summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordaryll <daryll>1999-12-05 01:22:19 +0000
committerdaryll <daryll>1999-12-05 01:22:19 +0000
commitb700746a28cb32d457c7aae74d8d04ffd0e4ab5d (patch)
treed4ca6d89cc41e952cb6f2357352ba886c10f0a4f
parent11e106bf56322bd30edd64458ed437050782b518 (diff)
Import XFree 3.9.16X_3_9_16
-rw-r--r--xc/extras/FreeType/INSTALL722
-rw-r--r--xc/extras/FreeType/MakeSub.in7
-rw-r--r--xc/extras/FreeType/Makefile.in60
-rw-r--r--xc/extras/FreeType/README488
-rw-r--r--xc/extras/FreeType/README.XFree8620
-rw-r--r--xc/extras/FreeType/aclocal.m4263
-rw-r--r--xc/extras/FreeType/announce40
-rwxr-xr-xxc/extras/FreeType/config.guess940
-rwxr-xr-xxc/extras/FreeType/config.sub955
-rwxr-xr-xxc/extras/FreeType/configure4294
-rw-r--r--xc/extras/FreeType/configure.in202
-rw-r--r--xc/extras/FreeType/contrib/ftos2/DEVELFAQ38
-rw-r--r--xc/extras/FreeType/contrib/ftos2/FAQ260
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ft2.gifbin0 -> 3817 bytes
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/32fddef.h53
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/32fdstrc.h161
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/32ifimet.h118
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/32pmifi.h79
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/FreeType.def10
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/FreeType.icc35
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/FreeType.wat29
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/ftifi.c3209
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/ftifi.h305
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/ftmem.c184
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/ftmem.icc4
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/ftmem.icobin0 -> 2692 bytes
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/test.c238
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/test.icc6
-rw-r--r--xc/extras/FreeType/contrib/ftos2/ifi/test.wat4
-rw-r--r--xc/extras/FreeType/contrib/ftos2/install.cmd30
-rw-r--r--xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.icc72
-rw-r--r--xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.wat41
-rw-r--r--xc/extras/FreeType/contrib/ftos2/lib/ttmemory.c385
-rwxr-xr-xxc/extras/FreeType/contrib/ftos2/limit.cmd63
-rw-r--r--xc/extras/FreeType/contrib/ftos2/query.cmd15
-rw-r--r--xc/extras/FreeType/contrib/ftos2/readme.1st87
-rw-r--r--xc/extras/FreeType/contrib/ftos2/readme.txt113
-rw-r--r--xc/extras/FreeType/contrib/ftos2/uninst.c60
-rw-r--r--xc/extras/FreeType/contrib/ftos2/uninstall.cmd34
-rw-r--r--xc/extras/FreeType/contrib/mac/mac.hqxbin0 -> 45034 bytes
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/Makefile.in74
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/README266
-rwxr-xr-xxc/extras/FreeType/contrib/ttf2bdf/configure1280
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/configure.in40
-rwxr-xr-xxc/extras/FreeType/contrib/ttf2bdf/contrib/KOI2iso_pcf28
-rwxr-xr-xxc/extras/FreeType/contrib/ttf2bdf/contrib/create_type60
-rwxr-xr-xxc/extras/FreeType/contrib/ttf2bdf/contrib/create_type_m59
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.2241
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.5202
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/maps/koi8.r203
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/maps/windows.1251204
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/remap.c684
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/remap.h64
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.c1563
-rw-r--r--xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.man190
-rw-r--r--xc/extras/FreeType/contrib/ttf2pfb/TODO35
-rw-r--r--xc/extras/FreeType/contrib/ttf2pfb/t1asm.c529
-rw-r--r--xc/extras/FreeType/contrib/ttf2pfb/ttf2pfb.c1293
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/BUGS3
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/MakeSub.in6
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/Makefile.dm71
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/Makefile.in116
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/README94
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/TODO18
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/c-auto.h23
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/case.c179
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/case.h27
-rwxr-xr-xxc/extras/FreeType/contrib/ttf2pk/configure1609
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/configure.in79
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/Big5.sfd65
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/ET5.enc119
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/EUC.sfd42
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/SJIS.sfd52
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/T1-WGL4.enc128
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/Unicode.sfd265
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/VPS.rpl244
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/data/ttfonts.map10
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/dvidrv.btm334
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/emdir.c109
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/emdir.h25
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/emtexdir.c405
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/emtexdir.h57
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/errormsg.c96
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/errormsg.h26
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/filesrch.c490
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/filesrch.h51
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ligkern.c275
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ligkern.h23
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/newobj.c347
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/newobj.h43
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/parse.c304
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/parse.h22
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/pklib.c872
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/pklib.h29
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/README6
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/teTeX-0.4/MakeTeXPK.diff63
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/MakeTeXPK.diff75
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/README1
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.0/MakeTeXPK.diff67
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/MakeTeXPK.diff72
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/README1
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.2/mktexpk.diff72
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/subfont.c264
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/subfont.h26
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/texenc.c203
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/texenc.h28
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/tfmaux.c480
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/tfmaux.h28
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttf2pk.1284
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttf2pk.c567
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttf2pk.doc568
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.11010
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.c839
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.h231
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttfaux.c505
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttfaux.h21
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttfenc.c1281
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttfenc.h41
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttflib.c529
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/ttflib.h31
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/vplaux.c584
-rw-r--r--xc/extras/FreeType/contrib/ttf2pk/vplaux.h23
-rw-r--r--xc/extras/FreeType/contrib/ttfbanner/Makefile9
-rw-r--r--xc/extras/FreeType/contrib/ttfbanner/README38
-rw-r--r--xc/extras/FreeType/contrib/ttfbanner/ttfbanner.c317
-rw-r--r--xc/extras/FreeType/contrib/ttfbanner/ttfbanner.h9
-rw-r--r--xc/extras/FreeType/docs/FAQ814
-rw-r--r--xc/extras/FreeType/docs/TODO37
-rw-r--r--xc/extras/FreeType/docs/apiref.txt1807
-rw-r--r--xc/extras/FreeType/docs/bitmaps.txt761
-rw-r--r--xc/extras/FreeType/docs/changes.txt343
-rw-r--r--xc/extras/FreeType/docs/convntns.txt958
-rw-r--r--xc/extras/FreeType/docs/credits46
-rw-r--r--xc/extras/FreeType/docs/errstr.txt73
-rw-r--r--xc/extras/FreeType/docs/freetype.lsm16
-rw-r--r--xc/extras/FreeType/docs/glyphs.htm1253
-rw-r--r--xc/extras/FreeType/docs/glyphs.txt1002
-rw-r--r--xc/extras/FreeType/docs/i18n.txt153
-rw-r--r--xc/extras/FreeType/docs/image/baselin2.gifbin0 -> 1282 bytes
-rw-r--r--xc/extras/FreeType/docs/image/baseline.gifbin0 -> 2976 bytes
-rw-r--r--xc/extras/FreeType/docs/image/emsquare.gifbin0 -> 2917 bytes
-rw-r--r--xc/extras/FreeType/docs/image/freetype.gifbin0 -> 10545 bytes
-rw-r--r--xc/extras/FreeType/docs/image/freetype.pngbin0 -> 10756 bytes
-rw-r--r--xc/extras/FreeType/docs/image/grid1.gifbin0 -> 1399 bytes
-rw-r--r--xc/extras/FreeType/docs/image/grid2.gifbin0 -> 3390 bytes
-rw-r--r--xc/extras/FreeType/docs/image/grid3.gifbin0 -> 3313 bytes
-rw-r--r--xc/extras/FreeType/docs/image/metrics.gifbin0 -> 3296 bytes
-rw-r--r--xc/extras/FreeType/docs/image/metrics2.gifbin0 -> 2934 bytes
-rw-r--r--xc/extras/FreeType/docs/image/small2.gifbin0 -> 8814 bytes
-rw-r--r--xc/extras/FreeType/docs/image/tfp-back.pngbin0 -> 53962 bytes
-rw-r--r--xc/extras/FreeType/docs/porting.txt1078
-rw-r--r--xc/extras/FreeType/docs/raster.doc578
-rw-r--r--xc/extras/FreeType/docs/readme.txt78
-rw-r--r--xc/extras/FreeType/docs/threads.txt120
-rw-r--r--xc/extras/FreeType/docs/user.txt944
-rw-r--r--xc/extras/FreeType/freetype.spec164
-rw-r--r--xc/extras/FreeType/ft_conf.h.in177
-rw-r--r--xc/extras/FreeType/howto/os2.txt174
-rw-r--r--xc/extras/FreeType/howto/unix.txt233
-rw-r--r--xc/extras/FreeType/howto/win32.txt136
-rwxr-xr-xxc/extras/FreeType/install-sh250
-rw-r--r--xc/extras/FreeType/lib/arch/amigaos/Makefile.gcc67
-rw-r--r--xc/extras/FreeType/lib/arch/amigaos/freetype.c24
-rw-r--r--xc/extras/FreeType/lib/arch/amigaos/ft_conf.h191
-rw-r--r--xc/extras/FreeType/lib/arch/mac/README47
-rw-r--r--xc/extras/FreeType/lib/arch/mac/ttmmap.c1069
-rw-r--r--xc/extras/FreeType/lib/arch/msdos/Makefile.dm82
-rw-r--r--xc/extras/FreeType/lib/arch/msdos/Makefile.gcc75
-rw-r--r--xc/extras/FreeType/lib/arch/msdos/Makefile.wat84
-rw-r--r--xc/extras/FreeType/lib/arch/msdos/freetype.c24
-rw-r--r--xc/extras/FreeType/lib/arch/msdos/ft_conf.h187
-rw-r--r--xc/extras/FreeType/lib/arch/os2/Makefile.dm82
-rw-r--r--xc/extras/FreeType/lib/arch/os2/Makefile.emx74
-rw-r--r--xc/extras/FreeType/lib/arch/os2/Makefile.icc71
-rw-r--r--xc/extras/FreeType/lib/arch/os2/Makefile.wat84
-rw-r--r--xc/extras/FreeType/lib/arch/os2/freetype.c32
-rw-r--r--xc/extras/FreeType/lib/arch/os2/ft_conf.h208
-rw-r--r--xc/extras/FreeType/lib/arch/os2/os2file.c1236
-rw-r--r--xc/extras/FreeType/lib/arch/unix/Makefile.in226
-rw-r--r--xc/extras/FreeType/lib/arch/unix/freetype.c31
-rw-r--r--xc/extras/FreeType/lib/arch/unix/ttmmap.c1027
-rw-r--r--xc/extras/FreeType/lib/arch/win32/freetype.c39
-rw-r--r--xc/extras/FreeType/lib/arch/win32/freetype.dsp104
-rw-r--r--xc/extras/FreeType/lib/arch/win32/freetype.dsw29
-rw-r--r--xc/extras/FreeType/lib/arch/win32/freetype.idebin0 -> 33878 bytes
-rw-r--r--xc/extras/FreeType/lib/arch/win32/freetype.mak353
-rw-r--r--xc/extras/FreeType/lib/arch/win32/freetype.mdpbin0 -> 37376 bytes
-rw-r--r--xc/extras/FreeType/lib/arch/win32/ft_conf.h179
-rw-r--r--xc/extras/FreeType/lib/changes.txt247
-rw-r--r--xc/extras/FreeType/lib/extend/ftxcmap.c342
-rw-r--r--xc/extras/FreeType/lib/extend/ftxcmap.h54
-rw-r--r--xc/extras/FreeType/lib/extend/ftxerr18.c212
-rw-r--r--xc/extras/FreeType/lib/extend/ftxerr18.h37
-rw-r--r--xc/extras/FreeType/lib/extend/ftxgasp.c68
-rw-r--r--xc/extras/FreeType/lib/extend/ftxgasp.h52
-rw-r--r--xc/extras/FreeType/lib/extend/ftxgpos.h48
-rw-r--r--xc/extras/FreeType/lib/extend/ftxgsub.c1671
-rw-r--r--xc/extras/FreeType/lib/extend/ftxgsub.h358
-rw-r--r--xc/extras/FreeType/lib/extend/ftxkern.c558
-rw-r--r--xc/extras/FreeType/lib/extend/ftxkern.h179
-rw-r--r--xc/extras/FreeType/lib/extend/ftxopen.c1078
-rw-r--r--xc/extras/FreeType/lib/extend/ftxopen.h282
-rw-r--r--xc/extras/FreeType/lib/extend/ftxopenf.h84
-rw-r--r--xc/extras/FreeType/lib/extend/ftxpost.c512
-rw-r--r--xc/extras/FreeType/lib/extend/ftxpost.h103
-rw-r--r--xc/extras/FreeType/lib/extend/ftxwidth.c181
-rw-r--r--xc/extras/FreeType/lib/extend/ftxwidth.h80
-rw-r--r--xc/extras/FreeType/lib/extend/readme.1st57
-rw-r--r--xc/extras/FreeType/lib/freetype.h1144
-rw-r--r--xc/extras/FreeType/lib/fterrid.h160
-rw-r--r--xc/extras/FreeType/lib/ftnameid.h597
-rw-r--r--xc/extras/FreeType/lib/header.h49
-rw-r--r--xc/extras/FreeType/lib/ttapi.c2191
-rw-r--r--xc/extras/FreeType/lib/ttcache.c460
-rw-r--r--xc/extras/FreeType/lib/ttcache.h216
-rw-r--r--xc/extras/FreeType/lib/ttcalc.c458
-rw-r--r--xc/extras/FreeType/lib/ttcalc.h102
-rw-r--r--xc/extras/FreeType/lib/ttcmap.c503
-rw-r--r--xc/extras/FreeType/lib/ttcmap.h169
-rw-r--r--xc/extras/FreeType/lib/ttconfig.h215
-rw-r--r--xc/extras/FreeType/lib/ttdebug.c396
-rw-r--r--xc/extras/FreeType/lib/ttdebug.h141
-rw-r--r--xc/extras/FreeType/lib/ttengine.h115
-rw-r--r--xc/extras/FreeType/lib/ttextend.c209
-rw-r--r--xc/extras/FreeType/lib/ttextend.h168
-rw-r--r--xc/extras/FreeType/lib/ttfile.c1179
-rw-r--r--xc/extras/FreeType/lib/ttfile.h270
-rw-r--r--xc/extras/FreeType/lib/ttgload.c1321
-rw-r--r--xc/extras/FreeType/lib/ttgload.h50
-rw-r--r--xc/extras/FreeType/lib/ttinterp.c6389
-rw-r--r--xc/extras/FreeType/lib/ttinterp.h54
-rw-r--r--xc/extras/FreeType/lib/ttload.c1553
-rw-r--r--xc/extras/FreeType/lib/ttload.h203
-rw-r--r--xc/extras/FreeType/lib/ttmemory.c389
-rw-r--r--xc/extras/FreeType/lib/ttmemory.h129
-rw-r--r--xc/extras/FreeType/lib/ttmutex.c85
-rw-r--r--xc/extras/FreeType/lib/ttmutex.h59
-rw-r--r--xc/extras/FreeType/lib/ttobjs.c1471
-rw-r--r--xc/extras/FreeType/lib/ttobjs.h861
-rw-r--r--xc/extras/FreeType/lib/ttraster.c2733
-rw-r--r--xc/extras/FreeType/lib/ttraster.h126
-rw-r--r--xc/extras/FreeType/lib/tttables.h215
-rw-r--r--xc/extras/FreeType/lib/tttags.h56
-rw-r--r--xc/extras/FreeType/lib/tttypes.h156
-rw-r--r--xc/extras/FreeType/license.txt159
-rwxr-xr-xxc/extras/FreeType/ltconfig1519
-rwxr-xr-xxc/extras/FreeType/ltmain.sh2453
-rwxr-xr-xxc/extras/FreeType/mkinstalldirs40
-rw-r--r--xc/extras/FreeType/net.m455
-rw-r--r--xc/extras/FreeType/po/Makefile.in.in216
-rw-r--r--xc/extras/FreeType/po/POTFILES.in8
-rw-r--r--xc/extras/FreeType/po/cs.po443
-rw-r--r--xc/extras/FreeType/po/de.po446
-rw-r--r--xc/extras/FreeType/po/es.po441
-rw-r--r--xc/extras/FreeType/po/fr.po446
-rw-r--r--xc/extras/FreeType/po/freetype.pot433
-rw-r--r--xc/extras/FreeType/po/nl.po444
-rw-r--r--xc/extras/FreeType/readme.1st66
-rw-r--r--xc/extras/FreeType/test/arch/amigaos/Makefile.gcc81
-rw-r--r--xc/extras/FreeType/test/arch/amigaos/TODO16
-rw-r--r--xc/extras/FreeType/test/arch/amigaos/gfsamiga.c428
-rw-r--r--xc/extras/FreeType/test/arch/amigaos/gw_amiga.c519
-rw-r--r--xc/extras/FreeType/test/arch/amigaos/smakefile159
-rw-r--r--xc/extras/FreeType/test/arch/msdos/Makefile.dm121
-rw-r--r--xc/extras/FreeType/test/arch/msdos/Makefile.gcc87
-rw-r--r--xc/extras/FreeType/test/arch/msdos/gfs_dos.c291
-rw-r--r--xc/extras/FreeType/test/arch/os2/Makefile.dm135
-rw-r--r--xc/extras/FreeType/test/arch/os2/Makefile.emx100
-rw-r--r--xc/extras/FreeType/test/arch/os2/Makefile.icc121
-rw-r--r--xc/extras/FreeType/test/arch/os2/Makefile.wat138
-rw-r--r--xc/extras/FreeType/test/arch/os2/gfs_os2.c218
-rw-r--r--xc/extras/FreeType/test/arch/os2/gpm_os2.c652
-rw-r--r--xc/extras/FreeType/test/arch/os2/gpm_os2.def5
-rw-r--r--xc/extras/FreeType/test/arch/unix/Makefile.in152
-rw-r--r--xc/extras/FreeType/test/arch/unix/gwin_x11.c450
-rw-r--r--xc/extras/FreeType/test/arch/win32/Driver32.c104
-rw-r--r--xc/extras/FreeType/test/arch/win32/ReadMe.txt17
-rw-r--r--xc/extras/FreeType/test/arch/win32/Resource.h24
-rw-r--r--xc/extras/FreeType/test/arch/win32/StdAfx.cpp6
-rw-r--r--xc/extras/FreeType/test/arch/win32/StdAfx.h25
-rw-r--r--xc/extras/FreeType/test/arch/win32/TESTW32.DSP190
-rw-r--r--xc/extras/FreeType/test/arch/win32/TESTW32.DSW29
-rw-r--r--xc/extras/FreeType/test/arch/win32/TESTW32.H50
-rw-r--r--xc/extras/FreeType/test/arch/win32/Testw32.cpp79
-rw-r--r--xc/extras/FreeType/test/arch/win32/Testw32.mak533
-rw-r--r--xc/extras/FreeType/test/arch/win32/hack_common.c8
-rw-r--r--xc/extras/FreeType/test/arch/win32/hack_ftdump.c9
-rw-r--r--xc/extras/FreeType/test/arch/win32/hack_ftlint.c9
-rw-r--r--xc/extras/FreeType/test/arch/win32/hack_ftstring.c9
-rw-r--r--xc/extras/FreeType/test/arch/win32/hack_fttimer.c9
-rw-r--r--xc/extras/FreeType/test/arch/win32/hack_ftview.c9
-rw-r--r--xc/extras/FreeType/test/arch/win32/testw32.mdpbin0 -> 43008 bytes
-rw-r--r--xc/extras/FreeType/test/arch/win32/testw32.rc202
-rw-r--r--xc/extras/FreeType/test/arch/win32/testw32Dlg.cpp358
-rw-r--r--xc/extras/FreeType/test/arch/win32/testw32Dlg.h51
-rw-r--r--xc/extras/FreeType/test/common.c245
-rw-r--r--xc/extras/FreeType/test/common.h53
-rw-r--r--xc/extras/FreeType/test/display.c297
-rw-r--r--xc/extras/FreeType/test/display.h71
-rw-r--r--xc/extras/FreeType/test/fdebug.c203
-rw-r--r--xc/extras/FreeType/test/ftdump.c571
-rw-r--r--xc/extras/FreeType/test/fterror.c75
-rw-r--r--xc/extras/FreeType/test/ftlint.c275
-rw-r--r--xc/extras/FreeType/test/ftstring.c486
-rw-r--r--xc/extras/FreeType/test/ftstrpnm.c511
-rw-r--r--xc/extras/FreeType/test/fttimer.c455
-rw-r--r--xc/extras/FreeType/test/ftview.c461
-rw-r--r--xc/extras/FreeType/test/ftzoom.c726
-rw-r--r--xc/extras/FreeType/test/gdriver.h55
-rw-r--r--xc/extras/FreeType/test/gevents.h43
-rw-r--r--xc/extras/FreeType/test/gmain.c468
-rw-r--r--xc/extras/FreeType/test/gmain.h72
-rw-r--r--xc/extras/README17
-rw-r--r--xc/extras/X-TrueType/ARABIC/CP1256toUCS2.c91
-rw-r--r--xc/extras/X-TrueType/ARABIC/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ARABIC/MULEARABICtoUCS2.c106
-rw-r--r--xc/extras/X-TrueType/ARABIC/XATERMtoUCS2.c101
-rw-r--r--xc/extras/X-TrueType/ARABIC/main.c120
-rw-r--r--xc/extras/X-TrueType/ARMSCII8/ARMSCII8toUCS2.c80
-rw-r--r--xc/extras/X-TrueType/ARMSCII8/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ARMSCII8/main.c69
-rw-r--r--xc/extras/X-TrueType/BIG5/BIG5toUCS2.c2284
-rw-r--r--xc/extras/X-TrueType/BIG5/Imakefile9
-rw-r--r--xc/extras/X-TrueType/BIG5/main.c69
-rw-r--r--xc/extras/X-TrueType/CHANGES.eng41
-rw-r--r--xc/extras/X-TrueType/DOSENCODING/DOSENCODINGtoUCS2.c227
-rw-r--r--xc/extras/X-TrueType/DOSENCODING/Imakefile9
-rw-r--r--xc/extras/X-TrueType/DOSENCODING/main.c96
-rw-r--r--xc/extras/X-TrueType/GB2312/GB2312toUCS2.c1189
-rw-r--r--xc/extras/X-TrueType/GB2312/Imakefile9
-rw-r--r--xc/extras/X-TrueType/GB2312/main.c66
-rw-r--r--xc/extras/X-TrueType/ISO8859.1/ISO8859_1toAROMAN.c74
-rw-r--r--xc/extras/X-TrueType/ISO8859.1/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.1/main.c137
-rw-r--r--xc/extras/X-TrueType/ISO8859.10/ISO8859_10toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.10/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.10/main.c68
-rw-r--r--xc/extras/X-TrueType/ISO8859.11/ISO8859_11toUCS2.c73
-rw-r--r--xc/extras/X-TrueType/ISO8859.11/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.11/main.c71
-rw-r--r--xc/extras/X-TrueType/ISO8859.14/ISO8859_14toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.14/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.14/main.c68
-rw-r--r--xc/extras/X-TrueType/ISO8859.15/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.15/main.c100
-rw-r--r--xc/extras/X-TrueType/ISO8859.2/ISO8859_2toACNTRO.c72
-rw-r--r--xc/extras/X-TrueType/ISO8859.2/ISO8859_2toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.2/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.2/main.c71
-rw-r--r--xc/extras/X-TrueType/ISO8859.3/ISO8859_3toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.3/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.3/main.c68
-rw-r--r--xc/extras/X-TrueType/ISO8859.4/ISO8859_4toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.4/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.4/main.c68
-rw-r--r--xc/extras/X-TrueType/ISO8859.5/ISO8859_5toACYRIL.c72
-rw-r--r--xc/extras/X-TrueType/ISO8859.5/ISO8859_5toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.5/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.5/main.c71
-rw-r--r--xc/extras/X-TrueType/ISO8859.6/ISO8859_6toUCS2.c194
-rw-r--r--xc/extras/X-TrueType/ISO8859.6/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.6/main.c111
-rw-r--r--xc/extras/X-TrueType/ISO8859.7/ISO8859_7toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.7/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.7/main.c68
-rw-r--r--xc/extras/X-TrueType/ISO8859.8/ISO8859_8toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.8/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.8/main.c68
-rw-r--r--xc/extras/X-TrueType/ISO8859.9/ISO8859_9toUCS2.c70
-rw-r--r--xc/extras/X-TrueType/ISO8859.9/Imakefile9
-rw-r--r--xc/extras/X-TrueType/ISO8859.9/main.c68
-rw-r--r--xc/extras/X-TrueType/Imakefile108
-rw-r--r--xc/extras/X-TrueType/JISX0201/Imakefile9
-rw-r--r--xc/extras/X-TrueType/JISX0201/JISX0201toUCS2.c82
-rw-r--r--xc/extras/X-TrueType/JISX0201/main.c106
-rw-r--r--xc/extras/X-TrueType/JISX0208/Imakefile9
-rw-r--r--xc/extras/X-TrueType/JISX0208/JISX0208toUCS2.c1150
-rw-r--r--xc/extras/X-TrueType/JISX0208/main.c163
-rw-r--r--xc/extras/X-TrueType/JISX0212/Imakefile9
-rw-r--r--xc/extras/X-TrueType/JISX0212/JISX0212toUCS2.c1046
-rw-r--r--xc/extras/X-TrueType/JISX0212/main.c93
-rw-r--r--xc/extras/X-TrueType/KOI8/Imakefile9
-rw-r--r--xc/extras/X-TrueType/KOI8/KOI8_RtoUCS2.c81
-rw-r--r--xc/extras/X-TrueType/KOI8/KOI8_UNItoUCS2.c81
-rw-r--r--xc/extras/X-TrueType/KOI8/main.c156
-rw-r--r--xc/extras/X-TrueType/KSC5601/Imakefile9
-rw-r--r--xc/extras/X-TrueType/KSC5601/KSC5601toUCS2.c1270
-rw-r--r--xc/extras/X-TrueType/KSC5601/main.c106
-rw-r--r--xc/extras/X-TrueType/KSCJOHAB/Imakefile9
-rw-r--r--xc/extras/X-TrueType/KSCJOHAB/KSCJOHABtoUCS2.c3162
-rw-r--r--xc/extras/X-TrueType/KSCJOHAB/main.c71
-rw-r--r--xc/extras/X-TrueType/MULEENCODING/ASCIILAOtoUCS2.c72
-rw-r--r--xc/extras/X-TrueType/MULEENCODING/Imakefile9
-rw-r--r--xc/extras/X-TrueType/MULEENCODING/MULELAOtoUCS2.c76
-rw-r--r--xc/extras/X-TrueType/MULEENCODING/MULETIBETANtoUCS2.c125
-rw-r--r--xc/extras/X-TrueType/MULEENCODING/main.c83
-rw-r--r--xc/extras/X-TrueType/TCVN/Imakefile9
-rw-r--r--xc/extras/X-TrueType/TCVN/TCVNtoUCS2.c78
-rw-r--r--xc/extras/X-TrueType/TCVN/main.c69
-rw-r--r--xc/extras/X-TrueType/VISCII/Imakefile9
-rw-r--r--xc/extras/X-TrueType/VISCII/VISCIItoUCS2.c99
-rw-r--r--xc/extras/X-TrueType/VISCII/main.c70
-rw-r--r--xc/extras/X-TrueType/xttcache.c359
-rw-r--r--xc/extras/X-TrueType/xttcache.h72
-rw-r--r--xc/extras/X-TrueType/xttcap.c689
-rw-r--r--xc/extras/X-TrueType/xttcap.h123
-rw-r--r--xc/extras/X-TrueType/xttcconv.c635
-rw-r--r--xc/extras/X-TrueType/xttcconv.h105
-rw-r--r--xc/extras/X-TrueType/xttcconvP.h269
-rw-r--r--xc/extras/X-TrueType/xttchinfo.c148
-rw-r--r--xc/extras/X-TrueType/xttcommon.h125
-rw-r--r--xc/extras/X-TrueType/xttdump.c234
-rw-r--r--xc/extras/X-TrueType/xttfuncs.c1901
-rw-r--r--xc/extras/X-TrueType/xttmisc.c78
-rw-r--r--xc/extras/X-TrueType/xttprop.c280
-rw-r--r--xc/extras/X-TrueType/xttstruct.h142
-rw-r--r--xc/extras/X-TrueType/xttversion.h17
-rw-r--r--xc/extras/Xpm/CHANGES957
-rw-r--r--xc/extras/Xpm/COPYRIGHT31
-rw-r--r--xc/extras/Xpm/FAQ.html344
-rw-r--r--xc/extras/Xpm/FILES68
-rw-r--r--xc/extras/Xpm/Imakefile74
-rw-r--r--xc/extras/Xpm/Makefile.noX70
-rw-r--r--xc/extras/Xpm/README.AMIGA10
-rw-r--r--xc/extras/Xpm/README.MSW127
-rw-r--r--xc/extras/Xpm/README.XFree864
-rw-r--r--xc/extras/Xpm/README.html303
-rw-r--r--xc/extras/Xpm/cxpm/Imakefile66
-rw-r--r--xc/extras/Xpm/cxpm/Makefile.noX64
-rw-r--r--xc/extras/Xpm/cxpm/cxpm.c151
-rw-r--r--xc/extras/Xpm/cxpm/cxpm.man49
-rw-r--r--xc/extras/Xpm/doc/xpm.PS.gzbin0 -> 49010 bytes
-rw-r--r--xc/extras/Xpm/lib/Attrib.c302
-rw-r--r--xc/extras/Xpm/lib/CrBufFrI.c400
-rw-r--r--xc/extras/Xpm/lib/CrBufFrP.c75
-rw-r--r--xc/extras/Xpm/lib/CrDatFrI.c340
-rw-r--r--xc/extras/Xpm/lib/CrDatFrP.c74
-rw-r--r--xc/extras/Xpm/lib/CrIFrBuf.c115
-rw-r--r--xc/extras/Xpm/lib/CrIFrDat.c120
-rw-r--r--xc/extras/Xpm/lib/CrIFrP.c55
-rw-r--r--xc/extras/Xpm/lib/CrPFrBuf.c76
-rw-r--r--xc/extras/Xpm/lib/CrPFrDat.c79
-rw-r--r--xc/extras/Xpm/lib/CrPFrI.c59
-rw-r--r--xc/extras/Xpm/lib/Image.c61
-rw-r--r--xc/extras/Xpm/lib/Imakefile186
-rw-r--r--xc/extras/Xpm/lib/Info.c124
-rw-r--r--xc/extras/Xpm/lib/Makefile.AmigaGCC92
-rw-r--r--xc/extras/Xpm/lib/Makefile.noX112
-rw-r--r--xc/extras/Xpm/lib/RdFToBuf.c118
-rw-r--r--xc/extras/Xpm/lib/RdFToDat.c65
-rw-r--r--xc/extras/Xpm/lib/RdFToI.c222
-rw-r--r--xc/extras/Xpm/lib/RdFToP.c75
-rw-r--r--xc/extras/Xpm/lib/Smakefile89
-rw-r--r--xc/extras/Xpm/lib/WrFFrBuf.c55
-rw-r--r--xc/extras/Xpm/lib/WrFFrDat.c59
-rw-r--r--xc/extras/Xpm/lib/WrFFrI.c359
-rw-r--r--xc/extras/Xpm/lib/WrFFrP.c74
-rw-r--r--xc/extras/Xpm/lib/Xpm-def.cpp37
-rw-r--r--xc/extras/Xpm/lib/XpmI.h343
-rw-r--r--xc/extras/Xpm/lib/amigax.c382
-rw-r--r--xc/extras/Xpm/lib/amigax.h151
-rw-r--r--xc/extras/Xpm/lib/create.c2486
-rw-r--r--xc/extras/Xpm/lib/data.c479
-rw-r--r--xc/extras/Xpm/lib/descrip.mms82
-rw-r--r--xc/extras/Xpm/lib/hashtab.c234
-rw-r--r--xc/extras/Xpm/lib/make.com169
-rw-r--r--xc/extras/Xpm/lib/misc.c124
-rw-r--r--xc/extras/Xpm/lib/parse.c745
-rw-r--r--xc/extras/Xpm/lib/rgb.c282
-rw-r--r--xc/extras/Xpm/lib/rgbtab.h292
-rw-r--r--xc/extras/Xpm/lib/scan.c1003
-rw-r--r--xc/extras/Xpm/lib/simx.c290
-rw-r--r--xc/extras/Xpm/lib/simx.h139
-rw-r--r--xc/extras/Xpm/lib/xpm.h501
-rwxr-xr-xxc/extras/Xpm/namecvt60
-rw-r--r--xc/extras/Xpm/sxpm/Imakefile98
-rw-r--r--xc/extras/Xpm/sxpm/Makefile.noX69
-rw-r--r--xc/extras/Xpm/sxpm/plaid.xpm34
-rw-r--r--xc/extras/Xpm/sxpm/plaid_ext.xpm43
-rw-r--r--xc/extras/Xpm/sxpm/plaid_mask.xpm35
-rw-r--r--xc/extras/Xpm/sxpm/sxpm.c705
-rw-r--r--xc/extras/Xpm/sxpm/sxpm.man131
-rw-r--r--xc/extras/fonts/ClearlyU/README190
-rw-r--r--xc/extras/fonts/ClearlyU/cu-alt12.bdf2768
-rw-r--r--xc/extras/fonts/ClearlyU/cu-arabic12.bdf3732
-rw-r--r--xc/extras/fonts/ClearlyU/cu-lig12.bdf1214
-rw-r--r--xc/extras/fonts/ClearlyU/cu-pua12.bdf1098
-rw-r--r--xc/extras/fonts/ClearlyU/cu12.bdf68414
-rw-r--r--xc/extras/fonts/arabic24/README72
-rw-r--r--xc/extras/fonts/arabic24/arabic24.bdf14298
-rw-r--r--xc/extras/fonts/arabic24/uniarab.txt225
-rw-r--r--xc/extras/regex/COPYRIGHT20
-rw-r--r--xc/extras/regex/Makefile130
-rw-r--r--xc/extras/regex/README32
-rw-r--r--xc/extras/regex/WHATSNEW105
-rw-r--r--xc/extras/regex/cclass.h31
-rw-r--r--xc/extras/regex/cname.h102
-rw-r--r--xc/extras/regex/debug.c242
-rw-r--r--xc/extras/regex/engine.c1019
-rw-r--r--xc/extras/regex/main.c510
-rw-r--r--xc/extras/regex/mkh76
-rw-r--r--xc/extras/regex/regcomp.c1603
-rw-r--r--xc/extras/regex/regerror.c126
-rw-r--r--xc/extras/regex/regex.3509
-rw-r--r--xc/extras/regex/regex.7235
-rw-r--r--xc/extras/regex/regex2.h134
-rw-r--r--xc/extras/regex/regexec.c138
-rw-r--r--xc/extras/regex/regfree.c37
-rw-r--r--xc/extras/regex/split.c316
-rw-r--r--xc/extras/regex/tests477
-rw-r--r--xc/extras/regex/utils.h22
511 files changed, 233783 insertions, 0 deletions
diff --git a/xc/extras/FreeType/INSTALL b/xc/extras/FreeType/INSTALL
new file mode 100644
index 000000000..fd61ed85e
--- /dev/null
+++ b/xc/extras/FreeType/INSTALL
@@ -0,0 +1,722 @@
+The FreeType compilation installation guide
+
+
+Introduction
+
+I. Quick compilation
+
+ 1. Unix
+ 2. OS/2
+ 3. MS-DOS
+ 4. Amiga
+
+II. Package layout
+
+ 1. The library
+ 2. The test programs
+
+III. Compilation steps
+
+ 1. Compiling the library
+ 2. Compiling the graphics subsystem & driver
+ 3. Compiling the test programs
+
+IV. Test programs usage and additional notes
+
+ 1. ftzoom
+ 2. ftlint
+ 3. ftview
+ 4. fttimer
+ 5. ftdump
+ 6. ftstring
+ 7. ftstrpnm
+ 8. fterror
+
+
+--------------------------------------------------------------------
+
+Introduction:
+
+ This file describes the steps that are necessary to compile the
+ files found in this package. Section I contains instructions to
+ compile the package 'out-of-the-box' on a variety of
+ platforms/compilers. Section II gives the detailed layout of the
+ package's files, a necessary understanding for the detailed
+ compilation steps given in section III.
+
+ Note that more detailed system-specific versions of this file
+ exist in the "freetype/howto" directory. You may consult them if
+ you encounter problems on your platform.
+
+ This package, known as the FreeType 1.2 Public Release, contains
+ several things:
+
+ - the 1.2 release of the FreeType library, contained in the 'lib'
+ directory. The library is written in portable ANSI C. It
+ should compile fine with any type of ANSI C compiler.
+
+ Note that 16 bit compilers are not fully supported yet (the
+ library compiles, though), as some problems may arise with very
+ large point sizes, or large font files. However, code has been
+ severely checked for errors lately.
+
+ - a set of test programs, found in the directory 'test' which
+ provide:
+
+ - A small graphics subsystem used to display the bitmaps
+ produced by the library, on a great variety of systems. The
+ subsystem is made of several files:
+
+ - a set of common files (gmain.h, gmain.c, gdriver.h, and
+ gevents.h)
+
+ - some system-specific drivers used to implement the interface
+ found in 'gdriver.h' and 'gevents.h' (gfs_dos.c, gfs_os2.c,
+ gwin_x11.c, etc). The X11 driver is located in "test",
+ while others are located in architecture-specific
+ directories (example: "test/arch/os2/gpm_os2.c").
+
+ - "common.h/c" provide the 'basename' and 'getopt' functions
+ for systems which do not provide it already.
+
+ - Several test programs which use the library and the graphics
+ subsystem:
+
+ - ftzoom: A simple glyph viewer. Supports composite glyph
+ loading, font smoothing.
+
+ - ftlint: A simple glyph instruction verifier. Used to
+ execute all glyphs instructions found in a font
+ file at a given ppem size. Useful to find bugs in
+ the library and/or font files.
+
+ - ftview: A simple font viewer. Supports font smoothing and
+ hinting!
+
+ - fttimer: Performance timer used to benchmark the scan-line
+ converter. Supports display and font-smoothing.
+ This is _not_ an indication of FreeType's overall
+ performance!
+
+ - ftdump: A very simple font information dumper.
+
+ - ftstring: A simple program to display a given string or
+ message in a given font, at a given point size.
+
+ - ftstrpnm: Converts a given text string rendered with a given
+ font at a given size into PBM or PGM format which
+ can be further converted into popular graphics
+ formats like GIF or PNG with the netpbm tool
+ suite.
+
+ - fterror: Tests the GNU gettext() functionality for
+ internationalized message.
+
+ - an OS/2 font driver for TrueType fonts to replace the original
+ TRUETYPE.DLL (which is of poor quality). It is located in the
+ contrib/ftos2 subdirectory.
+
+ - a conversion tool, called ttf2bdf, which uses the FreeType
+ library to produce bitmaps in BDF format (used with X Windows),
+ located in the directory "contrib/ttf2bdf". It is only
+ supported on Unix for now.
+
+ - another conversion tool, called ttf2pk, used to convert TrueType
+ fonts to TeX's PK font format, in "contrib/ttf2pk". It
+ currently needs the kpathsea library (which is part of web2c, a
+ popular TeX implementation) for TeX file searching, but it
+ should be easy to replace the searching routines.
+
+
+--------------------------------------------------------------------
+
+I. Quick compilation:
+
+ NOTE: With the exception of Unix, all system-dependent makefiles
+ and configuration files are located in the directories
+ lib/arch/<platform>/ and test/arch/<platform>/.
+
+ 1. Unix:
+
+ We provide a 'configure' script that will automatically create
+ configuration and Makefile files in all relevant directories.
+ Creation of shared libraries is supported; say 'configure
+ --help' for configuration options.
+
+ Graphics display is performed through X11 only, which means that
+ the performance measured by 'timer' with display 'on' should not
+ be considered as 'informative'.
+
+ We have tested FreeType and its tools with the gcc compiler; if
+ you use a platform specific compiler or make program which need
+ special compilation switches please report this to our mailing
+ list so we can incorporate this into the next release.
+
+ Go to your 'freetype' directory, type './configure', 'make', and
+ 'make install'. Other available targets are `depend', `clean',
+ `distclean', and `uninstall'.
+
+ Please jump to section IV for usage descriptions.
+
+ Please read sections II and III to learn how to compile the
+ package for your own system in case the configure script fails
+ for your system.
+
+ Note: If FreeType is compiled with the GNU gettext i18n
+ extension (via ftxerr18.c), you have to use '-lintl -lttf'
+ for linking with the FreeType library. Type `./configure
+ --help' to see the available configuration options; you
+ can set the installation path for message catalogues with
+ the `--with-locale-dir' option.
+
+
+ 2. OS/2:
+
+ Makefile.dm: This is for gcc/emx + dmake.
+
+ It builds both full screen and PM windowed test
+ versions.
+
+ To use it, go to the 'test' directory and type:
+
+ make -r -f arch/os2/Makefile.dm
+
+
+ Makefile.emx: This is for GNU make and gcc/emx.
+
+ It builds a version of the test programs that use
+ a PM display window (xxx.exe) and a version that
+ uses the full-screen display driver (xxxfs.exe).
+
+ To use it, go to the 'test' directory and type:
+
+ make -f arch/os2/Makefile.emx
+
+
+ Makefile.icc: This file must be used with Visual Age C++. It
+ now supports full-screen and PM display. Note
+ that the library is compiled with optimizations
+ OFF, due to a compiler bug which makes icc compile
+ the file 'ttraster.c' erroneously. This bug will
+ be reported to IBM.
+
+ To use it, go to the 'test' directory and type:
+
+ nmake -f arch\os2\Makefile.icc
+
+
+ Makefile.wat: This file must be used with Watcom. It supports
+ PM and fullscreen output alike.
+
+ To use it, go to the 'test' directory and type:
+
+ wmake -f arch\os2\Makefile.wat
+
+
+ In addition, the following make targets can be invoked:
+
+ * clean: Erases all object and library files, only keeping
+ the executables in place.
+
+ * distclean: Same as 'clean', but also erase executables.
+
+
+ For other compilers, please read sections II and III to know how
+ to compile the package on your system. You're welcome to add
+ new makefiles and send them to us, as long as they respect our
+ current location conventions.
+
+
+ 3. MS-DOS and clones:
+
+ Makefile.dm: This is for gcc/emx + dmake.
+
+ To use it, go to the 'test' directory and type:
+
+ make -r -f arch/msdos/Makefile.dm
+
+
+ Makefile.gcc: This is for GNU make and gcc/emx.
+
+ To use it, go to the 'test' directory and type:
+
+ make -f arch/msdos/Makefile.gcc
+
+
+ In addition, the following make targets can be invoked:
+
+ * clean: Erases all object and library files, only keeping
+ the executables in place.
+
+ * distclean: Same as 'clean', but also erase executables.
+
+
+ The two previous makefiles should work with djgpp too.
+
+
+ Note that you may have to set some emx options (usually -acm) in
+ the EMXOPT environment variable to run the test programs
+ compiled with emx.
+
+ There is only a full-screen display driver for MS-DOS.
+
+ For other compilers, please read sections II and III to know how
+ to compile the package on your system. You're welcome to add
+ new makefiles and send them to us, as long as they respect our
+ current location conventions.
+
+ `char' is always `signed char' in the sources!
+
+
+ 4. Amiga:
+
+ You will need gcc and GNU make for Amiga to compile the package.
+ Go to the 'test' directory, then type:
+
+ make -f arch/amigaos/Makefile.gcc
+
+ The arch/amigaos contains two display drivers (full screen and
+ windowed). The default driver is the windowed one, but this can
+ be changed easily in the makefile.
+
+ For other compilers, please read sections II and III to know how
+ to compile the package on your system. You're welcome to add new
+ makefiles and send them to us, as long as they respect our
+ current location conventions.
+
+
+--------------------------------------------------------------------
+
+II. Package Layout:
+
+ Here is a more thorough description of the package's files and
+ layout.
+
+ # The 'test' directory:
+
+ Contains the graphics subsystem's common files.
+
+ gmain.h
+ gmain.c
+ gdriver.h
+ gevents.h
+
+ where 'gdriver.h' is the interface that must be implemented by
+ all display drivers used by the subsystem.
+
+ Note that the graphics subsystem is _not_ part of the library,
+ it's just a way we found to display the engine's production on
+ several systems.
+
+ The platform-specific driver (which means the implementation of
+ "gdriver.h") is found in the architecture-dependent directories
+ of the form:
+
+ test/arch/<platform>
+
+ where <platform> can be either "msdos", "amiga", "os2", etc.
+
+ We provide several display driver implementations on some
+ platforms:
+
+ test/arch/os2/gfs_os2.c - full-screen OS/2 driver
+ test/arch/os2/gpm_os2.c - PM OS/2 driver
+
+ test/arch/amigaos/gfsamiga.c - full-screen Amiga driver
+ test/arch/amigaos/gw_amiga.c - windowed Aniga driver
+
+ test/arch/msdos/gfs_dos.c - full-screen DOS driver
+
+ test/arch/unix/gwin_x11.c - windowed X11 driver
+
+ You'll need to compile one of these drivers for your system, and
+ link it to the test programs together with the compiled
+ 'gmain.c'.
+
+ It also contains several test files:
+
+ common.c -- common subroutines uses by all test programs.
+ This file defines and implement the functions
+ "basename" and "getopt" if they're not provided
+ by your environment.
+
+ display.c -- a small lib used by several test programs
+ wrapping around the platform specific graphics
+ code.
+
+ ftview.c -- font viewer
+ fttimer.c -- performance tester
+ ftzoom.c -- simple glyph viewer
+ ftstring.c -- simple string text generation program
+ ftstrpnm.c -- converts a rendered text string into the PBM or
+ PGM graphics file format
+
+ ftlint.c -- font instruction checker -- console mode only
+ ftdump.c -- simple font dumper -- console mode only
+
+ fdebug.c -- short debugger; you need to compile ttdebug.c
+ and ttins.c in the c/lib directory with the
+ DEBUG constant defined to use it. Text mode
+ only. Makes sense for development only. Avoid
+ it completely if you don't need to hack the
+ engine.
+
+ fterror.c -- testing gettext() functionality under UNIX.
+
+ # The 'lib' directory:
+
+ Contains the engine's source code.
+
+ The engine is made of several components, each one having its
+ name beginning with a 'tt' prefix like 'ttmemory', 'ttfile',
+ 'ttraster', etc.
+
+ All components rely on the 'freetype.h' interface file (which is
+ the engine's interface to be used by all clients), and
+ 'ttconfig.h' (which is used to generate configuration macros).
+
+ Note that 'ttconfig.h' relies heavily on a file called
+ 'ft_conf.h' that contains information related to the target
+ platform. The ft_conf.h file is generated by the 'configure'
+ script under Unix. For other systems, it is located in the
+ lib/arch/<platform>/ directory:
+
+ lib/arch/os2/ft_conf.h
+ lib/arch/amigaos/ft_conf.h
+ lib/arch/msdos/ft_conf.h
+
+ It should be pretty obvious to create a new ft_conf.h file from
+ a current one: just copy it and define/undefine the macros that
+ are relevant to your platform.
+
+ # The 'lib/extend' directory:
+
+ This directory contains the current core engine extensions. To
+ know more about extensions, read the user guide found in
+ "docs/user.txt".
+
+
+--------------------------------------------------------------------
+
+III. Detailed Compilation Steps:
+
+ You must perform the following steps to compile this package by
+ hand:
+
+ 1. Compile the library:
+
+ with gcc, go to the 'lib' directory, then type
+
+ gcc -c <options> tt*.c -I..
+ gcc -c <options> extend/ftx*.c -I.. -Iextend
+
+ for Unix systems or
+
+ gcc -c <options> tt*.c -Iarch/<platform>
+ gcc -c <options> extend/ftx.c
+
+ for other platforms.
+
+ <options> stands for '-Wall -ansi -pedantic -O2' for the gcc
+ compiler.
+
+ The flags mean:
+
+ -c : compile only
+
+ -Wall : display all warnings during compilation
+
+ -ansi : check for ANSI conventions
+
+ -pedantic : be _very_ pedantic when checking ANSI convention
+
+ -O : optimization level (this is the letter capital O)
+
+ -I : add an include dir
+
+ This line is needed to give access to the
+ directory containing 'ft_conf.h' and the 'extend'
+ directory.
+
+
+ 2. Compile the graphics subsystem:
+
+ a. compile the subsystem in the 'test' dir:
+
+ gcc -c <options> gmain.c
+
+ b. compile the display driver in the 'test' dir:
+
+ gcc -c <options> gwin_x11.c -o gdriver.o
+
+ for Unixish systems (see note below) or
+
+ gcc -c <options> arch/system/yourdriver.c -o gdriver.o
+
+ for other platforms. Of course, don't forget to add the path
+ to your system's display libraries.
+
+ <options> usually stands for '-Wall -ansi -O2'; '-o' specifies
+ the output name of the ojlect file (here 'gdriver.o').
+
+
+ 3. Compile the test programs in the 'test' directory:
+
+ Usually with something like:
+
+ gcc <options> testprogram.c \
+ ../lib/*.o gmain.o gdriver.o \
+ -I<path_to_ft_conf.h> -I../lib
+
+ with additional libraries ('\' indicates a line continuation;
+ <options> as in the previous section).
+
+ Have a look at the supplied makefiles to get a better idea of
+ the required flags/commands.
+
+ You should now be able to run the test programs.
+
+
+----------------------------------------------------------------------------
+
+IV. Test programs usage:
+
+ NOTE: All test programs having a graphic interface use the same
+ key convention:
+
+ x : fine counter_clockwise rotation (ftzoom only)
+ c : fine clockwise rotation (ftzoom only)
+
+ v : fast counter_clockwise rotation (ftzoom only)
+ b : fast clockwise rotation (ftzoom only)
+
+ h : toggle hinting on/off
+
+ + : fast scale up
+ - : fast scale down
+ u : fine scale up
+ j : fine scale down
+
+ l : go to next glyph
+ k : go to previous glyph
+
+ o : go to tenth next glyph
+ i : go to tenth previous glyph
+
+ 0 : go to hundredth next glyph (useful for CJK fonts)
+ 9 : go to hundredth previous glyph
+
+ ) : go to thousandth next glyph
+ ( : go to thousandth previous glyph
+
+ } : go to tenthousandth next glyph
+ { : go to tenthousandth previous glyph
+
+
+ q :
+ ESC : exit
+
+ These keys were chosen because they are available on all
+ platforms. Note also that each program uses only a subset of this
+ key map.
+
+
+ 1. FTZOOM:
+
+ 'ftzoom' is a very simple glyph viewer that supports font
+ smoothing. Its usage is:
+
+ ftzoom [-g] [-p platformID -e encodingID]
+ [-r resolution] [-z magnification] [-n] fontfilename
+
+ With -g you can select gray-scaling; with -n you can suppress
+ usage of the `post' table in the TrueType font.
+
+ For example:
+
+ ftzoom arial.ttf to show the glyphs found
+ in the Arial font
+ ftzoom -g times.ttf to show smoothed version of
+ Times's glyphs.
+ ftzoom -p 3 -e 1 uwjmg3.ttf use cmap for platform ID 3,
+ encoding ID 1 for this Japanese
+ font.
+
+ 2. FTLINT:
+
+ FTLint is used to execute all glyphs instructions found in a
+ font file at a given char size size. Its usage is:
+
+ ftlint pointsize fontfilename [fontfilename] ...
+
+ For example:
+
+ ftlint 12 arial.ttf
+ ftlint 15 times.ttf
+
+ It reports error codes and faulty glyph numbers. This is a
+ console tool that doesn't need the graphics subsystem.
+
+ Since it is a production tool, don't get surprised to see
+ numerical error codes (the list is in the file 'lib/freetype.h'
+ anyway).
+
+ NOTE: Trying to hint at sizes smaller than 7 is irrelevant.
+
+ 3. FTVIEW:
+
+ A font viewer that supports hinting and font smoothing. Its
+ usage:
+
+ ftview [-g] pointsize fontfilename
+
+ like in:
+
+ ftview 12 arial.ttf show the hinted Arial at size 12pt.
+
+ ftview -g 15 timesi.ttf show the hinted and font-smoothed
+ Times at size 15pt.
+
+ Note that it is possible to change the point size during display
+ with the keys 'u', 'j', '+', and '-'. It is also possible to
+ browse the whole glyph set with the 'k', 'l', 'i', 'o', '0',
+ '9', '(', ')', '{', and '}' keys (see key map above).
+
+ The OS/2 PM driver comes with an additional magnifying window.
+ The magnified zone is set with the mouse, while the scale is
+ changed with the help of 'PageUp' and 'PageDown'.
+
+ Note 1: the engine uses the font's CVT program to determine at
+ which size to enable or disable glyph hinting. Don't be
+ surprised to see unhinted glyphs at sizes < 7pt.
+
+ Note 2: vertical drop-out control has been added to the gray
+ scaling renderer. As a consequence, the library doesn't
+ produce unpleasant results at small ppems with badly
+ hinted glyphs.
+
+ 4. FTTIMER:
+
+ This program is used to benchmark FreeType's scan-converter (the
+ component in charge of translating a vectorial shape description
+ into a bitmap). It does so in preloading all glyphs from a font
+ file, then rendering them as fast as possible in a 640x450
+ buffer. The glyphs are rendered at size 400pt / 96dpi, which is
+ _quite_ big.
+
+ Its usage is:
+
+ timer [-g] [-v] fontfilename
+
+ where
+
+ -g : asks for gray-level rendering at size 200pt instead
+ (a.k.a. font-smoothing)
+
+ -v : asks for the display of the produced bitmap. Beware
+ that display slows things down (display on X11 is
+ _terrible_, especially with gray-levels, but this is
+ not a problem for us :-).
+
+ Note that the returned numbers are not a becnhmark of FreeType's
+ overall performance! Only of the scan-line renderer (which
+ seems quite fast, apparently :-).
+
+ When comparing measured performances across machines, please
+ only consider the undisplayed ones. We're interested in all
+ kinds of results (please provide the following information:
+
+ font file
+ number of rendered glyphs
+ render time
+ total time
+ glyphs / s
+ processor type
+ CPU clock
+
+ and which compiler used (with optimization involved)! This
+ can make a great difference!
+
+ etc.)
+
+ 5. FTDUMP:
+
+ This program is a very simple font dumper. In its current
+ incarnation, it will only output a font's name table, character
+ encoding maps IDs and total memory consumption.
+
+ The "total memory used" reported is the amount that is used by
+ the engine to load one face, with one instance (a point size).
+
+ Each additional instance takes only a fraction of that amount,
+ and is labeled by "instance object". As you can see, FreeType
+ isn't really greedy.
+
+ Usage: ftdump fontpathname[.ttf|.ttc]
+
+
+ 6. FTSTRING:
+
+ This program demonstrates string text generation. It only
+ displays a given message on the screen, and lets you resize it
+ with the classic key bindings 'u', 'j', '+', and '-'.
+
+ Usage:
+
+ ftstring ptsize fontname[.ttf|.ttc] [message_string]
+
+ If the message is omitted, it will revert to the classic
+ typographic test sentence:
+
+ The quick brown fox jumps over the lazy dog
+
+ which is made of all letters of the English alphabet.
+
+ Ftstring only works with font files that contain a Unicode
+ character mapping table (either Windows Unicode or Apple
+ Unicode). For the moment, the message can however only be
+ written in ASCII, as accents aren't supported yet.
+
+
+ 7. FTSTRPNM:
+
+ Usage:
+
+ ftstrpnm [options] filename [string]
+
+ Options:
+
+ -g gray-level rendering (default: off)
+ -h hinting off (default: on)
+ -r X resolution X dpi (default: 96)
+ -p X pointsize X pt (default: 12)
+ -b X border X pixels wide (default: 0)
+
+ This program is quite similar to ftstring but converts the
+ rendered image of the specified string into a bitmap in PBM or
+ PGM format written to stdout; PBM (Portable BitMap) and PGM
+ (Portable GrayMap) formats can be further converted to popular
+ graphics formats like GIF or PNG with the netpbm tool suite
+ available via Internet.
+
+
+ 8. FTERROR:
+
+ This program tests the gettext() functionality on UNIX platforms
+ (usually provided in the GNU gettext package). It will return
+ language specific error and warning messages depending on your
+ locale. Currently French and German translations of the
+ FreeType messages are included -- we invite you to contribute
+ more translations.
+
+ Typically, you have to set the LANG environment variable to your
+ locale to get localized messages. Example:
+
+ LANG=de fterror
+
+ Note that providing message strings for FreeType's error and
+ warning messages is an extension and not part of the FreeType
+ library itself. Please refer to docs/i18n.txt for further
+ details.
+
+--- end of HOWTO ---
diff --git a/xc/extras/FreeType/MakeSub.in b/xc/extras/FreeType/MakeSub.in
new file mode 100644
index 000000000..90d10b9ec
--- /dev/null
+++ b/xc/extras/FreeType/MakeSub.in
@@ -0,0 +1,7 @@
+# this file is part of the FreeType project
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+libdir = @libdir@
+bindir = @bindir@
+includedir = @includedir@
diff --git a/xc/extras/FreeType/Makefile.in b/xc/extras/FreeType/Makefile.in
new file mode 100644
index 000000000..f4e1c94a0
--- /dev/null
+++ b/xc/extras/FreeType/Makefile.in
@@ -0,0 +1,60 @@
+# This file is part of the FreeType project.
+
+RMF = @RM@ -f
+
+MAKEFILE = arch/unix/Makefile
+
+FTLIBDIR = lib
+FTTESTDIR = test
+FTPODIR = po
+
+all: ttlib tttest ttpo
+
+debug: ttlibdebug tttest ttpo
+
+# we can't use the target names 'lib', 'test', etc.
+# because make will believe that the directories are
+# the targets and are up-to-date! Grrr... >:-(
+
+ttlib:
+ cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) all
+
+ttlibdebug:
+ cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) debug
+
+tttest:
+ cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) all
+
+ttpo:
+ cd $(FTPODIR); $(MAKE) all
+
+install:
+ cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) install
+ cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) install
+ cd $(FTPODIR); $(MAKE) install
+
+uninstall:
+ cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) uninstall
+ cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) uninstall
+ cd $(FTPODIR); $(MAKE) uninstall
+
+clean:
+ cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) clean
+ cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) clean
+ cd $(FTPODIR); $(MAKE) clean
+
+distclean:
+ cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) distclean
+ cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) distclean
+ cd $(FTPODIR); $(MAKE) distclean
+ $(RMF) config.cache config.log config.status Makefile \
+ MakeSub ft_conf.h libtool
+
+check:
+ @echo This package does not yet have a validation suite
+
+depend:
+ cd $(FTLIBDIR); $(MAKE) -f $(MAKEFILE) depend
+ cd $(FTTESTDIR); $(MAKE) -f $(MAKEFILE) depend
+
+# end of Makefile.in
diff --git a/xc/extras/FreeType/README b/xc/extras/FreeType/README
new file mode 100644
index 000000000..977ea7816
--- /dev/null
+++ b/xc/extras/FreeType/README
@@ -0,0 +1,488 @@
+
+
+ Welcome to the
+
+ F R E E T Y P E P R O J E C T
+
+ www.freetype.org
+
+ Release 1.2
+
+ The FREE TrueType Font Engine
+
+ Copyright 1996 David Turner <turner@enst.fr>
+ - 1998 Robert Wilhelm <robert@physiol.med.tu-muenchen.de>
+ Werner Lemberg <wl@gnu.org>
+
+
+Table Of Contents:
+
+ A. Introduction
+
+ B. The FreeType mini-FAQ
+
+ C. How to use the test programs
+
+ D. How to use the programs in the 'contrib' directory
+
+
+
+A. Introduction:
+
+ Please read the file `INSTALL' for installation instructions!
+
+ The FreeType engine is a free and portable TrueType font rendering
+ engine. It has been developed to provide TT support to a great
+ variety of platforms and environments.
+
+ Notice that FreeType is a *library*. It is *not* a font server
+ for your preferred environment, even though it has been written to
+ allow the design of many font servers.
+
+ To our knowledge, this is the only royalty-free complete TrueType
+ engine available. Moreover, its quality fully matches these of
+ Windows or the Macintosh, a thing that cannot be said for most
+ other commercial engines available.
+
+ FreeType is a clean-room implementation that is not derived from
+ the original TrueType engine developed by Apple and Microsoft. It
+ has been created with the sole help of the published TrueType
+ specifications, which, to our great surprise and pain, turned out
+ to be extremely poor or misleading in critical areas. Much hard
+ work has been undertaken to solve numerous ambiguities;
+ nevertheless, its end result is a portable, fast quality renderer!
+
+ The library itself takes about 55kByte of Intel code, complete
+ with a TrueType byte-code interpreter and a high-performance
+ scan-line converter.
+
+ You will find in this release:
+
+ - a TrueType engine, with source code in ANSI C and Pascal.
+
+ The C source code has been successfully compiled and run on
+ various platforms, including MS-DOS, OS/2, Amiga, Linux and
+ several other variants of Unix. It should be portable to
+ many other platforms too.
+
+ The Pascal code has been successfully compiled and run on DOS
+ (Borland's BP7) and OS/2 (fPrint's Virtual Pascal). A Delphi
+ port is in beta (the code in freetype/pascal compiles).
+
+ - An API to be used by client applications and font servers,
+ providing several low level abstractions that can be used to
+ open font files and collections, create point sizes and load,
+ process and render glyph outlines and bitmaps.
+
+ - Support for the following features:
+
+ o Font smoothing, a.k.a. gray-level rendering.
+
+ Just like Win95, the renderer uses a 'fine' algorithm
+ that only smoothes diagonals and curves, while keeping
+ the horizontal and vertical stems intact.
+
+ This results in glyphs that are much more legible than
+ the "fuzzy" ones generated by programs like Acrobat.
+
+ o Support for all character mapping formats.
+
+ o A full-featured TrueType byte-code interpreter.
+
+ The engine is able to hint the glyphs to produce
+ excellent output at small sizes. It was extremely
+ difficult to get this component right, due to the
+ ambiguous and misleading TrueType specifications.
+ However, we now *match* Windows and Macintosh
+ qualities.
+
+ o TrueType collection support, when several fonts are
+ embedded in the same file.
+
+ o Support for extensions.
+
+ It is now possible to extend the library in parts to
+ support additional features, like optional tables that
+ are not considered by the current core engine.
+
+ o Kerning support.
+
+ Provided as a sample extension with this release,
+ kerning tables can be accessed from a TrueType font for
+ applications that need it.
+
+ o New in 1.1: Support for vertical metrics.
+
+ It is now possible to load vertical metrics when
+ they're present in a font file. Metrics can be
+ retrieved glyph by glyph, using the loader, or in
+ arrays with a new API.
+
+ o New in 1.1: Support for thread-safety and re-entrancy.
+
+ This support is now in beta. You'll need to specialize
+ the file "ttmutex.c" for your platform to include
+ system-specific synchronization calls.
+
+ Note also that:
+
+ - Though development of the library is mainly performed on OS/2
+ and Linux, the library does not contain system-specific code.
+
+ - The package contains some graphics drivers used by the test
+ programs for display purposes on MS-DOS, OS/2, Amiga, and X11.
+ These drivers are absolutely not mandatory for running the
+ FreeType engine. Some console-mode test programs like 'ftlint'
+ or 'ftdump' don't use graphics at all.
+
+ - FreeType 1.1 is _not_ binary compatible with 1.0, which means
+ that you will need to recompile your programs if they used the
+ engine as a shared library (libttf.so on Linux, or FreeType.dll
+ on Windows). See the file 'freetype/docs/changes.txt' for more
+ information.
+
+
+B. The FreeType mini-FAQ:
+
+ Summary:
+
+ 0. Where to find the latest FreeType release?
+
+ 1. What do you mean by 'Public Release'?
+
+ 2. Did the API changed since the beta ?
+
+ 3. What does the 'Free' in FreeType means?
+ Can you use it in a commercial product? (YES!)
+
+ 4. I have made a small program based on the test programs but I
+ would like to know how to do xxx?
+
+ 5. When will I be able to use FreeType to display TrueType fonts
+ under X11, OS/2 or Wine? (NOW!)
+
+ 6. Trying to compile the FreeType sources gives me lots of
+ warnings with my ANSI C compliant compiler!
+
+ ------------------------------------------------------------------
+
+ 0. Where to find the latest FreeType release?
+
+ The latest package is usually uploaded to various source
+ repositories, like SunSite, SimTel, or Hobbes. There are two
+ archive formats (zip and tar.gz), which also differ by their
+ CR/LF conventions.
+
+ * for DOS and OS/2: 'ft-10.zip'
+
+ which should be available at:
+
+ Hobbes: ftp://ftp.cdrom.com/pub/os2/fonts
+ SimTel: ftp://oak.oakland.edu/pub/simtel.net/msdos/graphics
+
+ * for UNIX and Amiga: 'freetype-1.2.tar.gz'
+
+ look at:
+
+ SunSite: ftp://sunsite.unc.edu/pub/Linux/X11/fonts
+
+ * As uploading can take several days before the package
+ becomes available to the public, we advise you to download
+ it from our own ftp site if you read this message few days
+ after the announcement at:
+
+ ftp://ftp.freetype.org/pub/freetype
+
+
+ We have registered the "freetype.org" domain. Our main page
+ is now at:
+
+ http://www.freetype.org
+
+ (Screen shots available)
+
+ There are also four mailing lists:
+
+ o freetype-announce@lists.lrz-muenchen.de
+
+ Announcements only about new versions of FreeType
+ and related packages. This list is moderated and
+ expected to have very low traffic.
+
+
+ o freetype@lists.lrz-muenchen.de
+
+ Discusses general use of FreeType, future and needed
+ additions, as well as many other font-related
+ discussions which do not always relate directly to the
+ FreeType code itself...
+
+
+ o freetype-devel@lists.lrz-muenchen.de
+
+ Discusses development, design choices, portability
+ issues, internals, specific licenses, etc.
+
+
+ o freetype-bugs@freetype.org
+
+ To report bugs you believe come from the engine :-)
+ Notice the different address! If you want help fixing
+ bigs, contact rober@freetype.org to be manually subscribed.
+
+
+ To subscribe, send the usual subscription commands to:
+
+ majordomo@lists.lrz-muenchen.de
+
+
+ Any suggestions/bug reports are welcome.
+
+ ------------------------------------------------------------------
+
+ 1. What do you mean by 'Public Release'?
+
+ This release fixes some bugs found in FreeType 1.1.
+
+ Note that FreeType will soon go under a major re-design. The
+ library will evolve from a TrueType-specific driver to a more
+ general and high-level text rendering library, with the
+ ability to support several font file formats (bitmaps,
+ TrueType, hopefully Type1 PostScript). The first "try" will
+ be released as FreeType 2.0, but the font driver(s) alone
+ will still be available for separate compilation.
+
+ Of course, we keep the same license :-)
+
+
+ ------------------------------------------------------------------
+
+ 2. Did the API change since the beta ?
+
+ Yes, there were a few changes that are summed up in the file
+ 'docs/changes.txt'. Please read it thorougly before
+ modifying your code to adapt to this release.
+
+ Normally, if your source only used the FreeType 1.0 API, and
+ _didn't_ access directly the outline structures (these
+ changed in the way), it should recompile flawlessly on the
+ first try (with very small exceptions).
+
+
+ ------------------------------------------------------------------
+
+ 3. What does the 'Free' in FreeType means?
+ Can you use it in a commercial product? (YES!)
+
+ We have placed this release under the same old FreeType
+ license.
+
+ It was inspired by the BSD, Artistic and IJG (Independent
+ JPEG group) ones, which specifically encourage use of this
+ software in commercial products!
+
+ The reason we did this is that we believe that TrueType is a
+ very useful technology, and want to make it available on all
+ machines and platforms. The license is there to ensure that
+ the engine can be spread as widely as possible.
+
+ However, free does not mean public domain. This engine is
+ copyrighted by its authors, and they will fiercely defend
+ their rights.
+
+
+ ------------------------------------------------------------------
+
+ 4. I have made a small program based on the test programs but I
+ would like to know how to do xxx?
+
+ (Where xxx is a feature lacking from the current
+ implementation).
+
+ First of all, read the documentation. The user guide gives
+ some basic hints and concepts. You can also read the source
+ code of the test programs that you didn't consider yet. If
+ you're really stuck, mail your question to:
+
+ freetype@lists.lrz-muenchen.de
+
+ We'll try to help you.
+
+
+ ------------------------------------------------------------------
+
+ 5. When will I be able to use FreeType to display TrueType fonts
+ under X11, OS/2, or Wine?
+
+ You can already do that under X11 and OS/2 :-) Go to the
+ FreeType web page (www.freetype.org) for up-to-date
+ information.
+
+ And yes, it looks terrific!
+
+ For X11, you could also take a look at "xfstt", an
+ independent TrueType font server for Unix which doesn't rely
+ on the FreeType code.
+
+ You're welcome to volunteer for other platforms, like:
+
+ Amiga, RISC OS, BeOS, and others
+
+ Please contact freetype-devel@lists.lrz-muenchen.de for more
+ information.
+
+
+ ------------------------------------------------------------------
+
+ 6. Trying to compile the FreeType sources gives me lots of
+ warnings with my ANSI C compliant compiler!
+
+ We use gcc as our reference compiler for warnings. This means
+ that we use the "-ansi -pedantic -Wall" flags and try to get
+ rid of warnings in this situation.
+
+ If you're compiling with another compiler, you may encounter
+ warnings, not errors.
+
+ We have spent much efforts to reduce seriously the number of
+ warnings produced by major compilers, including Visual Age,
+ Visual C++ and Borland C++.
+
+ Note that the Borland compilers seem to produce lots of
+ irrelevant warnings (like 'potential loss of precision').
+
+
+
+C. How to use the test programs:
+
+ This package includes several test programs in the "freetype/test"
+ directory. Read the "HOWTO" files to learn how to compile them.
+
+ Note that all test programs share the same key map when
+ displaying. Using the arrow or function keys would have been good
+ to but we preferred a common map rather than specifying it for
+ each platform:
+
+ x : fine counter-clockwise rotation (ftzoom only)
+ c : fine clockwise rotation (ftzoom only)
+
+ v : fast counter-clockwise rotation (ftzoom only)
+ b : fast clockwise rotation (ftzoom only)
+
+ h : toggle hinting on/off
+
+ + : fast scale up
+ - : fast scale down
+ u : fine scale up
+ j : fine scale down
+
+ l : go to next glyph
+ k : go to previous glyph
+
+ o : go to tenth next glyph
+ i : go to tenth previous glyph
+
+ 9 : go to hundredth next glyph (useful for CJK fonts)
+ 0 : go to hundredth previous glyph
+
+ ( : go to 1000th next glyph
+ ) : go to 1000th previous glyph
+
+ { : go to 10000th next glyph
+ } : go to 10000th previous glyph
+
+ ESC :
+ q : exit
+
+
+ These keys were chosen because they're available on all platforms.
+
+
+- FTTIMER:
+
+ This is a simple performance timer for the engine. It will load a
+ TrueType font given as an argument and try to render each glyph as
+ fast as possible, giving the total time elapsed.
+
+ This program only times the scan-line converter's job by rendering
+ all glyphs at a size of 400pt.
+
+ (supports font-smoothing and display)
+
+
+- FTZOOM:
+
+ This program is a very simple glyph viewer. Specify a TrueType
+ font as an argument, and it will try to load it and allows you to
+ view/scale/rotate any glyph of it. Supports font smoothing.
+ Doesn't hint glyphs. Use the -p and -e flags to select a CMAP.
+
+
+- FTLINT:
+
+ This program will hint each glyph of a font file, at a given point
+ size. This is useful to detect bugs in the interpreter (or in the
+ font file).
+
+
+- FTVIEW:
+
+ This program will display all glyphs in a given font, applying
+ hinting to each one. Try it, the results are really pleasant.
+ Supports font-smoothing.
+
+ You can change the point size whenever you want. The OS/2 viewer
+ comes with a magnifying sub-window that lets you inspect pixel
+ details (like font-smoothing).
+
+
+- FTDUMP:
+
+ A simple TrueType font or collection dumper.
+
+
+- FTSTRING:
+
+ A simple program to show off string text generation. Used to
+ display a given message on the screen with a given font, and
+ eventually resize it as you want.
+
+
+- FTSTRPNM:
+
+ Use this program to convert a rendered text string into the PGM or
+ PBM format which can be further converted to popular formats like
+ GIF or PNG with the netpbm tool suite.
+
+
+- FTERROR:
+
+ This small test program is UNIX-specific. It tests the gettext()
+ functionality for internationalized messages.
+
+
+
+D. HOW TO USE THE PROGRAMS IN THE 'CONTRIB' DIRECTORY:
+
+ These programs (currently ftos2, ttf2bmf, and ttf2pk) are
+ contributions to FreeType and not really part of it. Please read
+ the documentation files in the respective subdirectories how to
+ compile and install them.
+
+
+Of course, all source code is provided 'as is'. Please read the
+file 'license.txt' for more information.
+
+We hope you'll find this engine useful, and look forward to file.
+your feed-back. We're of course very interested in bug reports, as
+well as FreeType success stories :-)
+
+
+Thanks for your time and consideration,
+
+
+ David Turner, Robert Wilhelm, Werner Lemberg,
+ and all the FreeType enthusiasts...
+
+
+--- end of readme.1st --
diff --git a/xc/extras/FreeType/README.XFree86 b/xc/extras/FreeType/README.XFree86
new file mode 100644
index 000000000..07a978332
--- /dev/null
+++ b/xc/extras/FreeType/README.XFree86
@@ -0,0 +1,20 @@
+A few files in this directory and all the files in the `lib/'
+subdirectory come from the FreeType 1.1 distribution. Please consult
+
+ <URL:http://www.freetype.org>
+ <URL:ftp://ftp.freetype.org>
+
+for more information.
+
+Those files have been slightly modified. All the changes are marked
+with a comment saying `Xserver-specific'.
+
+
+When importing version A.B of FreeType, use:
+
+ cvs import -m "FreeType version A.B" xc/extras/FreeType FreeType FreeType-A_B
+
+
+Files that are modified relative to the most recent import should have
+the ident text: $XFree86: xc/extras/FreeType/README.XFree86,v 1.2 1998/09/06 05:05:29 dawes Exp $ added in a comment.
+
diff --git a/xc/extras/FreeType/aclocal.m4 b/xc/extras/FreeType/aclocal.m4
new file mode 100644
index 000000000..a71a182fc
--- /dev/null
+++ b/xc/extras/FreeType/aclocal.m4
@@ -0,0 +1,263 @@
+## libtool.m4 - Configure libtool for the target system. -*-Shell-script-*-
+## Copyright (C) 1996-1998 Free Software Foundation, Inc.
+## Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful, but
+## WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+## General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+##
+## As a special exception to the GNU General Public License, if you
+## distribute this file as part of a program that contains a
+## configuration script generated by Autoconf, you may include it under
+## the same distribution terms that you use for the rest of that program.
+
+# serial 24 AM_PROG_LIBTOOL
+AC_DEFUN(AM_PROG_LIBTOOL,
+[AC_REQUIRE([AM_ENABLE_SHARED])dnl
+AC_REQUIRE([AM_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_RANLIB])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AM_PROG_LD])dnl
+AC_REQUIRE([AM_PROG_NM])dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+dnl
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags=
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ CFLAGS="$CFLAGS -belf"
+ ;;
+esac
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| AC_MSG_ERROR([libtool configure failed])
+])
+
+# AM_ENABLE_SHARED - implement the --enable-shared flag
+# Usage: AM_ENABLE_SHARED[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AM_ENABLE_SHARED,
+[define([AM_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(shared,
+changequote(<<, >>)dnl
+<< --enable-shared build shared libraries [default=>>AM_ENABLE_SHARED_DEFAULT]
+changequote([, ])dnl
+[ --enable-shared=PKGS only build shared libraries if the current package
+ appears as an element in the PKGS list],
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_shared=AM_ENABLE_SHARED_DEFAULT)dnl
+])
+
+# AM_DISABLE_SHARED - set the default shared flag to --disable-shared
+AC_DEFUN(AM_DISABLE_SHARED,
+[AM_ENABLE_SHARED(no)])
+
+# AM_DISABLE_STATIC - set the default static flag to --disable-static
+AC_DEFUN(AM_DISABLE_STATIC,
+[AM_ENABLE_STATIC(no)])
+
+# AM_ENABLE_STATIC - implement the --enable-static flag
+# Usage: AM_ENABLE_STATIC[(DEFAULT)]
+# Where DEFAULT is either `yes' or `no'. If omitted, it defaults to
+# `yes'.
+AC_DEFUN(AM_ENABLE_STATIC,
+[define([AM_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE(static,
+changequote(<<, >>)dnl
+<< --enable-static build static libraries [default=>>AM_ENABLE_STATIC_DEFAULT]
+changequote([, ])dnl
+[ --enable-static=PKGS only build shared libraries if the current package
+ appears as an element in the PKGS list],
+[p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac],
+enable_static=AM_ENABLE_STATIC_DEFAULT)dnl
+])
+
+
+# AM_PROG_LD - find the path to the GNU or non-GNU linker
+AC_DEFUN(AM_PROG_LD,
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by GCC])
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ changequote(, )dnl
+ /* | [A-Za-z]:\\*)
+ changequote([, ])dnl
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(ac_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_SUBST(LD)
+AM_PROG_LD_GNU
+])
+
+AC_DEFUN(AM_PROG_LD_GNU,
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], ac_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi])
+])
+
+# AM_PROG_NM - find the path to a BSD-compatible name lister
+AC_DEFUN(AM_PROG_NM,
+[AC_MSG_CHECKING([for BSD-compatible nm])
+AC_CACHE_VAL(ac_cv_path_NM,
+[case "$NM" in
+changequote(, )dnl
+/* | [A-Za-z]:\\*)
+changequote([, ])dnl
+ ac_cv_path_NM="$NM" # Let the user override the test with a path.
+ ;;
+*)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ else
+ ac_cv_path_NM="$ac_dir/nm"
+ fi
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+ ;;
+esac])
+NM="$ac_cv_path_NM"
+AC_MSG_RESULT([$NM])
+AC_SUBST(NM)
+])
diff --git a/xc/extras/FreeType/announce b/xc/extras/FreeType/announce
new file mode 100644
index 000000000..6b0c84b0f
--- /dev/null
+++ b/xc/extras/FreeType/announce
@@ -0,0 +1,40 @@
+
+
+ Announcing
+
+
+ F R E E T Y P E 1 . 1
+
+ The Public Release!
+
+
+ The FREE TrueType Font Engine
+
+
+ Copyright (C) 1996-1998 The FreeType Development Team
+
+
+
+ The FreeType engine is a free and portable TrueType font rendering
+ engine, available in ANSI C and Pascal source code. It has been
+ developed to provide TT support to a great variety of platforms
+ and environments.
+
+ Notice that FreeType is a *library*. It is *not* a font server
+ for your preferred environment, even though it has been designed
+ to be the basis of many high-level libraries, tools and font
+ servers.
+
+ It's a clean-room implementation that is not derived from the
+ original TT engine developed by Apple and Microsoft, though it
+ matches it regarding rendering quality. To our knowledge, it's
+ the only royalty-free complete TrueType engine available.
+
+ Version 1.1 fixes several bugs found in 1.0, as well as provide
+ the engine with enhanced capabilities, like support for vertical
+ metrics.
+
+ For more information, please visit the freetype web site at:
+
+ http://www.freetype.org
+
diff --git a/xc/extras/FreeType/config.guess b/xc/extras/FreeType/config.guess
new file mode 100755
index 000000000..dafad1119
--- /dev/null
+++ b/xc/extras/FreeType/config.guess
@@ -0,0 +1,940 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
+#
+# 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
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+ PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+ alpha:OSF1:*:*)
+ if test $UNAME_RELEASE = "V4.0"; then
+ UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+ fi
+ # A Vn.n version is a released version.
+ # A Tn.n version is a released field test version.
+ # A Xn.n version is an unreleased experimental baselevel.
+ # 1.2 uses "1.2" for uname -r.
+ cat <<EOF >dummy.s
+ .globl main
+ .ent main
+main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ ${CC-cc} dummy.s -o dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+ fi
+ rm -f dummy.s dummy
+ echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr [[A-Z]] [[a-z]]`
+ exit 0 ;;
+ 21064:Windows_NT:50:3)
+ echo alpha-dec-winnt3.5
+ exit 0 ;;
+ Amiga*:UNIX_System_V:4.0:*)
+ echo m68k-cbm-sysv4
+ exit 0;;
+ amiga:NetBSD:*:*)
+ echo m68k-cbm-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ amiga:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ *:[Aa]miga[Oo][Ss]:*:*)
+ echo ${UNAME_MACHINE}-unknown-amigaos
+ exit 0 ;;
+ arc64:OpenBSD:*:*)
+ echo mips64el-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hkmips:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ pmax:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sgi:OpenBSD:*:*)
+ echo mips-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ wgrisc:OpenBSD:*:*)
+ echo mipsel-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+ echo arm-acorn-riscix${UNAME_RELEASE}
+ exit 0;;
+ arm32:NetBSD:*:*)
+ echo arm-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ SR2?01:HI-UX/MPP:*:*)
+ echo hppa1.1-hitachi-hiuxmpp
+ exit 0;;
+ Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+ # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+ if test "`(/bin/universe) 2>/dev/null`" = att ; then
+ echo pyramid-pyramid-sysv3
+ else
+ echo pyramid-pyramid-bsd
+ fi
+ exit 0 ;;
+ NILE:*:*:dcosx)
+ echo pyramid-pyramid-svr4
+ exit 0 ;;
+ sun4H:SunOS:5.*:*)
+ echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+ echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ i86pc:SunOS:5.*:*)
+ echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:6*:*)
+ # According to config.sub, this is the proper way to canonicalize
+ # SunOS6. Hard to guess exactly what SunOS6 will be like, but
+ # it's likely to be more like Solaris than SunOS4.
+ echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ sun4*:SunOS:*:*)
+ case "`/usr/bin/arch -k`" in
+ Series*|S4*)
+ UNAME_RELEASE=`uname -v`
+ ;;
+ esac
+ # Japanese Language versions have a version number like `4.1.3-JL'.
+ echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+ exit 0 ;;
+ sun3*:SunOS:*:*)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ sun*:*:4.2BSD:*)
+ UNAME_RELEASE=`(head -1 /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+ test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+ case "`/bin/arch`" in
+ sun3)
+ echo m68k-sun-sunos${UNAME_RELEASE}
+ ;;
+ sun4)
+ echo sparc-sun-sunos${UNAME_RELEASE}
+ ;;
+ esac
+ exit 0 ;;
+ aushp:SunOS:*:*)
+ echo sparc-auspex-sunos${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:NetBSD:*:*)
+ echo m68k-atari-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ atari*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:NetBSD:*:*)
+ echo m68k-sun-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ sun3*:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:NetBSD:*:*)
+ echo m68k-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mac68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme68k:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ mvme88k:OpenBSD:*:*)
+ echo m88k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ powerpc:machten:*:*)
+ echo powerpc-apple-machten${UNAME_RELEASE}
+ exit 0 ;;
+ macppc:NetBSD:*:*)
+ echo powerpc-apple-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ RISC*:Mach:*:*)
+ echo mips-dec-mach_bsd4.3
+ exit 0 ;;
+ RISC*:ULTRIX:*:*)
+ echo mips-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ VAX*:ULTRIX*:*:*)
+ echo vax-dec-ultrix${UNAME_RELEASE}
+ exit 0 ;;
+ 2020:CLIX:*:*)
+ echo clipper-intergraph-clix${UNAME_RELEASE}
+ exit 0 ;;
+ mips:*:*:UMIPS | mips:*:*:RISCos)
+ sed 's/^ //' << EOF >dummy.c
+ int main (argc, argv) int argc; char **argv; {
+ #if defined (host_mips) && defined (MIPSEB)
+ #if defined (SYSTYPE_SYSV)
+ 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);
+ #endif
+ #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+ printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+ #endif
+ #endif
+ exit (-1);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy \
+ && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+ && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo mips-mips-riscos${UNAME_RELEASE}
+ exit 0 ;;
+ Night_Hawk:Power_UNIX:*:*)
+ echo powerpc-harris-powerunix
+ exit 0 ;;
+ m88k:CX/UX:7*:*)
+ echo m88k-harris-cxux7
+ exit 0 ;;
+ m88k:*:4*:R4*)
+ echo m88k-motorola-sysv4
+ exit 0 ;;
+ m88k:*:3*:R3*)
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ AViiON:dgux:*:*)
+ # DG/UX returns AViiON for all architectures
+ UNAME_PROCESSOR=`/usr/bin/uname -p`
+ if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+ if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+ -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+ echo m88k-dg-dgux${UNAME_RELEASE}
+ else
+ echo m88k-dg-dguxbcs${UNAME_RELEASE}
+ fi
+ else echo i586-dg-dgux${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ M88*:DolphinOS:*:*) # DolphinOS (SVR3)
+ echo m88k-dolphin-sysv3
+ exit 0 ;;
+ M88*:*:R3*:*)
+ # Delta 88k system running SVR3
+ echo m88k-motorola-sysv3
+ exit 0 ;;
+ XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+ echo m88k-tektronix-sysv3
+ exit 0 ;;
+ Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+ echo m68k-tektronix-bsd
+ exit 0 ;;
+ *:IRIX*:*:*)
+ echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+ exit 0 ;;
+ ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+ echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id
+ exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX '
+ i?86:AIX:*:*)
+ echo i386-ibm-aix
+ exit 0 ;;
+ *:AIX:2:3)
+ if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+ sed 's/^ //' << EOF >dummy.c
+ #include <sys/systemcfg.h>
+
+ main()
+ {
+ if (!__power_pc())
+ exit(1);
+ puts("powerpc-ibm-aix3.2.5");
+ exit(0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo rs6000-ibm-aix3.2.5
+ elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+ echo rs6000-ibm-aix3.2.4
+ else
+ echo rs6000-ibm-aix3.2
+ fi
+ exit 0 ;;
+ *:AIX:*:4)
+ if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+ IBM_ARCH=rs6000
+ else
+ IBM_ARCH=powerpc
+ fi
+ if [ -x /usr/bin/oslevel ] ; then
+ IBM_REV=`/usr/bin/oslevel`
+ else
+ IBM_REV=4.${UNAME_RELEASE}
+ fi
+ echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+ exit 0 ;;
+ *:AIX:*:*)
+ echo rs6000-ibm-aix
+ exit 0 ;;
+ ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+ echo romp-ibm-bsd4.4
+ exit 0 ;;
+ ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC NetBSD and
+ echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to
+ exit 0 ;; # report: romp-ibm BSD 4.3
+ *:BOSX:*:*)
+ echo rs6000-bull-bosx
+ exit 0 ;;
+ DPX/2?00:B.O.S.:*:*)
+ echo m68k-bull-sysv3
+ exit 0 ;;
+ 9000/[34]??:4.3bsd:1.*:*)
+ echo m68k-hp-bsd
+ exit 0 ;;
+ hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+ echo m68k-hp-bsd4.4
+ exit 0 ;;
+ 9000/[3478]??:HP-UX:*:*)
+ case "${UNAME_MACHINE}" in
+ 9000/31? ) HP_ARCH=m68000 ;;
+ 9000/[34]?? ) HP_ARCH=m68k ;;
+ 9000/7?? | 9000/8?[1679] )
+ sed 's/^ //' << EOF >dummy.c
+ #include <stdlib.h>
+ #include <unistd.h>
+
+ int main ()
+ {
+ #if defined(_SC_KERNEL_BITS)
+ long bits = sysconf(_SC_KERNEL_BITS);
+ #endif
+ long cpu = sysconf (_SC_CPU_VERSION);
+
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+ case CPU_PA_RISC2_0:
+ #if defined(_SC_KERNEL_BITS)
+ switch (bits)
+ {
+ case 64: puts ("hppa2.0w"); break;
+ case 32: puts ("hppa2.0n"); break;
+ default: puts ("hppa2.0"); break;
+ } break;
+ #else /* !defined(_SC_KERNEL_BITS) */
+ puts ("hppa2.0"); break;
+ #endif
+ default: puts ("hppa1.0"); break;
+ }
+ exit (0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && HP_ARCH=`./dummy`
+ rm -f dummy.c dummy
+ esac
+ HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+ echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+ exit 0 ;;
+ 3050*:HI-UX:*:*)
+ sed 's/^ //' << EOF >dummy.c
+ #include <unistd.h>
+ int
+ main ()
+ {
+ long cpu = sysconf (_SC_CPU_VERSION);
+ /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+ true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct
+ results, however. */
+ if (CPU_IS_PA_RISC (cpu))
+ {
+ switch (cpu)
+ {
+ case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+ case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+ default: puts ("hppa-hitachi-hiuxwe2"); break;
+ }
+ }
+ else if (CPU_IS_HP_MC68K (cpu))
+ puts ("m68k-hitachi-hiuxwe2");
+ else puts ("unknown-hitachi-hiuxwe2");
+ exit (0);
+ }
+EOF
+ ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ echo unknown-hitachi-hiuxwe2
+ exit 0 ;;
+ 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+ echo hppa1.1-hp-bsd
+ exit 0 ;;
+ 9000/8??:4.3bsd:*:*)
+ echo hppa1.0-hp-bsd
+ exit 0 ;;
+ hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+ echo hppa1.1-hp-osf
+ exit 0 ;;
+ hp8??:OSF1:*:*)
+ echo hppa1.0-hp-osf
+ exit 0 ;;
+ i?86:OSF1:*:*)
+ if [ -x /usr/sbin/sysversion ] ; then
+ echo ${UNAME_MACHINE}-unknown-osf1mk
+ else
+ echo ${UNAME_MACHINE}-unknown-osf1
+ fi
+ exit 0 ;;
+ parisc*:Lites*:*:*)
+ echo hppa1.1-hp-lites
+ exit 0 ;;
+ C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ CRAY*X-MP:*:*:*)
+ echo xmp-cray-unicos
+ exit 0 ;;
+ CRAY*Y-MP:*:*:*)
+ echo ymp-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY*[A-Z]90:*:*:*)
+ echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+ exit 0 ;;
+ CRAY*TS:*:*:*)
+ echo t90-cray-unicos${UNAME_RELEASE}
+ exit 0 ;;
+ CRAY-2:*:*:*)
+ echo cray2-cray-unicos
+ exit 0 ;;
+ F300:UNIX_System_V:*:*)
+ FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+ FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+ echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+ exit 0 ;;
+ F301:UNIX_System_V:*:*)
+ echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+ exit 0 ;;
+ hp3[0-9][05]:NetBSD:*:*)
+ echo m68k-hp-netbsd${UNAME_RELEASE}
+ exit 0 ;;
+ hp300:OpenBSD:*:*)
+ echo m68k-unknown-openbsd${UNAME_RELEASE}
+ exit 0 ;;
+ i?86:BSD/386:*:* | *:BSD/OS:*:*)
+ echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+ exit 0 ;;
+ *:FreeBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+ exit 0 ;;
+ *:NetBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ *:OpenBSD:*:*)
+ echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ exit 0 ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin32
+ exit 0 ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit 0 ;;
+ p*:CYGWIN*:*)
+ echo powerpcle-unknown-cygwin32
+ exit 0 ;;
+ prep*:SunOS:5.*:*)
+ echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+ exit 0 ;;
+ *:GNU:*:*)
+ echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+ exit 0 ;;
+ *:Linux:*:*)
+ # uname on the ARM produces all sorts of strangeness, and we need to
+ # filter it out.
+ case "$UNAME_MACHINE" in
+ arm* | sa110*) UNAME_MACHINE="arm" ;;
+ esac
+
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us.
+ ld_help_string=`ld --help 2>&1`
+ ld_supported_emulations=`echo $ld_help_string \
+ | sed -ne '/supported emulations:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported emulations: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_emulations" in
+ i?86linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0 ;;
+ i?86coff) echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0 ;;
+ sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ armlinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ m68klinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
+ elf32ppc) echo "powerpc-unknown-linux-gnu" ; exit 0 ;;
+ esac
+
+ if test "${UNAME_MACHINE}" = "alpha" ; then
+ sed 's/^ //' <<EOF >dummy.s
+ .globl main
+ .ent main
+ main:
+ .frame \$30,0,\$26,0
+ .prologue 0
+ .long 0x47e03d80 # implver $0
+ lda \$2,259
+ .long 0x47e20c21 # amask $2,$1
+ srl \$1,8,\$2
+ sll \$2,2,\$2
+ sll \$0,3,\$0
+ addl \$1,\$0,\$0
+ addl \$2,\$0,\$0
+ ret \$31,(\$26),1
+ .end main
+EOF
+ LIBC=""
+ ${CC-cc} dummy.s -o dummy 2>/dev/null
+ if test "$?" = 0 ; then
+ ./dummy
+ case "$?" in
+ 7)
+ UNAME_MACHINE="alpha"
+ ;;
+ 15)
+ UNAME_MACHINE="alphaev5"
+ ;;
+ 14)
+ UNAME_MACHINE="alphaev56"
+ ;;
+ 10)
+ UNAME_MACHINE="alphapca56"
+ ;;
+ 16)
+ UNAME_MACHINE="alphaev6"
+ ;;
+ esac
+
+ objdump --private-headers dummy | \
+ grep ld.so.1 > /dev/null
+ if test "$?" = 0 ; then
+ LIBC="libc1"
+ fi
+ fi
+ rm -f dummy.s dummy
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} ; exit 0
+ elif test "${UNAME_MACHINE}" = "mips" ; then
+ cat >dummy.c <<EOF
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#ifdef __MIPSEB__
+ printf ("%s-unknown-linux-gnu\n", argv[1]);
+#endif
+#ifdef __MIPSEL__
+ printf ("%sel-unknown-linux-gnu\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ else
+ # Either a pre-BFD a.out linker (linux-gnuoldld)
+ # or one that does not give us useful --help.
+ # GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
+ # If ld does not provide *any* "supported emulations:"
+ # that means it is gnuoldld.
+ echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations:"
+ test $? != 0 && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+
+ case "${UNAME_MACHINE}" in
+ i?86)
+ VENDOR=pc;
+ ;;
+ *)
+ VENDOR=unknown;
+ ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ cat >dummy.c <<EOF
+#include <features.h>
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+#ifdef __ELF__
+# ifdef __GLIBC__
+# if __GLIBC__ >= 2
+ printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+# else
+ printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
+# endif
+#else
+ printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
+#endif
+ return 0;
+}
+EOF
+ ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+ rm -f dummy.c dummy
+ fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+ i?86:DYNIX/ptx:4*:*)
+ echo i386-sequent-sysv4
+ exit 0 ;;
+ i?86:UNIX_SV:4.2MP:2.*)
+ # Unixware is an offshoot of SVR4, but it has its own version
+ # number series starting with 2...
+ # I am not positive that other SVR4 systems won't match this,
+ # I just have to hope. -- rms.
+ # Use sysv4.2uw... so that sysv4* matches it.
+ echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+ exit 0 ;;
+ i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+ if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+ echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+ else
+ echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ i?86:*:3.2:*)
+ if test -f /usr/options/cb.name; then
+ UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+ echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+ elif /bin/uname -X 2>/dev/null >/dev/null ; then
+ UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+ (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+ (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+ && UNAME_MACHINE=i586
+ echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+ else
+ echo ${UNAME_MACHINE}-pc-sysv32
+ fi
+ exit 0 ;;
+ pc:*:*:*)
+ # uname -m prints for DJGPP always 'pc', but it prints nothing about
+ # the processor, so we play safe by assuming i386.
+ echo i386-pc-msdosdjgpp
+ exit 0 ;;
+ Intel:Mach:3*:*)
+ echo i386-pc-mach3
+ exit 0 ;;
+ paragon:*:*:*)
+ echo i860-intel-osf1
+ exit 0 ;;
+ i860:*:4.*:*) # i860-SVR4
+ if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+ echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+ else # Add other i860-SVR4 vendors below as they are discovered.
+ echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4
+ fi
+ exit 0 ;;
+ mini*:CTIX:SYS*5:*)
+ # "miniframe"
+ echo m68010-convergent-sysv
+ exit 0 ;;
+ M68*:*:R3V[567]*:*)
+ test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+ 3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+ OS_REL=''
+ test -r /etc/.relid \
+ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+ /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+ 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+ /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+ && echo i486-ncr-sysv4 && exit 0 ;;
+ m68*:LynxOS:2.*:*)
+ echo m68k-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ mc68030:UNIX_System_V:4.*:*)
+ echo m68k-atari-sysv4
+ exit 0 ;;
+ i?86:LynxOS:2.*:*)
+ echo i386-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ TSUNAMI:LynxOS:2.*:*)
+ echo sparc-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+ echo rs6000-unknown-lynxos${UNAME_RELEASE}
+ exit 0 ;;
+ SM[BE]S:UNIX_SV:*:*)
+ echo mips-dde-sysv${UNAME_RELEASE}
+ exit 0 ;;
+ RM*:SINIX-*:*:*)
+ echo mips-sni-sysv4
+ exit 0 ;;
+ *:SINIX-*:*:*)
+ if uname -p 2>/dev/null >/dev/null ; then
+ UNAME_MACHINE=`(uname -p) 2>/dev/null`
+ echo ${UNAME_MACHINE}-sni-sysv4
+ else
+ echo ns32k-sni-sysv
+ fi
+ exit 0 ;;
+ PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+ # says <Richard.M.Bartel@ccMail.Census.GOV>
+ echo i586-unisys-sysv4
+ exit 0 ;;
+ *:UNIX_System_V:4*:FTX*)
+ # From Gerald Hewes <hewes@openmarket.com>.
+ # How about differentiating between stratus architectures? -djm
+ echo hppa1.1-stratus-sysv4
+ exit 0 ;;
+ *:*:*:FTX*)
+ # From seanf@swdc.stratus.com.
+ echo i860-stratus-sysv4
+ exit 0 ;;
+ mc68*:A/UX:*:*)
+ echo m68k-apple-aux${UNAME_RELEASE}
+ exit 0 ;;
+ news*:NEWS-OS:*:6*)
+ echo mips-sony-newsos6
+ exit 0 ;;
+ R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R4000:UNIX_SV:*:*)
+ if [ -d /usr/nec ]; then
+ echo mips-nec-sysv${UNAME_RELEASE}
+ else
+ echo mips-unknown-sysv${UNAME_RELEASE}
+ fi
+ exit 0 ;;
+ BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
+ echo powerpc-be-beos
+ exit 0 ;;
+ BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only.
+ echo powerpc-apple-beos
+ exit 0 ;;
+ BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
+ echo i586-pc-beos
+ exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+ /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
+ I don't know.... */
+ printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+ printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+ "4"
+#else
+ ""
+#endif
+ ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+ printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+ printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+ int version;
+ version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+ printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+ exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+ printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+ printf ("ns32k-encore-mach\n"); exit (0);
+#else
+ printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+ printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+ printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+ printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+ struct utsname un;
+
+ uname(&un);
+
+ if (strncmp(un.version, "V2", 2) == 0) {
+ printf ("i386-sequent-ptx2\n"); exit (0);
+ }
+ if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+ printf ("i386-sequent-ptx1\n"); exit (0);
+ }
+ printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+ printf ("vax-dec-bsd\n"); exit (0);
+#else
+ printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+ printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+ exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+ case `getsysinfo -f cpu_type` in
+ c1*)
+ echo c1-convex-bsd
+ exit 0 ;;
+ c2*)
+ if getsysinfo -f scalar_acc
+ then echo c32-convex-bsd
+ else echo c2-convex-bsd
+ fi
+ exit 0 ;;
+ c34*)
+ echo c34-convex-bsd
+ exit 0 ;;
+ c38*)
+ echo c38-convex-bsd
+ exit 0 ;;
+ c4*)
+ echo c4-convex-bsd
+ exit 0 ;;
+ esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/xc/extras/FreeType/config.sub b/xc/extras/FreeType/config.sub
new file mode 100755
index 000000000..ba9b041ec
--- /dev/null
+++ b/xc/extras/FreeType/config.sub
@@ -0,0 +1,955 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+# Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# 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
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support. The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+ echo Configuration name missing. 1>&2
+ echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+ echo "or $0 ALIAS" 1>&2
+ echo where ALIAS is a recognized configuration type. 1>&2
+ exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+ *local*)
+ echo $1
+ exit 0
+ ;;
+ *)
+ ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+ linux-gnu*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+ if [ $basic_machine != $1 ]
+ then os=`echo $1 | sed 's/.*-/-/'`
+ else os=; fi
+ ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work. We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+ -sun*os*)
+ # Prevent following clause from handling this invalid input.
+ ;;
+ -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+ -apple)
+ os=
+ basic_machine=$1
+ ;;
+ -hiux*)
+ os=-hiuxwe2
+ ;;
+ -sco5)
+ os=sco3.2v5
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco4)
+ os=-sco3.2v4
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2.[4-9]*)
+ os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco3.2v[4-9]*)
+ # Don't forget version if it is 3.2v4 or newer.
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -sco*)
+ os=-sco3.2v2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -isc)
+ os=-isc2.2
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -clix*)
+ basic_machine=clipper-intergraph
+ ;;
+ -isc*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+ ;;
+ -lynx*)
+ os=-lynxos
+ ;;
+ -ptx*)
+ basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+ ;;
+ -windowsnt*)
+ os=`echo $os | sed -e 's/windowsnt/winnt/'`
+ ;;
+ -psos*)
+ os=-psos
+ ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+ # Recognize the basic CPU types without company name.
+ # Some are omitted here because they have special meanings below.
+ tahoe | i860 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \
+ | arme[lb] | pyramid | mn10200 | mn10300 \
+ | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
+ | alpha | alphaev5 | alphaev56 | we32k | ns16k | clipper \
+ | i370 | sh | powerpc | powerpcle | 1750a | dsp16xx | pdp11 \
+ | mips64 | mipsel | mips64el | mips64orion | mips64orionel \
+ | mipstx39 | mipstx39el \
+ | sparc | sparclet | sparclite | sparc64 | v850)
+ basic_machine=$basic_machine-unknown
+ ;;
+ # We use `pc' rather than `unknown'
+ # because (1) that's what they normally are, and
+ # (2) the word "unknown" tends to confuse beginning users.
+ i[34567]86)
+ basic_machine=$basic_machine-pc
+ ;;
+ # Object if more than one company name word.
+ *-*-*)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+ # Recognize the basic CPU types with company name.
+ vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
+ | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
+ | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
+ | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
+ | xmp-* | ymp-* | hppa-* | hppa1.0-* | hppa1.1-* \
+ | alpha-* | alphaev5-* | alphaev56-* | we32k-* | cydra-* \
+ | ns16k-* | pn-* | np1-* | xps100-* | clipper-* | orion-* \
+ | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
+ | sparc64-* | mips64-* | mipsel-* \
+ | mips64el-* | mips64orion-* | mips64orionel-* \
+ | mipstx39-* | mipstx39el-* \
+ | f301-*)
+ ;;
+ # Recognize the various machine names and aliases which stand
+ # for a CPU type and a company and sometimes even an OS.
+ 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+ basic_machine=m68000-att
+ ;;
+ 3b*)
+ basic_machine=we32k-att
+ ;;
+ alliant | fx80)
+ basic_machine=fx80-alliant
+ ;;
+ altos | altos3068)
+ basic_machine=m68k-altos
+ ;;
+ am29k)
+ basic_machine=a29k-none
+ os=-bsd
+ ;;
+ amdahl)
+ basic_machine=580-amdahl
+ os=-sysv
+ ;;
+ amiga | amiga-*)
+ basic_machine=m68k-cbm
+ ;;
+ amigaos | amigados)
+ basic_machine=m68k-cbm
+ os=-amigaos
+ ;;
+ amigaunix | amix)
+ basic_machine=m68k-cbm
+ os=-sysv4
+ ;;
+ apollo68)
+ basic_machine=m68k-apollo
+ os=-sysv
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ convex-c1)
+ basic_machine=c1-convex
+ os=-bsd
+ ;;
+ convex-c2)
+ basic_machine=c2-convex
+ os=-bsd
+ ;;
+ convex-c32)
+ basic_machine=c32-convex
+ os=-bsd
+ ;;
+ convex-c34)
+ basic_machine=c34-convex
+ os=-bsd
+ ;;
+ convex-c38)
+ basic_machine=c38-convex
+ os=-bsd
+ ;;
+ cray | ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ cray2)
+ basic_machine=cray2-cray
+ os=-unicos
+ ;;
+ [ctj]90-cray)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ crds | unos)
+ basic_machine=m68k-crds
+ ;;
+ da30 | da30-*)
+ basic_machine=m68k-da30
+ ;;
+ decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+ basic_machine=mips-dec
+ ;;
+ delta | 3300 | motorola-3300 | motorola-delta \
+ | 3300-motorola | delta-motorola)
+ basic_machine=m68k-motorola
+ ;;
+ delta88)
+ basic_machine=m88k-motorola
+ os=-sysv3
+ ;;
+ dpx20 | dpx20-*)
+ basic_machine=rs6000-bull
+ os=-bosx
+ ;;
+ dpx2* | dpx2*-bull)
+ basic_machine=m68k-bull
+ os=-sysv3
+ ;;
+ ebmon29k)
+ basic_machine=a29k-amd
+ os=-ebmon
+ ;;
+ elxsi)
+ basic_machine=elxsi-elxsi
+ os=-bsd
+ ;;
+ encore | umax | mmax)
+ basic_machine=ns32k-encore
+ ;;
+ fx2800)
+ basic_machine=i860-alliant
+ ;;
+ genix)
+ basic_machine=ns32k-ns
+ ;;
+ gmicro)
+ basic_machine=tron-gmicro
+ os=-sysv
+ ;;
+ h3050r* | hiux*)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ h8300hms)
+ basic_machine=h8300-hitachi
+ os=-hms
+ ;;
+ harris)
+ basic_machine=m88k-harris
+ os=-sysv3
+ ;;
+ hp300-*)
+ basic_machine=m68k-hp
+ ;;
+ hp300bsd)
+ basic_machine=m68k-hp
+ os=-bsd
+ ;;
+ hp300hpux)
+ basic_machine=m68k-hp
+ os=-hpux
+ ;;
+ hp9k2[0-9][0-9] | hp9k31[0-9])
+ basic_machine=m68000-hp
+ ;;
+ hp9k3[2-9][0-9])
+ basic_machine=m68k-hp
+ ;;
+ hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+ basic_machine=hppa1.1-hp
+ ;;
+ hp9k8[0-9][0-9] | hp8[0-9][0-9])
+ basic_machine=hppa1.0-hp
+ ;;
+ hppa-next)
+ os=-nextstep3
+ ;;
+ i370-ibm* | ibm*)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+# I'm not sure what "Sysv32" means. Should this be sysv3.2?
+ i[34567]86v32)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv32
+ ;;
+ i[34567]86v4*)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv4
+ ;;
+ i[34567]86v)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-sysv
+ ;;
+ i[34567]86sol2)
+ basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+ os=-solaris2
+ ;;
+ iris | iris4d)
+ basic_machine=mips-sgi
+ case $os in
+ -irix*)
+ ;;
+ *)
+ os=-irix4
+ ;;
+ esac
+ ;;
+ isi68 | isi)
+ basic_machine=m68k-isi
+ os=-sysv
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ miniframe)
+ basic_machine=m68000-convergent
+ ;;
+ mipsel*-linux*)
+ basic_machine=mipsel-unknown
+ os=-linux-gnu
+ ;;
+ mips*-linux*)
+ basic_machine=mips-unknown
+ os=-linux-gnu
+ ;;
+ mips3*-*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+ ;;
+ mips3*)
+ basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+ ;;
+ ncr3000)
+ basic_machine=i486-ncr
+ os=-sysv4
+ ;;
+ news | news700 | news800 | news900)
+ basic_machine=m68k-sony
+ os=-newsos
+ ;;
+ news1000)
+ basic_machine=m68030-sony
+ os=-newsos
+ ;;
+ news-3600 | risc-news)
+ basic_machine=mips-sony
+ os=-newsos
+ ;;
+ next | m*-next )
+ basic_machine=m68k-next
+ case $os in
+ -nextstep* )
+ ;;
+ -ns2*)
+ os=-nextstep2
+ ;;
+ *)
+ os=-nextstep3
+ ;;
+ esac
+ ;;
+ nh3000)
+ basic_machine=m68k-harris
+ os=-cxux
+ ;;
+ nh[45]000)
+ basic_machine=m88k-harris
+ os=-cxux
+ ;;
+ nindy960)
+ basic_machine=i960-intel
+ os=-nindy
+ ;;
+ np1)
+ basic_machine=np1-gould
+ ;;
+ pa-hitachi)
+ basic_machine=hppa1.1-hitachi
+ os=-hiuxwe2
+ ;;
+ paragon)
+ basic_machine=i860-intel
+ os=-osf
+ ;;
+ pbd)
+ basic_machine=sparc-tti
+ ;;
+ pbb)
+ basic_machine=m68k-tti
+ ;;
+ pc532 | pc532-*)
+ basic_machine=ns32k-pc532
+ ;;
+ pentium | p5 | k5 | nexen)
+ basic_machine=i586-pc
+ ;;
+ pentiumpro | p6 | k6 | 6x86)
+ basic_machine=i686-pc
+ ;;
+ pentiumii | pentium2)
+ basic_machine=i786-pc
+ ;;
+ pentium-* | p5-* | k5-* | nexen-*)
+ basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumpro-* | p6-* | k6-* | 6x86-*)
+ basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pentiumii-* | pentium2-*)
+ basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ pn)
+ basic_machine=pn-gould
+ ;;
+ power) basic_machine=rs6000-ibm
+ ;;
+ ppc) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ppcle | powerpclittle | ppc-le | powerpc-little)
+ basic_machine=powerpcle-unknown
+ ;;
+ ppcle-* | powerpclittle-*)
+ basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+ ;;
+ ps2)
+ basic_machine=i386-ibm
+ ;;
+ rm[46]00)
+ basic_machine=mips-siemens
+ ;;
+ rtpc | rtpc-*)
+ basic_machine=romp-ibm
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ sps7)
+ basic_machine=m68k-bull
+ os=-sysv2
+ ;;
+ spur)
+ basic_machine=spur-unknown
+ ;;
+ sun2)
+ basic_machine=m68000-sun
+ ;;
+ sun2os3)
+ basic_machine=m68000-sun
+ os=-sunos3
+ ;;
+ sun2os4)
+ basic_machine=m68000-sun
+ os=-sunos4
+ ;;
+ sun3os3)
+ basic_machine=m68k-sun
+ os=-sunos3
+ ;;
+ sun3os4)
+ basic_machine=m68k-sun
+ os=-sunos4
+ ;;
+ sun4os3)
+ basic_machine=sparc-sun
+ os=-sunos3
+ ;;
+ sun4os4)
+ basic_machine=sparc-sun
+ os=-sunos4
+ ;;
+ sun4sol2)
+ basic_machine=sparc-sun
+ os=-solaris2
+ ;;
+ sun3 | sun3-*)
+ basic_machine=m68k-sun
+ ;;
+ sun4)
+ basic_machine=sparc-sun
+ ;;
+ sun386 | sun386i | roadrunner)
+ basic_machine=i386-sun
+ ;;
+ symmetry)
+ basic_machine=i386-sequent
+ os=-dynix
+ ;;
+ tx39)
+ basic_machine=mipstx39-unknown
+ ;;
+ tx39el)
+ basic_machine=mipstx39el-unknown
+ ;;
+ tower | tower-32)
+ basic_machine=m68k-ncr
+ ;;
+ udi29k)
+ basic_machine=a29k-amd
+ os=-udi
+ ;;
+ ultra3)
+ basic_machine=a29k-nyu
+ os=-sym1
+ ;;
+ vaxv)
+ basic_machine=vax-dec
+ os=-sysv
+ ;;
+ vms)
+ basic_machine=vax-dec
+ os=-vms
+ ;;
+ vpp*|vx|vx-*)
+ basic_machine=f301-fujitsu
+ ;;
+ vxworks960)
+ basic_machine=i960-wrs
+ os=-vxworks
+ ;;
+ vxworks68)
+ basic_machine=m68k-wrs
+ os=-vxworks
+ ;;
+ vxworks29k)
+ basic_machine=a29k-wrs
+ os=-vxworks
+ ;;
+ xmp)
+ basic_machine=xmp-cray
+ os=-unicos
+ ;;
+ xps | xps100)
+ basic_machine=xps100-honeywell
+ ;;
+ none)
+ basic_machine=none-none
+ os=-none
+ ;;
+
+# Here we handle the default manufacturer of certain CPU types. It is in
+# some cases the only manufacturer, in others, it is the most popular.
+ mips)
+ if [ x$os = x-linux-gnu ]; then
+ basic_machine=mips-unknown
+ else
+ basic_machine=mips-mips
+ fi
+ ;;
+ romp)
+ basic_machine=romp-ibm
+ ;;
+ rs6000)
+ basic_machine=rs6000-ibm
+ ;;
+ vax)
+ basic_machine=vax-dec
+ ;;
+ pdp11)
+ basic_machine=pdp11-dec
+ ;;
+ we32k)
+ basic_machine=we32k-att
+ ;;
+ sparc)
+ basic_machine=sparc-sun
+ ;;
+ cydra)
+ basic_machine=cydra-cydrome
+ ;;
+ orion)
+ basic_machine=orion-highlevel
+ ;;
+ orion105)
+ basic_machine=clipper-highlevel
+ ;;
+ *)
+ echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+ *-digital*)
+ basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+ ;;
+ *-commodore*)
+ basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+ ;;
+ *)
+ ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+ # First match some system type aliases
+ # that might get confused with valid system types.
+ # -solaris* is a basic system type, with this one exception.
+ -solaris1 | -solaris1.*)
+ os=`echo $os | sed -e 's|solaris1|sunos4|'`
+ ;;
+ -solaris)
+ os=-solaris2
+ ;;
+ -svr4*)
+ os=-sysv4
+ ;;
+ -unixware*)
+ os=-sysv4.2uw
+ ;;
+ -gnu/linux*)
+ os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+ ;;
+ # First accept the basic system types.
+ # The portable systems comes first.
+ # 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* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+ | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+ | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -uxpv* | -beos*)
+ # Remember, each alternative MUST END IN *, to match a version number.
+ ;;
+ -linux*)
+ os=`echo $os | sed -e 's|linux|linux-gnu|'`
+ ;;
+ -sunos5*)
+ os=`echo $os | sed -e 's|sunos5|solaris2|'`
+ ;;
+ -sunos6*)
+ os=`echo $os | sed -e 's|sunos6|solaris3|'`
+ ;;
+ -osfrose*)
+ os=-osfrose
+ ;;
+ -osf*)
+ os=-osf
+ ;;
+ -utek*)
+ os=-bsd
+ ;;
+ -dynix*)
+ os=-bsd
+ ;;
+ -acis*)
+ os=-aos
+ ;;
+ -ctix* | -uts*)
+ os=-sysv
+ ;;
+ -ns2 )
+ os=-nextstep2
+ ;;
+ # Preserve the version number of sinix5.
+ -sinix5.*)
+ os=`echo $os | sed -e 's|sinix|sysv|'`
+ ;;
+ -sinix*)
+ os=-sysv4
+ ;;
+ -triton*)
+ os=-sysv3
+ ;;
+ -oss*)
+ os=-sysv3
+ ;;
+ -svr4)
+ os=-sysv4
+ ;;
+ -svr3)
+ os=-sysv3
+ ;;
+ -sysvr4)
+ os=-sysv4
+ ;;
+ # This must come after -sysvr4.
+ -sysv*)
+ ;;
+ -xenix)
+ os=-xenix
+ ;;
+ -none)
+ ;;
+ *)
+ # Get rid of the `-' at the beginning of $os.
+ os=`echo $os | sed 's/[^-]*-//'`
+ echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+ exit 1
+ ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system. Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ pdp11-*)
+ os=-none
+ ;;
+ *-dec | vax-*)
+ os=-ultrix4.2
+ ;;
+ m68*-apollo)
+ os=-domain
+ ;;
+ i386-sun)
+ os=-sunos4.0.2
+ ;;
+ m68000-sun)
+ os=-sunos3
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ *-tti) # must be before sparc entry or we get the wrong os.
+ os=-sysv3
+ ;;
+ sparc-* | *-sun)
+ os=-sunos4.1.1
+ ;;
+ *-be)
+ os=-beos
+ ;;
+ *-ibm)
+ os=-aix
+ ;;
+ *-hp)
+ os=-hpux
+ ;;
+ *-hitachi)
+ os=-hiux
+ ;;
+ i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+ os=-sysv
+ ;;
+ *-cbm)
+ os=-amigaos
+ ;;
+ *-dg)
+ os=-dgux
+ ;;
+ *-dolphin)
+ os=-sysv3
+ ;;
+ m68k-ccur)
+ os=-rtu
+ ;;
+ m88k-omron*)
+ os=-luna
+ ;;
+ *-next )
+ os=-nextstep
+ ;;
+ *-sequent)
+ os=-ptx
+ ;;
+ *-crds)
+ os=-unos
+ ;;
+ *-ns)
+ os=-genix
+ ;;
+ i370-*)
+ os=-mvs
+ ;;
+ *-next)
+ os=-nextstep3
+ ;;
+ *-gould)
+ os=-sysv
+ ;;
+ *-highlevel)
+ os=-bsd
+ ;;
+ *-encore)
+ os=-bsd
+ ;;
+ *-sgi)
+ os=-irix
+ ;;
+ *-siemens)
+ os=-sysv4
+ ;;
+ *-masscomp)
+ os=-rtu
+ ;;
+ f301-fujitsu)
+ os=-uxpv
+ ;;
+ *)
+ os=-none
+ ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer. We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+ *-unknown)
+ case $os in
+ -riscix*)
+ vendor=acorn
+ ;;
+ -sunos*)
+ vendor=sun
+ ;;
+ -aix*)
+ vendor=ibm
+ ;;
+ -hpux*)
+ vendor=hp
+ ;;
+ -hiux*)
+ vendor=hitachi
+ ;;
+ -unos*)
+ vendor=crds
+ ;;
+ -dgux*)
+ vendor=dg
+ ;;
+ -luna*)
+ vendor=omron
+ ;;
+ -genix*)
+ vendor=ns
+ ;;
+ -mvs*)
+ vendor=ibm
+ ;;
+ -ptx*)
+ vendor=sequent
+ ;;
+ -vxsim* | -vxworks*)
+ vendor=wrs
+ ;;
+ -aux*)
+ vendor=apple
+ ;;
+ esac
+ basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+ ;;
+esac
+
+echo $basic_machine$os
diff --git a/xc/extras/FreeType/configure b/xc/extras/FreeType/configure
new file mode 100755
index 000000000..84349fd80
--- /dev/null
+++ b/xc/extras/FreeType/configure
@@ -0,0 +1,4294 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --enable-static build static libraries [default=no]
+ --enable-static=PKGS only build shared libraries if the current package
+ appears as an element in the PKGS list"
+ac_help="$ac_help
+ --enable-shared build shared libraries [default=yes]
+ --enable-shared=PKGS only build shared libraries if the current package
+ appears as an element in the PKGS list"
+ac_help="$ac_help
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]"
+ac_help="$ac_help
+ --disable-nls don't use NLS"
+ac_help="$ac_help
+ --with-locale-dir=DIR Location of the locale file(s)
+ [PREFIX/share/locale]"
+ac_help="$ac_help
+ --with-x use the X Window System"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # 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 << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.12"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=lib/freetype.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+srcdir=`cd $srcdir; pwd`
+
+# Check whether --enable-static or --disable-static was given.
+if test "${enable_static+set}" = set; then
+ enableval="$enable_static"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_static=yes ;;
+no) enable_static=no ;;
+*)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_static=no
+fi
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+# Check whether --enable-shared or --disable-shared was given.
+if test "${enable_shared+set}" = set; then
+ enableval="$enable_shared"
+ p=${PACKAGE-default}
+case "$enableval" in
+yes) enable_shared=yes ;;
+no) enable_shared=no ;;
+*)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:,"
+ for pkg in $enableval; do
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$ac_save_ifs"
+ ;;
+esac
+else
+ enable_shared=yes
+fi
+
+
+# Make sure we can run config.sub.
+if $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:614: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`$ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`$ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+# Extract the first word of "ranlib", so it can be a program name with args.
+set dummy ranlib; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:637: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RANLIB"; then
+ ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RANLIB="ranlib"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
+fi
+fi
+RANLIB="$ac_cv_prog_RANLIB"
+if test -n "$RANLIB"; then
+ echo "$ac_t""$RANLIB" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:666: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:695: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ ac_prog_rejected=no
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:743: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 753 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:777: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:782: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:791: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:806: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+# Check whether --with-gnu-ld or --without-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then
+ withval="$with_gnu_ld"
+ test "$withval" = no || with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+
+
+ac_prog=ld
+if test "$ac_cv_prog_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC""... $ac_c" 1>&6
+echo "configure:846: checking for ld used by GCC" >&5
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ /* | [A-Za-z]:\\*)
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld""... $ac_c" 1>&6
+echo "configure:864: checking for GNU ld" >&5
+else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+echo "configure:867: checking for non-GNU ld" >&5
+fi
+if eval "test \"`echo '$''{'ac_cv_path_LD'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ ac_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$ac_cv_path_LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+else
+ ac_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$ac_cv_path_LD"
+if test -n "$LD"; then
+ echo "$ac_t""$LD" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+test -z "$LD" && { echo "configure: error: no acceptable ld found in \$PATH" 1>&2; exit 1; }
+
+echo $ac_n "checking if the linker ($LD) is GNU ld""... $ac_c" 1>&6
+echo "configure:903: checking if the linker ($LD) is GNU ld" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gnu_ld'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ ac_cv_prog_gnu_ld=yes
+else
+ ac_cv_prog_gnu_ld=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gnu_ld" 1>&6
+
+
+echo $ac_n "checking for BSD-compatible nm""... $ac_c" 1>&6
+echo "configure:919: checking for BSD-compatible nm" >&5
+if eval "test \"`echo '$''{'ac_cv_path_NM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$NM" in
+/* | [A-Za-z]:\\*)
+ ac_cv_path_NM="$NM" # Let the user override the test with a path.
+ ;;
+*)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -B"
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ ac_cv_path_NM="$ac_dir/nm -p"
+ else
+ ac_cv_path_NM="$ac_dir/nm"
+ fi
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_NM" && ac_cv_path_NM=nm
+ ;;
+esac
+fi
+
+NM="$ac_cv_path_NM"
+echo "$ac_t""$NM" 1>&6
+
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:956: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Check for any special flags to pass to ltconfig.
+libtool_flags=
+test "$enable_shared" = no && libtool_flags="$libtool_flags --disable-shared"
+test "$enable_static" = no && libtool_flags="$libtool_flags --disable-static"
+test "$silent" = yes && libtool_flags="$libtool_flags --silent"
+test "$ac_cv_prog_gcc" = yes && libtool_flags="$libtool_flags --with-gcc"
+test "$ac_cv_prog_gnu_ld" = yes && libtool_flags="$libtool_flags --with-gnu-ld"
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case "$host" in
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '#line 992 "configure"' > conftest.$ac_ext
+ if { (eval echo configure:993: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ case "`/usr/bin/file conftest.o`" in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ CFLAGS="$CFLAGS -belf"
+ ;;
+esac
+
+# Actually configure libtool. ac_aux_dir is where install-sh is found.
+CC="$CC" CFLAGS="$CFLAGS" CPPFLAGS="$CPPFLAGS" \
+LD="$LD" NM="$NM" RANLIB="$RANLIB" LN_S="$LN_S" \
+${CONFIG_SHELL-/bin/sh} $ac_aux_dir/ltconfig \
+$libtool_flags --no-verify $ac_aux_dir/ltmain.sh $host \
+|| { echo "configure: error: libtool configure failed" 1>&2; exit 1; }
+
+
+freetype_version='1.2.0'
+
+version_info='3:0:1'
+
+# Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=no
+else
+ USE_NLS=yes
+fi
+
+
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:1065: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`$ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`$ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:1086: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`$ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:1104: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`$ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1130: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1159: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ ac_prog_rejected=no
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:1207: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 1217 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:1221: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:1241: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:1246: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1255: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1270: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1298: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 1313 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1319: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 1330 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1336: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+
+
+if test "x$CC" = xgcc; then
+ XX_CFLAGS="-Wall -pedantic -ansi"
+else
+ case "$host" in
+ *-dec-osf*)
+ XX_CFLAGS="-std1 -O2 -g3"
+ ;;
+ *)
+ XX_CFLAGS=
+ ;;
+ esac
+fi
+
+
+
+case "$host" in
+ *-dec-osf*)
+ ln -s ../../MakeSub lib/arch
+ ln -s ../../MakeSub test/arch
+ ;;
+esac
+
+
+
+
+if test "$USE_NLS" = "yes"; then
+
+ echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1388: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftestmake <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ SET_MAKE=
+else
+ echo "$ac_t""no" 1>&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+for ac_hdr in locale.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1418: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1423 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1428: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ for ac_func in setlocale
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1457: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1462 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1485: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+ ALL_LINGUAS="de fr cs nl es"
+ for ac_hdr in libintl.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1516: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1521 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1526: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
+echo "configure:1553: checking for gettext in -lintl" >&5
+ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lintl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1561 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gettext();
+
+int main() {
+gettext()
+; return 0; }
+EOF
+if { (eval echo configure:1572: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo intl | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lintl $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+
+
+ LOCALEDIR='${prefix}/share/locale'
+ # Check whether --with-locale-dir or --without-locale-dir was given.
+if test "${with_locale_dir+set}" = set; then
+ withval="$with_locale_dir"
+
+ if test x$withval = xyes; then
+ echo "configure: warning: Usage is: --with-locale-dir=basedir" 1>&2
+ else
+ if test x$withval = xno; then
+ echo "configure: warning: Usage is: --with-locale-dir=basedir" 1>&2
+ else
+ LOCALEDIR=$withval
+ fi
+ fi
+
+fi
+
+
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1624: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGFMT" in
+ /*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+MSGFMT="$ac_cv_path_MSGFMT"
+if test -n "$MSGFMT"; then
+ echo "$ac_t""$MSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test -n "$MSGFMT"; then
+ for ac_func in dcgettext
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:1657: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1662 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:1685: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1712: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_GMSGFMT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$GMSGFMT" in
+ /*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT="$ac_cv_path_GMSGFMT"
+if test -n "$GMSGFMT"; then
+ echo "$ac_t""$GMSGFMT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1744: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_XGETTEXT'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$XGETTEXT" in
+ /*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT="$XGETTEXT"
+ ;;
+esac
+fi
+XGETTEXT="$ac_cv_path_XGETTEXT"
+if test -n "$XGETTEXT"; then
+ echo "$ac_t""$XGETTEXT" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ # Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1776: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_MSGMERGE'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ case "$MSGMERGE" in
+ /*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE="$MSGMERGE"
+ ;;
+esac
+fi
+MSGMERGE="$ac_cv_path_MSGMERGE"
+if test -n "$MSGMERGE"; then
+ echo "$ac_t""$MSGMERGE" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+ if test -n "$XGETTEXT"; then
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
+ XGETTEXT=""
+ fi
+ fi
+
+ if test -n "$XGETTEXT"; then
+ if $XGETTEXT --help > /dev/null 2> /dev/null; then
+ : ;
+ else
+ echo "$ac_t""found xgettext program is not GNU xgettext; ignore it" 1>&6
+ XGETTEXT=""
+ fi
+ fi
+
+ if test -n "$MSGFMT"; then
+ if $MSGFMT < /dev/null 2> /dev/null; then
+ echo "$ac_t""found msgfmt program is not GNU msgfmt; NLS won't be installed" 1>&6
+ MSGFMT=""
+ fi
+ fi
+
+ cat > conftest.$ac_ext <<EOF
+#line 1832 "configure"
+#include "confdefs.h"
+
+int main() {
+extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr
+; return 0; }
+EOF
+if { (eval echo configure:1840: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ CATOBJEXT=.gmo
+ DATADIRNAME=share
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+fi
+rm -f conftest*
+ INSTOBJEXT=.mo
+ fi
+
+ if test -n "$ALL_LINGUAS"; then
+ for lang in $ALL_LINGUAS; do
+ CATALOGS="$CATALOGS $lang$CATOBJEXT"
+ done
+ fi
+
+
+
+
+fi
+
+if test x"$MSGFMT" = x; then
+ USE_NLS=no
+fi
+
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1874: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RM"; then
+ ac_cv_prog_RM="$RM" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RM="rm"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RM="$ac_cv_prog_RM"
+if test -n "$RM"; then
+ echo "$ac_t""$RM" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "rmdir", so it can be a program name with args.
+set dummy rmdir; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1902: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RMDIR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RMDIR"; then
+ ac_cv_prog_RMDIR="$RMDIR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RMDIR="rmdir"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RMDIR="$ac_cv_prog_RMDIR"
+if test -n "$RMDIR"; then
+ echo "$ac_t""$RMDIR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1938: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ for ac_prog in ginstall installbsd scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ # OSF/1 installbsd also uses dspmsg, but is usable.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
+echo "configure:1988: checking whether ln -s works" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ rm -f conftestdata
+if ln -s X conftestdata 2>/dev/null
+then
+ rm -f conftestdata
+ ac_cv_prog_LN_S="ln -s"
+else
+ ac_cv_prog_LN_S=ln
+fi
+fi
+LN_S="$ac_cv_prog_LN_S"
+if test "$ac_cv_prog_LN_S" = "ln -s"; then
+ echo "$ac_t""yes" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+
+
+
+ # Most operating systems have gethostbyname() in the default searched
+ # libraries (i.e. libc):
+ echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
+echo "configure:2015: checking for gethostbyname" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2020 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char gethostbyname(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+gethostbyname();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2043: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_gethostbyname=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_gethostbyname=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+# Some OSes (eg. Solaris) place it in libnsl:
+ echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
+echo "configure:2062: checking for gethostbyname in -lnsl" >&5
+ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lnsl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2070 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+gethostbyname()
+; return 0; }
+EOF
+if { (eval echo configure:2081: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo nsl | sed -e 's/^a-zA-Z0-9_/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lnsl $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+# Some strange OSes (SINIX) have it in libsocket:
+ echo $ac_n "checking for gethostbyname in -lsocket""... $ac_c" 1>&6
+echo "configure:2108: checking for gethostbyname in -lsocket" >&5
+ac_lib_var=`echo socket'_'gethostbyname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lsocket $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2116 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+gethostbyname()
+; return 0; }
+EOF
+if { (eval echo configure:2127: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/^a-zA-Z0-9_/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lsocket $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+# Unfortunately libsocket sometimes depends on libnsl.
+ # AC_CHECK_LIB's API is essentially broken so the following
+ # ugliness is necessary:
+ echo $ac_n "checking for gethostbyname in -lsocket""... $ac_c" 1>&6
+echo "configure:2156: checking for gethostbyname in -lsocket" >&5
+ac_lib_var=`echo socket'_'gethostbyname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lsocket -lnsl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2164 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+gethostbyname()
+; return 0; }
+EOF
+if { (eval echo configure:2175: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="-lsocket -lnsl $LIBS"
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for gethostbyname in -lresolv""... $ac_c" 1>&6
+echo "configure:2194: checking for gethostbyname in -lresolv" >&5
+ac_lib_var=`echo resolv'_'gethostbyname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lresolv $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2202 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+gethostbyname()
+; return 0; }
+EOF
+if { (eval echo configure:2213: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo resolv | sed -e 's/^a-zA-Z0-9_/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lresolv $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+ echo $ac_n "checking for socket""... $ac_c" 1>&6
+echo "configure:2252: checking for socket" >&5
+if eval "test \"`echo '$''{'ac_cv_func_socket'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2257 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char socket(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char socket();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_socket) || defined (__stub___socket)
+choke me
+#else
+socket();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2280: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_socket=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_socket=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'socket`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
+echo "configure:2298: checking for socket in -lsocket" >&5
+ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lsocket $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2306 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char socket();
+
+int main() {
+socket()
+; return 0; }
+EOF
+if { (eval echo configure:2317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/^a-zA-Z0-9_/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lsocket $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
+echo "configure:2343: checking for socket in -lsocket" >&5
+ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lsocket -lnsl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2351 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char socket();
+
+int main() {
+socket()
+; return 0; }
+EOF
+if { (eval echo configure:2362: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="-lsocket -lnsl $LIBS"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+fi
+
+
+echo $ac_n "checking for cos in -lm""... $ac_c" 1>&6
+echo "configure:2388: checking for cos in -lm" >&5
+ac_lib_var=`echo m'_'cos | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2396 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char cos();
+
+int main() {
+cos()
+; return 0; }
+EOF
+if { (eval echo configure:2407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lm $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+# If we find X, set shell vars x_includes and x_libraries to the
+# paths, otherwise set no_x=yes.
+# Uses ac_ vars as temps to allow command line to override cache and checks.
+# --without-x overrides everything else, but does not touch the cache.
+echo $ac_n "checking for X""... $ac_c" 1>&6
+echo "configure:2440: checking for X" >&5
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+ withval="$with_x"
+ :
+fi
+
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+ # Both variables are already set.
+ have_x=yes
+ else
+if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=NO ac_x_libraries=NO
+rm -fr conftestdir
+if mkdir conftestdir; then
+ cd conftestdir
+ # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+ cat > Imakefile <<'EOF'
+acfindx:
+ @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+EOF
+ if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+ eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl; do
+ if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
+ test -f $ac_im_libdir/libX11.$ac_extension; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case "$ac_im_incroot" in
+ /usr/include) ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;;
+ esac
+ case "$ac_im_usrlibdir" in
+ /usr/lib | /lib) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;;
+ esac
+ fi
+ cd ..
+ rm -fr conftestdir
+fi
+
+if test "$ac_x_includes" = NO; then
+ # Guess where to find include files, by looking for this one X11 .h file.
+ test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
+
+ # First, try using that file with no special directory specified.
+cat > conftest.$ac_ext <<EOF
+#line 2502 "configure"
+#include "confdefs.h"
+#include <$x_direct_test_include>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2507: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ # Look for the header file in a standard set of common directories.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ for ac_dir in \
+ /usr/X11/include \
+ /usr/X11R6/include \
+ /usr/X11R5/include \
+ /usr/X11R4/include \
+ \
+ /usr/include/X11 \
+ /usr/include/X11R6 \
+ /usr/include/X11R5 \
+ /usr/include/X11R4 \
+ \
+ /usr/local/X11/include \
+ /usr/local/X11R6/include \
+ /usr/local/X11R5/include \
+ /usr/local/X11R4/include \
+ \
+ /usr/local/include/X11 \
+ /usr/local/include/X11R6 \
+ /usr/local/include/X11R5 \
+ /usr/local/include/X11R4 \
+ \
+ /usr/X386/include \
+ /usr/x386/include \
+ /usr/XFree86/include/X11 \
+ \
+ /usr/include \
+ /usr/local/include \
+ /usr/unsupported/include \
+ /usr/athena/include \
+ /usr/local/x11r5/include \
+ /usr/lpp/Xamples/include \
+ \
+ /usr/openwin/include \
+ /usr/openwin/share/include \
+ ; \
+ do
+ if test -r "$ac_dir/$x_direct_test_include"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+ done
+fi
+rm -f conftest*
+fi # $ac_x_includes = NO
+
+if test "$ac_x_libraries" = NO; then
+ # Check for the libraries.
+
+ test -z "$x_direct_test_library" && x_direct_test_library=Xt
+ test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
+
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS="$LIBS"
+ LIBS="-l$x_direct_test_library $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2576 "configure"
+#include "confdefs.h"
+
+int main() {
+${x_direct_test_function}()
+; return 0; }
+EOF
+if { (eval echo configure:2583: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ LIBS="$ac_save_LIBS"
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ LIBS="$ac_save_LIBS"
+# First see if replacing the include by lib works.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \
+ /usr/X11/lib \
+ /usr/X11R6/lib \
+ /usr/X11R5/lib \
+ /usr/X11R4/lib \
+ \
+ /usr/lib/X11 \
+ /usr/lib/X11R6 \
+ /usr/lib/X11R5 \
+ /usr/lib/X11R4 \
+ \
+ /usr/local/X11/lib \
+ /usr/local/X11R6/lib \
+ /usr/local/X11R5/lib \
+ /usr/local/X11R4/lib \
+ \
+ /usr/local/lib/X11 \
+ /usr/local/lib/X11R6 \
+ /usr/local/lib/X11R5 \
+ /usr/local/lib/X11R4 \
+ \
+ /usr/X386/lib \
+ /usr/x386/lib \
+ /usr/XFree86/lib/X11 \
+ \
+ /usr/lib \
+ /usr/local/lib \
+ /usr/unsupported/lib \
+ /usr/athena/lib \
+ /usr/local/x11r5/lib \
+ /usr/lpp/Xamples/lib \
+ /lib/usr/lib/X11 \
+ \
+ /usr/openwin/lib \
+ /usr/openwin/share/lib \
+ ; \
+do
+ for ac_extension in a so sl; do
+ if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f conftest*
+fi # $ac_x_libraries = NO
+
+if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then
+ # Didn't find X anywhere. Cache the known absence of X.
+ ac_cv_have_x="have_x=no"
+else
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+ fi
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ echo "$ac_t""$have_x" 1>&6
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+ echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
+fi
+
+if test "$no_x" = yes; then
+ # Not all programs may use this symbol, but it does not hurt to define it.
+ cat >> confdefs.h <<\EOF
+#define X_DISPLAY_MISSING 1
+EOF
+
+ X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+ if test -n "$x_includes"; then
+ X_CFLAGS="$X_CFLAGS -I$x_includes"
+ fi
+
+ # It would also be nice to do this for all -L options, not just this one.
+ if test -n "$x_libraries"; then
+ X_LIBS="$X_LIBS -L$x_libraries"
+ # For Solaris; some versions of Sun CC require a space after -R and
+ # others require no space. Words are not sufficient . . . .
+ case "`(uname -sr) 2>/dev/null`" in
+ "SunOS 5"*)
+ echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
+echo "configure:2689: checking whether -R must be followed by a space" >&5
+ ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
+ cat > conftest.$ac_ext <<EOF
+#line 2692 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2699: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_R_nospace=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_R_nospace=no
+fi
+rm -f conftest*
+ if test $ac_R_nospace = yes; then
+ echo "$ac_t""no" 1>&6
+ X_LIBS="$X_LIBS -R$x_libraries"
+ else
+ LIBS="$ac_xsave_LIBS -R $x_libraries"
+ cat > conftest.$ac_ext <<EOF
+#line 2715 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2722: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ ac_R_space=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_R_space=no
+fi
+rm -f conftest*
+ if test $ac_R_space = yes; then
+ echo "$ac_t""yes" 1>&6
+ X_LIBS="$X_LIBS -R $x_libraries"
+ else
+ echo "$ac_t""neither works" 1>&6
+ fi
+ fi
+ LIBS="$ac_xsave_LIBS"
+ esac
+ fi
+
+ # Check for system-dependent libraries X programs must link with.
+ # Do this before checking for the system-independent R6 libraries
+ # (-lICE), since we may need -lsocket or whatever for X linking.
+
+ if test "$ISC" = yes; then
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+ else
+ # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X
+ # libraries were built with DECnet support. And karl@cs.umb.edu says
+ # the Alpha needs dnet_stub (dnet does not exist).
+ echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
+echo "configure:2754: checking for dnet_ntoa in -ldnet" >&5
+ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldnet $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2762 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa();
+
+int main() {
+dnet_ntoa()
+; return 0; }
+EOF
+if { (eval echo configure:2773: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
+echo "configure:2795: checking for dnet_ntoa in -ldnet_stub" >&5
+ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-ldnet_stub $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2803 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dnet_ntoa();
+
+int main() {
+dnet_ntoa()
+; return 0; }
+EOF
+if { (eval echo configure:2814: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+
+ # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+ # to get the SysV transport functions.
+ # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4)
+ # needs -lnsl.
+ # The nsl library prevents programs from opening the X display
+ # on Irix 5.2, according to dickey@clark.net.
+ echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
+echo "configure:2843: checking for gethostbyname" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2848 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char gethostbyname(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+gethostbyname();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2871: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_gethostbyname=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_gethostbyname=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test $ac_cv_func_gethostbyname = no; then
+ echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
+echo "configure:2892: checking for gethostbyname in -lnsl" >&5
+ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lnsl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2900 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gethostbyname();
+
+int main() {
+gethostbyname()
+; return 0; }
+EOF
+if { (eval echo configure:2911: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+
+ # lieder@skyler.mavd.honeywell.com says without -lsocket,
+ # socket/setsockopt and other routines are undefined under SCO ODT
+ # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary
+ # on later versions), says simon@lia.di.epfl.ch: it contains
+ # gethostby* variants that don't use the nameserver (or something).
+ # -lsocket must be given before -lnsl if both are needed.
+ # We assume that if connect needs -lnsl, so does gethostbyname.
+ echo $ac_n "checking for connect""... $ac_c" 1>&6
+echo "configure:2941: checking for connect" >&5
+if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 2946 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char connect(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_connect) || defined (__stub___connect)
+choke me
+#else
+connect();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2969: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_connect=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_connect=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test $ac_cv_func_connect = no; then
+ echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
+echo "configure:2990: checking for connect in -lsocket" >&5
+ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2998 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char connect();
+
+int main() {
+connect()
+; return 0; }
+EOF
+if { (eval echo configure:3009: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+
+ # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
+ echo $ac_n "checking for remove""... $ac_c" 1>&6
+echo "configure:3033: checking for remove" >&5
+if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3038 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char remove(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_remove) || defined (__stub___remove)
+choke me
+#else
+remove();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3061: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_remove=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_remove=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test $ac_cv_func_remove = no; then
+ echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
+echo "configure:3082: checking for remove in -lposix" >&5
+ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lposix $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3090 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char remove();
+
+int main() {
+remove()
+; return 0; }
+EOF
+if { (eval echo configure:3101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ echo $ac_n "checking for shmat""... $ac_c" 1>&6
+echo "configure:3125: checking for shmat" >&5
+if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3130 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shmat(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+choke me
+#else
+shmat();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3153: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_shmat=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_shmat=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ if test $ac_cv_func_shmat = no; then
+ echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
+echo "configure:3174: checking for shmat in -lipc" >&5
+ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lipc $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3182 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shmat();
+
+int main() {
+shmat()
+; return 0; }
+EOF
+if { (eval echo configure:3193: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ fi
+ fi
+
+ # Check for libraries that X11R6 Xt/Xaw programs need.
+ ac_save_LDFLAGS="$LDFLAGS"
+ test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+ # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+ # check for ICE first), but we must link in the order -lSM -lICE or
+ # we get undefined symbols. So assume we have SM if we have ICE.
+ # These have to be linked with before -lX11, unlike the other
+ # libraries we check for below, so use a different variable.
+ # --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
+ echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
+echo "configure:3226: checking for IceConnectionNumber in -lICE" >&5
+ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lICE $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3234 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char IceConnectionNumber();
+
+int main() {
+IceConnectionNumber()
+; return 0; }
+EOF
+if { (eval echo configure:3245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ LDFLAGS="$ac_save_LDFLAGS"
+
+fi
+
+for ac_hdr in stdlib.h fcntl.h unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:3273: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3278 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3283: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:3311: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3316 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this. */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this. */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this. */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in an arm
+ of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:3365: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_const=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+ cat >> confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo $ac_n "checking whether byte ordering is bigendian""... $ac_c" 1>&6
+echo "configure:3386: checking whether byte ordering is bigendian" >&5
+if eval "test \"`echo '$''{'ac_cv_c_bigendian'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_cv_c_bigendian=unknown
+# See if sys/param.h defines the BYTE_ORDER macro.
+cat > conftest.$ac_ext <<EOF
+#line 3393 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/param.h>
+int main() {
+
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:3404: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+cat > conftest.$ac_ext <<EOF
+#line 3408 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/param.h>
+int main() {
+
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif
+; return 0; }
+EOF
+if { (eval echo configure:3419: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+ rm -rf conftest*
+ ac_cv_c_bigendian=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_c_bigendian=no
+fi
+rm -f conftest*
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+if test $ac_cv_c_bigendian = unknown; then
+if test "$cross_compiling" = yes; then
+ { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3439 "configure"
+#include "confdefs.h"
+main () {
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long l;
+ char c[sizeof (long)];
+ } u;
+ u.l = 1;
+ exit (u.c[sizeof (long) - 1] == 1);
+}
+EOF
+if { (eval echo configure:3452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_c_bigendian=no
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_c_bigendian=yes
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_c_bigendian" 1>&6
+if test $ac_cv_c_bigendian = yes; then
+ cat >> confdefs.h <<\EOF
+#define WORDS_BIGENDIAN 1
+EOF
+
+fi
+
+echo $ac_n "checking size of int""... $ac_c" 1>&6
+echo "configure:3476: checking size of int" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3484 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(int));
+ exit(0);
+}
+EOF
+if { (eval echo configure:3495: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_int=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_int=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_int" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+EOF
+
+
+echo $ac_n "checking size of long""... $ac_c" 1>&6
+echo "configure:3515: checking size of long" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; }
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3523 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+main()
+{
+ FILE *f=fopen("conftestval", "w");
+ if (!f) exit(1);
+ fprintf(f, "%d\n", sizeof(long));
+ exit(0);
+}
+EOF
+if { (eval echo configure:3534: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_sizeof_long=`cat conftestval`
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_sizeof_long=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+EOF
+
+
+
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:3559: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3564 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+for ac_func in getpagesize
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3598: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3603 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for working mmap""... $ac_c" 1>&6
+echo "configure:3651: checking for working mmap" >&5
+if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_mmap_fixed_mapped=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3659 "configure"
+#include "confdefs.h"
+
+/* Thanks to Mike Haertel and Jim Avera for this test.
+ Here is a matrix of mmap possibilities:
+ mmap private not fixed
+ mmap private fixed at somewhere currently unmapped
+ mmap private fixed at somewhere already mapped
+ mmap shared not fixed
+ mmap shared fixed at somewhere currently unmapped
+ mmap shared fixed at somewhere already mapped
+ For private mappings, we should verify that changes cannot be read()
+ back from the file, nor mmap's back from the file at a different
+ address. (There have been systems where private was not correctly
+ implemented like the infamous i386 svr4.0, and systems where the
+ VM page cache was not coherent with the filesystem buffer cache
+ like early versions of FreeBSD and possibly contemporary NetBSD.)
+ For shared mappings, we should conversely verify that changes get
+ propogated back to all the places they're supposed to be.
+
+ Grep wants private fixed already mapped.
+ The main things grep needs to know about mmap are:
+ * does it exist and is it safe to write into the mmap'd area
+ * how to use it (BSD variants) */
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+
+/* This mess was copied from the GNU getpagesize.h. */
+#ifndef HAVE_GETPAGESIZE
+# ifdef HAVE_UNISTD_H
+# include <unistd.h>
+# endif
+
+/* Assume that all systems that can run configure have sys/param.h. */
+# ifndef HAVE_SYS_PARAM_H
+# define HAVE_SYS_PARAM_H 1
+# endif
+
+# ifdef _SC_PAGESIZE
+# define getpagesize() sysconf(_SC_PAGESIZE)
+# else /* no _SC_PAGESIZE */
+# ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+# ifdef EXEC_PAGESIZE
+# define getpagesize() EXEC_PAGESIZE
+# else /* no EXEC_PAGESIZE */
+# ifdef NBPG
+# define getpagesize() NBPG * CLSIZE
+# ifndef CLSIZE
+# define CLSIZE 1
+# endif /* no CLSIZE */
+# else /* no NBPG */
+# ifdef NBPC
+# define getpagesize() NBPC
+# else /* no NBPC */
+# ifdef PAGESIZE
+# define getpagesize() PAGESIZE
+# endif /* PAGESIZE */
+# endif /* no NBPC */
+# endif /* no NBPG */
+# endif /* no EXEC_PAGESIZE */
+# else /* no HAVE_SYS_PARAM_H */
+# define getpagesize() 8192 /* punt totally */
+# endif /* no HAVE_SYS_PARAM_H */
+# endif /* no _SC_PAGESIZE */
+
+#endif /* no HAVE_GETPAGESIZE */
+
+#ifdef __cplusplus
+extern "C" { void *malloc(unsigned); }
+#else
+char *malloc();
+#endif
+
+int
+main()
+{
+ char *data, *data2, *data3;
+ int i, pagesize;
+ int fd;
+
+ pagesize = getpagesize();
+
+ /*
+ * First, make a file with some known garbage in it.
+ */
+ data = malloc(pagesize);
+ if (!data)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ *(data + i) = rand();
+ umask(0);
+ fd = creat("conftestmmap", 0600);
+ if (fd < 0)
+ exit(1);
+ if (write(fd, data, pagesize) != pagesize)
+ exit(1);
+ close(fd);
+
+ /*
+ * Next, try to mmap the file at a fixed address which
+ * already has something else allocated at it. If we can,
+ * also make sure that we see the same garbage.
+ */
+ fd = open("conftestmmap", O_RDWR);
+ if (fd < 0)
+ exit(1);
+ data2 = malloc(2 * pagesize);
+ if (!data2)
+ exit(1);
+ data2 += (pagesize - ((int) data2 & (pagesize - 1))) & (pagesize - 1);
+ if (data2 != mmap(data2, pagesize, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_FIXED, fd, 0L))
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data2 + i))
+ exit(1);
+
+ /*
+ * Finally, make sure that changes to the mapped area
+ * do not percolate back to the file as seen by read().
+ * (This is a bug on some variants of i386 svr4.0.)
+ */
+ for (i = 0; i < pagesize; ++i)
+ *(data2 + i) = *(data2 + i) + 1;
+ data3 = malloc(pagesize);
+ if (!data3)
+ exit(1);
+ if (read(fd, data3, pagesize) != pagesize)
+ exit(1);
+ for (i = 0; i < pagesize; ++i)
+ if (*(data + i) != *(data3 + i))
+ exit(1);
+ close(fd);
+ unlink("conftestmmap");
+ exit(0);
+}
+
+EOF
+if { (eval echo configure:3799: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_mmap_fixed_mapped=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_mmap_fixed_mapped=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_mmap_fixed_mapped" 1>&6
+if test $ac_cv_func_mmap_fixed_mapped = yes; then
+ cat >> confdefs.h <<\EOF
+#define HAVE_MMAP 1
+EOF
+
+fi
+
+if test "$ac_cv_func_mmap_fixed_mapped" != yes; then
+ TT_FILE_COMPONENT=ttfile.c
+else
+ TT_FILE_COMPONENT=arch/unix/ttmmap.c
+fi
+
+
+for ac_func in memcpy memmove
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:3831: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 3836 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func(); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3859: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+
+
+$srcdir/mkinstalldirs lib/arch/unix test/arch/unix
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile
+ MakeSub
+ lib/arch/unix/Makefile
+ test/arch/unix/Makefile
+ po/Makefile.in ft_conf.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@RANLIB@%$RANLIB%g
+s%@CC@%$CC%g
+s%@LD@%$LD%g
+s%@NM@%$NM%g
+s%@LN_S@%$LN_S%g
+s%@LIBTOOL@%$LIBTOOL%g
+s%@USE_NLS@%$USE_NLS%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@CPP@%$CPP%g
+s%@XX_CFLAGS@%$XX_CFLAGS%g
+s%@freetype_version@%$freetype_version%g
+s%@version_info@%$version_info%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@HAVE_LOCALE_H@%$HAVE_LOCALE_H%g
+s%@HAVE_LIBINTL_H@%$HAVE_LIBINTL_H%g
+s%@HAVE_LIBINTL@%$HAVE_LIBINTL%g
+s%@LOCALEDIR@%$LOCALEDIR%g
+s%@MSGFMT@%$MSGFMT%g
+s%@GMSGFMT@%$GMSGFMT%g
+s%@XGETTEXT@%$XGETTEXT%g
+s%@MSGMERGE@%$MSGMERGE%g
+s%@CATALOGS@%$CATALOGS%g
+s%@CATOBJEXT@%$CATOBJEXT%g
+s%@INSTOBJEXT@%$INSTOBJEXT%g
+s%@DATADIRNAME@%$DATADIRNAME%g
+s%@RM@%$RM%g
+s%@RMDIR@%$RMDIR%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@X_CFLAGS@%$X_CFLAGS%g
+s%@X_PRE_LIBS@%$X_PRE_LIBS%g
+s%@X_LIBS@%$X_LIBS%g
+s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g
+s%@TT_FILE_COMPONENT@%$TT_FILE_COMPONENT%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+ MakeSub
+ lib/arch/unix/Makefile
+ test/arch/unix/Makefile
+ po/Makefile.in"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='\([ ][ ]*\)[^ ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='\([ ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+ CONFIG_HEADERS="ft_conf.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ echo creating $ac_file
+
+ rm -f conftest.frag conftest.in conftest.out
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h. And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+ ac_lines=`grep -c . conftest.vals`
+ # grep -c gives empty output for an empty file on some AIX systems.
+ if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+ # Write a limited-size here document to conftest.frag.
+ echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+ echo 'CEOF
+ sed -f conftest.frag conftest.in > conftest.out
+ rm -f conftest.in
+ mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+ rm -f conftest.vals
+ mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+ rm -f conftest.frag conftest.h
+ echo "/* $ac_file. Generated automatically by configure. */" > conftest.h
+ cat conftest.in >> conftest.h
+ rm -f conftest.in
+ if cmp -s $ac_file conftest.h 2>/dev/null; then
+ echo "$ac_file is unchanged"
+ rm -f conftest.h
+ else
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ fi
+ rm -f $ac_file
+ mv conftest.h $ac_file
+ fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
+
diff --git a/xc/extras/FreeType/configure.in b/xc/extras/FreeType/configure.in
new file mode 100644
index 000000000..88265f794
--- /dev/null
+++ b/xc/extras/FreeType/configure.in
@@ -0,0 +1,202 @@
+dnl This file is part of the FreeType project.
+dnl
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(lib/freetype.h)
+
+dnl Due to a bug in autoconf we must set $srcdir explicitly to an absolute
+dnl path.
+srcdir=`cd $srcdir; pwd`
+
+AM_DISABLE_STATIC
+AM_PROG_LIBTOOL
+
+dnl FreeType version
+freetype_version='1.2.0'
+
+dnl libttf.so version
+version_info='3:0:1'
+
+AC_ARG_ENABLE(nls,
+ [ --disable-nls don't use NLS],
+ USE_NLS=no, USE_NLS=yes)
+AC_SUBST(USE_NLS)
+
+dnl Checks for system type.
+AC_CANONICAL_SYSTEM
+
+dnl Checks for programs.
+AC_PROG_CC
+AC_PROG_CPP
+
+dnl get Compiler flags right.
+
+if test "x$CC" = xgcc; then
+ XX_CFLAGS="-Wall -pedantic -ansi"
+else
+ case "$host" in
+ *-dec-osf*)
+ XX_CFLAGS="-std1 -O2 -g3"
+ ;;
+ *)
+ XX_CFLAGS=
+ ;;
+ esac
+fi
+AC_SUBST(XX_CFLAGS)
+
+dnl at least Digital UNIX 4.0d needs this due to a strange make program
+
+case "$host" in
+ *-dec-osf*)
+ ln -s ../../MakeSub lib/arch
+ ln -s ../../MakeSub test/arch
+ ;;
+esac
+
+AC_SUBST(freetype_version)
+AC_SUBST(version_info)
+
+dnl gettext support
+if test "$USE_NLS" = "yes"; then
+ AC_REQUIRE([AC_PROG_MAKE_SET])
+ AC_CHECK_HEADERS(locale.h)
+ AC_CHECK_FUNCS(setlocale)
+ AC_SUBST(HAVE_LOCALE_H)
+
+ ALL_LINGUAS="de fr cs nl es"
+ AC_CHECK_HEADERS(libintl.h)
+ AC_CHECK_LIB(intl,gettext)
+ AC_SUBST(HAVE_LIBINTL_H)
+ AC_SUBST(HAVE_LIBINTL)
+
+ dnl Handle localedir
+ LOCALEDIR='${prefix}/share/locale'
+ AC_ARG_WITH(locale-dir,
+ [ --with-locale-dir=DIR Location of the locale file(s)
+ [PREFIX/share/locale]],[
+ if test x$withval = xyes; then
+ AC_MSG_WARN(Usage is: --with-locale-dir=basedir)
+ else
+ if test x$withval = xno; then
+ AC_MSG_WARN(Usage is: --with-locale-dir=basedir)
+ else
+ LOCALEDIR=$withval
+ fi
+ fi
+ ])
+ AC_SUBST(LOCALEDIR)
+
+ AC_PATH_PROG(MSGFMT, msgfmt, $MSGFMT)
+ if test -n "$MSGFMT"; then
+ AC_CHECK_FUNCS(dcgettext)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+ AC_PATH_PROG(XGETTEXT, xgettext, $XGETTEXT)
+ AC_PATH_PROG(MSGMERGE, msgmerge, $MSGMERGE)
+
+ dnl Test whether we really found GNU xgettext.
+ if test -n "$XGETTEXT"; then
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=""
+ fi
+ fi
+
+ dnl We add another test for comparing GNU xgettext with openwin xgettext
+ if test -n "$XGETTEXT"; then
+ if $XGETTEXT --help > /dev/null 2> /dev/null; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext program is not GNU xgettext; ignore it])
+ XGETTEXT=""
+ fi
+ fi
+
+ dnl Test whether we really found GNU msgfmt.
+ if test -n "$MSGFMT"; then
+ if $MSGFMT < /dev/null 2> /dev/null; then
+ AC_MSG_RESULT(
+ [found msgfmt program is not GNU msgfmt; NLS won't be installed])
+ MSGFMT=""
+ fi
+ fi
+
+ AC_TRY_LINK(,
+ [extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr],
+ [CATOBJEXT=.gmo
+ DATADIRNAME=share],
+ [CATOBJEXT=.mo
+ DATADIRNAME=lib])
+ INSTOBJEXT=.mo
+ fi
+
+ if test -n "$ALL_LINGUAS"; then
+ for lang in $ALL_LINGUAS; do
+ CATALOGS="$CATALOGS $lang$CATOBJEXT"
+ done
+ fi
+ AC_SUBST(CATALOGS)
+ AC_SUBST(CATOBJEXT)
+ AC_SUBST(INSTOBJEXT)
+ AC_SUBST(DATADIRNAME)
+fi
+
+dnl don't use NLS, when there is no gettext installed
+if test x"$MSGFMT" = x; then
+ USE_NLS=no
+fi
+
+
+AC_CHECK_PROG(RM, rm, rm)
+AC_CHECK_PROG(RMDIR, rmdir, rmdir)
+AC_PROG_INSTALL
+AC_PROG_LN_S
+
+dnl Checks for libraries.
+sinclude(net.m4)
+AC_LIBRARY_NET
+AC_CHECK_LIB(m, cos)
+
+dnl Checks for header files.
+AC_PATH_XTRA
+AC_CHECK_HEADERS(stdlib.h fcntl.h unistd.h)
+
+dnl Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+AC_C_BIGENDIAN
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+
+dnl Checks for library functions.
+
+dnl Here we check whether we can use our mmap file component.
+AC_FUNC_MMAP
+if test "$ac_cv_func_mmap_fixed_mapped" != yes; then
+ TT_FILE_COMPONENT=ttfile.c
+else
+ TT_FILE_COMPONENT=arch/unix/ttmmap.c
+fi
+AC_SUBST(TT_FILE_COMPONENT)
+
+AC_CHECK_FUNCS(memcpy memmove)
+
+AC_CONFIG_HEADER(ft_conf.h)
+
+dnl Another bug: to make --srcdir work correctly we have to create the
+dnl directory hierarchy first since autoconf only uses mkdir.
+$srcdir/mkinstalldirs lib/arch/unix test/arch/unix
+
+AC_OUTPUT(Makefile
+ MakeSub
+ lib/arch/unix/Makefile
+ test/arch/unix/Makefile
+ po/Makefile.in,
+ [sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile])
+
+
+dnl end of configure.in
diff --git a/xc/extras/FreeType/contrib/ftos2/DEVELFAQ b/xc/extras/FreeType/contrib/ftos2/DEVELFAQ
new file mode 100644
index 000000000..f8aafbc68
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/DEVELFAQ
@@ -0,0 +1,38 @@
+
+ This is a FreeType/2 programmers' mini-FAQ
+
+Q1: Is the source code available?
+
+A1: Yes! But if you think you have all you need, you're probably wrong :-)
+ The source is now actually part of FreeType project, located at
+ ftp://ftp.physiol.med.tu-muenchen.de/pub/freetype
+
+ We have now the permission to distribute the OS/2 IFI headers with
+ the FreeType/2 source code. They're all the files beginning with a
+ "32" in the "ifi" directory. It seems that some people had problems
+ with the download indicated in the last beta.
+
+
+Q2: What compilers are supported?
+
+A2: The development of FreeType/2 was done primarily in IBM's VisualAge C++
+ version 3.0. It should be possible to build the DLL with Watcom C/C++ but
+ it's not quite working yet.
+ It is perhaps possible to build the Font Driver with another compiler,
+ but you'll have to know the compiler (and OS/2 of course) _quite_ well.
+
+ Note that the FreeType library itself supports also EMX/GCC (and I
+ believe it was mainly developed in it).
+
+
+Q3: What other tools do I need?
+
+A3: You'll need a kernel debugger. Check out IBM's ICAT, it's great and
+ it's free! Actually without ICAT this code would probably never happen.
+ If you've lived under a rock and don't know what ICAT is, it's actually
+ an interface to ol' good KDB. It is a source-level debugger and it looks
+ and feels very much like the VisualAge debugger, IPMD.
+
+ And if you haven't got it yet, you'll need _two_ computers to use ICAT.
+ But believe me, it's worth it!
+
diff --git a/xc/extras/FreeType/contrib/ftos2/FAQ b/xc/extras/FreeType/contrib/ftos2/FAQ
new file mode 100644
index 000000000..d4a7922c1
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/FAQ
@@ -0,0 +1,260 @@
+This is a FreeType/2 users' mini-FAQ
+
+Table of Contents:
+
+Q1: Where can I find the latest FreeType/2 release?
+Q2: Now that I have FreeType/2 installed, how do I actually add TrueType
+fonts to OS/2?
+Q3: When will you add font-smoothing to the DLL? I really want that!
+Q4: Why does IBM's TrueType engine do such a poor job?
+Q5: But there are still differences with the glyphs produced by Windows or
+the Mac, right?
+Q6: I've got TrueType Times New Roman installed but the system still seems
+to be using the original ATM (Type 1) font. Why this odd behaviour?
+Q7: I noticed it takes a second or two before the Font Palette object opens
+for the first time. Why?
+Q8: I noticed the characters sometimes have odd spacing. When will you fix
+it?
+Q9: Could you explain the open fonts limit?
+Q10: Can you recommend some fonts to use?
+Q11: What's a 'broken glyph'?
+Q12: Why do some fonts appear twice, once starting with an '@'?
+Q13: I've got a Chinese (Japanese, Korean) font but the characters aren't
+there! Why?
+Q14: I tried to use a DBCS font but I got an exception un UCONV.DLL. What's
+wrong?
+Q15: My system won't boot after I installed FreeType/2 and the uninstall
+script won't work when I boot to command line. What now?
+Q16: I'm upgrading from previous version and I don't want to uninstall and
+reinstall. Is there any other way?
+Q17: What's this stuff about Times New Roman being aliased to Tms Rmn?
+Please explain this.
+
+Questions & Answers:
+
+Q1: Where can I find the latest FreeType/2 release?
+
+A1: Links to the latest release can be found at the FreeType/2 homepage at
+http://www.freetype.org/ft_os2/index.html.
+
+Q2: Now that I have FreeType/2 installed, how do I actually add TrueType
+fonts to OS/2?
+
+A2: I thought everyone knew that... It's simple, really. Open the Font
+Palette object (in System Setup folder) then click 'Edit font' and 'Add'.
+Now type the directory path where your TrueType fonts reside, such as
+'C:\WINDOWS\FONTS' if you have Win95 and click 'Add'. You'll be presented a
+list of all fonts that OS/2 found in specified directory. Simply select all
+fonts you wish to install click 'Add' for the last time. If you wish to
+remove fonts, just use the 'Delete' button in the 'Edit Font' dialog.
+TIP: If you wish to add font to OS/2 but don't want to actually copy the
+file, just type the directory name where the font files already are instead
+of 'X:\PSFONTS' in the 'Add New Fonts' dialog.
+
+Q3: When will you add font-smoothing to the DLL? I really want that!
+
+A3: Short answer: We can't.
+Long answer: The FreeType library already supports font-smoothing (or
+antialiasing or grayscaling). The problem is that OS/2's font engine, in
+its current incarnation, doesn't know anything about anti-aliased text and
+is only able to manage monochrome bitmaps. Font smoothing support would
+require some changes of PM/GPI/GRE components, which certainly is out of
+our scope, and isn't planned by IBM (to our knowledge) in foreseeable
+future, if ever.
+
+If you really need font smoothing in your application, you can still use
+the FreeType library itself. Be warned that it is a rather low-level engine
+and that you'll need to add a various number of text features on top of
+this code to get the equivalent of PM's font API.
+
+There is a good chance that FreeType 2.0 will ease the pain for developers
+when it's available.
+
+And if you really want font smoothing in OS/2, ask IBM!
+
+Q4: Why does IBM's TrueType engine do such a poor job?
+
+A4: It'd be easy to throw one or two stones at IBM's engineers if this was
+the result of lazy coding or bad software engineering. However, the problem
+is more complex, and PSP programmers deserve little, if any, blame.
+
+Trouble is that the TrueType specification, which can be found both on
+Microsoft and Apple sites, has severe lacks, as well as particularly fuzzy
+definitions. Part of the TT spec is the TrueType bytecode specification.
+This bytecode is used to write glyph programs that are used to explicitely
+hint each glyph to have it rendered perfectly on the screen (and on
+printers). It is made of approximately 200 opcodes, which relate to moving
+points on a pixel grid, measuring distances in any kind of direction,
+keeping widths and heights consistent across a single font, etc..
+
+Some of these opcodes are simply un-documented, or lack precise and
+important details related to their exact implementation. As a consequence,
+when FreeType started, it's first bytecode interpreter exhibited results
+which were very similar to OS/2's one (i.e. bad baseline, incoherent
+widths, "swashs" and bad serifs, etc..). There are several commercial
+engines which provide the same kind of "erroneous" output, like the one in
+the BeOS for instance.
+
+It took FreeType developers _many_ months and experimentation to discover
+the real meaning of some opcodes, and incorporate it into the library. This
+"spelunker" work has been painful and slow, which is why few commercial
+companies, if any, dared to do it, but it finally pays off ! Moreover, the
+FreeType library is released under a BSD-like free license. This means that
+_anyone_ is now able to take the work that has been done to rewrite or fix
+his own TrueType interpreter. (Of course, another good idea is to use
+FreeType as your core TrueType engine, to be able to benefit to ongoing
+fixes and "undocumented features" discoveries, etc...)
+
+Q5: But there are still differences with the glyphs produced by Windows or
+the Mac, right?
+
+A5: Right. Another feature of the TrueType specification is to use fixed
+float pixel coordinates. When measuring distances along diagonals, some
+rouding error usually occur. Also, some TrueType opcodes have a more or
+less "chaotic" behaviour, where a ridiculous difference in inputs can
+produce vastly different results. These factors mean that the only way to
+match bit-to-bit the glyphs produced by Windows or the Macintosh is to
+implement the _exact_ same computation routines, and reproduce all their
+rounding errors ! As FreeType is a clean-room implementation, this will
+never be possible. Note that the bitmaps match in 95% cases, at least, and
+that there are already differences between the Win 3.1 and Win95 TrueType
+renderers (i.e. look at the "m" of Arial at size 8 for example).
+
+The FreeType team tries very hard to "catch" differences, but there is a
+point where this just isn't possible... However, we're very satisfied with
+its current quality, and we hope you'll be too :-)
+
+Q6: I've got TrueType Times New Roman installed but the system still seems
+to be using the original ATM (Type 1) font. Why this odd behaviour?
+
+A6: It seems in case of a name clash OS/2 is using the font that was
+installed later. Try removing and reinstalling the TrueType font.
+Alternately remove the ATM (Type 1) font (not recommended).
+Experiments also suggest that different apps behave differently. Some apps
+will for example show both fonts but will use only one of them anyway. It
+really depends.
+
+Q7: I noticed it takes a second or two before the Font Palette object opens
+for the first time. Why?
+
+A7: Because FreeType/2 postpones as much work on the fonts as possible
+until it's really needed. This means the first opening of a font is a bit
+slower. But it also means no resources are unnecessarily wasted. And it's
+not really that bad :-) This behaviour is also noticeable when e.g. opening
+a document for the first time. Note that subsequent openings are OK because
+OS/2 caches as much information as possible.
+
+Q8: I noticed the characters sometimes have odd spacing. When will you fix
+it?
+
+A8: I won't. It's not really a bug, it's a feature. If they weren't spaced
+'oddly', the result might look better, but only at the cost of
+Windows-style 'WYSIWYG', i.e. what you see on screen will almost certainly
+look totally different on any other device. Anyway, the spacing is
+controlled by OS/2 and not by the Font Driver itself, so if you still don't
+like it, IBM is the right one to ask :-)
+
+This problem is particularly visible in Netscape. Most probably this
+happens because Netscape tries to use fractional pointsizes, but most
+TrueType fonts don't allow that. This means that Netscape sometimes
+positions characters as if they were e.g. 8.6 points while their actual
+size is only 8 points.
+
+Q9: Could you explain the open fonts limit?
+
+A9: Sure. If you install 50 fonts in OS/2, the system opens them all at
+startup and keeps them open until shutdown. While many users may want to
+have large number of fonts installed (like me), very few of them probably
+use all the fonts all the time. This of course wastes lots of memory and
+swap space. Just for your information, normal fonts take up 30-50 K of
+memory with FreeType/2, but for example Times New Roman MT 30 takes over
+500K!
+
+FreeType/2 overcomes this problem by only actually keeping in memory the
+last n most recently used fonts. The actual number is settable via entry in
+OS2.INI and there's an simple REXX script to do that. Good default might be
+10-15 fonts, depending what you want to do with them.
+
+Note that this process is totally transparent to the system. You won't have
+to do anything, FreeType/2 will take care of everything. The only things
+you will notice is dramatically reduced memory consumption and when working
+with large numbers of fonts there may be slight delay when reopening a
+font.
+
+Q10: Can you recommend some fonts to use?
+
+A10: Yes! I recommend to use Micro$oft's (oh no!) Core Fonts - Times New
+Roman, Arial and Courier New, plus other MS fonts. There are several
+reasons: the fonts have very good quality, stick to the TrueType spec prety
+well, support many countries and are widely available. Moreover they're
+free. You can certainly find some Win95 or NT machine in your neighbourhood
+(all too easily I'm afraid). They should also be available from MS's Web
+site.
+Note: If you want to copy the fonts from a Win95 machine, they're in
+\WINDOWS\FONTS. Watch out, the directory is hidden!
+
+Q11: What's a 'broken glyph'?
+
+A11: Some fonts contain buggy or 'broken' glyphs that cannot be reliably
+loaded and rendered. Those glyphs are usually very rarely used so you might
+never notice. There was a problem with the first Beta of FreeType/2 that if
+there was a single broken glyph in a font, the
+whole font didn't work.
+
+Q12: Why do some fonts appear twice, once starting with an '@'?
+
+A12: It's because of DBCS systems. If you don't have one, you can safely
+ignore these fonts. The DBCS characters in them are rotated 90 degrees
+counterclockwise. It allows you to write vertical text (e.g. Chinese) with
+a normal word processor. You write the text horizontally but if you turn
+the resulting page 90 degrees clockwise, you've got vertical text.
+It's not working perfectly yet.
+
+Q13: I've got a Chinese (Japanese, Korean) font but the characters aren't
+there! Why?
+
+A13: Most probably the font and your system settings don't mix. One
+possible cause is that your country setting is different than that of the
+font and the font contains no information about what language it's meant
+for. In that case, FreeType/2 has to guess from your country setting. This
+means it might try to treat e.g. Japanese font as a Korean one which means
+you won't be able to access the Japanese characters in it. It's all a bit
+more complicated but it's a result of how national language support is done
+in OS/2.
+
+Q14: I tried to use a DBCS font but I got an exception un UCONV.DLL. What's
+wrong?
+
+A14: UCONV.DLL it used for character code translation. A likely cause is
+that you are missing the required translation table in \LANGUAGE\CODEPAGE
+directory on your boot drive. Look for file named 'IBM<CP>', where <CP> is
+the codepage you use, e.g. IBM950 for Taiwan or IBM949 for Korea.
+
+Q15: My system won't boot after I installed FreeType/2 and the uninstall
+script won't work when I boot to command line. What now?
+
+A15: But you've archived the key files, haven't you? If not, one way out of
+this mess is booting to command line and renaming or deleting FREETYPE.DLL
+from \OS2\DLL. Your system should boot then.
+
+Q16: I'm upgrading from previous version and I don't want to uninstall and
+reinstall. Is there any other way?
+
+A16: Yes! There's a little utility called REPMOD.EXE which allows you to
+replace files that are in use. In case you don't already have it, it's
+included in the FreeType/2 package. You should simply run UPDATE.CMD. The
+new version will be used on next reboot.
+
+Q17: What's this stuff about Times New Roman being aliased to Tms Rmn?
+Please explain this.
+
+A17: OS/2 contains bitmap font called Tms Rmn which is often used in dialog
+windows and elsewhere. The bitmap font contains only several pointsizes (8,
+10, 12, 14, 18, 24). If you request a missing pointsize, OS/2's graphics
+engine (GRE) substitutes it from the (outline) ATM font Times New Roman
+which can also be referred to as Roman/Tms Rmn. Now FreeType/2 mimics this
+functionality and can fully replace the ATM version. I recommend to
+uninstall the ATM font since if both fonts are installed, some apps use the
+ATM one, others TrueType one, without any apparent logic. If you uninstall
+(via Font Palette) the ATM version, you will always get high-quality
+TrueType Times New Roman.
diff --git a/xc/extras/FreeType/contrib/ftos2/ft2.gif b/xc/extras/FreeType/contrib/ftos2/ft2.gif
new file mode 100644
index 000000000..b3e963239
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ft2.gif
Binary files differ
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/32fddef.h b/xc/extras/FreeType/contrib/ftos2/ifi/32fddef.h
new file mode 100644
index 000000000..73ae565bb
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/32fddef.h
@@ -0,0 +1,53 @@
+/*********************************************************************\
+* Module Name: 32FDDEF.H
+*
+* OS/2 Intelligent Font Interface
+*
+* Copyright (c) 1989,1994 IBM Corporation
+* Copyright (c) 1989 Microsoft Corporation
+*
+\*********************************************************************/
+#ifndef __32FDDEF_H__
+#define __32FDDEF_H__
+
+/* Typedef the Font Driver 32 Bit entry points */
+
+/* FdLoadFontFile */
+typedef HFF (* _syscall PFDLFF)(PSZ pszFileName);
+
+/* FdQueryFaces */
+typedef LONG (* _syscall PFDQF)(HFF hff, PIFIMETRICS pifim,
+ ULONG cMetricLen, ULONG cFontCount,
+ ULONG cStart);
+/* FdConvertFontFile */
+typedef LONG (* _syscall PFDCFF)(PSZ pszSrc, PSZ pszDestDir,
+ PSZ pszName);
+
+/* FdClaimFontFile */
+typedef LONG (* _syscall PFDCLF)(PSZ pszFileName);
+
+/* FdUnloadFontFile */
+typedef LONG (* _syscall PFDUFF)(HFF hff);
+
+/* FdOpenFontContext */
+typedef HFC (* _syscall PFDOFC)(HFF hff, ULONG ulFont);
+
+/* FdSetFontContext */
+typedef LONG (* _syscall PFDSFC)(HFC hfc, PCONTEXTINFO pci);
+
+/* FdCloseFontContext */
+typedef LONG (* _syscall PFDCFC)(HFC hfc);
+
+/* FdQueryFaceAttr */
+typedef LONG (* _syscall PFDQFA)(HFC hfc, ULONG iQuery, PBYTE pBuffer,
+ ULONG cb, PGLYPH pagi, GLYPH gistart);
+
+/* FdQueryCharAttr */
+typedef LONG (* _syscall PFDQCA)(HFC hfc, PCHARATTR pCharAttr,
+ PBITMAPMETRICS pbmm);
+
+/* FdQueryFullFaces */
+typedef LONG (* _syscall PFDQFF)(HFF hff, PVOID pBuf, PULONG cBufLen,
+ PULONG cFontCount, ULONG cStart);
+#endif
+
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/32fdstrc.h b/xc/extras/FreeType/contrib/ftos2/ifi/32fdstrc.h
new file mode 100644
index 000000000..0db1d72d8
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/32fdstrc.h
@@ -0,0 +1,161 @@
+/*********************************************************************\
+* Module Name: 32FDSTRC.H
+*
+* OS/2 Intelligent Font Interface
+*
+* Copyright (c) 1989,1994 IBM Corporation
+* Copyright (c) 1989 Microsoft Corporation
+*
+\*********************************************************************/
+#ifndef __32FDSTRC_H__
+#define __32FDSTRC_H__
+
+#define FACESIZE 32
+#define GLYPHNAMESIZE 16
+
+/* Error codes defined to be returned by IFI */
+/* NOTE: The actual values are subject to change */
+
+/*#define PMERR_BUFFER_TOO_SMALL 23003L*/
+#define PMERR_FACENAME_NOT_FOUND 23004L
+#define PMERR_FD_ALREADY_INSTALLED 23005L
+#define PMERR_INVALID_CONTEXTINFO 23006L
+#define PMERR_NOT_A_FONT_FILE 23007L
+#define PMERR_INVALID_FONT_SELECTION 23008L
+#define PMERR_INVALID_FORMAT 23009L
+#define PMERR_BUSY_HFC 230010L
+#define PMERR_INVALID_HFC 230011L
+#define PMERR_INVALID_INDEX 230012L
+#define PMERR_INVALID_QUERY_TYPE 230013L
+#define PMERR_CONTEXT_NOT_SET 230014L
+
+/* Query faces subfunction */
+#define FD_QUERY_CONTEXTMETRICS 1L
+#define FD_QUERY_ABC_WIDTHS 2L
+#define FD_QUERY_KERNINGPAIRS 3L
+
+/* Query char subfunction */
+#define FD_QUERY_CHARIMAGE 1L
+#define FD_QUERY_OUTLINE 2L
+#define FD_QUERY_BITMAPMETRICS 4L
+
+#define FD_CHARATTR_ALIGNED_8 0x00000001
+#define FD_CHARATTR_ALIGNED_16 0x00000002
+#define FD_CHARATTR_ALIGNED_32 0x00000004
+#define FD_CHARATTR_NO_CACHE 0x00000010
+
+typedef struct _ABC_TRIPLETS /*abc*/
+{
+ LONG lA;
+ ULONG ulB;
+ LONG lC;
+} ABC_TRIPLETS;
+typedef ABC_TRIPLETS *PABC_TRIPLETS;
+
+// THIS STRUCTURE NOW RESIDES IN PMDDI.H FOR CRUISER WORLD
+// BUT IFI FONT DRIVER DOES NOT INCLUDE PMDDI.H
+
+#ifndef INCL_IFI
+typedef struct _POINTFX { /* ptfx */
+ FIXED x;
+ FIXED y;
+} POINTFX;
+typedef POINTFX *PPOINTFX;
+#endif
+
+typedef struct _BITMAPMETRICS /* bmm */
+{
+ SIZEL sizlExtent;
+ ULONG cyAscent;
+#ifdef OLD_DRIVER
+ POINTFX *ppfxOrigin; /* Return character origin. */
+#else
+ POINTFX pfxOrigin; /* Return character origin. */
+#endif
+} BITMAPMETRICS;
+typedef BITMAPMETRICS *PBITMAPMETRICS;
+
+typedef struct _MAT2 /* mat */
+{
+ FIXED eM11;
+ FIXED eM12;
+ FIXED eM21;
+ FIXED eM22;
+} MAT2;
+
+typedef struct _FD_KERNINGPAIRS /* krnpr */
+{
+ GLYPH giFirst;
+ GLYPH giSecond;
+ LONG eKerningAmount;
+} FD_KERNINGPAIRS;
+
+typedef struct _CONTEXTINFO /* ci */
+{
+ ULONG cb; /* Length in bytes of this structure. */
+ ULONG fl; /* Flags. */
+ SIZEL sizlPPM; /* Device resolution in pels/meter. */
+ POINTFX pfxSpot; /* Spot size in pels. */
+ MAT2 matXform; /* Notional to Device transform. */
+} CONTEXTINFO;
+typedef CONTEXTINFO *PCONTEXTINFO;
+
+typedef struct _CHARATTR /* ca */
+{
+ ULONG cb;
+ ULONG iQuery; /* Query type. */
+ GLYPH gi; /* Glyph index in font. */
+ PBYTE pBuffer; /* Bitmap buffer. */
+ ULONG cbLen; /* Size of buffer in bytes. */
+} CHARATTR;
+typedef CHARATTR *PCHARATTR;
+
+typedef struct _CHARATTR2 /* ca2 */
+{
+ ULONG cb;
+ ULONG iQuery; /* Query type. */
+ GLYPH gi; /* Glyph index in font. */
+ PBYTE pBuffer; /* Bitmap buffer. */
+ ULONG cbLen; /* Size of buffer in bytes. */
+ ULONG fl; /* Flags */
+} CHARATTR2;
+typedef CHARATTR2 *PCHARATTR2;
+
+typedef struct _CONTEXTMETRICS
+{
+ SIZEL sizlMax;
+ ULONG cyMaxAscent;
+ ULONG cyMaxDescent;
+ ULONG cxTotal;
+ ULONG cGlyphs;
+} CONTEXTMETRICS;
+typedef CONTEXTMETRICS * PCONTEXTMETRICS;
+
+typedef struct _POLYGONHEADER {
+ ULONG cb;
+ ULONG iType; /* Must be FD_POLYGON_TYPE */
+} POLYGONHEADER;
+typedef POLYGONHEADER *PPOLYGONHEADER;
+
+typedef struct _PRIMLINE {
+ ULONG iType; /* Must be FD_PRIM_LINE */
+ POINTFX pte;
+} PRIMLINE;
+typedef PRIMLINE *PPRIMLINE;
+
+typedef struct _PRIMSPLINE {
+ ULONG iType; /* Must be FD_PRIM_SPLINE */
+ POINTFX pte[3];
+} PRIMSPLINE;
+typedef PRIMSPLINE *PPRIMSPLINE;
+
+/*
+ * The names of these were changed to avoid conflict with PRIM_LINE
+ * which is defined ion some other header file.
+ */
+#define FD_POLYGON_TYPE 24
+#define FD_PRIM_LINE 1
+#define FD_PRIM_SPLINE 3
+
+#endif
+
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/32ifimet.h b/xc/extras/FreeType/contrib/ftos2/ifi/32ifimet.h
new file mode 100644
index 000000000..d965ce0e9
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/32ifimet.h
@@ -0,0 +1,118 @@
+/*********************************************************************\
+* Module Name: 32IFIMET.H
+*
+* OS/2 Intelligent Font Interface
+*
+* Copyright (c) 1989,1994 IBM Corporation
+* Copyright (c) 1989 Microsoft Corporation
+*
+* Definition and description of IFIMETRICS structure
+* This file is included by FDSTRUCS.H
+*
+\*********************************************************************/
+#ifndef __32IFIMET_H__
+#define __32IFIMET_H__
+
+#define FACESIZE 32
+#define GLYPHNAMESIZE 16
+
+/* #defines for fsType in IFIMETRICS */
+
+#define IFIMETRICS_FIXED 0x0001 /*Fixed pitch */
+#define IFIMETRICS_LICENSED 0x0002 /*Font subject of licensing agreement */
+#define IFIMETRICS_KERNING 0x0004 /*Font has kerning data */
+#define IFIMETRICS_DBCS 0x0010 /*DBCS font */
+#define IFIMETRICS_MBCS 0x0018 /*MBCS (DBCS + SBCS) font */
+/* Reserved 0x8000 */
+#define IFIMETRICS_ATOMS 0x4000 /*The atom name fields are valid */
+#define IFIMETRICS_FAMTRUNC 0x2000 /*Familyname field is truncated */
+#define IFIMETRICS_FACETRUNC 0x1000 /*Facename field is truncated */
+#define IFIMETRICS_ANTIALIASED 0x0020
+#define IFIMETRICS_UNICODE 0x0040
+#define IFIMETRICS_NO_CACHE 0x0080
+
+/* #defines for fsDefn in IFIMETRICS */
+
+#define IFIMETRICS_OUTLINE 0x0001 /*1 - Outline. 0 - Raster */
+/* Reserved 0x0002 */
+/* Reserved 0x0004 */
+/* Reserved 0x8000 */
+#define IFIMETRICS_UDC_FONT 0x0010 /*User defined font */
+/* Reserved */
+
+/* #defines for fsSelection in IFIMETRICS valid for bitmap or outline fonts */
+
+#define IFIMETRICS_ITALIC 0x8000 /*Italic */
+#define IFIMETRICS_UNDERSCORE 0x4000 /*Underscored */
+#define IFIMETRICS_OVERSTRUCK 0x2000 /*Overstruck */
+
+/* #defines for fsSelection in IFIMETRICS valid for bitmap fonts */
+
+#define IFIMETRICS_NEGATIVE 0x1000 /*Negative image */
+#define IFIMETRICS_HOLLOW 0x0800 /*Outline (hollow) */
+
+#if defined(__IBMCPP__) || defined(__IBMC__)
+ #pragma pack(1)
+#else
+ #pragma Align_members(1)
+#endif
+
+typedef struct _IFIMETRICS /* ifim */
+{ /* UNITS */
+ UCHAR szFamilyname[FACESIZE]; /*Font Family Name, e.g. Roman */
+ UCHAR szFacename[FACESIZE]; /*Face name, e.g. Tms Rmn Bold Italic */
+ UCHAR szGlyphlistName[GLYPHNAMESIZE]; /*e.g. PM316, Latin-2, Greek */
+ USHORT idRegistry; /*IBM registration number (or zero). I */
+ LONG lCapEmHeight; /*Height of uppercase M N */
+ LONG lXHeight; /*Nominal height of lowercase N */
+ LONG lMaxAscender; /*Maximum height above baseline of any char N */
+ LONG lMaxDescender; /*Maximum depth below baseline of any char N */
+ LONG lLowerCaseAscent; /*Maximum height above baseline of any a-z N */
+ LONG lLowerCaseDescent; /*Maximum depth below basiline of any a-z N */
+ LONG lInternalLeading; /*White space within character N */
+ LONG lExternalLeading; /*White space between lines N */
+ LONG lAveCharWidth; /*Weighted average character width N */
+ LONG lMaxCharInc; /*Maximum character increment N */
+ LONG lEmInc; /*Increment for Capitals (typically 'M') N */
+ LONG lMaxBaselineExt; /*Height of character cell N */
+ FIXED fxCharSlope; /*Slope angle, degrees, clockwise D */
+ FIXED fxInlineDir; /*Drawing direction, degrees clockwise D */
+ FIXED fxCharRot; /*Glyph rotation in cell, degrees clockwise D */
+ USHORT usWeightClass; /*Character weight, 1-9 (1=ultra-light) I */
+ USHORT usWidthClass; /*Character width, 1-9 (1=ultra condensed) I */
+ LONG lEmSquareSizeX; /*Em Square size, x-direction N */
+ LONG lEmSquareSizeY; /*Em Square size, y-direction N */
+ GLYPH giFirstChar; /*Number of first glyph in font I */
+ GLYPH giLastChar; /*Number of last glyph in font I */
+ GLYPH giDefaultChar; /*Glyph used if requested glyph invalid I */
+ GLYPH giBreakChar; /*Space glyph I */
+ USHORT usNominalPointSize; /*Point size for which font was designed N */
+ USHORT usMinimumPointSize; /*Minimum point size scaling for font N */
+ USHORT usMaximumPointSize; /*Maximum point size scaling for font N */
+ USHORT fsType; /*Type indicators (see #defines) B */
+ USHORT fsDefn; /*Font definition data (see #defines) B */
+ USHORT fsSelection; /*Font selection flags (see #defines) B */
+ USHORT fsCapabilities; /*Font capabilities must be 0 B */
+ LONG lSubscriptXSize; /*Size in x-direction of subscript N */
+ LONG lSubscriptYSize; /*Size in y-direction of subscript N */
+ LONG lSubscriptXOffset; /*Offset in x-direction of subscript N */
+ LONG lSubscriptYOffset; /*Offset in y-direction of subscript N */
+ LONG lSuperscriptXSize; /*Size in x-direction of superscript N */
+ LONG lSuperscriptYSize; /*Size in y-direction of superscript N */
+ LONG lSuperscriptXOffset; /*Offset in x-direction of superscript N */
+ LONG lSuperscriptYOffset; /*Offset in y-direction of superscript N */
+ LONG lUnderscoreSize; /*Underscore size N */
+ LONG lUnderscorePosition; /*Underscore position N */
+ LONG lStrikeoutSize; /*Strikeout size N */
+ LONG lStrikeoutPosition; /*Strikeout position N */
+ SHORT cKerningPairs; /*Number of kerning pairs in pair table I */
+ ULONG ulFontClass; /*IBM font classification B */
+} IFIMETRICS;
+typedef IFIMETRICS FAR *PIFIMETRICS;
+#if defined(__IBMCPP__) || defined(__IBMC__)
+ #pragma pack()
+#else
+ #pragma Align_members()
+#endif
+
+#endif
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/32pmifi.h b/xc/extras/FreeType/contrib/ftos2/ifi/32pmifi.h
new file mode 100644
index 000000000..e0bdb893a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/32pmifi.h
@@ -0,0 +1,79 @@
+/*********************************************************************\
+* Module Name: 32PMIFI.H
+*
+* OS/2 Intelligent Font Interface
+*
+* Copyright (c) 1989,1994 IBM Corporation
+* Copyright (c) 1989 Microsoft Corporation
+*
+\*********************************************************************/
+#ifndef __32PMIFI_H__
+#define __32PMIFI_H__
+
+#define INCL_IFD
+
+typedef PVOID HFF; /* Font file handle */
+typedef PVOID HFC; /* Font context handle */
+
+#ifndef INCL_GRE_FONTS
+typedef ULONG GLYPH; /* gi */
+typedef ULONG *PGLYPH; /* pgi */
+#endif
+
+#include "32fdstrc.h" /* Font Driver structures */
+#include "32ifimet.h" /* Pifi Metrics */
+#include "32fddef.h" /* Font Driver entry definitions */
+
+
+typedef struct _FDDISPATCH16 { /* fdisp */
+ PVOID FdLoadFontFile;
+ PVOID FdQueryFaces;
+ PVOID FdUnloadFontFile;
+ PVOID FdOpenFontContext;
+ PVOID FdSetFontContext;
+ PVOID FdCloseFontContext;
+ PVOID FdQueryFaceAttr;
+ PVOID FdQueryCharAttr;
+ PVOID FdClaimFontFile;
+ PVOID FdConvertFontFile;
+} FDDISPATCH16;
+typedef FDDISPATCH16 FAR *PFDDISPATCH16;
+
+
+typedef struct _FDDISPATCH { /* fdisp */
+ PFDLFF FdLoadFontFile;
+ PFDQF FdQueryFaces;
+ PFDUFF FdUnloadFontFile;
+ PFDOFC FdOpenFontContext;
+ PFDSFC FdSetFontContext;
+ PFDCFC FdCloseFontContext;
+ PFDQFA FdQueryFaceAttr;
+ PFDQCA FdQueryCharAttr;
+ PFDCLF FdClaimFontFile;
+ PFDCFF FdConvertFontFile;
+ PFDQFF FdQueryFullFaces;
+} FDDISPATCH;
+typedef FDDISPATCH *PFDDISPATCH;
+
+typedef struct _FDHEADER { /* fdhdr */
+ ULONG cbLength; /* Length of FDHEADER */
+ UCHAR strId[16]; /* String 'OS/2 FONT DRIVER' */
+ UCHAR szTechnology[40]; /* Identifier of Font Driver technology */
+ ULONG ulVersion; /* IFI version number (0x0100) */
+ ULONG ufDeviceCaps; /* Capabilities of device */
+ PFDDISPATCH pfddisp;
+} FDHEADER;
+
+typedef FDHEADER FAR *PFDHEADER;
+
+#define OK 0
+#define ERROR -1
+
+#define IFI_VERSION 10
+#define IFI_VERSION20 20
+#define IFI_VERSION21 21
+
+#define FD_DISPATCH_COUNT 11
+#define DISPATCHTABLE "FONT_DRIVER_DISPATCH_TABLE"
+
+#endif
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.def b/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.def
new file mode 100644
index 000000000..a9e06b244
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.def
@@ -0,0 +1,10 @@
+;LIBRARY FreeType INITGLOBAL TERMGLOBAL
+LIBRARY FreeType INITINSTANCE TERMINSTANCE
+
+PROTMODE
+
+DATA SINGLE SHARED READWRITE LOADONCALL
+;DATA MULTIPLE NONSHARED READWRITE LOADONCALL
+CODE LOADONCALL
+
+DESCRIPTION "FreeType/2, Copyright (C) 1998 Michal Necasek"
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.icc b/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.icc
new file mode 100644
index 000000000..1c9d230ef
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.icc
@@ -0,0 +1,35 @@
+# Makefile for FTIFI using IBM VisualAge C++
+#
+# Explanation of compiler switches used:
+# -C compile only, do not link
+# -Sp1 pack structures on byte boundaries (quite important)
+# -Ss accept double slash (//) comments
+# -Ge- build a DLL
+# -Rn build a subsystem DLL; means that a special C library is
+# linked and some calls cannot be used
+# -Fo<name> create object file <name>
+# -O+ optimizations on
+# -G4 optimize for 486 (should be better for my 6x86MX, produces smaller
+# code than Pentium optimization)
+# Linker switches used:
+# /DE include debug info in executable
+# /NOE no extended dictionary search
+# /E:2 exepack (for Warp 3 and higher)
+# /A:32 align pages of code on 32-byte boundaries (makes smaller file)
+# /DBGPACK pack debug info
+
+# uncomment ICCR and LNKR to build a release version
+ICCR=-O+ -G4
+LNKR=/PACKC /PACKD /M /A:32 /E:2
+# uncomment ICCD and LNKD to build a debug version. Note that debug and
+# release version is not mutually exclusive in this case.
+#ICCD=-Ti+ -DDEBUG
+#ICCD=-Ti+
+#LNKD=/DE /DBGPACK /M
+
+
+FreeType.dll: $*.obj $*.def ..\lib\libttf.lib
+ ilink /NOE $(LNKD) $(LNKR) $*.obj ..\lib\libttf.lib libconv.lib $*.def
+
+FreeType.obj: ftifi.c ftifi.h FreeType.icc
+ icc $(ICCD) $(ICCR) -C -Sp1 -Ss -Ge- -Rn -FoFreeType -I..\lib -I..\lib\extend -I..\lib\arch\os2 ftifi.c
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.wat b/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.wat
new file mode 100644
index 000000000..ecb1a6cea
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/FreeType.wat
@@ -0,0 +1,29 @@
+# WARNING!! this doesn't quite work yet!!!!
+#
+# Makefile for FTIFI using Watcom C/C++
+#
+# Explanation of compiler switches used:
+# -4r register calling convention, generate 486 code. Better than
+# Pentium opt. for Cyrix/IBM and AMD
+# -otexan maximum optimization for speed
+# -zp1 pack structures on byte boundaries (quite important!)
+# -bd build a DLL
+# -zc
+# -d2 include debug info
+#
+# Important linker options used:
+# initglobal call DLL initialization function only once (not for each
+# process)
+# termglobal call DLL termination function only once
+# oneautodata use only one shared data segment
+
+WCCR=-4r -otexan
+#WCCD=-d2 -DDEBUG
+#LNKD=debug all
+
+
+FreeType.dll: $*.obj $*.def
+ wlink system os2v2 dll initglobal termglobal op oneautodata export GetOutline_ export FONT_DRIVER_DISPATCH_TABLE=_fdhdr file $* lib ..\lib\libttf.lib $(LNKD)
+
+FreeType.obj: ftifi.c ftifi.h
+ wcc386 $(WCCD) $(WCCR) -zp1 -bd -zc -I..\lib -I..\lib\extend ftifi.c /Fo=freetype.obj
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/ftifi.c b/xc/extras/FreeType/contrib/ftos2/ifi/ftifi.c
new file mode 100644
index 000000000..9cb672137
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/ftifi.c
@@ -0,0 +1,3209 @@
+/* */
+/* OS/2 Font Driver using the FreeType library */
+/* */
+/* Copyright (C) 1997, 1998 Michal Necasek <mike@mendelu.cz> */
+/* Copyright (C) 1997, 1998 David Turner <turner@email.ENST.Fr> */
+/* Copyright (C) 1997, 1998 International Business Machines */
+/* */
+/* Version: 0.9.90 (Beta) */
+/* */
+/* This source is to be compiled with IBM VisualAge C++ 3.0 or possibly */
+/* Watcom C/C++ 10.0 or higher (Wactom doesn't quite work yet). */
+/* Other compilers may actually work too but don't forget this is NOT a */
+/* normal DLL but rather a subsystem DLL. That means it shouldn't use */
+/* the usual C library as it has to run without runtime environment. */
+/* VisualAge provides a special subsystem version of the run-time library. */
+/* All this is of course very compiler-dependent. See makefiles for */
+/* discussion of switches used. */
+/* */
+/* Implemantation Notes: */
+/* */
+/* Note #1: As a consequence of this being a subsystem librarary, I had to */
+/* slightly modify the FreeType source, namely ttmemory.c and ttfile.c. */
+/* FreeType/2 now allocates several chunks of memory and uses them as a */
+/* heap. Note that memory allocation should use TTAlloc(), possibly */
+/* directly SSAllocMem(). malloc() is unusable here and it doesn't work */
+/* at all (runtime library isn't even initialized). See ttmemory.c for */
+/* more info. */
+/* In ttfile.c I had to change all fopen(), fseek()... calls */
+/* to OS/2 API calls (DosOpen, DosSetFilePtr...) because without proper */
+/* runtime environment a subsystem DLL cannot use std C library calls. */
+/* */
+/* Note #2: On exit of each function reading from font file the API */
+/* TT_Flush_Stream() must be called. This is because file handles opened */
+/* by this DLL actually belong to the calling process. As a consequence */
+/* a) it's easy to run out of file handles, which results in really */
+/* very nasty behavior and/or crashes. This could be solved by */
+/* increased file handles limit, but cannot because */
+/* b) it is impossible to close files open by another process and */
+/* therefore the fonts cannot be properly uninstalled (you can't */
+/* delete them while the're open by other process) */
+/* The only solution I found is very simple - just close the file before */
+/* exiting a DLL function. This ensures files are not left open across */
+/* processes and other problems. */
+/* */
+/* Note #3: The whole business with linked lists is aimed at lowering */
+/* memory consumption drastically. If you install 50 TT fonts, OS/2 */
+/* opens all of them at startup. Even if you never use them, they take */
+/* up at least over 1 Meg memory. With certain fonts the consumption can */
+/* easily go over several MB. We limit such waste of memory by only */
+/* actually keeping open several typefaces most recently used. Their */
+/* number can be set via entry in OS2.INI. */
+/* */
+/* For Intelligent Font Interface (IFI) specification please see IFI32.TXT */
+
+#ifndef __IBMC__
+ #ifndef __WATCOMC__
+ #error "This source requires IBM VisualAge C++ or Watcom C/C++"
+ #endif
+#endif
+
+/* Defining the following uses UCONV.DLL instead of the built-in */
+/* translation tables. This code should work on any Warp 4 and */
+/* Warp 3 w/ FixPak 35(?) and above */
+/* Note: this should be defined before FTIFI.H is #included */
+#undef USE_UCONV
+
+#define INCL_WINSHELLDATA /* for accessing OS2.INI */
+#define INCL_DOSMISC
+#define INCL_DOSNLS
+#define INCL_DOSPROCESS
+#define INCL_GRE_DCS
+#define INCL_GRE_DEVSUPPORT
+#define INCL_DDIMISC
+#define INCL_IFI
+#include <os2.h>
+#include <pmddi.h> /* SSAllocmem(), SSFreemem() and more */
+
+#ifdef USE_UCONV /* uconv.h isn't always available */
+#include <uconv.h>
+#endif /* USE_UCONV */
+
+#include <string.h>
+#include <stdlib.h> /* min and max macros */
+
+#define _syscall _System /* the IFI headers don't compile without it */
+
+#include "32pmifi.h" /* IFI header */
+#include "freetype.h" /* FreeType header */
+#include "ftxkern.h" /* kerning extension */
+#include "ftxwidth.h" /* glyph width extension */
+#include "ftifi.h" /* xlate table */
+
+
+/* For the sake of Netscape's text rendering bugs ! */
+#define NETSCAPE_FIX
+
+/* Create 'fake' Roman face for Times New Roman (to mimic PMATM's */
+/* behaviour */
+#define FAKE_TNR
+
+/* (indirectly) exported functions */
+LONG _System ConvertFontFile(PSZ pszSrc, PSZ pszDestDir, PSZ pszNewName);
+HFF _System LoadFontFile(PSZ pszFileName);
+LONG _System UnloadFontFile(HFF hff);
+LONG _System QueryFaces(HFF hff, PIFIMETRICS pifiMetrics, ULONG cMetricLen,
+ ULONG cFountCount, ULONG cStart);
+HFC _System OpenFontContext(HFF hff, ULONG ulFont);
+LONG _System SetFontContext(HFC hfc, PCONTEXTINFO pci);
+LONG _System CloseFontContext(HFC hfc);
+LONG _System QueryFaceAttr(HFC hfc, ULONG iQuery, PBYTE pBuffer,
+ ULONG cb, PGLYPH pagi, GLYPH giStart);
+LONG _System QueryCharAttr(HFC hfc, PCHARATTR pCharAttr,
+ PBITMAPMETRICS pbmm);
+LONG _System QueryFullFaces(HFF hff, PVOID pBuff, PULONG buflen,
+ PULONG cFontCount, ULONG cStart);
+
+FDDISPATCH fdisp = { /* Font driver dispatch table */
+ LoadFontFile,
+ QueryFaces,
+ UnloadFontFile,
+ OpenFontContext,
+ SetFontContext,
+ CloseFontContext,
+ QueryFaceAttr,
+ QueryCharAttr,
+ NULL, /* this one is no more used, only the spec fails to mention it */
+ ConvertFontFile,
+ QueryFullFaces
+};
+
+
+
+/****************************************************************************/
+/* the single exported entry point; this way is faster than exporting every */
+/* single function and a bit more flexible */
+/* */
+#pragma export (fdhdr, "FONT_DRIVER_DISPATCH_TABLE", 1)
+FDHEADER fdhdr =
+{ /* Font driver Header */
+ sizeof(FDHEADER),
+ "OS/2 FONT DRIVER", /* do not change */
+ "TrueType (Using FreeType Engine)", /* description up to 40 chars */
+ IFI_VERSION20, /* version */
+ 0, /* reserved */
+ &fdisp
+};
+
+
+/****************************************************************************/
+/* some debug macros and functions. the debug version logs system requests */
+/* to the file C:\FTIFI.LOG */
+/* */
+#ifdef DEBUG
+ HFILE LogHandle = NULLHANDLE;
+ ULONG Written = 0;
+ char log[2048] = "";
+ char buf[2048] = "";
+
+
+char* itoa10( int i, char* buffer ) {
+ char* ptr = buffer;
+ char* rptr = buffer;
+ char digit;
+
+ if (i == 0) {
+ buffer[0] = '0';
+ buffer[1] = 0;
+ return buffer;
+ }
+
+ if (i < 0) {
+ *ptr = '-';
+ ptr++; rptr++;
+ i = -i;
+ }
+
+ while (i != 0) {
+ *ptr = (char) (i % 10 + '0');
+ ptr++;
+ i /= 10;
+ }
+
+ *ptr = 0; ptr--;
+
+ while (ptr > rptr) {
+ digit = *ptr;
+ *ptr = *rptr;
+ *rptr = digit;
+ ptr--;
+ rptr++;
+ }
+
+ return buffer;
+}
+
+ #define COPY(s) strcpy(log, s)
+ #define CAT(s) strcat(log, s)
+ #define CATI(v) strcat(log, itoa10( (int)v, buf ))
+ #define WRITE DosWrite(LogHandle, log, strlen(log), &Written)
+
+ #define ERET1(label) { COPY("Error at "); \
+ CATI(__LINE__); \
+ CAT("\r\n"); \
+ WRITE; \
+ goto label; \
+ }
+
+ #define ERRRET(e) { COPY("Error at "); \
+ CATI(__LINE__); \
+ CAT("\r\n"); \
+ WRITE; \
+ return(e); \
+ }
+
+
+#else
+
+ #define COPY(s)
+ #define CAT(s)
+ #define CATI(v)
+ #define WRITE
+
+ #define ERET1(label) goto label;
+
+ #define ERRRET(e) return(e);
+
+#endif /* DEBUG */
+
+
+/****************************************************************************/
+/* */
+/* 'engine' : */
+/* */
+/* The FreeType engine instance. Although this is a DLL, it isn't */
+/* supposed to be shared by apps, as it is only called by the OS/2 GRE. */
+/* This means that there is no need to bother with reentrancy/thread */
+/* safety, which aren't supported by FreeType 1.0 anyway. */
+/* */
+TT_Engine engine;
+
+/****************************************************************************/
+/* */
+/* TList and TListElement : */
+/* */
+/* simple structures used to implement a doubly linked list. Lists are */
+/* used to implement the HFF object lists, as well as the font size and */
+/* outline caches. */
+/* */
+
+typedef struct _TListElement TListElement, *PListElement;
+
+struct _TListElement
+{
+ PListElement next; /* next element in list - NULL if tail */
+ PListElement prev; /* previous element in list - NULL if head */
+ long key; /* value used for searches */
+ void* data; /* pointer to the listed/cached object */
+};
+
+typedef struct _TList TList, *PList;
+struct _TList
+{
+ PListElement head; /* first element in list - NULL if empty */
+ PListElement tail; /* last element in list - NULL if empty */
+ int count; /* number of elements in list */
+};
+
+static PListElement free_elements = 0;
+
+#if 0
+/****************************************************************************/
+/* */
+/* TGlyph_Image : */
+/* */
+/* structure used to store a glyph's attributes, i.e. outlines and metrics */
+/* Note that we do not cache bitmaps ourselves for the moment. */
+/* */
+typedef struct _TGlyph_Image TGlyph_Image, *PGlyph_Image;
+
+struct _TGlyph_Image
+{
+ PListElement element; /* list element for this glyph image */
+ TT_Glyph_Metrics metrics;
+ TT_Outline outline;
+};
+#endif
+
+
+/****************************************************************************/
+/* */
+/* TFontFace : */
+/* */
+/* a structure related to an open font face. It contains data for each of */
+/* possibly several faces in a .TTC file. */
+
+typedef struct _TFontFace TFontFace, *PFontFace;
+
+struct _TFontFace
+{
+ TT_Face face; /* handle to actual FreeType face object */
+ TT_Glyph glyph; /* handle to FreeType glyph container */
+ TT_CharMap charMap; /* handle to FreeType character map */
+ TT_Kerning directory; /* kerning directory */
+ USHORT *widths; /* glyph width cache for large fonts */
+ USHORT *kernIndices; /* reverse translation cache for kerning */
+ LONG em_size; /* points per em square */
+ ULONG flags; /* various FC_* flags (like FC_FLAG_FIXED)*/
+#if 0 /* not now */
+ TList sizes; /* list of live child font sizes */
+#endif
+ LONG charMode; /* character translation mode : */
+ /* 0 = Unicode to UGL */
+ /* 1 = Symbol (no translation) */
+ /* 2 = Unicode w/o translation */
+};
+
+
+/****************************************************************************/
+/* */
+/* TFontFile : */
+/* */
+/* a structure related to an open font file handle. All TFontFiles are */
+/* kept in a simple linked list. There can be several faces in one font. */
+/* Face(s) information is stored in a variable-length array of TFontFaces. */
+/* A single TFontFile structure exactly corresponds to one HFF. */
+
+typedef struct _TFontFile TFontFile, *PFontFile;
+
+struct _TFontFile
+{
+ PListElement element; /* list element for this font face */
+ HFF hff; /* HFF handle used from outside */
+ CHAR filename[260]; /* font file name */
+ LONG ref_count; /* number of times this font file is open */
+ ULONG flags; /* various FL_* flags */
+ ULONG numFaces; /* number of faces in a file (normally 1) */
+ TFontFace *faces; /* array of FontFace structures */
+};
+
+
+/* Flag : The font face has a fixed pitch width */
+#define FC_FLAG_FIXED_WIDTH 1
+
+/* Flag : Effectively duplicated FL_FLAG_DBCS_FILE. This info is */
+/* kept twice for simplified access */
+#define FC_FLAG_DBCS_FACE 2
+
+/* Flag : This face is an alias */
+#define FL_FLAG_FAKE_ROMAN 8
+
+/* Flag : The font file has a live FreeType face object */
+#define FL_FLAG_LIVE_FACE 16
+
+/* Flag : A font file's face has a context open - DON'T CLOSE IT! */
+#define FL_FLAG_CONTEXT_OPEN 32
+
+/* Flag : This file has been already opened previously*/
+#define FL_FLAG_ALREADY_USED 64
+
+/* Flag : This is a font including DBCS characters; this also means */
+/* the font driver presents to the system a second, vertically */
+/* rendered, version of this typeface with name prepended by */
+/* an '@' (used in horizontal-only word processors) */
+/* Note : For TTCs, the whole collection is either DBCS or not. I've */
+/* no idea if there are any TTCs with both DBCS and non-DBCS */
+/* faces. It's possible, but sounds unlikely. */
+#define FL_FLAG_DBCS_FILE 128
+
+/* Note, we'll only keep the first max_open_files files with opened */
+/* FreeType objects/instances.. */
+int max_open_files = 10;
+
+/* number of processes using the font driver; used by the init/term */
+/* routine */
+ULONG ulProcessCount = 0;
+
+/* the list of live faces */
+static TList liveFiles = { NULL, NULL, 0 };
+
+/* the list of sleeping faces */
+static TList idleFiles = { NULL, NULL, 0 };
+
+/****************************************************************************/
+/* */
+/* TFontSize : */
+/* */
+/* a structure related to a opened font context (a.k.a. instance or */
+/* transform/pointsize). It exactly corresponds to a HFC. */
+/* */
+
+typedef struct _TFontSize TFontSize, *PFontSize;
+
+struct _TFontSize
+{
+ PListElement element; /* List element for this font size */
+ HFC hfc; /* HFC handle used from outside */
+ TT_Instance instance; /* handle to FreeType instance */
+ BOOL transformed; /* TRUE = rotation/shearing used (rare) */
+ BOOL vertical; /* TRUE = vertically rendered DBCS face */
+ TT_Matrix matrix; /* transformation matrix */
+ PFontFile file; /* HFF this context belongs to */
+ ULONG faceIndex; /* index of face in a font (for TTCs) */
+/* TList outlines;*/ /* outlines cache list */
+};
+
+/****************************************************************************/
+/* array of font context handles. Note that there isn't more than one font */
+/* context open at any time anyway, but we want to be safe.. */
+/* */
+#define MAX_CONTEXTS 5
+
+static TFontSize contexts[MAX_CONTEXTS]; /* this is rather too much */
+
+
+/****************************************************************************/
+/* few globals used for NLS */
+/* */
+/* Note: most of the internationalization (I18N) code was kindly provided */
+/* by Ken Borgendale and Marc L Cohen from IBM (big thanks!). I also */
+/* received help from Tetsuro Nishimura from IBM Japan. */
+/* I was also unable to test the I18N code on actual Japanese, Chinese... */
+/* etc. systems. But it might work. */
+/* */
+
+static ULONG ScriptTag = -1;
+static ULONG LangSysTag = -1;
+static ULONG iLangId = TT_MS_LANGID_ENGLISH_UNITED_STATES; /* language ID */
+static ULONG uLastGlyph = 255; /* last glyph for language */
+static PSZ pGlyphlistName = "SYMBOL"; /* PM383, PMJPN, PMKOR.... */
+static BOOL isGBK = TRUE; /* only used for Chinese */
+static ULONG ulCp[2] = {1}; /* codepages used */
+static UCHAR DBCSLead[12]; /* DBCS lead byte table */
+
+/* rather simple-minded test to decide if given glyph index is a 'halfchar',*/
+/* i.e. Latin character in a DBCS font which is _not_ to be rotated */
+#define is_HALFCHAR(_x) ((_x) < 0x0400)
+
+
+/****************************************************************************/
+/* */
+/* interfaceSEId: */
+/* */
+/* interfaceSEId (Interface-specific Encoding Id) determines what encoding */
+/* the font driver should use if a font includes a Unicode encoding. */
+/* */
+LONG interfaceSEId(TT_Face face, BOOL UDCflag, LONG encoding);
+
+/****************************************************************************/
+/* */
+/* LookUpName : */
+/* */
+/* this function tries to find M$ English name for a face */
+/* length is limited to FACESIZE (defined by OS/2); returns NULL if */
+/* unsuccessful. warning: the string gets overwritten on the next */
+/* invocation */
+/* */
+/* TODO: needs enhancing for I18N */
+static char* LookupName(TT_Face face, int index );
+
+
+/****************************************************************************/
+/* */
+/* GetCharMap : */
+/* */
+/* get suitable charmap from font */
+/* */
+static ULONG GetCharmap(TT_Face face);
+
+
+/****************************************************************************/
+/* */
+/* GetOutlineLen : */
+/* */
+/* get # of bytes needed for glyph outline */
+/* */
+static int GetOutlineLen(TT_Outline *ol);
+
+
+/****************************************************************************/
+/* */
+/* GetOutline : */
+/* */
+/* get glyph outline in PM format */
+/* */
+static int GetOutline(TT_Outline *ol, PBYTE pb);
+
+
+
+/****************************************************************************/
+/* */
+/* IsDBCSChar : */
+/* */
+/* Returns TRUE if character is first byte of a DBCS char, FALSE otherwise */
+/* */
+BOOL IsDBCSChar(UCHAR c)
+{
+ ULONG i;
+
+ for (i = 0; DBCSLead[i] && DBCSLead[i+1]; i += 2)
+ if ((c >= DBCSLead[i]) && (c <= DBCSLead[i+1]))
+ return TRUE;
+ return FALSE;
+}
+
+
+/****************************************************************************/
+/* */
+/* TT_Alloc & TT_Free : */
+/* */
+/* The following two functions are declared here because including */
+/* the entire ttmemory.h creates more problems than it solves */
+/* */
+TT_Error TT_Alloc( long Size, void** P );
+TT_Error TT_Free( void** P );
+TT_Error TTMemory_Init(void);
+
+static TT_Error error;
+
+#define ALLOC( p, size ) TT_Alloc( (size), (void**)&(p) )
+#define FREE( p ) TT_Free( (void**)&(p) )
+
+/****************************************************************************/
+/* */
+/* New_Element : */
+/* */
+/* return a fresh list element. Either new or recycled. */
+/* returns NULL if out of memory. */
+/* */
+static PListElement New_Element( void )
+{
+ PListElement e = free_elements;
+
+ if (e)
+ free_elements = e->next;
+ else
+ {
+ if ( ALLOC( e, sizeof(TListElement) ) )
+ return NULL;
+ }
+ e->next = e->prev = e->data = NULL;
+ e->key = 0;
+
+ return e;
+}
+
+/****************************************************************************/
+/* */
+/* Done_Element : */
+/* */
+/* recycles an old list element */
+/* */
+static void Done_Element( PListElement element )
+{
+ element->next = free_elements;
+ free_elements = element;
+}
+
+/****************************************************************************/
+/* */
+/* List_Insert : */
+/* */
+/* inserts a new object at the head of a given list */
+/* returns 0 in case of success, -1 otherwise. */
+/* */
+static int List_Insert( PList list, PListElement element )
+{
+ if (!list || !element)
+ return -1;
+
+ element->next = list->head;
+
+ if (list->head)
+ list->head->prev = element;
+
+ element->prev = NULL;
+ list->head = element;
+
+ if (!list->tail)
+ list->tail = element;
+
+ list->count++;
+ return 0;
+}
+
+/****************************************************************************/
+/* */
+/* List_Remove : */
+/* */
+/* removes an element from its list. Returns 0 in case of success, */
+/* -1 otherwise. WARNING : this function doesn't check that the */
+/* element is part of the list. */
+/* */
+static int List_Remove( PList list, PListElement element )
+{
+ if (!element)
+ return -1;
+
+ if (element->prev)
+ element->prev->next = element->next;
+ else
+ list->head = element->next;
+
+ if (element->next)
+ element->next->prev = element->prev;
+ else
+ list->tail = element->prev;
+
+ element->next = element->prev = NULL;
+ list->count --;
+ return 0;
+}
+
+/****************************************************************************/
+/* */
+/* List_Find : */
+/* */
+/* Look for a given object with a specified key. Returns NULL if the */
+/* list is empty, or the object wasn't found. */
+/* */
+static PListElement List_Find( PList list, long key )
+{
+ static PListElement cur;
+
+ for ( cur=list->head; cur; cur = cur->next )
+ if ( cur->key == key )
+ return cur;
+
+ /* not found */
+ return NULL;
+}
+
+/****************************************************************************/
+/* */
+/* Sleep_FontFile : */
+/* */
+/* closes a font file's FreeType objects to leave room in memory. */
+/* */
+static int Sleep_FontFile( PFontFile cur_file )
+{
+ int i;
+
+ if (!(cur_file->flags & FL_FLAG_LIVE_FACE))
+ ERRRET(-1); /* already asleep */
+
+ /* is this face in use? */
+ if (cur_file->flags & FL_FLAG_CONTEXT_OPEN) {
+ /* move face to top of the list */
+ if (List_Remove( &liveFiles, cur_file->element ))
+ ERRRET(-1);
+ if (List_Insert( &liveFiles, cur_file->element ))
+ ERRRET(-1);
+
+ cur_file = (PFontFile)(liveFiles.tail->data);
+ }
+
+ /* remove the face from the live list */
+ if (List_Remove( &liveFiles, cur_file->element ))
+ ERRRET(-1);
+
+ /* add it to the sleep list */
+ if (List_Insert( &idleFiles, cur_file->element ))
+ ERRRET(-1);
+
+ /* deactivate its objects - we ignore errors there */
+ for (i = 0; i < cur_file->numFaces; i++) {
+ TT_Done_Glyph( cur_file->faces[i].glyph );
+ TT_Close_Face( cur_file->faces[i].face );
+ }
+ cur_file->flags &= ~FL_FLAG_LIVE_FACE;
+
+ return 0;
+}
+
+/****************************************************************************/
+/* */
+/* Wake_FontFile : */
+/* */
+/* awakes a font file, and reloads important data from disk. */
+/* */
+static int Wake_FontFile( PFontFile cur_file )
+{
+ static TT_Face face;
+ static TT_Glyph glyph;
+ static TT_CharMap cmap;
+ static TT_Face_Properties props;
+ static PFontFace cur_face;
+ ULONG encoding, i;
+
+ if (cur_file->flags & FL_FLAG_LIVE_FACE)
+ ERRRET(-1); /* already awoken !! */
+
+ /* OK, try to activate the FreeType objects */
+ error = TT_Open_Face(engine, cur_file->filename, &face);
+ if (error)
+ {
+ COPY( "Error while opening " ); CAT( cur_file->filename );
+ CAT( ", error code = " ); CATI( error ); CAT( "\r\n" ); WRITE;
+ return -1; /* error, can't open file */
+ /* XXX : should set error condition here! */
+ }
+
+ /* Create a glyph container for it */
+ error = TT_New_Glyph( face, &glyph );
+ if (error)
+ {
+ COPY( "Error while creating container for " ); CAT( cur_file->filename );
+ CAT( ", error code = " ); CATI( error ); CAT( "\r\n" ); WRITE;
+ goto Fail_Face;
+ }
+
+ /* now get suitable charmap for this font */
+ encoding = GetCharmap(face);
+ error = TT_Get_CharMap(face, encoding & 0xFFFF, &cmap);
+ if (error)
+ {
+ COPY( "Error: No char map in " ); CAT( cur_file->filename );
+ CAT( "\r\n" ); WRITE;
+ goto Fail_Glyph;
+ }
+
+ /* Get face properties. Necessary to find out number of fonts for TTCs */
+ TT_Get_Face_Properties(face, &props);
+
+ /* all right, now remove the face from the sleep list */
+ if (List_Remove( &idleFiles, cur_file->element ))
+ ERET1( Fail_Glyph );
+
+ /* add it to the live list */
+ if (List_Insert( &liveFiles, cur_file->element ))
+ ERET1( Fail_Glyph );
+
+ /* If the file is a TTC, the first face is now opened successfully. */
+
+ cur_file->numFaces = props.num_Faces;
+
+ /* Now allocate memory for face data (one struct for each face in TTC). */
+ if (cur_file->faces == NULL) {
+ if (ALLOC(cur_face, sizeof(TFontFace) * cur_file->numFaces))
+ ERET1( Fail_Glyph );
+
+ cur_file->faces = cur_face;
+ }
+ else
+ cur_face = cur_file->faces;
+
+ cur_face->face = face; /* possibly first face in a TTC */
+ cur_face->glyph = glyph;
+ cur_face->charMap = cmap;
+ cur_file->flags |= FL_FLAG_LIVE_FACE;
+
+
+ if (!(cur_file->flags & FL_FLAG_ALREADY_USED)) {
+ cur_face->charMode = encoding >> 16; /* Unicode, Symbol, ... */
+ cur_face->em_size = props.header->Units_Per_EM;
+
+ /* if a face contains over 1024 glyphs, assume it's a DBCS font - */
+ /* VERY probable */
+ TT_Get_Face_Properties(cur_face->face, &props);
+
+ if (props.num_Glyphs > 1024) {
+ cur_file->flags |= FL_FLAG_DBCS_FILE;
+ cur_face->flags |= FC_FLAG_DBCS_FACE;
+ }
+
+ cur_face->widths = NULL;
+ cur_face->kernIndices = NULL;
+ }
+ /* load kerning directory, if any */
+ error = TT_Get_Kerning_Directory(face, &(cur_face->directory));
+ if (error)
+ cur_face->directory.nTables = 0; /* indicates no kerning in font */
+
+ TT_Flush_Face(face); /* this is important ! */
+
+ /* open remaining faces if this font is a TTC */
+ for (i = 1; i < cur_file->numFaces; i++) {
+ error = TT_Open_Collection(engine, cur_file->filename,
+ i, &face);
+ if (error)
+ return -1; /* TODO: handle bad TTCs more tolerantly */
+
+ error = TT_New_Glyph( face, &glyph );
+ if (error)
+ ERET1(Fail_Face);
+
+ encoding = GetCharmap(face);
+ error = TT_Get_CharMap(face, encoding & 0xFFFF, &cmap);
+ if (error)
+ ERET1(Fail_Glyph);
+
+ cur_face = &(cur_file->faces[i]);
+
+ cur_face->face = face;
+ cur_face->glyph = glyph;
+ cur_face->charMap = cmap;
+
+ if (!(cur_file->flags & FL_FLAG_ALREADY_USED)) {
+ cur_face->em_size = props.header->Units_Per_EM;
+ cur_face->charMode = encoding >> 16; /* 0 - Unicode; 1 - Symbol */
+
+ if (cur_file->flags & FL_FLAG_DBCS_FILE)
+ cur_face->flags |= FC_FLAG_DBCS_FACE;
+
+ cur_face->widths = NULL;
+ cur_face->kernIndices = NULL;
+ }
+
+ /* load kerning directory, if any */
+ error = TT_Get_Kerning_Directory(face, &(cur_face->directory));
+ if (error)
+ cur_face->directory.nTables = 0; /* indicates no kerning in font */
+ }
+
+ cur_file->flags |= FL_FLAG_ALREADY_USED; /* indicates some fields need no re-init */
+
+ error = TT_Flush_Face(face); /* this is important ! */
+ if (error) {
+ COPY("Error flushing face\r\n"); WRITE;
+ }
+
+ return 0; /* everything is in order, return 0 == success */
+
+Fail_Glyph:
+ /* This line isn't really necessary, because the glyph container */
+ /* would be destroyed by the following TT_Close_Face anyway. We */
+ /* however use it for the sake of orthodoxy */
+ TT_Done_Glyph( glyph );
+
+Fail_Face:
+ TT_Close_Face(face);
+
+ /* note that in case of error (e.g. out of memory), the face stays */
+ /* on the sleeping list */
+ return -1;
+}
+
+/****************************************************************************/
+/* */
+/* Done_FontFile : */
+/* */
+/* destroys a given font file object. This will also destroy all of its */
+/* live child font sizes (which in turn will destroy the glyph caches). */
+/* This is done for all faces if the file is a collection. */
+/* */
+/* WARNING : The font face must be removed from its list by the caller */
+/* before this function is called. */
+/* */
+static void Done_FontFile( PFontFile *file )
+{
+ static PListElement element;
+ static PListElement next;
+ ULONG i;
+
+#if 0 /* this part isn't really used and maybe it never will */
+ /* destroy its font sizes */
+ element = (*face)->sizes.head;
+ while (element)
+ {
+ next = element->next;
+ /* XXX : right now, we simply free the font size object, */
+ /* because the instance is destroyed automatically */
+ /* by FreeType. */
+
+ FREE( element->data );
+ /* Done_FontSize( (PFontSize)element->data ); - later */
+
+ Done_Element( element );
+ element = next;
+ }
+#endif
+
+ /* now discard the font face itself */
+ if ((*file)->flags & FL_FLAG_LIVE_FACE)
+ {
+ for (i = 0; i < (*file)->numFaces; i++) {
+ TT_Done_Glyph( (*file)->faces[i].glyph );
+ TT_Close_Face( (*file)->faces[i].face );
+
+ if ((*file)->faces[i].widths)
+ FREE((*file)->faces[i].widths);
+ if ((*file)->faces[i].kernIndices)
+ FREE((*file)->faces[i].kernIndices);
+ }
+ }
+
+ FREE( (*file)->faces );
+ FREE( *file );
+}
+
+
+/****************************************************************************/
+/* */
+/* New_FontFile : */
+/* */
+/* return the address of the TFontFile corresponding to a given */
+/* HFF. Note that in our implementation, we could simply to a */
+/* typecast like '(PFontFile)hff'. However, for safety reasons, we */
+/* look up the handle in the list. */
+/* */
+static PFontFile New_FontFile( char* file_name )
+{
+ static PListElement element;
+ static PFontFile cur_file;
+ static TT_CharMap cmap;
+
+ /* first, check if it's already open - in the live list */
+ for ( element = liveFiles.head; element; element = element->next )
+ {
+ cur_file = (PFontFile)element->data;
+ if (strcmp( cur_file->filename, file_name ) == 0)
+ goto Exit_Same;
+ }
+
+ /* check in the idle list */
+ for ( element = idleFiles.head; element; element = element->next )
+ {
+ cur_file = (PFontFile)element->data;
+ if (strcmp( cur_file->filename, file_name ) == 0)
+ goto Exit_Same;
+ }
+
+ /* OK, this file isn't opened yet. Create a new font face object */
+ /* then try to wake it up. This will fail if the file can't be found */
+ /* or if we lack memory.. */
+
+ element = New_Element();
+ if (!element)
+ ERRRET(NULL);
+
+ if ( ALLOC( cur_file, sizeof(TFontFile) ) )
+ ERET1( Fail_Element );
+
+ element->data = cur_file;
+ element->key = (long)cur_file; /* use the HFF as cur key */
+
+ cur_file->element = element;
+ cur_file->ref_count = 1;
+ cur_file->hff = (HFF)cur_file;
+ strcpy( cur_file->filename, file_name);
+ cur_file->flags = 0;
+ cur_file->faces = NULL;
+#if 0 /* not used */
+ cur_face->sizes.head = NULL;
+ cur_face->sizes.tail = NULL;
+ cur_face->sizes.count= 0;
+#endif
+
+ /* add new font face to sleep list */
+ if (List_Insert( &idleFiles, element ))
+ ERET1( Fail_File );
+
+ /* Make enough room in the live list */
+ if ( liveFiles.count >= max_open_files)
+ {
+ COPY( "rolling...\n" ); WRITE;
+ if (Sleep_FontFile( (PFontFile)(liveFiles.tail->data) ))
+ ERET1( Fail_File );
+ }
+
+ /* wake new font file */
+ if ( Wake_FontFile( cur_file ) )
+ {
+ COPY( "could not open/wake " ); CAT( file_name ); CAT( "\r\n" ); WRITE;
+ if (List_Remove( &idleFiles, element ))
+ ERET1( Fail_File );
+
+ ERET1( Fail_File );
+ }
+
+ return cur_file; /* everything is in order */
+
+Fail_File:
+ FREE( cur_file );
+
+Fail_Element:
+ Done_Element( element );
+ return NULL;
+
+Exit_Same:
+ cur_file->ref_count++; /* increment reference count */
+
+ COPY( " -> (duplicate) hff = " ); CATI( cur_file->hff );
+ CAT( "\r\n" ); WRITE;
+
+ return cur_file; /* no sense going on */
+}
+
+/****************************************************************************/
+/* */
+/* getFontFile : */
+/* */
+/* return the address of the TFontFile corresponding to a given */
+/* HFF. If asleep, the file and its face object(s) is awoken. */
+/* */
+PFontFile getFontFile( HFF hff )
+{
+ static PListElement element;
+
+ /* look in the live list first */
+ element = List_Find( &liveFiles, (long)hff );
+ if (element)
+ {
+ /* move it to the front of the live list - if it isn't already */
+ if ( liveFiles.head != element )
+ {
+ if ( List_Remove( &liveFiles, element ) )
+ ERRRET( NULL );
+
+ if ( List_Insert( &liveFiles, element ) )
+ ERRRET( NULL );
+ }
+ return (PFontFile)(element->data);
+ }
+
+ /* the file may be asleep, look in the second list */
+ element = List_Find( &idleFiles, (long)hff );
+ if (element)
+ {
+ /* we need to awake the font, but before that, we must be sure */
+ /* that there is enough room in the live list */
+ if ( liveFiles.count >= max_open_files )
+ if (Sleep_FontFile( (PFontFile)(liveFiles.tail->data) ))
+ ERRRET( NULL );
+
+ if ( Wake_FontFile( (PFontFile)(element->data) ) )
+ ERRRET( NULL );
+
+ COPY ( "hff " ); CATI( hff ); CAT( " awoken\n" ); WRITE;
+ return (PFontFile)(element->data);
+ }
+
+ COPY( "Could not find hff " ); CATI( hff ); CAT( " in lists\n" ); WRITE;
+
+#ifdef DEBUG
+
+ /* dump files lists */
+ COPY( "Live files : " ); CATI( liveFiles.count ); CAT( "\r\n" ); WRITE;
+
+ for (element = liveFiles.head; element; element = element->next)
+ {
+ COPY( ((PFontFile)(element->data))->filename ); CAT("\r\n");WRITE;
+ }
+
+ COPY( "Idle files : " ); CATI( idleFiles.count ); CAT( "\r\n" ); WRITE;
+ for (element = idleFiles.head; element; element = element->next)
+ {
+ COPY( ((PFontFile)(element->data))->filename ); CAT("\r\n");WRITE;
+ }
+#endif
+
+ /* could not find the HFF in the list */
+ return NULL;
+}
+
+
+/****************************************************************************/
+/* */
+/* getFontSize : */
+/* */
+/* return pointer to a TFontSize given a HFC handle, NULL if error */
+/* */
+static PFontSize getFontSize( HFC hfc )
+{
+ int i;
+ for ( i = 0; i < MAX_CONTEXTS; i++ )
+ if ( contexts[i].hfc == hfc ) {
+ return &contexts[i];
+ }
+
+ return NULL;
+}
+
+#ifdef USE_UCONV
+
+/* maximum number of cached UCONV objects */
+#define MAX_UCONV_CACHE 10
+
+/* UCONV object used for conversion from UGL to Unicode */
+#define UCONV_TYPE_UGL 1
+
+/* UCONV objects used for conversion from local DBCS codepage to Unicode */
+#define UCONV_TYPE_BIG5 2
+#define UCONV_TYPE_SJIS 4
+
+/* UCONV objects cache entry */
+typedef struct _UCACHEENTRY {
+ UconvObject object; /* actual UCONV object */
+ PID pid; /* process ID the object is valid for */
+ ULONG type; /* type of UCONV object (UGL or DBCS) */
+} UCACHEENTRY, *PUCACHEENTRY;
+
+/* UCONV globals */
+static UCACHEENTRY UconvCache[MAX_UCONV_CACHE]; /* 10 should do it */
+static int slotsUsed = 0; /* number of cache slots used */
+
+/****************************************************************************/
+/* */
+/* getUconvObject : */
+/* */
+/* a function to cache UCONV objects based on current process. The only */
+/* problem is that FT/2 currently doesn't keep track of processes and */
+/* consequently the objects aren't freed when a process ends. But UCONV */
+/* frees the objects itself anyway. */
+int getUconvObject(UniChar *name, UconvObject *ConvObj, ULONG UconvType) {
+ PPIB ppib; /* process/thread info blocks */
+ PTIB ptib;
+ PID curPid; /* current process ID */
+ int i;
+
+ /* query current process ID */
+ if (DosGetInfoBlocks(&ptib, &ppib))
+ return -1;
+
+ curPid = ppib->pib_ulpid;
+
+ if (slotsUsed == 0) { /* initialize cache */
+ if (UniCreateUconvObject(name, ConvObj) != ULS_SUCCESS)
+ return -1;
+ UconvCache[0].object = *ConvObj;
+ UconvCache[0].pid = curPid;
+ UconvCache[0].type = UconvType;
+
+ for (i = 1; i < MAX_UCONV_CACHE; i++) {
+ UconvCache[i].object = NULL;
+ UconvCache[i].pid = 0;
+ }
+ slotsUsed = 1;
+ return 0;
+ }
+
+ /* search cache for available conversion object */
+ i = 0;
+ while ((UconvCache[i].pid != curPid || UconvCache[i].type != UconvType)
+ && i < slotsUsed)
+ i++;
+
+ if (i < slotsUsed) { /* entry found in cache */
+ *ConvObj = UconvCache[i].object;
+ return 0;
+ }
+
+ /* if cache is full, remove first entry and shift the others 'down' */
+ if (slotsUsed == MAX_UCONV_CACHE) {
+ UniFreeUconvObject(UconvCache[0].object);
+ for (i = 1; i < MAX_UCONV_CACHE; i++) {
+ UconvCache[i - 1].object = UconvCache[i].object;
+ UconvCache[i - 1].pid = UconvCache[i].pid;
+ UconvCache[i - 1].type = UconvCache[i].type;
+ }
+ }
+
+ if (UniCreateUconvObject(name, ConvObj) != ULS_SUCCESS)
+ return -1;
+
+ if (slotsUsed < MAX_UCONV_CACHE)
+ slotsUsed++;
+
+ UconvCache[slotsUsed - 1].object = *ConvObj;
+ UconvCache[slotsUsed - 1].pid = curPid;
+ UconvCache[slotsUsed - 1].type = UconvType;
+
+ return 0;
+}
+
+/****************************************************************************/
+/* */
+/* CleanUCONVCache : */
+/* */
+/* When process is terminated, removes this process' entries in the UCONV */
+/* object cache. Errors are disregarded at this point. */
+void CleanUCONVCache(void) {
+ PPIB ppib; /* process/thread info blocks */
+ PTIB ptib;
+ PID curPid; /* current process ID */
+ int i = 0, j;
+
+ /* query current process ID */
+ if (DosGetInfoBlocks(&ptib, &ppib))
+ return;
+
+ curPid = ppib->pib_ulpid;
+
+ while (i < slotsUsed) {
+ /* if PID matches, remove the entry and shift the others 'down' (or up?) */
+ if (UconvCache[i].pid == curPid) {
+ UniFreeUconvObject(UconvCache[i].object);
+ for (j = i + 1; j < slotsUsed; j++) {
+ UconvCache[j - 1].object = UconvCache[j].object;
+ UconvCache[j - 1].pid = UconvCache[j].pid;
+ UconvCache[j - 1].type = UconvCache[j].type;
+ }
+ slotsUsed--;
+ }
+ i++;
+ }
+}
+#endif /* USE_UCONV */
+
+/****************************************************************************/
+/* */
+/* PM2TT : */
+/* */
+/* a function to convert PM codepoint to TT glyph index. This is the real */
+/* tricky part. */
+/* mode = TRANSLATE_UGL - translate UGL to Unicode */
+/* mode = TRANSLATE_SYMBOL - no translation - symbol font */
+/* mode = TRANSLATE_UNICODE- no translation - Unicode */
+static int PM2TT( TT_CharMap charMap,
+ ULONG mode,
+ int index)
+{
+#ifdef USE_UCONV
+ /* Brand new version that uses UCONV.DLL. This should make FreeType/2 */
+ /* smaller and at the same time more flexible as it now should use */
+ /* the Unicode translation tables supplied with base OS/2 Warp 4. */
+ /* Unfortunately there's a complication (again) since UCONV objects */
+ /* created in one process can't be used in another. Therefore we */
+ /* keep a small cache of recently used UCONV objects. */
+ static UconvObject UGLObj = NULL; /* UGL->Unicode conversion object */
+ static BOOL UconvSet = FALSE;
+ char char_data[2], *pin_char_str;
+ size_t in_bytes_left, uni_chars_left, num_subs;
+ UniChar *pout_uni_str, uni_buffer[4];
+ int rc;
+ static UniChar uglName[10] = L"OS2UGL";
+ static UniChar uglNameBig5[10] = L"IBM-950";
+ static UniChar uglNameSJIS[10] = L"IBM-943";
+
+ switch (mode) {
+ case TRANSLATE_UGL:
+ if (UconvSet == FALSE) {
+ switch (iLangId) { /* select proper conversion table */
+ case TT_MS_LANGID_GREEK_GREECE:
+ strncpy((char*)uglName, (char*)L"OS2UGLG", 16);
+ break;
+ case TT_MS_LANGID_HEBREW_ISRAEL:
+ strncpy((char*)uglName, (char*)L"OS2UGLH", 16);
+ break;
+ case TT_MS_LANGID_ARABIC_SAUDI_ARABIA:
+ strncpy((char*)uglName, (char*)L"OS2UGLA", 16);
+ break;
+ }
+ UconvSet = TRUE;
+ }
+
+ /* get Uconv object - either new or cached */
+ if (getUconvObject(uglName, &UGLObj, UCONV_TYPE_UGL) != 0)
+ return 0;
+
+ if (index > MAX_GLYPH)
+ return 0;
+
+ char_data[0] = index;
+ char_data[1] = index >> 8;
+
+ pout_uni_str = uni_buffer;
+ pin_char_str = char_data;
+ in_bytes_left = 2;
+ uni_chars_left = 1;
+
+ rc = UniUconvToUcs(UGLObj, (void**)&pin_char_str, &in_bytes_left,
+ &pout_uni_str, &uni_chars_left,
+ &num_subs);
+ if (rc != ULS_SUCCESS)
+ return 0;
+ else
+ return TT_Char_Index(charMap, ((unsigned short*)uni_buffer)[0]);
+
+ case TRANSLATE_SYMBOL:
+ case TRANSLATE_UNICODE:
+ case TRANSLATE_BIG5:
+ case TRANSLATE_SJIS:
+ return TT_Char_Index(charMap, index);
+
+ case TRANSLATE_UNI_BIG5:
+ case TRANSLATE_UNI_SJIS:
+
+ /* get Uconv object - either new or cached */
+ switch (mode) {
+ /* get proper conversion object */
+ case TRANSLATE_UNI_BIG5:
+ if (getUconvObject(uglNameBig5, &UGLObj, UCONV_TYPE_BIG5) != 0)
+ return 0;
+ break;
+
+ case TRANSLATE_UNI_SJIS:
+ if (getUconvObject(uglNameSJIS, &UGLObj, UCONV_TYPE_SJIS) != 0)
+ return 0;
+ break;
+ }
+
+ /* Note the bytes are swapped here for double byte chars! */
+ if (index & 0xFF00) {
+ char_data[0] = (index & 0xFF00) >> 8;
+ char_data[1] = index & 0x00FF;
+ }
+ else {
+ char_data[0] = index;
+ char_data[1] = 0;
+ }
+
+ pout_uni_str = uni_buffer;
+ pin_char_str = char_data;
+ in_bytes_left = 2;
+ uni_chars_left = 2;
+
+ rc = UniUconvToUcs(UGLObj, (void**)&pin_char_str, &in_bytes_left,
+ &pout_uni_str, &uni_chars_left,
+ &num_subs);
+ if (rc != ULS_SUCCESS)
+ return 0;
+ else
+ return TT_Char_Index(charMap, ((unsigned short*)uni_buffer)[0]);
+
+ default:
+ return 0;
+ }
+#else
+ switch (mode)
+ {
+ /* convert from PM383 to Unicode */
+ case TRANSLATE_UGL:
+ /* TODO: Hebrew and Arabic UGL */
+ if (iLangId == TT_MS_LANGID_GREEK_GREECE) /* use Greek UGL */
+ if ((index >= GREEK_START) && (index < GREEK_START + GREEK_GLYPHS))
+ return TT_Char_Index(charMap, SubUGLGreek[index - GREEK_START]);
+
+ if (index <= MAX_GLYPH)
+ return TT_Char_Index(charMap, UGL2Uni[index]);
+ else
+ ERRRET(0);
+
+ case TRANSLATE_SYMBOL :
+ case TRANSLATE_UNICODE:
+ case TRANSLATE_BIG5:
+ case TRANSLATE_SJIS:
+ return TT_Char_Index(charMap, index);
+
+ default:
+ return 0;
+ }
+#endif
+}
+
+/****************************************************************************/
+/* */
+/* mystricmp : */
+/* */
+/* A simple function for comparing strings without case sensitivity. Just */
+/* returns zero if strings match, one otherwise. I wrote this because */
+/* stricmp is not available in the subsystem run-time library (probably */
+/* because it uses locales). toupper() is unfortunately unavailable too. */
+/* */
+
+#define toupper( c ) ( ((c) >= 'a') && ((c) <= 'z') ? (c) - 'a' + 'A' : (c) )
+
+static
+int mystricmp(const char *s1, const char *s2) {
+ int i = 0;
+ int match = 0;
+ int len = strlen(s1);
+
+ if (len != strlen(s2))
+ return 1; /* no match */
+
+ while (i < len) {
+ if (toupper(s1[i]) != toupper(s2[i])) {
+ match = 1;
+ break;
+ }
+ i++;
+ }
+ return match;
+}
+
+/* DBCS enabled strrchr (only looks for SBCS chars though) */
+static
+char *mystrrchr(char *s, char c) {
+ int i = 0;
+ int lastfound = -1;
+ int len = strlen(s);
+
+ while (i <= len) {
+ if (IsDBCSChar(s[i])) {
+ i += 2;
+ continue;
+ }
+ if (s[i] == c)
+ lastfound = i;
+ i++;
+ }
+ if (lastfound == -1)
+ return NULL;
+ else
+ return s + lastfound;
+}
+
+/* -------------------------------------------------------------------------*/
+/* here begin the exported functions */
+/* -------------------------------------------------------------------------*/
+
+/****************************************************************************/
+/* */
+/* ConvertFontFile : */
+/* */
+/* Install/delete font file */
+/* */
+LONG _System ConvertFontFile( PSZ source,
+ PSZ dest_dir,
+ PSZ new_name )
+{
+ PSZ source_name;
+
+ COPY("ConvertFontFile: Src = "); CAT(source);
+ if (dest_dir) {
+ CAT(", DestDir = "); CAT(dest_dir);
+ }
+ CAT("\r\n"); WRITE;
+
+ if (dest_dir && new_name)
+ {
+ /* install the font file */
+ source_name = mystrrchr( source, '\\' ); /* find the last backslash */
+ if (!source_name)
+ ERRRET(-1);
+
+ source_name++;
+ strcpy( new_name, source_name );
+
+ /* check if file is to be copied onto itself */
+ if (strncmp(source, dest_dir, strlen(dest_dir)) == 0)
+ return OK; /* do nothing */
+
+ if ( DosCopy( source, dest_dir, DCPY_EXISTING) ) /* overwrite file */
+ ERRRET(-1); /* XXX : we should probably set the error condition */
+
+ COPY(" -> Name: "); CAT(new_name); CAT("\r\n"); WRITE;
+ }
+ else
+ {
+ COPY("Delete file "); CAT(source); CAT("\r\n"); WRITE;
+ DosDelete(source); /* fail quietly */
+ }
+
+ return OK;
+}
+
+/****************************************************************************/
+/* */
+/* LoadFontFile : */
+/* */
+/* open a font file and return a handle for it */
+/* */
+HFF _System LoadFontFile( PSZ file_name )
+{
+ PSZ extension;
+ PFontFile cur_file;
+ PListElement element;
+
+ COPY( "LoadFontFile " ); CAT( file_name ); CAT( "\r\n" ); WRITE;
+
+ /* first check if the file extension is supported */
+ extension = mystrrchr( file_name, '.' ); /* find the last dot */
+ if ( extension == NULL ||
+ (mystricmp(extension, ".TTF") &&
+ mystricmp(extension, ".TTC")) )
+ return ((HFF)-1);
+
+ /* now actually open the file */
+ cur_file = New_FontFile( file_name );
+ if (cur_file)
+ return cur_file->hff;
+ else
+ return (HFF)-1;
+}
+
+/****************************************************************************/
+/* */
+/* UnloadFontFile : */
+/* */
+/* destroy resources associated with a given HFF */
+/* */
+LONG _System UnloadFontFile( HFF hff )
+{
+ PListElement element;
+
+ COPY("UnloadFontFile: hff = "); CATI((int) hff); CAT("\r\n"); WRITE;
+
+ /* look in the live list first */
+ for (element = liveFiles.head; element; element = element->next)
+ {
+ if (element->key == (long)hff)
+ {
+ PFontFile file = (PFontFile)element->data;
+
+ if (--file->ref_count > 0) /* don't really close, return OK */
+ return 0;
+
+ List_Remove( &liveFiles, element );
+ Done_Element( element );
+ Done_FontFile( &file );
+ return 0;
+ }
+ }
+
+ /* now look in sleep list */
+ for (element = idleFiles.head; element; element = element->next)
+ {
+ if (element->key == (long)hff)
+ {
+ PFontFile file = (PFontFile)element->data;
+
+ if (--file->ref_count > 0) /* don't really close, return OK */
+ return 0;
+
+ List_Remove( &idleFiles, element );
+ Done_Element( element );
+ Done_FontFile( &file );
+ return 0;
+ }
+ }
+
+ /* didn't find the file */
+ return -1;
+}
+
+/****************************************************************************/
+/* */
+/* QueryFaces : */
+/* */
+/* Return font metrics. This routine has to do a lot of not very */
+/* hard work. */
+/* */
+LONG _System QueryFaces( HFF hff,
+ PIFIMETRICS pifiMetrics,
+ ULONG cMetricLen,
+ ULONG cFontCount,
+ ULONG cStart)
+{
+ static TT_Face_Properties properties;
+ static IFIMETRICS ifi; /* temporary structure */
+ PFontFace pface;
+ TT_Header *phead;
+ TT_Horizontal_Header *phhea;
+ TT_OS2 *pOS2;
+ TT_Postscript *ppost;
+ PIFIMETRICS pifi2;
+ PFontFile file;
+ LONG index, faceIndex, ifiCount = 0;
+ char *name;
+
+ COPY( "QueryFaces: hff = " ); CATI( hff );
+ CAT( ", cFontCount = " ); CATI( cFontCount );
+ CAT( ", cStart = " ); CATI( cStart );
+ CAT( ", cMetricLen = " ); CATI( cMetricLen );
+ CAT( "\r\n");
+ WRITE;
+
+ file = getFontFile(hff);
+ if (!file)
+ ERRRET(-1) /* error, invalid handle */
+
+ if (cMetricLen == 0) { /* only number of faces is requested */
+ #ifdef FAKE_TNR
+ /* create an alias for Times New Roman */
+ pface = &(file->faces[0]);
+ name = LookupName(pface->face, TT_NAME_ID_FONT_FAMILY);
+ if (!strcmp(name, "Times New Roman")) {
+ file->flags |= FL_FLAG_FAKE_ROMAN;
+ return 2;
+ }
+ #endif
+ if (file->flags & FL_FLAG_DBCS_FILE)
+ return file->numFaces * 2;
+ else
+ return file->numFaces;
+ }
+
+ for (faceIndex = 0; faceIndex < file->numFaces; faceIndex++) {
+ /* get pointer to this face's data */
+ pface = &(file->faces[faceIndex]);
+
+ TT_Get_Face_Properties( pface->face, &properties );
+
+ pOS2 = properties.os2;
+ phead = properties.header;
+ phhea = properties.horizontal;
+ ppost = properties.postscript;
+
+ /* get font name and check it's really found */
+ name = LookupName(pface->face, TT_NAME_ID_FONT_FAMILY);
+ if (name == NULL)
+ ERET1(Fail);
+
+ strncpy(ifi.szFamilyname, name, FACESIZE);
+ ifi.szFamilyname[FACESIZE - 1] = '\0';
+
+ name = LookupName(pface->face, TT_NAME_ID_FULL_NAME);
+ if (name == NULL) {
+ ERET1(Fail);
+ }
+ strncpy(ifi.szFacename, name, FACESIZE);
+ ifi.szFacename[FACESIZE - 1] = '\0';
+
+ /* If Unicode cmap exists in font and it contains more than 1024 glyphs, */
+ /* then do not translate from UGL to Unicode and use straight Unicode. */
+ /* But first check if it's a DBCS font and handle it properly */
+ if ((pface->charMode == TRANSLATE_UGL) && (properties.num_Glyphs > 1024))
+ {
+ LONG specEnc;
+ BOOL UDCflag = FALSE; /* !!!!TODO: UDC support */
+
+ specEnc = interfaceSEId(pface->face, UDCflag, PSEID_UNICODE);
+ switch (specEnc) {
+ case PSEID_SHIFTJIS:
+ strcpy( ifi.szGlyphlistName, "PMJPN" );
+ pface->charMode = TRANSLATE_UNI_SJIS;
+ break;
+
+ case PSEID_BIG5:
+ strcpy( ifi.szGlyphlistName, "PMCHT" );
+ pface->charMode = TRANSLATE_UNI_BIG5;
+ break;
+
+ default: /* do use straight Unicode */
+ strcpy( ifi.szGlyphlistName, "UNICODE" );
+ pface->charMode = TRANSLATE_UNICODE; /* straight Unicode */
+ }
+#if 0
+ strcpy( ifi.szGlyphlistName, "PMJPN" );
+ pface->charMode = TRANSLATE_UNI_SJIS;
+#endif
+ }
+ else
+ if (pface->charMode == TRANSLATE_SYMBOL) /* symbol encoding */
+ strcpy(ifi.szGlyphlistName, "SYMBOL");
+ else
+ if (pface->charMode == TRANSLATE_BIG5) /* Big5 encoding */
+ strcpy(ifi.szGlyphlistName, "PMCHT");
+ else
+ if (pface->charMode == TRANSLATE_SJIS)
+ strcpy(ifi.szGlyphlistName, "PMJPN"); /* ShiftJIS encoding */
+ else
+ strcpy(ifi.szGlyphlistName, "PM383");
+
+ ifi.idRegistry = 0;
+ ifi.lCapEmHeight = phead->Units_Per_EM; /* ??? probably correct */
+ ifi.lXHeight = phead->yMax /2; /* IBM TRUETYPE.DLL does */
+ ifi.lMaxAscender = pOS2->usWinAscent;
+
+ if ((LONG)pOS2->usWinDescent >= 0)
+ ifi.lMaxDescender = pOS2->usWinDescent;
+ else
+ ifi.lMaxDescender = -pOS2->usWinDescent;
+
+ ifi.lLowerCaseAscent = phhea->Ascender;
+ ifi.lLowerCaseDescent = -phhea->Descender;
+
+ ifi.lInternalLeading = ifi.lMaxAscender + ifi.lMaxDescender
+ - ifi.lCapEmHeight;
+
+ ifi.lExternalLeading = 0;
+ ifi.lAveCharWidth = pOS2->xAvgCharWidth;
+ ifi.lMaxCharInc = phhea->advance_Width_Max;
+ ifi.lEmInc = phead->Units_Per_EM;
+ ifi.lMaxBaselineExt = ifi.lMaxAscender + ifi.lMaxDescender;
+ ifi.fxCharSlope = -ppost->italicAngle; /* is this correct ? */
+ ifi.fxInlineDir = 0;
+ ifi.fxCharRot = 0;
+ ifi.usWeightClass = pOS2->usWeightClass; /* hopefully OK */
+ ifi.usWidthClass = pOS2->usWidthClass;
+ ifi.lEmSquareSizeX = phead->Units_Per_EM;
+ ifi.lEmSquareSizeY = phead->Units_Per_EM; /* probably correct */
+ ifi.giFirstChar = 0; /* following values should work */
+ ifi.giLastChar = 503; /* either 383 or 503 */
+ ifi.giDefaultChar = 0;
+ ifi.giBreakChar = 32;
+ ifi.usNominalPointSize = 120; /* these are simply constants */
+ ifi.usMinimumPointSize = 10;
+ ifi.usMaximumPointSize = 10000; /* limit to 1000 pt (like the ATM fonts) */
+ ifi.fsType = pOS2->fsType & IFIMETRICS_LICENSED; /* ??? */
+ ifi.fsDefn = IFIMETRICS_OUTLINE; /* always with TrueType */
+ ifi.fsSelection = 0;
+ ifi.fsCapabilities = 0; /* must be zero according to the IFI spec */
+ ifi.lSubscriptXSize = pOS2->ySubscriptXSize;
+ ifi.lSubscriptYSize = pOS2->ySubscriptYSize;
+ ifi.lSubscriptXOffset = pOS2->ySubscriptXOffset;
+ ifi.lSubscriptYOffset = pOS2->ySubscriptYOffset;
+ ifi.lSuperscriptXSize = pOS2->ySuperscriptXSize;
+ ifi.lSuperscriptYSize = pOS2->ySuperscriptYSize;
+ ifi.lSuperscriptXOffset = pOS2->ySuperscriptXOffset;
+ ifi.lSuperscriptYOffset = pOS2->ySuperscriptYOffset;
+ ifi.lUnderscoreSize = ppost->underlineThickness;
+ if (ifi.lUnderscoreSize == 150)
+ ifi.lUnderscoreSize = 100; /* little fix for Arial */
+ ifi.lUnderscorePosition = -ppost->underlinePosition;
+ ifi.lStrikeoutSize = pOS2->yStrikeoutSize;
+ ifi.lStrikeoutPosition = pOS2->yStrikeoutPosition;
+
+#if 1
+ if (pface->directory.nTables != 0 &&
+ pface->directory.tables[0].format == 0) { /* we support only format */
+ ifi.cKerningPairs = (pface->directory.tables[0].length - 8) / 6;
+ ifi.fsType |= IFIMETRICS_KERNING; /* !!! for testing only! */
+ }
+ else
+#endif
+ ifi.cKerningPairs = 0;
+
+ /* Note that the following field seems to be the only reliable method of */
+ /* recognizing a TT font from an app! Not that it should be done. */
+ ifi.ulFontClass = 0x10D; /* just like TRUETYPE.DLL */
+
+ /* the following adjustment are needed because the TT spec defines */
+ /* usWeightClass and fsType differently */
+ if (ifi.usWeightClass >= 100)
+ ifi.usWeightClass /= 100;
+ if (ifi.usWeightClass == 4)
+ ifi.usWeightClass = 5; /* does this help? */
+ if (pOS2->panose[3] == 9) {
+ ifi.fsType |= IFIMETRICS_FIXED;
+ pface->flags |= FC_FLAG_FIXED_WIDTH; /* we'll need this later */
+ }
+
+ switch (pface->charMode) { /* adjustments for var. encodings */
+ case TRANSLATE_UNICODE:
+ ifi.giLastChar = pOS2->usLastCharIndex;
+ ifi.fsType |= IFIMETRICS_MBCS | IFIMETRICS_DBCS;
+ break;
+
+ case TRANSLATE_SYMBOL:
+ ifi.giLastChar = 255;
+ break;
+
+ case TRANSLATE_BIG5:
+ case TRANSLATE_UNI_BIG5:
+ ifi.giLastChar = 383;
+ ifi.fsType |= IFIMETRICS_MBCS | IFIMETRICS_DBCS;
+ break;
+
+ case TRANSLATE_SJIS:
+ case TRANSLATE_UNI_SJIS:
+ ifi.giLastChar = 890;
+ ifi.fsType |= IFIMETRICS_MBCS | IFIMETRICS_DBCS;
+ break;
+
+ }
+
+ /* adjust fsSelection (TT defines this differently) */
+ /* Note: Interestingly, the PMATM font driver seems to use the values
+ defined in TT spec, at least for italic. Strange. Better leave it. */
+ if (pOS2->fsSelection & 0x01) {
+ ifi.fsSelection |= 0x01;
+ }
+ if (pOS2->fsSelection & 0x02) {
+ ifi.fsSelection |= IFIMETRICS_UNDERSCORE;
+ }
+ if (pOS2->fsSelection & 0x04) {
+ ifi.fsSelection |= IFIMETRICS_OVERSTRUCK;
+ }
+
+ /* copy the right amount of data to output buffer, */
+ /* also handle the 'fake' vertically rendered DBCS fonts */
+ index = faceIndex * ((file->flags & FL_FLAG_DBCS_FILE) ? 2 : 1);
+ if ((index >= cStart) && (index < (cStart + cFontCount))) {
+ memcpy((((PBYTE) pifiMetrics) + ifiCount), &ifi,
+ sizeof(IFIMETRICS) > cMetricLen ? cMetricLen : sizeof(IFIMETRICS));
+ ifiCount += cMetricLen;
+ }
+ if ((file->flags & FL_FLAG_DBCS_FILE) && (index + 1 >= cStart) &&
+ (index + 1 < (cStart + cFontCount))) {
+
+ pifi2 = (PIFIMETRICS) (((PBYTE) pifiMetrics) + ifiCount);
+ memcpy(pifi2, &ifi,
+ sizeof(IFIMETRICS) > cMetricLen ? cMetricLen : sizeof(IFIMETRICS));
+ strcpy(pifi2->szFamilyname + 1, ifi.szFamilyname);
+ pifi2->szFamilyname[0] = '@';
+ strcpy(pifi2->szFacename + 1, ifi.szFacename);
+ pifi2->szFacename[0] = '@';
+ ifiCount += cMetricLen;
+ }
+ #ifdef FAKE_TNR
+ if ((file->flags & FL_FLAG_FAKE_ROMAN) && (index + 1 >= cStart) &&
+ (index + 1 < (cStart + cFontCount))) {
+ pifi2 = (PIFIMETRICS) (((PBYTE) pifiMetrics) + ifiCount);
+ memcpy(pifi2, &ifi,
+ sizeof(IFIMETRICS) > cMetricLen ? cMetricLen : sizeof(IFIMETRICS));
+ strcpy(pifi2->szFamilyname, "Roman");
+ switch (strlen(ifi.szFacename)) { /* This looks weird but... works */
+ case 15: /* Times New Roman */
+ strcpy(pifi2->szFacename, "Tms Rmn");
+ break;
+ case 20: /* Times New Roman Bold*/
+ strcpy(pifi2->szFacename, "Tms Rmn Bold");
+ break;
+ case 22: /* Times New Roman Italic*/
+ strcpy(pifi2->szFacename, "Tms Rmn Italic");
+ break;
+ case 27: /* Times New Roman Bold Italic*/
+ strcpy(pifi2->szFacename, "Tms Rmn Bold Italic");
+ break;
+ }
+ ifiCount += cMetricLen;
+ }
+ #endif
+ }
+
+Exit:
+ TT_Flush_Face(pface->face);
+ return cFontCount;
+
+Fail:
+ TT_Flush_Face(pface->face);
+ return -1;
+}
+
+/****************************************************************************/
+/* */
+/* OpenFontContext : */
+/* */
+/* open new font context */
+/* */
+HFC _System OpenFontContext( HFF hff,
+ ULONG ulFont)
+{
+ int i = 0;
+ static TT_Instance instance;
+ static PFontFile file;
+ ULONG faceIndex;
+
+ COPY("OpenFontContext: hff = "); CATI((int) hff); CAT("\r\n");
+ COPY(" ulFont = "); CATI((int) ulFont); CAT("\r\n");
+ WRITE;
+
+ file = getFontFile(hff);
+ if (!file)
+ ERRRET((HFC)-1) /* error, invalid font handle */
+
+ /* calculate real face index in font file */
+ faceIndex = file->flags & FL_FLAG_DBCS_FILE ? ulFont / 2 : ulFont;
+
+ #ifdef FAKE_TNR
+ if (file->flags & FL_FLAG_FAKE_ROMAN)
+ /* This font isn't real! */
+ faceIndex = 0;
+ #endif
+
+ if (faceIndex > file->numFaces)
+ ERRRET((HFC)-1)
+
+ /* OK, create new instance with defaults */
+ error = TT_New_Instance( file->faces[faceIndex].face, &instance);
+ if (error)
+ ERET1( Fail );
+
+ /* Instance resolution is set to 72 dpi and is never changed */
+ error = TT_Set_Instance_Resolutions(instance, 72, 72);
+ if (error)
+ ERRRET((HFC)-1)
+
+ /* find first unused index */
+ i = 0;
+ while ((contexts[i].hfc != 0) && (i < MAX_CONTEXTS))
+ i++;
+
+ if (i == MAX_CONTEXTS)
+ ERET1( Fail ); /* no free slot in table */
+
+ contexts[i].hfc = (HFC)(i + 0x100); /* initialize table entries */
+ contexts[i].instance = instance;
+ contexts[i].transformed = FALSE; /* no scaling/rotation assumed */
+ contexts[i].file = file;
+ contexts[i].faceIndex = faceIndex;
+
+ /* for DBCS fonts/collections, odd indices are vertical versions*/
+ if ((file->flags & FL_FLAG_DBCS_FILE) && (ulFont & 1))
+ contexts[i].vertical = TRUE;
+ else
+ contexts[i].vertical = FALSE;
+
+ file->flags |= FL_FLAG_CONTEXT_OPEN; /* flag as in-use */
+
+ COPY("-> hfc "); CATI((int) contexts[i].hfc); CAT("\r\n"); WRITE;
+
+ TT_Flush_Face(file->faces[faceIndex].face);
+ return contexts[i].hfc; /* everything OK */
+
+Fail:
+ TT_Flush_Face(file->faces[faceIndex].face);
+ return (HFC)-1;
+}
+
+/****************************************************************************/
+/* */
+/* SetFontContext : */
+/* */
+/* set font context parameters */
+/* */
+LONG _System SetFontContext( HFC hfc,
+ PCONTEXTINFO pci )
+{
+ LONG ptsize, temp, emsize;
+ PFontSize size;
+
+ COPY("SetFontContext: hfc = "); CATI((int) hfc);
+ CAT(", sizlPPM.cx = "); CATI((int) pci->sizlPPM.cx);
+ CAT(", sizlPPM.cy = "); CATI((int) pci->sizlPPM.cy);
+ CAT("\r\n pfxSpot.x = "); CATI((int) pci->pfxSpot.x);
+ CAT(", pfxSpot.y = "); CATI((int) pci->pfxSpot.y);
+ CAT("\r\n eM11 = "); CATI((int) pci->matXform.eM11);
+ CAT(", eM12 = "); CATI((int) pci->matXform.eM12);
+ CAT(", eM21 = "); CATI((int) pci->matXform.eM21);
+ CAT(", eM22 = "); CATI((int) pci->matXform.eM22);
+ CAT("\r\n");
+ WRITE;
+
+ size = getFontSize(hfc);
+ if (!size)
+ ERRRET(-1) /* error, invalid context handle */
+
+ emsize = size->file->faces[size->faceIndex].em_size;
+
+ /* Look at matrix and see if a transform is asked for */
+ /* Actually when rotating by 90 degrees hinting could be used */
+
+ size->transformed =
+ ( pci->matXform.eM11 != pci->matXform.eM22 ||
+ (pci->matXform.eM12 | pci->matXform.eM21) != 0 ||
+ pci->matXform.eM11 <= 0 );
+
+ if ( size->transformed )
+ {
+ /* check for simple stretch in one direction */
+ if ((pci->matXform.eM11 > 0 && pci->matXform.eM22 > 0) &&
+ (pci->matXform.eM12 | pci->matXform.eM21) == 0) {
+
+ LONG ptsizex, ptsizey;
+
+ size->transformed = FALSE; /* will be handled like nontransformed font */
+
+ ptsizex = (emsize * pci->matXform.eM11) >> 10;
+ ptsizey = (emsize * pci->matXform.eM22) >> 10;
+
+ error = TT_Set_Instance_CharSizes(size->instance, ptsizex, ptsizey);
+ if (error)
+ ERRRET(-1) /* engine problem */
+
+ return 0;
+ }
+ /* note that eM21 and eM12 are swapped; I have no idea why, but */
+ /* it seems to be correct */
+ size->matrix.xx = pci->matXform.eM11 * 64;
+ size->matrix.xy = pci->matXform.eM21 * 64;
+ size->matrix.yx = pci->matXform.eM12 * 64;
+ size->matrix.yy = pci->matXform.eM22 * 64;
+
+ /* set pointsize to Em size; this effectively disables scaling */
+ /* but enables use of hinting */
+ error = TT_Set_Instance_CharSize(size->instance, emsize);
+ if (error)
+ ERRRET(-1) /* engine problem */
+
+ return 0;
+ }
+
+ /* calculate & set point size */
+ ptsize = (emsize * (pci->matXform.eM11 + pci->matXform.eM21)) >> 10;
+
+ if (ptsize <= 0) /* must not allow zero point size ! */
+ ptsize = 1; /* !!! should be handled better */
+
+ error = TT_Set_Instance_CharSize(size->instance, ptsize);
+ if (error)
+ ERRRET(-1) /* engine problem */
+
+ return 0; /* pretend everything is OK */
+}
+
+/****************************************************************************/
+/* */
+/* CloseFontContext : */
+/* */
+/* destroy a font context */
+/* */
+LONG _System CloseFontContext( HFC hfc)
+{
+ PFontSize size;
+
+ COPY("CloseFontContext: hfc = "); CATI((int)hfc); CAT("\r\n"); WRITE;
+
+ size = getFontSize(hfc);
+ if (!size)
+ ERRRET(-1) /* error, invalid context handle */
+
+ /* mark table entry as free */
+ size->hfc = 0;
+
+ /* !!!!! set flag in TFontFile structure */
+ size->file->flags &= ~FL_FLAG_CONTEXT_OPEN; /* reset the in-use flag */
+
+ if (size->file->flags & FL_FLAG_LIVE_FACE) {
+ COPY("Closing instance: "); CATI((int)(size->instance.z)); CAT("\r\n"); WRITE;
+ error = TT_Done_Instance(size->instance);
+ if (error)
+ ERRRET(-1) /* engine error */
+ }
+
+ COPY("CloseFontContext successful\r\n"); WRITE;
+
+ return 0; /* success */
+}
+
+#define MAX_KERN_INDEX 504
+
+GLYPH ReverseTranslate(PFontFace face, USHORT index) {
+ ULONG i;
+ GLYPH newidx = 0;
+
+ /* TODO: enable larger fonts */
+ for (i = 0; i < MAX_KERN_INDEX; i++) {
+ newidx = PM2TT(face->charMap,
+ face->charMode,
+ i);
+ if (newidx == index)
+ break;
+ }
+ if (i < MAX_KERN_INDEX)
+ return i;
+ else
+ return 0;
+}
+
+/****************************************************************************/
+/* */
+/* QueryFaceAttr */
+/* */
+/* Return various info about font face */
+/* */
+LONG _System QueryFaceAttr( HFC hfc,
+ ULONG iQuery,
+ PBYTE pBuffer,
+ ULONG cb,
+ PGLYPH pagi,
+ GLYPH giStart )
+{
+ int count, i = 0;
+ PFontSize size;
+ PFontFace face;
+ static TT_Face_Properties properties;
+ TT_OS2 *pOS2;
+ ABC_TRIPLETS* pt;
+
+ COPY("QueryFaceAttr: hfc = "); CATI((int) hfc); CAT("\r\n"); WRITE;
+
+ size = getFontSize(hfc);
+ if (!size)
+ ERRRET(-1) /* error, invalid context handle */
+
+ face = &(size->file->faces[size->faceIndex]);
+
+ if (iQuery == FD_QUERY_KERNINGPAIRS)
+ {
+ TT_Kern_0 kerntab; /* actual kerning table */
+ ULONG used = 0; /* # bytes used in output buffer */
+ FD_KERNINGPAIRS *kpair;
+ USHORT *kernIndices, idx;
+
+ count = cb / sizeof(FD_KERNINGPAIRS);
+
+ COPY("QUERY_KERNINGPAIRS, "); CATI((int) count);
+ CAT("\r\n"); WRITE;
+#if 1
+
+ if (face->directory.tables == NULL)
+ return 0; /* no kerning info provided */
+ /* !!!! could use better error checking */
+ /* Only format 0 is supported (which is what M$ recommends) */
+ if (face->directory.tables[0].format != 0) /* need only format 0 */
+ ERRRET(-1);
+
+ error = TT_Load_Kerning_Table(face->face, 0);
+ if (error)
+ ERET1( Fail );
+
+ kerntab = face->directory.tables[0].t.kern0;
+ kpair = (PVOID)pBuffer;
+
+ if (face->kernIndices == NULL) {
+ TT_Get_Face_Properties( face->face, &properties );
+ error = ALLOC(face->kernIndices,
+ properties.num_Glyphs * sizeof (USHORT));
+ if (error)
+ ERET1( Fail );
+
+ /* fill all entries with -1s */
+ memset(face->kernIndices, 0xFF,
+ properties.num_Glyphs * sizeof (USHORT));
+ }
+
+ kernIndices = face->kernIndices;
+
+ while ((i < kerntab.nPairs) && (i < count))
+ {
+ idx = kerntab.pairs[i].left;
+ if (kernIndices[idx] == (USHORT)-1)
+ kernIndices[idx] = ReverseTranslate(face, idx);
+ kpair->giFirst = kernIndices[idx];
+ idx = kerntab.pairs[i].right;
+ if (kernIndices[idx] == (USHORT)-1)
+ kernIndices[idx] = ReverseTranslate(face, idx);
+ kpair->giSecond = kernIndices[idx];
+ kpair->eKerningAmount = kerntab.pairs[i].value;
+ kpair++;
+ i++;
+ }
+
+ COPY("Returned kerning pairs: "); CATI(i); CAT("\r\n"); WRITE;
+ return i; /* # items filled */
+#else
+ return 0; /* no kerning support */
+
+#endif
+ }
+
+ if (iQuery == FD_QUERY_ABC_WIDTHS)
+ {
+ count = cb / sizeof(ABC_TRIPLETS);
+
+ COPY("QUERY_ABC_WIDTHS, "); CATI((int) count);
+ CAT(" items, giStart = "); CATI((int) giStart);
+ if (pBuffer == NULL)
+ CAT(" NULL buffer");
+ CAT("\r\n"); WRITE;
+
+ /* This call never fails - no error check needed */
+ TT_Get_Face_Properties( face->face, &properties );
+
+ pt = (ABC_TRIPLETS*)pBuffer;
+ for (i = giStart; i < giStart + count; i++, pt++)
+ {
+ int index;
+ unsigned short wid;
+ static unsigned short adv_widths [2];
+ static unsigned short adv_heights[2];
+
+ static unsigned short widths[2], heights[2];
+ static short lefts [2], tops [2];
+
+ index = PM2TT( face->charMap,
+ face->charMode,
+ i );
+
+ /* get advances and bearings */
+ if (size->vertical && properties.vertical && 0) /* TODO: enable */
+ error = TT_Get_Face_Metrics( face->face, index, index,
+ lefts, adv_widths, tops, adv_heights );
+ else
+ error = TT_Get_Face_Metrics( face->face, index, index,
+ lefts, adv_widths, NULL, NULL );
+
+ if (error)
+ goto Broken_Glyph;
+
+ /* skip complicated calculations for fixed fonts */
+ if (face->flags & FC_FLAG_FIXED_WIDTH) {
+ wid = adv_widths[0] - lefts[0];
+ }
+ else { /* proportianal font, it gets trickier */
+ /* store glyph widths for DBCS fonts
+ - needed for reasonable performance */
+ if (face->flags & FC_FLAG_DBCS_FACE) {
+ if (face->widths == NULL) {
+ error = ALLOC(face->widths,
+ properties.num_Glyphs * sizeof (USHORT));
+ if (error)
+ goto Broken_Glyph; /* this error really shouldn't happen */
+
+ /* tag all entries as unused */
+ memset(face->widths, 0xFF,
+ properties.num_Glyphs * sizeof (USHORT));
+ }
+ if (face->widths[index] == 0xFFFF) { /* get from file if needed */
+ error = TT_Get_Face_Widths( face->face, index, index,
+ widths, heights );
+ if (error)
+ goto Broken_Glyph;
+
+ /* save for later */
+ wid = face->widths[index] = widths[0];
+ }
+ else
+ wid = face->widths[index];
+ }
+ /* 'small' font, no need to remember widths, OS/2 takes care of it */
+ else {
+ /* get width or height - use ftxwidth.c */
+ error = TT_Get_Face_Widths( face->face, index, index,
+ widths, heights );
+ if (error)
+ goto Broken_Glyph;
+
+ wid = widths[0];
+ }
+ }
+
+ if (size->vertical && !is_HALFCHAR(i))
+ {
+ if (properties.vertical && 0) /* TODO: enable */
+ {
+ pt->lA = tops[0];
+ pt->ulB = heights[0];
+ pt->lC = adv_heights[0] - pt->lA - pt->ulB;
+ }
+ else
+ {
+ pt->lA = pt->lC = 0;
+ pt->ulB = properties.os2->usWinAscent +
+ properties.os2->usWinDescent;
+ }
+
+ }
+ else
+ {
+ pt->lA = lefts[0];
+ pt->ulB = wid;
+ pt->lC = adv_widths[0] - pt->lA - pt->ulB;
+ }
+
+#ifdef NETSCAPE_FIX
+ if (face->charMode != TRANSLATE_SYMBOL &&
+ !size->vertical) {
+ if (face->flags & FC_FLAG_FIXED_WIDTH) {
+ pt->ulB = pt->ulB + pt->lA + pt->lC;
+ pt->lA = 0;
+ pt->lC = 0;
+ } else if (i == 32) {
+ /* return nonzero B width for 'space' */
+ pt->ulB = adv_widths[0] - 2 * lefts[0];
+ pt->lC = lefts[0];
+ }
+ }
+#endif
+ continue;
+
+ Broken_Glyph: /* handle broken glyphs gracefully */
+ pt->lA = pt->lC = 0;
+
+ if (size->vertical && !is_HALFCHAR(i))
+ pt->ulB = properties.os2->usWinAscent +
+ properties.os2->usWinDescent;
+ else
+ pt->ulB = properties.horizontal->xMax_Extent;
+
+ }
+ }
+
+ TT_Flush_Face(face->face);
+ return count; /* number of entries filled in */
+
+Fail:
+ TT_Flush_Face(face->face);
+ return -1;
+}
+
+/****************************************************************************/
+/* */
+/* QueryCharAttr : */
+/* */
+/* Return glyph attributes, basically glyph's bit-map or outline */
+/* some variables are declared static to conserve stack space. */
+/* */
+LONG _System QueryCharAttr( HFC hfc,
+ PCHARATTR pCharAttr,
+ PBITMAPMETRICS pbmm )
+{
+ static TT_Raster_Map bitmap;
+ static TT_Outline outline;
+ static TT_BBox bbox;
+
+ PFontSize size;
+ PFontFace face;
+ LONG temp;
+ PBYTE pb;
+ int i, j;
+ ULONG cb;
+
+ size = getFontSize(hfc);
+ if (!size)
+ ERRRET(-1) /* error, invalid context handle */
+
+ face = &(size->file->faces[size->faceIndex]);
+
+ error = TT_Load_Glyph( size->instance,
+ face->glyph,
+ PM2TT( face->charMap,
+ face->charMode,
+ pCharAttr->gi),
+ TTLOAD_DEFAULT);
+
+ if (error)
+ {
+ if (i == 0)
+ ERET1( Fail ) /* this font's no good, return error */
+ else
+ { /* try to recover quietly */
+ error = TT_Load_Glyph( size->instance,
+ face->glyph,
+ 0,
+ TTLOAD_DEFAULT);
+ if (error) {
+ COPY("Error code is "); CATI(error); CAT("\r\n"); WRITE;
+ ERET1( Fail );
+ }
+ }
+ }
+
+ TT_Flush_Face( face->face );
+
+ error = TT_Get_Glyph_Outline( face->glyph, &outline );
+ if (error)
+ ERRRET(-1);
+
+ /* --- Vertical fonts handling----------------------------------- */
+
+ if (size->vertical && !is_HALFCHAR(pCharAttr->gi)) {
+ TT_Matrix vertMatrix;
+
+ vertMatrix.xx = 0x00000;
+ vertMatrix.xy = -0x10000;
+ vertMatrix.yx = 0x10000;
+ vertMatrix.yy = 0x00000;
+ TT_Get_Outline_BBox( &outline, &bbox );
+
+ /* rotate outline 90 degrees counterclockwise */
+ TT_Transform_Outline(&outline, &vertMatrix);
+
+ /* move outline to the right to adjust for rotation */
+ TT_Translate_Outline(&outline, bbox.yMax, 0);
+ /* move outline down a bit */
+ TT_Translate_Outline(&outline, 0, bbox.yMin);
+ }
+
+ if (size->transformed)
+ TT_Transform_Outline( &outline, &size->matrix );
+
+ /* --- Outline processing --------------------------------------- */
+
+ if ( pCharAttr->iQuery & FD_QUERY_OUTLINE )
+ {
+ if (pCharAttr->cbLen == 0) /* send required outline size in bytes */
+ return GetOutlineLen( &outline );
+
+ return GetOutline( &outline, pCharAttr->pBuffer );
+ }
+
+ /* --- Bitmap processing ---------------------------------------- */
+
+ TT_Get_Outline_BBox( &outline, &bbox );
+
+ /* the following seems to be necessary for rotated glyphs */
+ if (size->transformed) {
+ bbox.xMax = bbox.xMin = 0;
+ for (i = 0; i < outline.n_points; i++) {
+ if (bbox.xMin > outline.points[i].x)
+ bbox.xMin = outline.points[i].x;
+ if (bbox.xMax < outline.points[i].x)
+ bbox.xMax = outline.points[i].x;
+ }
+ }
+ /* grid-fit the bbox */
+ bbox.xMin &= -64;
+ bbox.yMin &= -64;
+
+ bbox.xMax = (bbox.xMax+63) & -64;
+ bbox.yMax = (bbox.yMax+63) & -64;
+
+ if (pCharAttr->iQuery & FD_QUERY_BITMAPMETRICS)
+ {
+ /* fill in bitmap metrics */
+ /* metrics values are in 26.6 format ! */
+ pbmm->sizlExtent.cx = (bbox.xMax - bbox.xMin) >> 6;
+ pbmm->sizlExtent.cy = (bbox.yMax - bbox.yMin) >> 6;
+ pbmm->cyAscent = 0;
+ pbmm->pfxOrigin.x = bbox.xMin << 10;
+ pbmm->pfxOrigin.y = bbox.yMax << 10;
+
+ if (!(pCharAttr->iQuery & FD_QUERY_CHARIMAGE))
+ return sizeof(*pbmm);
+ }
+
+ /* --- actual bitmap processing here --- */
+ if (pCharAttr->iQuery & FD_QUERY_CHARIMAGE)
+ {
+ /* values in 26.6 format ?!? */
+ bitmap.width = (bbox.xMax - bbox.xMin) >> 6;
+ bitmap.rows = (bbox.yMax - bbox.yMin) >> 6;
+ /* width rounded up to nearest multiple of 4 */
+ bitmap.cols = ((bitmap.width + 31) / 8) & -4;
+ bitmap.flow = TT_Flow_Down;
+ bitmap.bitmap = pCharAttr->pBuffer;
+ bitmap.size = bitmap.rows * bitmap.cols;
+
+ if (pCharAttr->cbLen == 0)
+ return bitmap.size;
+
+ if (bitmap.size > pCharAttr->cbLen)
+ ERRRET(-1) /* otherwise we might overwrite something */
+
+ /* clean provided buffer (unfortunately necessary) */
+ memset(bitmap.bitmap, 0, pCharAttr->cbLen);
+
+ error = TT_Get_Glyph_Bitmap( face->glyph,
+ &bitmap,
+ -bbox.xMin,
+ -bbox.yMin );
+ if (error)
+ ERRRET(-1); /* engine error */
+
+ return bitmap.size; /* return # of bytes */
+ }
+ ERRRET(-1) /* error */
+
+Fail:
+ TT_Flush_Face(face->face);
+ return -1;
+}
+
+/****************************************************************************/
+/* */
+/* QueryFullFaces : */
+/* */
+/* Query names of all faces in this file */
+/* */
+LONG _System QueryFullFaces( HFF hff,
+ PVOID pBuff,
+ PULONG buflen,
+ PULONG cFontCount,
+ ULONG cStart )
+{
+ COPY("!QueryFullFaces: hff = "); CATI((int) hff); CAT("\r\n"); WRITE;
+ ERRRET(-1) /* error ? */
+}
+
+/*---------------------------------------------------------------------------*/
+/* end of exported functions */
+/*---------------------------------------------------------------------------*/
+
+
+/****************************************************************************/
+/* LimitsInit reads OS2.INI and sets up max_open_files limit, possibly */
+/* other variables as well. */
+/* */
+static void LimitsInit(void) {
+ char cBuffer[25]; /* ought to be enough */
+
+ if (PrfQueryProfileString(HINI_USERPROFILE, "FreeType/2", "OPENFACES",
+ NULL, cBuffer, sizeof(cBuffer)) > 0) {
+ max_open_files = atoi(cBuffer);
+
+ if (max_open_files < 8) /* ensure limit isn't too low */
+ max_open_files = 8;
+ }
+ else
+ max_open_files = 12; /* reasonable default */
+}
+
+
+/****************************************************************************/
+/* my_itoa is used only in the following function GetUdcInfo. */
+/* Works pretty much like expected. */
+/* */
+void my_itoa(int num, char *cp) {
+ char temp[10];
+ int i = 0;
+
+ do {
+ temp[i++] = (num % 10) + '0';
+ num /= 10;
+ } while (num); /* enddo */
+
+ while (i--) {
+ *cp++ = temp[i];
+ } /* endwhile */
+ *cp = '\0';
+}
+
+/****************************************************************************/
+/* GetUdcInfo determines the UDC ranges used */
+/* */
+VOID GetUdcInfo(VOID) {
+ ULONG ulUdc, ulUdcInfo, i;
+ PVOID gPtr;
+ HINI hini;
+ CHAR szCpStr[10] = "CP";
+
+ DosQueryCp(sizeof(ulCp), (ULONG*)&ulCp, &i); /* find out default codepage */
+ my_itoa((INT) ulCp, szCpStr + 2); /* convert to ASCII */
+
+}
+
+/****************************************************************************/
+/* LangInit determines language used at DLL startup, non-zero return value */
+/* means error. */
+/* This code is crucial, because it determines behaviour of the font driver */
+/* with regard to language encodings it will use. */
+static ULONG LangInit(void) {
+ COUNTRYCODE cc = {0, 0};
+ COUNTRYINFO ci;
+ ULONG cilen;
+
+ isGBK = FALSE;
+
+ GetUdcInfo(); /* get User Defined Character info */
+
+ /* get country info; ci.country then contains country code */
+ if (DosQueryCtryInfo(sizeof(ci), &cc, &ci, &cilen))
+ return -1;
+ /* get DBCS lead byte values for later use */
+ DosQueryDBCSEnv(sizeof(DBCSLead), &cc, DBCSLead);
+
+ uLastGlyph = 383;
+ switch (ci.country) {
+ case 81: /* Japan */
+ iLangId = TT_MS_LANGID_JAPANESE_JAPAN;
+ ScriptTag = *(ULONG *) "kana";
+ LangSysTag = *(ULONG *) "JAN ";
+ pGlyphlistName = "PMJPN";
+ uLastGlyph = 890;
+ break;
+
+ case 88: /* Taiwan */
+ iLangId = TT_MS_LANGID_CHINESE_TAIWAN;
+ ScriptTag = *(ULONG *) "kana";
+ LangSysTag = *(ULONG *) "CHT ";
+ pGlyphlistName = "PMCHT";
+ break;
+
+ case 86: /* People's Republic of China */
+ if (ci.codepage == 1386 || ulCp[0] == 1386 || ulCp[1] == 1386) {
+ isGBK = TRUE;
+ } /* endif */
+ iLangId = TT_MS_LANGID_CHINESE_PRC;
+ ScriptTag = *(ULONG *) "kana";
+ LangSysTag = *(ULONG *) "CHS ";
+ pGlyphlistName = "PMPRC";
+ break;
+
+ case 82: /* Korea */
+ iLangId = TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA;
+ ScriptTag = *(ULONG *) "hang";
+ LangSysTag = *(ULONG *) "KOR ";
+ pGlyphlistName = "PMKOR";
+ uLastGlyph = 949;
+ break;
+
+ case 30: /* Greece - for Alex! */
+ iLangId = TT_MS_LANGID_GREEK_GREECE;
+
+ default: /* none of the above countries */
+ ScriptTag = *(ULONG *) "";
+ LangSysTag = *(ULONG *) "";
+ break;
+ } /* endswitch */
+
+ return 0;
+}
+
+/****************************************************************************/
+/* */
+/* FirstInit : */
+/* */
+/* Called when font driver is loaded for the first time. Performs the */
+/* necessary one-time initialization. */
+ULONG FirstInit(void) {
+ LONG lReqCount;
+ ULONG ulCurMaxFH;
+
+ #ifdef DEBUG
+ ULONG Action;
+ #endif /* DEBUG */
+ #ifdef DEBUG
+ DosOpen("C:\\FTIFI.LOG", &LogHandle, &Action, 0, FILE_NORMAL,
+ OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS,
+ OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_WRITE_THROUGH |
+ OPEN_FLAGS_SEQUENTIAL | OPEN_SHARE_DENYWRITE | OPEN_ACCESS_WRITEONLY,
+ NULL);
+ COPY("FreeType/2 loaded.\r\n");
+ WRITE;
+ #endif /* DEBUG */
+
+ /* increase # of file handles by five to be on the safe side */
+ lReqCount = 5;
+ DosSetRelMaxFH(&lReqCount, &ulCurMaxFH);
+ error = TT_Init_FreeType(&engine); /* turn on the FT engine */
+ if (error)
+ return 0; /* exit immediately */
+ error = TT_Init_Kerning_Extension(engine); /* load kerning support */
+ COPY("FreeType Init called\r\n");
+ WRITE;
+
+ if (LangInit()) /* initialize NLS */
+ return 0; /* exit on error */
+ COPY("NLS initialized.\r\n");
+ WRITE;
+
+ LimitsInit(); /* initialize max_open_files */
+ COPY("Open faces limit set to "); CATI(max_open_files); CAT("\r\n");
+ WRITE;
+
+ if (error)
+ return 0; /* exit immediately */
+ COPY("Initialization successful.\r\n");
+ WRITE;
+ return 1;
+}
+
+
+/****************************************************************************/
+/* */
+/* FinalTerm : */
+/* */
+/* Called when font driver is unloaded for the last time time. Performs */
+/* final clean-up, shuts down engine etc. */
+ULONG FinalTerm(void) {
+ PListElement cur;
+ PListElement tmp;
+
+ /* throw away elements from 'free elements' list */
+ cur = free_elements;
+ while (cur != NULL) {
+ tmp = cur;
+ cur = cur->next;
+ FREE(tmp);
+ }
+
+ /* turn off engine */
+ TT_Done_FreeType(engine);
+
+ #ifdef DEBUG
+ COPY("FreeType/2 terminated.\r\n");
+ WRITE;
+ DosClose(LogHandle);
+ #endif
+ return 1;
+}
+/****************************************************************************/
+/* */
+/* _DLL_InitTerm : */
+/* */
+/* This is the DLL Initialization/termination function. It initializes */
+/* the FreeType engine and some internal structures at startup. It cleans */
+/* up the UCONV cache at process termination. */
+ULONG _System _DLL_InitTerm(ULONG hModule, ULONG ulFlag) {
+ switch (ulFlag) {
+ case 0: /* initializing */
+ if (++ulProcessCount == 1)
+ return FirstInit(); /* loaded for the first time */
+ else
+ return 1;
+
+ case 1: { /* terminating */
+ int i;
+ /* clean UCONV cache */
+ #ifdef USE_UCONV
+ CleanUCONVCache();
+ #endif
+ if(--ulProcessCount == 0)
+ return FinalTerm();
+ else
+ return 1;
+ }
+ }
+ return 0;
+}
+
+/****************************************************************************/
+/* */
+/* interfaceSEId (Interface-specific Encoding Id) determines what encoding */
+/* the font driver should use if a font includes a Unicode encoding. */
+/* */
+LONG interfaceSEId(TT_Face face, BOOL UDCflag, LONG encoding) {
+ ULONG range1 = 0;
+ ULONG bits, mask;
+ TT_OS2 *pOS2;
+ static TT_Face_Properties props;
+
+ TT_Get_Face_Properties(face, &props);
+ pOS2 = props.os2;
+
+ if (encoding == PSEID_UNICODE) {
+
+ /* if font is 'small', use PM383; this is done because of DBCS
+ systems */
+ if (!UDCflag && props.num_Glyphs < 1024) {
+ encoding = PSEID_PM383;
+ } else if (pOS2->version >= 1) {
+ /*
+ * * OS/2 table version 1 and later contains codepage *
+ * bitfield to support multiple codepages.
+ */
+ range1 = pOS2->ulCodePageRange1;
+ bits = 0;
+
+ if (range1 & OS2_CP1_ANSI_OEM_JAPANESE_JIS)
+ bits++;
+ if (range1 & OS2_CP1_ANSI_OEM_CHINESE_SIMPLIFIED)
+ bits++;
+ if (range1 & OS2_CP1_ANSI_OEM_CHINESE_TRADITIONAL)
+ bits++;
+ if (range1 & OS2_CP1_ANSI_OEM_KOREAN_WANSUNG)
+ bits++;
+ if (range1 & OS2_CP1_ANSI_OEM_KOREAN_JOHAB)
+ bits++;
+
+ /* Note: if font supports more than one of the following codepages,
+ * encoding is left at PSEID_UNICODE!
+ */
+ if (bits == 1) {
+ switch (range1) {
+ case OS2_CP1_ANSI_OEM_JAPANESE_JIS:
+ encoding = PSEID_SHIFTJIS;
+ break;
+ case OS2_CP1_ANSI_OEM_CHINESE_SIMPLIFIED:
+ encoding = PSEID_PRC;
+ break;
+ case OS2_CP1_ANSI_OEM_CHINESE_TRADITIONAL:
+ encoding = PSEID_BIG5;
+ break;
+ case OS2_CP1_ANSI_OEM_KOREAN_WANSUNG:
+ encoding = PSEID_WANSUNG;
+ break;
+ case OS2_CP1_ANSI_OEM_KOREAN_JOHAB:
+ encoding = PSEID_JOHAB;
+ break;
+ default:
+ break;
+ } /* endswitch */
+ } /* endif */
+ } else {
+ /*
+ * The codepage range bitfield is not available.
+ * Codepage must be assumed from the COUNTRY setting.
+ * This means the user is on his own.
+ */
+
+ switch (iLangId) {
+ case TT_MS_LANGID_JAPANESE_JAPAN:
+ encoding = PSEID_SHIFTJIS;
+ break;
+ case TT_MS_LANGID_CHINESE_PRC:
+ case TT_MS_LANGID_CHINESE_SINGAPORE:
+ encoding = PSEID_PRC;
+ break;
+ case TT_MS_LANGID_CHINESE_TAIWAN:
+ case TT_MS_LANGID_CHINESE_HONG_KONG:
+ encoding = PSEID_BIG5;
+ break;
+ case TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA:
+ encoding = PSEID_WANSUNG;
+ break;
+ case TT_MS_LANGID_KOREAN_JOHAB_KOREA:
+ encoding = PSEID_JOHAB;
+ break;
+ }
+
+ }
+ }
+ return encoding;
+}
+
+/****************************************************************************/
+/* */
+/* LookupName : */
+/* */
+/* Look for a TrueType name by index, prefer current language */
+/* */
+static char* LookupName(TT_Face face, int index )
+{
+ static char name_buffer[FACESIZE + 2];
+ int name_len = 0;
+ int i, j, n;
+
+ USHORT platform, encoding, language, id;
+ char* string;
+ USHORT string_len;
+
+ int found;
+
+ n = TT_Get_Name_Count( face );
+ if ( n < 0 )
+ return NULL;
+
+ for ( i = 0; i < n; i++ )
+ {
+ TT_Get_Name_ID( face, i, &platform, &encoding, &language, &id );
+ TT_Get_Name_String( face, i, &string, &string_len );
+
+ if ( id == index )
+ {
+ found = 0;
+
+ /* Try to find an appropriate name */
+ if ( platform == TT_PLATFORM_MICROSOFT )
+ for ( j = 5; j >= 0; j-- )
+ if ( encoding == j ) /* Microsoft ? */
+ switch (language)
+ {
+ case TT_MS_LANGID_CHINESE_TAIWAN:
+ if (encoding == PSEID_PRC)
+ found = 1;
+ break;
+
+ case TT_MS_LANGID_JAPANESE_JAPAN:
+ if (encoding == PSEID_SHIFTJIS)
+ found = 1;
+ break;
+
+ /* these aren't all possibilities; just the most likely ones */
+ case TT_MS_LANGID_ENGLISH_UNITED_STATES :
+ case TT_MS_LANGID_ENGLISH_UNITED_KINGDOM :
+ case TT_MS_LANGID_ENGLISH_AUSTRALIA :
+ case TT_MS_LANGID_ENGLISH_CANADA :
+ case TT_MS_LANGID_ENGLISH_NEW_ZEALAND :
+ case TT_MS_LANGID_ENGLISH_IRELAND :
+ case TT_MS_LANGID_ENGLISH_SOUTH_AFRICA :
+ found = 1;
+ break;
+ }
+
+ if ( !found && platform == 0 && language == 0 )
+ found = 1;
+
+ if (found)
+ {
+ if (language == TT_MS_LANGID_CHINESE_TAIWAN ||
+ language == TT_MS_LANGID_JAPANESE_JAPAN) {
+ /* it's a DBCS string, copy everything except NULLs */
+ int i,j;
+ if (string_len > FACESIZE - 1)
+ string_len = FACESIZE - 1;
+
+ for (i=0, j=0; i<string_len; i++)
+ if (string[i] != '\0')
+ name_buffer[j++] = string[i];
+ name_buffer[j] = '\0';
+
+ return name_buffer;
+ }
+ else {
+ /* assume it's an ASCII string in Unicode, just skip the
+ zeros */
+ if ( string_len > FACESIZE * 2)
+ string_len = FACESIZE * 2;
+
+ name_len = 0;
+
+ for ( i = 1; i < string_len; i += 2 )
+ name_buffer[name_len++] = string[i];
+
+ name_buffer[name_len] = '\0';
+
+ return name_buffer;
+ }
+ }
+ }
+ }
+
+ /* Not found */
+ return NULL;
+}
+
+/****************************************************************************/
+/* */
+/* GetCharMap : */
+/* */
+/* A function to find a suitable charmap, searching in the following */
+/* order of importance : */
+/* */
+/* 1) Windows Unicode */
+/* 2) Apple Unicode */
+/* 3) ROC (Taiwan) */
+/* 4) ShiftJIS (Japan) */
+/* 5) Apple Roman */
+/* 6) Windows Symbol - not really supported */
+/* */
+/* High word of returned ULONG contains type of encoding */
+/* */
+static ULONG GetCharmap(TT_Face face)
+{
+ int n; /* # of encodings (charmaps) available */
+ USHORT platform, encoding;
+ int i, best, bestVal, val;
+
+ n = TT_Get_CharMap_Count(face);
+
+ if (n < 0) /* no encodings at all; don't yet know what the best course of action would be */
+ ERRRET(-1) /* such font should probably be rejected */
+
+ bestVal = 16;
+ best = -1;
+
+ for (i = 0; i < n; i++)
+ {
+ TT_Get_CharMap_ID( face, i, &platform, &encoding );
+
+ /* Windows Unicode is the highest encoding, return immediately */
+ /* if we find it.. */
+ if ( platform == TT_PLATFORM_MICROSOFT && encoding == TT_MS_ID_UNICODE_CS)
+ return i;
+
+ /* otherwise, compare it to the best encoding found */
+ val = -1;
+ if (platform == TT_PLATFORM_APPLE_UNICODE)
+ val = 2;
+ else if (platform == TT_PLATFORM_MICROSOFT
+ && encoding == TT_MS_ID_BIG_5)
+ val = 3;
+ else if (platform == TT_PLATFORM_MICROSOFT
+ && encoding == TT_MS_ID_SJIS)
+ val = 4;
+ else if (platform == TT_PLATFORM_MACINTOSH
+ && encoding == TT_MAC_ID_ROMAN)
+ val = 5;
+ else if (platform == TT_PLATFORM_MICROSOFT
+ && encoding == TT_MS_ID_SYMBOL_CS)
+ val = 6;
+
+ if (val > 0 && val <= bestVal)
+ {
+ bestVal = val;
+ best = i;
+ }
+ }
+
+ if (i < 0)
+ return 0; /* we didn't find any suitable encoding !! */
+
+ if (bestVal == 3) /* Taiwanese font */
+ best |= ( TRANSLATE_BIG5 << 16 );
+
+ if (bestVal == 4) /* Japanese font */
+ best |= ( TRANSLATE_SJIS << 16 );
+
+ if (bestVal == 5) /* for Apple Roman encoding only, this */
+ best |= ( TRANSLATE_SYMBOL << 16 ); /* means no translation should be performed */
+
+ return best;
+}
+
+/****************************************************************************/
+/* */
+/* GetOutlineLen : */
+/* */
+/* Used to compute the size of an outline once it is converted to */
+/* OS/2's specific format. The translation is performed by the later */
+/* function called simply "GetOultine". */
+/* */
+static int GetOutlineLen(TT_Outline *ol)
+{
+ int index; /* current point's index */
+ BOOL on_curve; /* current point's state */
+ int i, start = 0;
+ int first, last;
+ ULONG cb = 0;
+
+ /* loop thru all contours in a glyph */
+ for ( i = 0; i < ol->n_contours; i++ ) {
+
+ cb += sizeof(POLYGONHEADER);
+
+ first = start;
+ last = ol->contours[i];
+
+ on_curve = (ol->flags[first] & 1);
+ index = first;
+
+ /* process each contour point individually */
+ while ( index < last ) {
+ index++;
+
+ if ( on_curve ) {
+ /* the previous point was on the curve */
+ on_curve = ( ol->flags[index] & 1 );
+ if ( on_curve ) {
+ /* two successive on points => emit segment */
+ cb += sizeof(PRIMLINE);
+ }
+ }
+ else {
+ /* the previous point was off the curve */
+ on_curve = ( ol->flags[index] & 1 );
+ if ( on_curve ) {
+ /* reaching an `on' point */
+ cb += sizeof(PRIMSPLINE);
+ }
+ else {
+ /* two successive `off' points => create middle point */
+ cb += sizeof(PRIMSPLINE);
+ }
+ }
+ }
+
+ /* end of contour, close curve cleanly */
+ if ( ol->flags[first] & 1 )
+ {
+ if ( on_curve )
+ cb += sizeof(PRIMLINE);
+ else
+ cb += sizeof(PRIMSPLINE);
+ }
+ else
+ if (!on_curve)
+ cb += sizeof(PRIMSPLINE);
+
+ start = ol->contours[i] + 1;
+
+ }
+ return cb; /* return # bytes used */
+}
+
+/****************************************************************************/
+/* */
+/* a few global variables used in the following functions */
+/* */
+static ULONG cb = 0, polycb;
+static LONG lastX, lastY;
+static PBYTE pb;
+static POINTFX Q, R;
+static POLYGONHEADER hdr = {0, FD_POLYGON_TYPE};
+static PRIMLINE line = {FD_PRIM_LINE};
+static PRIMSPLINE spline = {FD_PRIM_SPLINE};
+
+/****************************************************************************/
+/* */
+/* LineFrom : */
+/* */
+/* add a line segment to the PM outline that GetOultine is currently */
+/* building. */
+/* */
+static void Line_From(LONG x, LONG y) {
+ line.pte.x = x << 10;
+ line.pte.y = y << 10;
+ /* store to output buffer */
+ memcpy(&(pb[cb]), &line, sizeof(line));
+ cb += sizeof(PRIMLINE);
+ polycb += sizeof(PRIMLINE);
+}
+
+
+/****************************************************************************/
+/* */
+/* BezierFrom : */
+/* */
+/* add a bezier arc to the PM outline that GetOutline is currently */
+/* buidling. The second-order Bezier is trivially converted to its */
+/* equivalent third-order form. */
+/* */
+static void Bezier_From( LONG x0, LONG y0, LONG x2, LONG y2, LONG x1, LONG y1 ) {
+ spline.pte[0].x = x0 << 10;
+ spline.pte[0].y = y0 << 10;
+ /* convert from second-order to cubic Bezier spline */
+ Q.x = (x0 + 2 * x1) / 3;
+ Q.y = (y0 + 2 * y1) / 3;
+ R.x = (x2 + 2 * x1) / 3;
+ R.y = (y2 + 2 * y1) / 3;
+ spline.pte[1].x = Q.x << 10;
+ spline.pte[1].y = Q.y << 10;
+ spline.pte[2].x = R.x << 10;
+ spline.pte[2].y = R.y << 10;
+ /* store to output buffer */
+ memcpy(&(pb[cb]), &spline, sizeof(spline));
+ cb += sizeof(PRIMSPLINE);
+ polycb += sizeof(PRIMSPLINE);
+}
+
+
+/****************************************************************************/
+/* */
+/* GetOutline : */
+/* */
+/* Translate a FreeType glyph outline into PM format. The buffer is */
+/* expected to be of the size returned by a previous call to the */
+/* function GetOutlineLen(). */
+/* */
+/* This code is taken right from the FreeType ttraster.c source, and */
+/* subsequently modified to emit PM segments and arcs. */
+/* */
+static int GetOutline(TT_Outline *ol, PBYTE pbuf) {
+ LONG x, y; /* current point */
+ LONG cx, cy; /* current Bezier control point */
+ LONG mx, my; /* current middle point */
+ LONG x_first, y_first; /* first point's coordinates */
+ LONG x_last, y_last; /* last point's coordinates */
+
+ int index; /* current point's index */
+ BOOL on_curve; /* current point's state */
+ int i, start = 0;
+ int first, last;
+ ULONG polystart;
+
+ pb = pbuf;
+ cb = 0;
+
+ /* loop thru all contours in a glyph */
+ for ( i = 0; i < ol->n_contours; i++ ) {
+
+ polystart = cb; /* save this polygon's start offset */
+ polycb = sizeof(POLYGONHEADER); /* size of this polygon */
+ cb += sizeof(POLYGONHEADER);
+
+ first = start;
+ last = ol->contours[i];
+
+ x_first = ol->points[first].x;
+ y_first = ol->points[first].y;
+
+ x_last = ol->points[last].x;
+ y_last = ol->points[last].y;
+
+ lastX = cx = x_first;
+ lastY = cy = y_first;
+
+ on_curve = (ol->flags[first] & 1);
+ index = first;
+
+ /* check first point to determine origin */
+ if ( !on_curve ) {
+ /* first point is off the curve. Yes, this happens... */
+ if ( ol->flags[last] & 1 ) {
+ lastX = x_last; /* start at last point if it */
+ lastY = y_last; /* is on the curve */
+ }
+ else {
+ /* if both first and last points are off the curve, */
+ /* start at their middle and record its position */
+ /* for closure */
+ lastX = (lastX + x_last)/2;
+ lastY = (lastY + y_last)/2;
+
+ x_last = lastX;
+ y_last = lastY;
+ }
+ }
+
+ /* now process each contour point individually */
+ while ( index < last ) {
+ index++;
+ x = ( ol->points[index].x );
+ y = ( ol->points[index].y );
+
+ if ( on_curve ) {
+ /* the previous point was on the curve */
+ on_curve = ( ol->flags[index] & 1 );
+ if ( on_curve ) {
+ /* two successive on points => emit segment */
+ Line_From( lastX, lastY ); /*x, y*/
+ lastX = x;
+ lastY = y;
+ }
+ else {
+ /* else, keep current control point for next bezier */
+ cx = x;
+ cy = y;
+ }
+ }
+ else {
+ /* the previous point was off the curve */
+ on_curve = ( ol->flags[index] & 1 );
+ if ( on_curve ) {
+ /* reaching an `on' point */
+ Bezier_From(lastX, lastY, x, y, cx, cy );
+ lastX = x;
+ lastY = y;
+ }
+ else {
+ /* two successive `off' points => create middle point */
+ mx = (cx + x) / 2;
+ my = (cy + y)/2;
+
+ Bezier_From( lastX, lastY, mx, my, cx, cy );
+ lastX = mx;
+ lastY = my;
+
+ cx = x;
+ cy = y;
+ }
+ }
+ }
+
+ /* end of contour, close curve cleanly */
+ if ( ol->flags[first] & 1 ) {
+ if ( on_curve )
+ Line_From( lastX, lastY); /* x_first, y_first );*/
+ else
+ Bezier_From( lastX, lastY, x_first, y_first, cx, cy );
+ }
+ else
+ if (!on_curve)
+ Bezier_From( lastX, lastY, x_last, y_last, cx, cy );
+
+ start = ol->contours[i] + 1;
+
+ hdr.cb = polycb;
+ memcpy(&(pb[polystart]), &hdr, sizeof(hdr));
+
+ }
+ return cb; /* return # bytes used */
+}
+
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/ftifi.h b/xc/extras/FreeType/contrib/ftos2/ifi/ftifi.h
new file mode 100644
index 000000000..e8be7870c
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/ftifi.h
@@ -0,0 +1,305 @@
+/*
+ Conversion from OS/2 UGL to Unicode
+
+ Copyright (C) 1997 Robert Muchsel <muchsel@acm.org>
+ Copyright (C) 1997,1998 Michal Necasek <mike@mendelu.cz>
+
+ All entries that were previously 0xFFFF were changed to 0x0000 because
+ TrueType 'missing glyph' has index 0
+*/
+
+#ifndef _FTIFI_H_INCLUDED_
+#define _FTIFI_H_INCLUDED_
+
+/* Platform-specific Encoding IDs for MS platform */
+#define PSEID_SYMBOL 0
+#define PSEID_UNICODE 1
+#define PSEID_SHIFTJIS 2
+#define PSEID_BIG5 3
+#define PSEID_PRC 4
+#define PSEID_WANSUNG 5
+#define PSEID_JOHAB 6
+/* defined by me! */
+#define PSEID_PM383 100
+
+/* bit masks for determining supported codepages */
+#define OS2_CP1_ANSI_OEM_JAPANESE_JIS (1 << 17)
+#define OS2_CP1_ANSI_OEM_CHINESE_SIMPLIFIED (1 << 18)
+#define OS2_CP1_ANSI_OEM_CHINESE_TRADITIONAL (1 << 19)
+#define OS2_CP1_ANSI_OEM_KOREAN_WANSUNG (1 << 20)
+#define OS2_CP1_ANSI_OEM_KOREAN_JOHAB (1 << 21)
+
+/* defines for character translation */
+/* from Unicode to UGL */
+#define TRANSLATE_UGL 0
+/* Symbol - no translation */
+#define TRANSLATE_SYMBOL 1
+/* Unicode - no translation */
+#define TRANSLATE_UNICODE 2
+/* Big5 - no translation */
+#define TRANSLATE_BIG5 4
+/* ShiftJIS - no translation */
+#define TRANSLATE_SJIS 5
+/* from Unicode to Big5 */
+#define TRANSLATE_UNI_BIG5 16
+/* from Unicode to ShiftJIS */
+#define TRANSLATE_UNI_SJIS 17
+
+
+#define MAX_GLYPH 504
+/* I suppose more than 949 is never used */
+/* 504 should be OK for (most) European and American countries */
+
+#ifndef USE_UCONV
+static const int UGL2Uni[MAX_GLYPH + 1] = {
+
+ /* PM383 UGL mapping */
+
+ /* 0..9 */
+ 0x0000, 0x263a, 0x263b, 0x2665, 0x2666, 0x2663, 0x2660, 0x2022, 0x25d8, 0x25cb,
+ /* 10..19 */
+ 0x25d9, 0x2642, 0x2640, 0x266a, 0x266b, 0x263c, 0x25ba, 0x25c4, 0x2195, 0x203c,
+ /* 20..29 */
+ 0xb6, 0xa7, 0x25ac, 0x21a8, 0x2191, 0x2193, 0x2192, 0x2190, 0x221f, 0x2194,
+ /* 30..39 */
+ 0x25b2, 0x25bc, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ /* 40..49 */
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
+ /* 50..59 */
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b,
+ /* 60..69 */
+ 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45,
+ /* 70..79 */
+ 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
+ /* 80..89 */
+ 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ /* 90..99 */
+ 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
+ /* 100..109 */
+ 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d,
+ /* 110..119 */
+ 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ /* 120..129 */
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x2302, 0xc7, 0xfc,
+ /* 130..139 */
+ 0xe9, 0xe2, 0xe4, 0xe0, 0xe5, 0xe7, 0xea, 0xeb, 0xe8, 0xef,
+ /* 140..149 */
+ 0xee, 0xec, 0xc4, 0xc5, 0xc9, 0xe6, 0xc6, 0xf4, 0xf6, 0xf2,
+ /* 150..159 */
+ 0xfb, 0xf9, 0xff, 0xd6, 0xdc, 0xf8, 0xa3, 0xd8, 0xd7, 0x192,
+ /* 160..169 */
+ 0xe1, 0xed, 0xf3, 0xfa, 0xf1, 0xd1, 0xaa, 0xba, 0xbf, 0xae,
+ /* 170..179 */
+ 0xac, 0xbd, 0xbc, 0xa1, 0xab, 0xbb, 0x2591, 0x2592, 0x2593, 0x2502,
+ /* 180..189 */
+ 0x2524, 0xc1, 0xc2, 0xc0, 0xa9, 0x2563, 0x2551, 0x2557, 0x255d, 0xa2,
+ /* 190..199 */
+ 0xa5, 0x2510, 0x2514, 0x2534, 0x252c, 0x251c, 0x2500, 0x253c, 0xe3, 0xc3,
+ /* 200..209 */
+ 0x255a, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256c, 0xa4, 0xf0, 0xd0,
+ /* 210..219 */
+ 0xca, 0xcb, 0xc8, 0x131, 0xcd, 0xce, 0xcf, 0x2518, 0x250c, 0x2588,
+ /* 220..229 */
+ 0x2584, 0xa6, 0xcc, 0x2580, 0xd3, 0xdf, 0xd4, 0xd2, 0xf5, 0xd5,
+ /* 230..239 */
+ 0xb5, 0xfe, 0xde, 0xda, 0xdb, 0xd9, 0xfd, 0xdd, 0xaf, 0xb4,
+ /* 240..249 */
+ 0xad, 0xb1, 0x2017, 0xbe, 0xb6, 0xa7, 0xf7, 0xb8, 0xb0, 0xa8,
+ /* 250..259 */
+ 0xb7, 0xb9, 0xb3, 0xb2, 0x25a0, 0xa0, 0x20a7, 0x2310, 0x2561, 0x2562,
+ /* 260..269 */
+ 0x2556, 0x2555, 0x255c, 0x255b, 0x255e, 0x255f, 0x2567, 0x2568, 0x2564, 0x2565,
+ /* 270..279 */
+ 0x2559, 0x2558, 0x2552, 0x2553, 0x256b, 0x256a, 0x258c, 0x2590, 0x3b1, 0x393,
+ /* 280..289 */
+ 0x3c0, 0x3a3, 0x3c3, 0x3c4, 0x3a6, 0x398, 0x3a9, 0x3b4, 0x221e, 0x3c6,
+ /* 290..299 */
+ 0x3b5, 0x2229, 0x2261, 0x2265, 0x2264, 0x2320, 0x2321, 0x2248, 0x2219, 0x221a,
+ /* 300..309 */
+ 0x207f, 0x2c9, 0x2d8, 0x2d9, 0x2da, 0x2dd, 0x2db, 0x2c7, 0x2018, 0x2019,
+ /* 310..318*/
+ 0x201c, 0x201d, 0x2013, 0x2014, 0x2c6, 0x2dc, 0x201a, 0x201e, 0x2026,
+
+ /* 319..329 */
+ 0x2020, 0x2021, 0x2c6, 0x2030, 0x160, 0x2039, 0x152, 0x303, 0x2122, 0x161, 0x203a,
+ /* 330..339 */
+ 0x153, 0x178, 0x11f, 0x11e, 0x130, 0x15f, 0x15e, 0x103, 0x102, 0x105,
+ /* 340..349 */
+ 0x104, 0x107, 0x106, 0x10d, 0x10c, 0x10f, 0x10e, 0x111, 0x11b, 0x11a,
+ /* 350..359 */
+ 0x119, 0x118, 0x13a, 0x139, 0x13e, 0x13d, 0x142, 0x141, 0x144, 0x143,
+ /* 360..369 */
+ 0x148, 0x147, 0x151, 0x150, 0x155, 0x154, 0x159, 0x158, 0x15b, 0x15a,
+ /* 370..379 */
+ 0x165, 0x164, 0x163, 0x162, 0x171, 0x170, 0x16f, 0x16e, 0x17a, 0x179,
+ /* 380..383 */
+ 0x17e, 0x17d, 0x17c, 0x17b,
+
+ /* I don't know whether the following are used by PM, but they are in
+ the I18N unicode library */
+ /* yes they ARE used (for Cyrillic systems) */
+
+ /* 384..389 */
+ 0x401, 0x402, 0x403, 0x404, 0x405, 0x406,
+ /* 390..399 */
+ 0x407, 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0x40e, 0x40f, 0x410, 0x411,
+ /* 400..409 */
+ 0x412, 0x413, 0x414, 0x415, 0x416, 0x417, 0x418, 0x419, 0x41a, 0x41b,
+ /* 410..419 */
+ 0x41c, 0x41d, 0x41e, 0x41f, 0x420, 0x421, 0x422, 0x423, 0x424, 0x425,
+ /* 420..429 */
+ 0x426, 0x427, 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f,
+ /* 430..439 */
+ 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437, 0x438, 0x439,
+ /* 440..449 */
+ 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f, 0x440, 0x441, 0x442, 0x443,
+ /* 450..459 */
+ 0x444, 0x445, 0x446, 0x447, 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d,
+ /* 460..469 */
+ 0x44e, 0x44f, 0x2116, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457,
+ /* 470..479 */
+ 0x458, 0x459, 0x45a, 0x45b, 0x45c, 0x45e, 0x45f, 0x490, 0x491, 0x156,
+ /* 480..489 */
+ 0x12e, 0x100, 0x112, 0x116, 0x122, 0x136, 0x12a, 0x1eb, 0x145, 0x14c,
+ /* 490..499 */
+ 0x172, 0x16a, 0x157, 0x12f, 0x101, 0x113, 0x117, 0x123, 0x137, 0x12b,
+ /* 500..504 */
+ 0x13c, 0x146, 0x14d, 0x173, 0x16b
+
+#if MAX_GLYPH > 504
+ , 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 510..519 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 520..529 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 530..539 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 540..549 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 550..559 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 560..569 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 570..579 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 580..589 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 590..599 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 600..609 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 610..619 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 620..629 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 630..639 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 640..649 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 650..659 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 660..669 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 670..679 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 680..689 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 690..699 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 700..709 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 710..719 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 720..729 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 730..739 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 740..749 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 750..759 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 760..769 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x303f, 0x21b5,
+ /* 770..779 */
+ 0x3002, 0x300c, 0x300d, 0x3001, 0x0000, 0x30f2, 0x30a1, 0x30a3, 0x30a5, 0x30a7,
+ /* 780..789 */
+ 0x30a9, 0x30e3, 0x30e5, 0x30e7, 0x30c3, 0x30fc, 0x30a2, 0x30a4, 0x30a6, 0x30a8,
+ /* 790..799 */
+ 0x30aa, 0x30ab, 0x30ad, 0x30af, 0x30b1, 0x30b3, 0x30b5, 0x30b7, 0x30b9, 0x30bb,
+ /* 800..809 */
+ 0x30bd, 0x30bf, 0x30c1, 0x30c4, 0x30c6, 0x30c8, 0x30ca, 0x30cb, 0x30cc, 0x30cd,
+ /* 810..819 */
+ 0x30ce, 0x30cf, 0x30d2, 0x30d5, 0x30d8, 0x30db, 0x30de, 0x30df, 0x30e0, 0x30e1,
+ /* 820..829 */
+ 0x30e2, 0x30e4, 0x30e6, 0x30e8, 0x30e9, 0x30ea, 0x30eb, 0x30ec, 0x30ed, 0x30ef,
+ /* 830..839 */
+ 0x30f3, 0x309b, 0x309c, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, 0x3083, 0x3085,
+ /* 840..849 */
+ 0x3049, 0x3063, 0x3042, 0x3044, 0x3046, 0x3048, 0x304a, 0x304b, 0x304d, 0x304f,
+ /* 850..859 */
+ 0x3051, 0x3053, 0x3055, 0x3057, 0x3059, 0x305b, 0x305d, 0x305f, 0x3061, 0x3064,
+ /* 860..869 */
+ 0x3066, 0x3068, 0x306a, 0x306b, 0x306c, 0x306d, 0x306e, 0x306f, 0x3072, 0x3075,
+ /* 870..879 */
+ 0x3078, 0x307b, 0x307e, 0x307f, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086, 0x3088,
+ /* 880..889 */
+ 0x3089, 0x308a, 0x308b, 0x308c, 0x308d, 0x308f, 0x3092, 0x3093, 0x300e, 0x300f,
+ /* 890..899 */
+ 0x30f6, 0x3005, 0x0000, 0x0000, 0x0000, 0x0000, 0x3131, 0x3132, 0x3133, 0x3134,
+ /* 900..909 */
+ 0x3135, 0x3136, 0x3137, 0x3138, 0x3139, 0x313a, 0x313b, 0x313c, 0x313d, 0x313e,
+ /* 910..919 */
+ 0x313f, 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147, 0x3148,
+ /* 920..929 */
+ 0x3149, 0x314a, 0x314b, 0x314c, 0x314d, 0x314e, 0x314f, 0x3150, 0x3151, 0x3152,
+ /* 930..939 */
+ 0x3153, 0x3154, 0x3155, 0x3156, 0x3157, 0x3158, 0x3159, 0x315a, 0x315b, 0x315c,
+ /* 940..949 */
+ 0x315d, 0x315e, 0x315f, 0x3160, 0x3161, 0x3162, 0x3163, 0x20a9, 0x0000, 0x3164,
+ /* 950..959 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 960..969 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 970..979 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 980..989 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 990..999 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1000..1009 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1010..1019 */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 1020..1023 */
+ 0x0000, 0x0000, 0x0000, 0x0000
+#endif /* MAX_GLYHP > 504 */
+};
+
+
+/* on Greek systems, the UGL is a bit different */
+/* and changes the entries 319-383 inclusive */
+
+/* # of Greek glyphs in UGL */
+#define GREEK_GLYPHS 65
+/* start of Greek glyphs in UGL */
+#define GREEK_START 319
+
+static const int SubUGLGreek[GREEK_GLYPHS] = {
+ /* 319..328 */
+ 0x0391, 0x0392, 0x0395, 0x0396, 0x0397, 0x0399, 0x039a, 0x039c, 0x039d, 0x039f,
+ /* 329..338 */
+ 0x03a1, 0x03a4, 0x03a5, 0x03a7, 0x03b7, 0x03bd, 0x03c7, 0x03bf, 0x0384, 0x0308,
+ /* 339..348 */
+ 0x0385, 0x0390, 0x0020, 0x00A6, 0x0386, 0x0388, 0x0389, 0x038a, 0x038c, 0x038e,
+ /* 349..358 */
+ 0x038f, 0x0394, 0x0398, 0x039b, 0x039e, 0x03a0, 0x03a8, 0x03aa, 0x03ab, 0x03ac,
+ /* 359..368 */
+ 0x03ad, 0x03ae, 0x03af, 0x03b0, 0x03b2, 0x03b3, 0x03b6, 0x03b8, 0x03b9, 0x03ba,
+ /* 369..378 */
+ 0x03bb, 0x03bc, 0x03be, 0x03c1, 0x03c2, 0x03c5, 0x03c6, 0x03c8, 0x03c9, 0x03ca,
+ /* 379..383 */
+ 0x03cb, 0x03cc, 0x03cd, 0x03ce, 0x0000
+};
+#endif /* USE_UCONV */
+
+#endif /* _FTIFI_H_INCLUDED_ */
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.c b/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.c
new file mode 100644
index 000000000..f0f15f309
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.c
@@ -0,0 +1,184 @@
+/* */
+/* ** This is part of the FreeType/2 project! ** */
+/* A small utility to display online memory usage stats for FreeType/2 */
+/* */
+/* The method used to keep the window float on top may be completely */
+/* stupid but I found no other way (except putting WinSetWindowPos() */
+/* in the timer code which looks odd). */
+/* */
+/* Copyright (C) 1998 by M. Necasek */
+
+#define INCL_DOSMISC
+#define INCL_WINTIMER
+#define INCL_PM
+#include <os2.h>
+#include <stdio.h>
+
+#define ID_TIMER 42
+#define IDM_FLOAT 155
+
+
+/* name of shared memory used for memory usage reporting */
+#define MEM_NAME "\\sharemem\\freetype"
+
+typedef struct _INFOSTRUCT {
+ ULONG signature; /* signature (0x46524545, 'FREE') */
+ ULONG used; /* bytes actually used */
+ ULONG maxused; /* maximum amount ever used */
+ ULONG num_err; /* number of (de)allocation errors */
+} INFOSTRUCT, *PINFOSTRUCT;
+
+/* structure (in named shared memory) pointing to the above struct */
+typedef struct _INFOPTR {
+ PINFOSTRUCT address; /* pointer to actual memory info */
+} INFOPTR, *PINFOPTR;
+
+HAB hab;
+HWND hwndFrame;
+PINFOSTRUCT meminfo;
+PINFOPTR memptr;
+ULONG bFloat = TRUE;
+HWND hwndSysSubmenu;
+
+VOID AddFloat(HWND hwndFrame) {
+ MENUITEM mi;
+ HWND hwndSysMenu;
+ SHORT sMenuID;
+
+ /* add Float option to system menu */
+ hwndSysMenu = WinWindowFromID(hwndFrame, FID_SYSMENU);
+ sMenuID = (SHORT)WinSendMsg(hwndSysMenu, MM_ITEMIDFROMPOSITION,
+ MPFROMSHORT(0), MPVOID);
+ WinSendMsg(hwndSysMenu, MM_QUERYITEM, MPFROMSHORT(sMenuID),
+ MPFROMP(&mi));
+ hwndSysSubmenu = mi.hwndSubMenu;
+ mi.iPosition = MIT_END;
+ mi.afStyle = MIS_SEPARATOR;
+ mi.afAttribute = 0;
+ mi.id = -1;
+ mi.hwndSubMenu = 0;
+ mi.hItem = 0;
+ WinSendMsg(hwndSysSubmenu, MM_INSERTITEM, MPFROMP (&mi), NULL);
+ mi.afStyle = MIS_TEXT;
+ mi.afAttribute = MIA_CHECKED;
+ mi.id = IDM_FLOAT;
+ WinSendMsg(hwndSysSubmenu, MM_INSERTITEM, MPFROMP (&mi), "~Float on top");
+}
+
+MRESULT EXPENTRY ClientWndProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
+{
+ HPS hps;
+ RECTL rcl;
+ static ULONG i = 1;
+ ULONG ulMem;
+ char szBuf[200];
+
+ switch (msg) {
+ case WM_CREATE:
+ /* use smaller text */
+ WinSetPresParam(hwnd, PP_FONTNAMESIZE, 7, (PVOID)"8.Helv");
+ /* start the timer (ticks each 0.5 sec.) */
+ AddFloat(WinQueryWindow(hwnd, QW_PARENT));
+ WinStartTimer(hab, hwnd, ID_TIMER, 500);
+ break;
+
+ /* make window always stay on top (if desired) */
+ case WM_VRNENABLED:
+ if (bFloat)
+ WinSetWindowPos(hwndFrame, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER);
+ break;
+
+ case WM_COMMAND: /* why doesn't WM_SYSCOMMAND work? */
+ if (LOUSHORT(mp1) == IDM_FLOAT) {
+ bFloat = !bFloat;
+ WinCheckMenuItem(hwndSysSubmenu, IDM_FLOAT, bFloat);
+ }
+ break;
+
+ case WM_TIMER:
+ if (++i > 13)
+ i = 1;
+ WinInvalidateRect(hwnd, NULL, FALSE);
+ return FALSE;
+
+ case WM_PAINT:
+ hps = WinBeginPaint(hwnd, NULLHANDLE, &rcl);
+ /* necessary to avoid incorrectly repainting window */
+ WinQueryWindowRect(hwnd, &rcl);
+
+/* sprintf(szBuf, " Current use %dK Maximum ever used %dK Errors %d",
+ meminfo->used / 1024,
+ meminfo->maxused / 1024, meminfo->num_err);*/
+ sprintf(szBuf, " Current use %dB Maximum ever used %dK Errors %d",
+ meminfo->used,
+ meminfo->maxused / 1024, meminfo->num_err);
+ WinDrawText(hps, -1, szBuf, &rcl, CLR_BLACK, CLR_WHITE,
+ DT_CENTER | DT_VCENTER | DT_ERASERECT);
+
+ WinEndPaint(hps);
+ break;
+ }
+
+ return WinDefWindowProc(hwnd, msg, mp1, mp2);
+}
+
+void main (void)
+{
+ QMSG qmsg;
+ HMQ hmq;
+ HWND hwndClient;
+ ULONG flFrameFlags;
+
+ WinInitialize(0);
+ hmq = WinCreateMsgQueue(hab, 0);
+
+ /* get access to shared memory */
+ DosGetNamedSharedMem((PVOID*)&memptr, MEM_NAME, PAG_READ);
+ if (!memptr)
+ WinMessageBox(HWND_DESKTOP, HWND_DESKTOP,
+ " FreeType/2 is not running!",
+ "Error", 0, MB_OK | MB_ERROR);
+
+ else {
+ meminfo = memptr->address;
+ if (meminfo->signature != 0x46524545)
+ WinMessageBox(HWND_DESKTOP, HWND_DESKTOP,
+ " FreeType/2 is not running!",
+ "Error", 0, MB_OK | MB_ERROR);
+ else {
+ flFrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
+ FCF_TASKLIST ;
+
+ WinRegisterClass(hab, "MyClass",
+ (PFNWP) ClientWndProc,
+ CS_SIZEREDRAW, 0);
+
+ hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
+ WS_VISIBLE,
+ &flFrameFlags,
+ "MyClass", "FreeType/2 Heap Usage",
+ 0, (HMODULE) NULL,
+ 0, &hwndClient);
+
+ WinSetVisibleRegionNotify(hwndClient, TRUE);
+
+ /* make titlebar text look better */
+ WinSetPresParam(WinWindowFromID(hwndFrame, FID_TITLEBAR),
+ PP_FONTNAMESIZE, 9, (PVOID)"8.Helv");
+
+ WinSetWindowPos(hwndFrame, NULLHANDLE, 0, 0, 350, 42,
+ SWP_MOVE | SWP_SIZE | SWP_SHOW);
+
+ while (WinGetMsg(hab, &qmsg, (HWND) NULL, 0, 0))
+ WinDispatchMsg(hab, &qmsg);
+
+ WinSetVisibleRegionNotify(hwndClient, FALSE);
+ }
+ }
+ /* free shared memory block */
+ DosFreeMem(memptr);
+
+ WinDestroyWindow(hwndFrame);
+ WinDestroyMsgQueue(hmq);
+ WinTerminate(hab);
+}
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.icc b/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.icc
new file mode 100644
index 000000000..c9991f418
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.icc
@@ -0,0 +1,4 @@
+ftmem.exe: $*.obj
+ ilink /PM:PM /ST:0x8000 /BAS:0x10000 /E:2 /A:4 $*.obj
+ftmem.obj: $*.c
+ icc -C $*.c
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.ico b/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.ico
new file mode 100644
index 000000000..ab730f5c9
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/ftmem.ico
Binary files differ
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/test.c b/xc/extras/FreeType/contrib/ftos2/ifi/test.c
new file mode 100644
index 000000000..b79301272
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/test.c
@@ -0,0 +1,238 @@
+
+#include <os2.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "32pmifi.h"
+
+//#define USE_ORIG
+#ifdef USE_ORIG
+ #pragma import (fdhdr, "FONT_DRIVER_DISPATCH_TABLE", "TRUETYPE", 0)
+#else
+ #if defined USE_ATM
+ #pragma import (fdhdr, "FONT_DRIVER_DISPATCH_TABLE", "PMATM", 0)
+ #else
+ #pragma import (fdhdr, "FONT_DRIVER_DISPATCH_TABLE", "FREETYPE", 0)
+ #endif
+#endif
+
+extern FDHEADER fdhdr;
+
+char *fontnames[20] = {
+ "G:\\OS2\\MDOS\\WINOS2\\SYSTEM\\SYMBOL.TTF",
+ "G:\\OS2\\MDOS\\WINOS2\\SYSTEM\\WINGDING.TTF",
+ "G:\\PSFONTS\\ARIALB.ttf",
+ "G:\\PSFONTS\\ARIALI.ttf",
+ "G:\\PSFONTS\\ARIALZ.ttf",
+ "G:\\PSFONTS\\COUR.TTF",
+ "G:\\PSFONTS\\COURB.TTF",
+ "G:\\PSFONTS\\COURI.TTF",
+ "G:\\PSFONTS\\COURZ.TTF",
+ "G:\\PSFONTS\\ARIAL.ttf",
+ "G:\\PSFONTS\\TIMESB.TTF",
+ "G:\\PSFONTS\\TIMESI.ttf",
+ "G:\\PSFONTS\\TIMESZ.ttf",
+ "G:\\PSFONTS\\TIMES.TTF",
+ "G:\\PSFONTS\\ARIBLK.ttf",
+ "G:\\CHINESE\\AVSV.TTF",
+ "G:\\CHINESE\\MINGLI.TTC",
+ "D:\\PSFONTS\\TNRMT30.TTF"
+};
+
+#define FNTNAME1 "\\PSFONTS\\TIMES.TTF"
+#ifdef USE_ATM
+ #define FNTNAME2 "\\PSFONTS\\helv.ofm"
+#else
+ #define FNTNAME2 "\\PSFONTS\\symbol.tTf"
+#endif
+
+#define BUFSIZE 32768
+
+void ShowChar(PCHARATTR pca, PBITMAPMETRICS pbmm) {
+ int i, j;
+ int bufwidth = ((pbmm->sizlExtent.cx + 31) & -32) / 8;
+
+ for (i =0; i < pbmm->sizlExtent.cy; i++) {
+ for (j = 0; j < bufwidth * 8; j++)
+ if (pca->pBuffer[i * bufwidth + j / 8] & (1 << (7-(j % 8))))
+ printf("*");
+ else
+ printf(" ");
+ printf("\n");
+ }
+}
+
+void main(int argc, char **argv)
+{
+ char fname[260];
+ PFDDISPATCH pfdisp;
+ LONG rc;
+ HFF hff, hff2; /* font file */
+ HFC hfc, hfc2; /* font context */
+ static IFIMETRICS ifimet[12]; /* IFI metrics */
+ CONTEXTINFO ci;
+ CHARATTR charattr; /* character attributes */
+ BITMAPMETRICS bmm; /* bit-map metrics */
+ PBYTE buf;
+ int glyph = 0, i, j;
+ int numFaces;
+ int faceIndex = 0;
+
+ switch (argc) {
+ case 4:
+ strcpy(fname, argv[1]);
+ glyph = atoi(argv[2]);
+ faceIndex = atoi(argv[3]);
+ break;
+
+ case 2:
+ glyph = atoi(argv[1]);
+ case 1:
+ strcpy(fname, FNTNAME1);
+ break;
+
+ default:
+ strcpy(fname, argv[1]);
+ glyph = atoi(argv[2]);
+ }
+
+ buf = (PBYTE)malloc(BUFSIZE);
+ if (strncmp("OS/2 FONT DRIVER", fdhdr.strId, 16)) {
+ printf("Invalid Font Driver\n");
+ return;
+ }
+ printf("Font Driver OK, ");
+ printf("Version %d\n", fdhdr.ulVersion);
+ printf("Technology: %s\n", fdhdr.szTechnology);
+
+ hff = fdhdr.pfddisp->FdLoadFontFile(fname);
+ printf("Loading font... HFF = %X\n", hff);
+ if (hff == (HFF)0xFFFFFFFF)
+ return;
+
+/* rc = fdhdr.pfddisp->FdConvertFontFile("G:\\PSFONTS\\TIMES.TTF",
+ "G:\\PSFONTS", buf); */
+
+#if 0
+ for (i = 0; i < 18; i++) {
+ hff = fdhdr.pfddisp->FdLoadFontFile(fontnames[i]);
+ if (hff == (HFF)-1) {
+ printf("x");
+ continue;
+ }
+ numFaces = fdhdr.pfddisp->FdQueryFaces(hff, NULL, 0, -1, 0);
+ if (numFaces < 0) {
+ printf("x");
+ continue;
+ }
+ for (j = 0; j < numFaces; j++) {
+ rc = fdhdr.pfddisp->FdQueryFaces(hff, &ifimet[0], 238, 1, j);
+ if (rc < 0) {
+ printf("x");
+ continue;
+ }
+ }
+
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff);
+ if (rc)
+ printf("x");
+ else
+ printf(".");
+ }
+ printf("\n");
+#endif
+
+ hff = fdhdr.pfddisp->FdLoadFontFile(FNTNAME2);
+ hff = fdhdr.pfddisp->FdLoadFontFile(fname);
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff);
+
+ hff = fdhdr.pfddisp->FdLoadFontFile(fname);
+ printf("Loading font... HFF = %X\n", hff);
+ if (hff == (HFF)0xFFFFFFFF)
+ return;
+ numFaces = fdhdr.pfddisp->FdQueryFaces(hff, NULL, 0, -1, 0);
+ printf("Number of faces = %d\n", numFaces);
+ rc = fdhdr.pfddisp->FdQueryFaces(hff, &ifimet[0], sizeof(IFIMETRICS), numFaces, 0);
+ printf("Querying faces... RC = %X\n", rc);
+ hfc = fdhdr.pfddisp->FdOpenFontContext(hff, faceIndex);
+ printf("Opening context... HFC = %X\n", hfc);
+ if (hfc == (HFC)0xFFFFFFFF) {
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff);
+ printf("Unloading font... RC = %X\n", rc);
+ }
+ ci.cb = sizeof(ci);
+ ci.fl = 0;
+/* ci.sizlPPM.cx = 3618;
+ ci.sizlPPM.cy = 3622;
+ ci.pfxSpot.x = 46340;
+ ci.pfxSpot.y = 46340;
+ ci.matXform.eM11 = 511;
+ ci.matXform.eM12 = 0;
+ ci.matXform.eM21 = 0;
+ ci.matXform.eM22 = 511; */
+ ci.sizlPPM.cx = 3622;
+ ci.sizlPPM.cy = 3622;
+ ci.pfxSpot.x = 46340;
+ ci.pfxSpot.y = 46340;
+ ci.matXform.eM11 = 768;
+ ci.matXform.eM12 = 0;
+ ci.matXform.eM21 = 0;
+ ci.matXform.eM22 = 768;
+
+ rc = fdhdr.pfddisp->FdQueryFaceAttr(hfc, FD_QUERY_ABC_WIDTHS, buf,
+ sizeof(ABC_TRIPLETS), NULL, glyph);
+ printf("Querying face attrs... RC = %d\n", rc);
+ rc = fdhdr.pfddisp->FdQueryFaceAttr(hfc, FD_QUERY_KERNINGPAIRS, buf,
+ ifimet[0].cKerningPairs * sizeof(FD_KERNINGPAIRS),
+ NULL, 0);
+
+
+ rc = fdhdr.pfddisp->FdSetFontContext(hfc, &ci);
+ printf("Setting context... rc = %X\n", rc);
+
+ charattr.cb = sizeof(charattr);
+ charattr.iQuery = FD_QUERY_BITMAPMETRICS | FD_QUERY_CHARIMAGE;
+// charattr.iQuery = FD_QUERY_OUTLINE;
+ charattr.gi = glyph;
+ charattr.pBuffer = buf;
+ charattr.cbLen = BUFSIZE;
+ if (rc == -1)
+ return;
+ rc = fdhdr.pfddisp->FdQueryCharAttr(hfc, &charattr, &bmm);
+ printf("Querying char attrs... bytes = %d\n", rc);
+ ShowChar(&charattr, &bmm);
+
+// rc = fdhdr.pfddisp->FdQueryCharAttr(hfc, &charattr, &bmm, NULL);
+// printf("Querying char attrs... bytes = %d\n", rc);
+
+ hff2 = fdhdr.pfddisp->FdLoadFontFile(FNTNAME2);
+ printf("Loading font... HFF = %X\n", hff2);
+ if (hff2 == (HFF)0xFFFFFFFF)
+ return;
+
+ charattr.cbLen = 0;
+ rc = fdhdr.pfddisp->FdQueryCharAttr(hfc, &charattr, &bmm);
+ printf("Querying char attrs... bytes = %d\n", rc);
+ rc = fdhdr.pfddisp->FdQueryFaces(hff2, &ifimet[0], sizeof(ifimet), 1, 0);
+ printf("Querying faces... RC = %X\n", rc);
+ hfc2 = fdhdr.pfddisp->FdOpenFontContext(hff2, 0);
+ printf("Opening context... HFC = %X\n", hfc2);
+ if (hfc2 == (HFC)0xFFFFFFFF) {
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff2);
+ printf("Unloading font... RC = %X\n", rc);
+ }
+ rc = fdhdr.pfddisp->FdCloseFontContext(hfc);
+ printf("Closing context... RC = %X\n", rc);
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff);
+ printf("Unloading font... RC = %X\n", rc);
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff);
+ printf("Unloading font... RC = %X\n", rc);
+
+ rc = fdhdr.pfddisp->FdCloseFontContext(hfc2);
+ printf("Closing context... RC = %X\n", rc);
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff2);
+ printf("Unloading font... RC = %X\n", rc);
+ rc = fdhdr.pfddisp->FdUnloadFontFile(hff2);
+ printf("Unloading font... RC = %X\n", rc);
+}
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/test.icc b/xc/extras/FreeType/contrib/ftos2/ifi/test.icc
new file mode 100644
index 000000000..36a8f0d79
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/test.icc
@@ -0,0 +1,6 @@
+test.exe: $*.obj freetype.lib
+ ilink /DE /PM:VIO /ST:0x1000 $*.obj freetype.lib
+test.obj: $*.c
+ icc -Ti+ -C -Ss -Sp1 $*.c
+freetype.lib: $*.dll
+ implib $*.lib $*.dll
diff --git a/xc/extras/FreeType/contrib/ftos2/ifi/test.wat b/xc/extras/FreeType/contrib/ftos2/ifi/test.wat
new file mode 100644
index 000000000..20dca184f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/ifi/test.wat
@@ -0,0 +1,4 @@
+test.exe: $*.obj
+ wlink file $*.obj lib freetype.lib import _fdhdr freetype.FONT_DRIVER_DISPATCH_TABLE
+test.obj: $*.c
+ wcc386 -d2 -zp1 $*.c
diff --git a/xc/extras/FreeType/contrib/ftos2/install.cmd b/xc/extras/FreeType/contrib/ftos2/install.cmd
new file mode 100644
index 000000000..44e7a299b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/install.cmd
@@ -0,0 +1,30 @@
+/* */
+call RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs"
+call SysLoadFuncs
+
+
+say "Warning: This is your last chance to back out. If you do not wish to"
+say "continue, please just press ENTER. Otherwise please type ""yes"""
+
+pull letter
+if letter <> "YES" then exit
+
+/* Find drive where OS/2 is installed */
+bootdrive = SysSearchPath('PATH', 'OS2.INI')
+/* say os2path */
+bootdrive = left(bootdrive, 2)
+
+copy "FREETYPE.DLL " || bootdrive || "\os2\dll"
+if rc <> 0 then do
+ say "Error: Could not copy file!"
+ pause
+ exit
+end
+
+app = "PM_Font_Drivers"
+key = "TRUETYPE"
+val = "\OS2\DLL\FREETYPE.DLL" || d2c(0)
+
+SysIni('BOTH', app, key, val)
+say "Font Driver is installed. Please reboot."
+pause
diff --git a/xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.icc b/xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.icc
new file mode 100644
index 000000000..7d83f3393
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.icc
@@ -0,0 +1,72 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for IBM VisualAge C++ under OS/2.
+#
+# You will need nmake.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# nmake -f arch\os2\Makefile.icc
+#
+
+ARCH = arch\os2
+FT_MAKEFILE = $(ARCH)\Makefile.icc
+FT_MAKE = $(MAKE) -nologo
+
+CC = icc
+CFLAGS = -Wcnd- -Wpro- -Ss -Sp1 -Rn -Ge- -O+ -G4 -Q+ -Iarch\os2 -I. -Iextend
+#CFLAGS = -Wcnd- -Wpro- -Ss -Sp1 -Rn -Ge- -Ti+ Q+ -Iarch\os2 -I. -Iextend
+
+# NOTE: Optimizations are discarded, as it seems that Visual Age
+# is buggy when producing ttraster.obj. The resulting code
+# crashes under some circumstances (performing vertical dropout
+# control when rendering smoothed outlines)!
+
+TTFILE = $(ARCH)\os2file.c
+TTMEMORY = .\ttmemory.c
+TTMUTEX = .\ttmutex.c
+
+PORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)
+
+SRC_X = extend\ftxgasp.c extend\ftxkern.c extend\ftxpost.c \
+ extend\ftxcmap.c extend\ftxwidth.c
+OBJS_X = $(SRC_X:.c=.obj)
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c \
+ ttgload.c ttinterp.c ttload.c ttobjs.c ttraster.c \
+ ttextend.c $(PORT)
+OBJS_M = $(SRC_M:.c=.obj) $(OBJS_X)
+
+SRC_S = $(ARCH)\freetype.c
+OBJ_S = $(SRC_S:.c=.obj)
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+all:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES="$(OBJS_S)" libttf.lib
+
+debug:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES="$(OBJS_M)" libttf.lib
+
+
+$(OBJ_S): $(SRC_S) $(SRC_M)
+ $(CC) -C $(CFLAGS) /Fo$@ $*.c
+
+$(OBJS_X):
+ $(CC) -C $(CFLAGS) /Fo$@ $*.c
+
+$(ARCH)\os2file.obj:
+ $(CC) -C $(CFLAGS) /Fo$@ $*.c
+
+libttf.lib: $(LIB_FILES)
+ !ilib /nologo /noignorecase /nobackup $@ -+$?,,
+
+clean:
+ -del *.obj
+ -del extend\*.obj
+ -del arch\os2\*.obj
+
+distclean: clean
+ -del libttf.lib
+
+# end of Makefile.icc
diff --git a/xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.wat b/xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.wat
new file mode 100644
index 000000000..3a4cef6b3
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/lib/arch/os2/Makefile.wat
@@ -0,0 +1,41 @@
+# This file is part of the FreeType project.
+# Modified for FTIFI - Mike
+#
+# It builds the library and test programs using Watcom C/C++ under OS/2.
+#
+# You will need nmake!!
+# If you can change this makefile to work with wmake, please
+# inform me.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# nmake -f arch\os2\Makefile.icc
+
+CC = wcc386
+CFLAGS = -4r -Otexan -zp1 -bd -zc -Iarch\os2 -I. -Iextend
+
+SRC = ttapi.c ttcache.c ttcalc.c ttcmap.c tterror.c \
+ ttfile.c ttgload.c ttinterp.c ttlists.c ttload.c \
+ ttmemory.c ttmutex.c ttobjs.c ttraster.c ttextend.c \
+ \
+ extend\ftxgasp.c extend\ftxkern.c
+
+OBJ = $(SRC:.c=.obj)
+
+.c.obj:
+ $(CC) $(CFLAGS) $*.c
+
+all: libttf.lib
+
+libttf.lib: $(OBJ)
+ -move ft*.obj extend
+ !wlib -c $@ -+$?
+
+clean:
+ -del *.obj
+ -del extend\*.obj
+
+distclean: clean
+ -del libttf.lib
+
+# end of Makefile.wcc
diff --git a/xc/extras/FreeType/contrib/ftos2/lib/ttmemory.c b/xc/extras/FreeType/contrib/ftos2/lib/ttmemory.c
new file mode 100644
index 000000000..38fd97948
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/lib/ttmemory.c
@@ -0,0 +1,385 @@
+/*******************************************************************
+ *
+ * ttmemory.c 1.2
+ *
+ * Memory management component (body).
+ *
+ * Copyright 1996, 1997 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * Portions Copyright 1998 by Michal Necasek
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * Changes between 1.1 and 1.2:
+ *
+ * - the font pool is gone.
+ *
+ * - introduced the FREE macro and the Free function for
+ * future use in destructors.
+ *
+ * - Init_FontPool() is now a macro to allow the compilation of
+ * 'legacy' applications (all four test programs have been updated).
+ *
+ * Note: This code was slightly adapted for use in the OS/2
+ * Font Driver (FreeType/2).
+ *
+ ******************************************************************/
+
+#include "ttdebug.h"
+#include "ttmemory.h"
+#include "ttengine.h"
+
+#define INCL_DEV
+#include <os2.h>
+#include <pmddi.h>
+
+#include <stdlib.h>
+
+#undef DEBUG_MEM
+
+/* -------------------- debugging defs ----------------------- */
+/* DEBUG_MEM creates a file and logs all actions to it */
+
+#ifdef DEBUG_MEM
+ static HFILE MemLogHandle = NULLHANDLE;
+ static ULONG Written = 0;
+ static char log[2048] = "";
+ static char buf[2048] = "";
+
+
+char* itoa10( int i, char* buffer ) {
+ char* ptr = buffer;
+ char* rptr = buffer;
+ char digit;
+
+ if (i == 0) {
+ buffer[0] = '0';
+ buffer[1] = 0;
+ return buffer;
+ }
+
+ if (i < 0) {
+ *ptr = '-';
+ ptr++; rptr++;
+ i = -i;
+ }
+
+ while (i != 0) {
+ *ptr = (char) (i % 10 + '0');
+ ptr++;
+ i /= 10;
+ }
+
+ *ptr = 0; ptr--;
+
+ while (ptr > rptr) {
+ digit = *ptr;
+ *ptr = *rptr;
+ *rptr = digit;
+ ptr--;
+ rptr++;
+ }
+
+ return buffer;
+}
+
+static const char* hexstr = "0123456789abcdef";
+
+char* itohex2( int i, char* buffer )
+ {
+ buffer[0] = hexstr[ (i >> 12) & 0xF ];
+ buffer[1] = hexstr[ (i >> 8 ) & 0xF ];
+ buffer[2] = hexstr[ (i >> 4 ) & 0xF ];
+ buffer[3] = hexstr[ (i ) & 0xF ];
+ buffer[4] = '\0';
+ return buffer;
+}
+
+char* itohex4( long i, char* buffer )
+{
+ itohex2( (i >> 16) & 0xFFFF, buffer );
+ /* We separate the high and low part with a dot to make it */
+ /* more readable */
+ buffer[4] = '.';
+ itohex2( i & 0xFFFF, buffer+5 );
+ return buffer;
+}
+
+ #define COPY(s) strcpy(log, s)
+ #define CAT(s) strcat(log, s)
+ #define CATI(v) strcat(log, itoa10( (int)v, buf ))
+ #define CATH(v) strcat(log, itohex4( (long)v, buf ))
+ #define CATW(v) strcat(log, itohex2( (short)v, buf ))
+ #define WRITE DosWrite(MemLogHandle, log, strlen(log), &Written)
+ #define ERRRET(e) { COPY("Error at "); \
+ CATI(__LINE__); \
+ CAT("\r\n"); \
+ WRITE; \
+ return(e); \
+ }
+
+#else
+
+ #define COPY(s)
+ #define CAT(s)
+ #define CATI(v)
+ #define CATH(v)
+ #define CATW(v)
+ #define WRITE
+ #define ERRRET(e) return(e);
+
+#endif /* DEBUG_MEM */
+
+
+#undef TRACK_MEM
+/* TRACK_MEM allows online tracking of memory usage online (via shared */
+/* memory). It is used in conjunction with the FTMEM utility. */
+
+#ifdef TRACK_MEM
+ /* name of shared memory used for memory usage reporting */
+ #define MEM_NAME "\\sharemem\\freetype"
+
+ /* structure containing memory usage information */
+ typedef struct _INFOSTRUCT {
+ ULONG signature; /* signature (0x46524545, 'FREE') */
+ ULONG used; /* bytes actually used */
+ ULONG maxused; /* maximum amount ever used */
+ ULONG num_err; /* number of (de)allocation errors */
+ } INFOSTRUCT, *PINFOSTRUCT;
+
+ /* structure (in named shared memory) pointing to the above struct */
+ typedef struct _INFOPTR {
+ PINFOSTRUCT address; /* pointer to actual memory info */
+ } INFOPTR, *PINFOPTR;
+
+ PINFOSTRUCT meminfo; /* struct in shared memory holding usage info */
+ PINFOPTR memptr;
+#endif
+
+/* -----------------------------------------------------------------
+
+ A brief explanation of the memory allocator :
+
+ - We store the block's size in front of it. The size implies the nature
+ of the block, and selects a de-allocation scheme..
+
+ - A note on the memory debugging schemes: logging and online tracking
+ are independent of each other and none, either or both may be used.
+
+ ----------------------------------------------------------------- */
+
+ /****************************************************************/
+ /* */
+ /* Allocate a block of memory */
+ /* */
+ static
+ void* ft2_malloc( long size )
+ {
+ long* head;
+ void* base;
+ int rc;
+
+ /* add header size */
+ size += sizeof(long);
+
+ /* Allocate memory accessible from all processes */
+ if (( rc = SSAllocMem( (PVOID)&head, size, 0 )))
+ {
+ COPY( "ft2_malloc: block SSAllocMem failed with rc = " );
+ CATH( rc );
+ CAT ( "\r\n" );
+ WRITE;
+ return NULL;
+ }
+ *head = size;
+ base = (void*)(head + 1);
+ #ifdef TRACK_MEM
+ meminfo->used += size;
+ if (meminfo->used > meminfo->maxused)
+ meminfo->maxused = meminfo->used;
+ #endif
+ return base;
+ }
+
+ /****************************************************************/
+ /* */
+ /* Release a block of memory */
+ /* */
+ int ft2_free( void* block )
+ {
+ long* head;
+ long size, offset;
+ int rc, h;
+
+ if (!block)
+ return -1;
+
+ head = ((long*)block) - 1;
+ size = *head;
+
+ if (size <= 0)
+ {
+ COPY( "ft2_free: negative size !!\r\n" );
+ WRITE;
+ return -1;
+ }
+
+ rc = SSFreeMem( (PVOID)head );
+ if (rc)
+ {
+ COPY( "ft2_free: block SSFreeMem failed with rc = " );
+ CATI( rc );
+ CAT ( "\r\n" );
+ WRITE;
+ }
+ #ifdef TRACK_MEM
+ meminfo->used -= size;
+ #endif
+ return rc;
+ }
+
+/*******************************************************************
+ *
+ * Function : TT_Alloc
+ *
+ * Description : Allocates memory from the heap buffer.
+ *
+ * Input : Size size of the memory to be allocated
+ * P pointer to a buffer pointer
+ *
+ * Output : Error code.
+ *
+ * NOTE: The newly allocated block should _always_ be zeroed
+ * on return. Many parts of the engine rely on this to
+ * work properly.
+ *
+ ******************************************************************/
+
+ TT_Error TT_Alloc( long Size, void** P )
+ {
+ if ( Size )
+ {
+ *P = ft2_malloc( Size );
+ if (!*P) {
+ #ifdef TRACK_MEM
+ meminfo->num_err++;
+ #endif
+ return TT_Err_Out_Of_Memory;
+ }
+
+ /* MEM_Set( *P, 0, Size); */ /* not necessary, SSAllocMem does it */
+ }
+ else
+ *P = NULL;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Free
+ *
+ * Description : Releases a previously allocated block of memory.
+ *
+ * Input : P pointer to memory block
+ *
+ * Output : Always SUCCESS.
+ *
+ * Note : The pointer must _always_ be set to NULL by this function.
+ *
+ ******************************************************************/
+
+ TT_Error TT_Free( void** P )
+ {
+ if ( !P || !*P )
+ return TT_Err_Ok;
+
+ if (ft2_free( *P )) {
+ #ifdef TRACK_MEM
+ meminfo->num_err++;
+ #endif
+ }
+ *P = NULL;
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTMemory_Init
+ *
+ * Description : Initializes the memory.
+ *
+ * Output : Always SUCCESS.
+ *
+ ******************************************************************/
+
+ TT_Error TTMemory_Init()
+ {
+ int rc;
+
+ #ifdef DEBUG_MEM
+ ULONG Action;
+
+ DosOpen("C:\\FTMEM.LOG", &MemLogHandle, &Action, 0, FILE_NORMAL,
+ OPEN_ACTION_CREATE_IF_NEW | OPEN_ACTION_REPLACE_IF_EXISTS,
+ OPEN_FLAGS_NO_CACHE | OPEN_FLAGS_WRITE_THROUGH |
+ OPEN_FLAGS_SEQUENTIAL | OPEN_SHARE_DENYWRITE | OPEN_ACCESS_WRITEONLY,
+ NULL);
+
+ COPY("FTMEM Init.\r\n");
+ WRITE;
+
+ #endif /* DEBUG */
+
+ #ifdef TRACK_MEM
+ /* allocate named shared memory and global shared memory */
+
+ SSAllocMem(&meminfo, 4096, 0);
+ DosAllocSharedMem((PVOID*)&memptr, MEM_NAME, 4096, fALLOC);
+ memptr->address = meminfo;
+ meminfo->signature = 0x46524545; /* 'FREE' */
+ meminfo->maxused = 0;
+ meminfo->used = 0;
+ #endif /* TRACK */
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTMemory_Done
+ *
+ * Description : Finalizes memory usage.
+ *
+ * Output : Always SUCCESS.
+ *
+ ******************************************************************/
+
+ TT_Error TTMemory_Done()
+ {
+ /* Never called by the font driver (beats me why). We do not
+ release the heaps */
+
+ #ifdef TRACK_MEM
+ DosFreeMem(memptr); /* free shared memory */
+ SSFreeMem(meminfo);
+ #endif
+ #ifdef DEBUG_MEM
+ COPY("FTMEM Done.\r\n");
+ WRITE;
+ DosClose(MemLogHandle);
+ #endif
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/contrib/ftos2/limit.cmd b/xc/extras/FreeType/contrib/ftos2/limit.cmd
new file mode 100755
index 000000000..807deda4b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/limit.cmd
@@ -0,0 +1,63 @@
+/* */
+call RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs"
+call SysLoadFuncs
+
+Parse Upper Arg a1 a2
+
+app = "FreeType/2"
+key = "OPENFACES"
+
+if Arg() = 0 then call usage
+
+if a1 = 'Q' then call query
+
+if a1 = 'S' then call set
+call usage
+
+set:
+
+val = a2
+
+if val = '' then do
+ say 'Invalid limit!'
+ exit
+end
+
+if val < 8 then do
+ say 'The lowest acceptable limit is 8!'
+ pause
+ exit
+end
+
+szval = val || d2c(0)
+
+rc = SysIni('USER', app, key, szval)
+say rc
+if rc = 'ERROR:' then do
+ say 'Error updating OS2.INI!'
+ pause
+ exit
+end
+
+say "Open faces limit updated to " || val || ". Please reboot to activate changes."
+pause
+exit
+
+query:
+val = SysIni('USER', app, key)
+if val = "ERROR:" then val = "not set"
+/* strip the terminating NULL character */
+else val = substr(val, 1, pos(d2c(0), val) - 1)
+
+say 'The current open faces limit is ' || val
+pause
+exit
+
+usage:
+say 'This program is used to set the limit of concurrently open typefaces for'
+say 'FreeType/2. Use lower numbers to limit memory consumption and higher to'
+say 'improve performance if you use lots of fonts.'
+say
+say 'Usage: LIMIT q - query the current limit'
+say ' LIMIT s <val> - set limit to <val> (effective on next reboot).'
+pause
diff --git a/xc/extras/FreeType/contrib/ftos2/query.cmd b/xc/extras/FreeType/contrib/ftos2/query.cmd
new file mode 100644
index 000000000..532c8e605
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/query.cmd
@@ -0,0 +1,15 @@
+/* */
+call RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs"
+call SysLoadFuncs
+
+app = "PM_Font_Drivers"
+key = "TRUETYPE"
+
+val = SysIni('USER', app, key)
+
+if val = "ERROR:" then val = "none"
+/* strip the terminating NULL character */
+else val = substr(val, 1, pos(d2c(0), val) - 1)
+
+say 'The current TrueType driver is ' || val
+pause
diff --git a/xc/extras/FreeType/contrib/ftos2/readme.1st b/xc/extras/FreeType/contrib/ftos2/readme.1st
new file mode 100644
index 000000000..ea5f403d4
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/readme.1st
@@ -0,0 +1,87 @@
+This is the source code from the FreeType/2 OS/2 font driver.
+Copyright (C) 1997-1998 Michal Necasek (mike@mendelu.cz).
+
+Here's a description of the files in this package :
+
+ readme.1st This file
+
+ readme.txt The FreeType/2 Readme
+
+ FAQ The FreeType/2 user faq
+
+ DEVELFAQ The FreeType/2 developer faq. Read it before trying to
+ compile this program
+
+ install.cmd The FreeType/2 installation script
+ uninstall.cmd The FreeType/2 uninstallation script
+ query.cmd A script used to query the name of the current font driver
+
+ limit.cmd The driver controls the number of font files it keeps
+ opened at the same time, in order to save system resources
+ and memory (of course, this _doesn't_ limit the number of
+ opened fonts in PM, it just saves a _lot_ of memory when
+ many fonts are installed on your system).
+
+ This script let you change this limit. It can be useful
+ if you use font-intensive applications (like DTP) and
+ want better performance (to the sake of memory).
+
+ update.cmd The FreeType/2 update script
+ ifi/ Source code of the FreeType/2 font driver proper
+
+
+ lib/ files that must be added to the standard FreeType 1.1
+ release. They take the place of the files located in
+ the corresponding "lib" file.
+
+ lib/ttmemory.c replacement for the FreeType memory
+ manager component. This one uses the GRE
+ shared memory segment allocater, and is
+ required.
+
+ lib/arch/makefile.icc Makefile to compile the FreeType library for
+ FreeType/2 with Visual Age. You'll need nmake.
+
+ lib/arch/makefile.wat Makefile to compile with Watcom. NOTE that
+ you'll ALSO need nmake (wmake won't work !!)
+
+
+Here's how to compile the font driver.
+
+0. Read the DEVELFAQ ! Now ! Then make a WPS backup !
+
+1. Get the FreeType library, and copy the "lib" hierarchy into it to
+ replace the related files (i.e. ttmemory.c and makefiles).
+
+2. Compile FreeType with the new files, simply go to "freetype/lib"
+ and type :
+
+ nmake -f arch\os2\makefile.icc for VisualAge
+ nmake -f arch\os2\makefile.wat for Watcom
+
+3. Adjust the makefiles in "ifi" to reflect the location of the
+ library file "libttf.lib" that was generated previously.
+
+5. Compile the font driver. Go to the "ft_os2/ifi" directory, then type
+
+ nmake -f freetype.icc for VisualAge
+ nmake -f freetype.wat for Watcom
+
+ You should have created a file called "FreeType.dll". Copy it to
+ your "ft_os2" directory..
+
+6. Run the "install.cmd" script, then reboot after closing all
+ applications.
+
+7. When your desktop is back, go to the font palette and try to
+ install some new TrueType fonts. Enjoy the difference :-)
+
+8. You can also compile a small memory usage dumper called "ftmem.c"
+ to know how much memory the driver is using. Simply do
+
+ nmake -f ftmem.icc for VisualAge
+ nmake -f ftmem.wat for Watcom
+
+ Then launch it. A small window will appear with the current amount
+ of memory allocated by the driver.
+
diff --git a/xc/extras/FreeType/contrib/ftos2/readme.txt b/xc/extras/FreeType/contrib/ftos2/readme.txt
new file mode 100644
index 000000000..a03fd2b11
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/readme.txt
@@ -0,0 +1,113 @@
+
+ * * * FreeType/2 * * *
+
+ (Version 1.0, 5. November 1998)
+
+ Copyright (C) 1997,1998 Michal Necasek <mike@mendelu.cz>
+ Copyright (C) 1997,1998 The FreeType Development Team
+
+
+ Motto: "OS/2 is dead? Again? Thanks for telling me, I'd never notice!"
+
+
+ *** if you are upgrading from previous version, please see the FAQ (Q15) ***
+
+
+- First a short Q&A:
+
+Q1: What's this?
+A1: This is what OS/2 users have been waiting for only too long - a free,
+ high-quality TrueType renderer a.k.a. Font Driver conforming to the
+ OS/2 Intelligent Font Interface specification. It is based on FreeType -
+ a free portable library for using TrueType fonts.
+ Please note that although this code is free the FreeType team and
+ I will cheerfully accept any donations by happy users ;-) (not that I
+ expect to get any)
+
+Q2: How do I use this?
+A2: Go to OS/2 command line and run INSTALL.CMD from the directory containing
+ FREETYPE.DLL. This will replace the original IBM TrueType driver if it is
+ installed.
+
+Q3: Where's the disclaimer?
+A3: No, don't worry, I didn't forget that. I of course provide NO WARRANTY
+ that this code will work as you expect. Use only at your OWN RISK!
+
+Q4: What should I do RIGHT NOW?
+A4: Before attempting to install this driver, you are STRONGLY advised
+ to archive your current configuration (Set Desktop Properties/Archive/
+ Create archive at each startup, then reboot. Then of course switch archiving
+ off). It is always possible your system won't boot with the font driver
+ installed. You can risk it, but I warned you! You know how nasty the
+ computers can be ;-)
+
+Q5: What about the license?
+A5: This code is distributed under the FreeType license.
+ It is free and the source code is available as part of the FreeType
+ distribution.
+
+Q6: How do I get rid of this?
+A6: Ah, right question. Just run UNINSTALL.CMD. That removes the font driver
+ (not physically, it just isn't used on next startup) and restores the
+ original TRUETYPE.DLL if it exists.
+
+Q7: Is there something else?
+A7: Yes, be prepared that the fonts just kick ass! You will no longer have
+ to envy those poor souls still using the so-called 95% OS from THAT
+ unspeakable company starting with the letter M ;-)
+
+
+- Current features/bugs/limitations:
+
+ Features : - outlines
+ - scaled/rotated text
+ - supports printed output
+ - works with TTCs (TrueType collections)
+ - national characters (if provided in the font, of course);
+ should work with all Latin codepages, Cyrillic and Greek.
+ - partial DBCS support - Traditional Chinese should work about
+ 98%. Fonts like Times New Roman MT30 should work on all
+ systems. If you want your language to be supported, you can
+ apply at <mike@mendelu.cz> and become a Beta tester.
+
+ Bug/feature: - unharmonious glyph spacing in some applications. This seems
+ to come from OS/2's WYSIWYG glyph placement policy. This
+ is more or less visible depending on the application. We
+ can't do a lot about this... At least it's true WYSIWYG and
+ no nasty surprises when printing.
+
+
+ Limitations: - no grayscaling (a.k.a. antialiasing) - this is a limitation
+ of OS/2, not my code. If OS/2 starts supporting it, I'll
+ implement it the moment I lay my hands on the specs :)
+ Unfortunately it most probably won't happen any too soon.
+ Anyway, you have to bug IBM about this one, not me!
+
+- Planned features and features under consideration:
+ - possibly adding even support for Type 1 fonts, but that depends on
+ further FreeType engine development. Looks quite probable now.
+
+And finally, thanks go to:
+ - the FreeType team, the makers of FreeType. Without them, my work would be
+ impossible.
+ - especially David Turner of FreeType for his help, advice and support
+ - Robert Muchsel, I used one or two ideas from his code
+ - Marc L Cohen, Ken Borgendale and Tetsuro Nishimura from IBM. They provided
+ me with lots of extremely valuable 'inside' information.
+ - and last but not least - IBM, for providing us with the wonderful OS/2.
+ And for giving out the necessary docs for free. If all companies did
+ that, the world would be a better place.
+
+
+Information on FreeType is available at
+ http://www.freetype.org
+
+Please send bug reports/suggestions and comments to :
+
+ freetype-os2@physiol.med.tu-muenchen.de
+
+
+Greetings can also be sent directly to the author at : mike@mendelu.cz
+
+And if you didn't know, IBM and OS/2 are registered trademarks of the
+International Business Machines Corporation.
diff --git a/xc/extras/FreeType/contrib/ftos2/uninst.c b/xc/extras/FreeType/contrib/ftos2/uninst.c
new file mode 100644
index 000000000..da3380b22
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/uninst.c
@@ -0,0 +1,60 @@
+/* */
+/* UNINST - FreeType/2 uninstaller */
+/* */
+/* Copyright 1998 Michal Necasek <mike@mendelu.cz> */
+/* */
+/* UNINSTALL.CMD rewritten in C - apparently the REXX version fails */
+/* when OS/2 is booted to command line. This causes problems if */
+/* FreeType/2 prevents PM from starting successfully. */
+/* */
+/* Note: This can be compiled as 16-bit app to keep the size down. */
+
+#define INCL_NOXLATE_WIN16
+#define INCL_NOXLATE_DOS16
+#define INCL_WINSHELLDATA
+#define INCL_DOSMISC
+#include <os2.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <conio.h>
+
+char szApp[] = "PM_Font_Drivers";
+char szKey[] = "TRUETYPE";
+char szBuffer[300];
+
+void main(void) {
+ ULONG ulBootDrv;
+ USHORT usLen = 0;
+ APIRET rc;
+ char c;
+
+ usLen = PrfQueryProfileString(HINI_USERPROFILE, szApp, szKey, NULL,
+ (PVOID)szBuffer, 260L);
+
+ if (!strcmp("\\OS2\\DLL\\FREETYPE.DLL", szBuffer)) {
+ if(!PrfWriteProfileString(HINI_USERPROFILE, szApp, szKey, NULL))
+ goto err;
+
+ printf("FreeType/2 successfully removed.\n");
+ printf("Do you wish to restore TRUETYPE.DLL (y/n)? ");
+ c = getch();
+ if (c != 'y' && c != 'Y')
+ return;
+
+ if(!PrfWriteProfileString(HINI_USERPROFILE, szApp, szKey,
+ "\\OS2\\DLL\\TRUETYPE.DLL"))
+ goto err;
+
+ printf("\nTRUETYPE.DLL successfully restored");
+ }
+ else {
+ printf("FreeType/2 not installed!");
+ return;
+ }
+
+ return;
+
+err:
+ printf("Uninstallation failed!");
+}
diff --git a/xc/extras/FreeType/contrib/ftos2/uninstall.cmd b/xc/extras/FreeType/contrib/ftos2/uninstall.cmd
new file mode 100644
index 000000000..bf13f68e7
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ftos2/uninstall.cmd
@@ -0,0 +1,34 @@
+/* */
+call RxFuncAdd "SysLoadFuncs", "RexxUtil", "SysLoadFuncs"
+call SysLoadFuncs
+
+
+say "This utility will remove the FreeType/2 font driver and install "
+say "the original TRUETYPE.DLL if it exists. If you do not wish to"
+say "continue, please just press ENTER. Otherwise please type ""y"""
+
+pull letter
+if letter <> "Y" then exit
+
+/* Find drive where OS/2 is installed */
+bootdrive = SysSearchPath('PATH', 'OS2.INI')
+bootdrive = left(bootdrive, 1)
+
+app = "PM_Font_Drivers"
+key = "TRUETYPE"
+
+/* look for TRUETYPE.DLL */
+rc = SysFileTree(left(bootdrive,1) || ":\OS2\DLL\TRUETYPE.DLL", "file", "F")
+
+if file.0 = 1 then do
+ say "Restoring TRUETYPE.DLL..."
+ val = "\OS2\DLL\TRUETYPE.DLL" || d2c(0)
+ SysIni('BOTH', app, key, val)
+end
+else do
+ say "Uninstalling FREETYPE.DLL..."
+ SysIni('BOTH', app, key, "DELETE:")
+end
+
+say "FTIFI is uninstalled. Please reboot."
+pause
diff --git a/xc/extras/FreeType/contrib/mac/mac.hqx b/xc/extras/FreeType/contrib/mac/mac.hqx
new file mode 100644
index 000000000..cd33ac5ff
--- /dev/null
+++ b/xc/extras/FreeType/contrib/mac/mac.hqx
Binary files differ
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/Makefile.in b/xc/extras/FreeType/contrib/ttf2bdf/Makefile.in
new file mode 100644
index 000000000..7902828e3
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/Makefile.in
@@ -0,0 +1,74 @@
+#
+# $Id: Makefile.in,v 1.1.1.1 1999/12/05 01:23:18 daryll Exp $
+#
+
+#
+# Copyright 1996, 1997, 1998 Computing Research Labs, New Mexico State
+# University
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+# THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+RM = @RM@
+
+CC = @CC@
+CFLAGS = @XX_CFLAGS@ @CFLAGS@
+
+SRCS = remap.c ttf2bdf.c
+OBJS = remap.o ttf2bdf.o
+
+#
+# Point these at the FreeType source directories.
+#
+INCS = @CPPFLAGS@
+LIBS = @LIBS@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+mandir = @mandir@
+
+all: ttf2bdf
+
+ttf2bdf: $(OBJS)
+ $(PURIFY) $(CC) $(STATIC) $(CFLAGS) -o ttf2bdf $(OBJS) $(LIBS)
+
+clean:
+ $(RM) -f *.o *BAK *CKP *~ a.out core
+
+realclean: clean
+ $(RM) -f ttf2bdf
+
+distclean: clean
+ $(RM) -f ttf2bdf config.* Makefile
+
+.c.o:
+ $(CC) $(CFLAGS) $(INCS) -c $< -o $@
+
+install: ttf2bdf
+ @if [ ! -d $(bindir) ] ; then \
+ mkdir $(bindir); fi
+ @cp ttf2bdf $(bindir)/ttf2bdf
+ @cp ttf2bdf.man $(mandir)/man1/ttf2bdf.1
+
+uninstall:
+ @$(RM) -f $(bindir)/ttf2bdf
+ @$(RM) -f $(mandir)/man1/ttf2bdf.1
+
+# end of Makefile
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/README b/xc/extras/FreeType/contrib/ttf2bdf/README
new file mode 100644
index 000000000..2dc631c5e
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/README
@@ -0,0 +1,266 @@
+#
+# $Id: README,v 1.1.1.1 1999/12/05 01:23:18 daryll Exp $
+#
+
+#
+# Copyright 1996, 1997, 1998 Computing Research Labs, New Mexico State
+# University
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+# THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+This is version 2.2 of a program to convert TrueType fonts to BDF fonts using
+the FreeType renderer.
+
+BDF fonts can be edited using the XmBDFEditor which is available from (replace
+the <version> with the most current version number):
+
+ [Sources]
+ ftp://crl.nmsu.edu/CLR/multiling/General/xmbdfed.tar.gz
+
+ [Binaries: Linux/Pentium, Solaris, SunOS]
+ ftp://crl.nmsu.edu/CLR/multiling/General/xmbdfed-<version>-ELF.tar.gz
+ ftp://crl.nmsu.edu/CLR/multiling/General/xmbdfed-<version>-SOLARIS.tar.gz
+ ftp://crl.nmsu.edu/CLR/multiling/General/xmbdfed-<version>-SUNOS.tar.gz
+
+COMPILING ttf2bdf
+-----------------
+
+1. Pick up the latest FreeType distribution from:
+
+ftp://ftp.physiol.med.tu-muenchen.de/pub/freetype/devel/freetype-current.tar.gz
+
+2. Unpack FreeType and build it.
+
+3. Go into the "contrib/ttf2bdf/" directory and type "make" to build "ttf2bdf".
+
+RUNNING ttf2bdf
+---------------
+
+Type the following to get a list of command line options:
+
+ % ttf2bdf -h
+
+ACKNOWLEDGEMENTS
+----------------
+
+Thanks go to the following people:
+
+ Robert Wilhelm <robert@physiol.med.tu-muenchen.de> for pointing out a
+ crucial problem with the pre-1.0 code.
+
+ Lho Li-Da <ollie@ms1.hinet.net> for pointing out a problem with Big5 and
+ GB2312 encoding ids being documented incorrectly in the TT docs and a
+ problem with glyphs that are height 1 or width 1, and a font name problem.
+
+ Adrian Havill <havill@threeweb.ad.jp> for unintentionally pointing out a
+ missing feature.
+
+ Richard Verhoeven <rcb5@win.tue.nl> for pointing out a font names problem,
+ problem with bitmaps missing their last byte in each row, and an invalid
+ FONT_DESCENT property value.
+
+ Choi Jun Ho <junker@jazz.snu.ac.kr> for his inspiration from his
+ implementation that changed some character set names, and added a
+ number of new command line parameters.
+
+ Pavel Kankovsky <peak@kerberos.troja.mff.cuni.cz> for providing some
+ critical grid fitting and metrics fixes when generating the bitmaps,
+ adding the code to "auto-detect" bold and italic fonts, removing the
+ dependency on ttobjs.h, finding some remapping bugs, and other fixes.
+
+ Matti Koskinen <mjkoskin@sci.fi> for pointing out a problem with using
+ the code 0xffff.
+
+ Eugene Bobin <gene@ftim.ustu.ru> for contributing the Cyrillic mapping
+ tables (iso8859.5, koi8.r, windows.1251) and the sample shell scripts for
+ generating sets of BDF fonts.
+
+ Oleg N. Yakovlev <yashka@optima.dnepropetrovsk.ua> for alerting me to the
+ problem of certain codes not being loaded correctly in the mapping tables.
+
+ Bertrand Petit <elrond@phoe.frmug.org> for providing additional command line
+ parameters to allow more control over the XLFD name generated.
+
+ Roman Czyborra <czyborra@cs.tu-berlin.de> for pointing out the need for a
+ change from UNICODE-2.0 to ISO10646-1 in the font XLFD name.
+
+CHANGES
+-------
+Version 2.2
+===========
+ 1. Added missing documentation in the manual page.
+
+ 2. Added the `-u' parameter to allow setting the character used to replace
+ dashes or spaces in the font name.
+
+ 3. Changed the CHARSET_REGISTRY and CHARSET_ENCODING to be "ISO10646-1"
+ instead of "Unicode-2.0".
+
+ 4. The numGlyphs property comes back incorrect for some fonts, so the loop
+ cycles through all 65536 possibilities every time now.
+
+Version 2.1
+===========
+ 1. Added patches provided by Bertrand Petit.
+
+ 2. Insured compatibility with FreeType 1.1.
+
+Version 2.0
+===========
+ 1. Created two new subdirectories. One for mapping tables and one for any
+ other contributed code, scripts, or data.
+
+ 2. Updated Cyrillic mapping files sent by Eugene Bobin.
+
+ 3. Minor fixes to make compatible with the latest version of FreeType.
+
+Version 1.9
+===========
+ 1. Fixed a problem with the first code of a mapping table being lost.
+
+Version 1.8
+===========
+ 1. Added the Unicode->Cyrillic mapping tables provided by Eugene Bobin.
+
+ 2. Created a shell script based on Eugene Bobin's scripts to generate sets
+ of BDF fonts at one time.
+
+Version 1.7
+===========
+ 1. If a remapping table is provided, code ranges are now expected to be
+ specified in terms of the codes in the mapping table.
+
+ 2. The glyph generation loop is improved a bit.
+
+Version 1.6
+===========
+ 1. Added two expected keywords REGISTRY and ENCODING in the remap files.
+ These values are used when the font's XLFD name is generated.
+
+ 2. Added TTF2BDF_VERSION macro used for adding the "Converted by" comment.
+
+ 3. Handle the case of no glyphs being generated. No BDF font is produced.
+
+ 4. Updated for new API with TT_Engine.
+
+Version 1.5
+===========
+ 1. Fixed a problem with updating the average width field of the XLFD
+ font name.
+
+ 2. Changed things so bitmaps are generated to a temporay file so an
+ accurate count and metrics can be calculated.
+
+ 3. Changed things so the font header is not generated until the bitmaps
+ have been generated. This allows accurate calculations of the various
+ fields needed.
+
+ 4. Added the '-l' command line parameter that allows specification of a
+ subrange of glyphs to generate. The syntax is the same as that used in
+ X11 for subranges. See the X11 XLFD documentation, page 9 for more
+ detail.
+
+ Example:
+
+ % ttf2bdf -l '60 70 80_90' font.ttf -o font.bdf
+
+ The command above will only generate the glyphs for codes 60, 70,
+ and 80 through 90 inclusive.
+
+ 5. Added the ability to load a mapping table that will remap a font to
+ another character set. The mapping table should have two columns.
+
+ The first column should be the hexadecimal code of the glyph in the
+ "cmap" table ttf2bdf is using. The second column should have the
+ code which should be used in the BDF font. An example mapping file
+ is provided which will map fonts from Unicode (default cmap table) to
+ ISO8859-2.
+
+ 6. Fixed grid fitting to avoid dropout in some cases.
+
+ 7. Removed dependency on ttobjs.h by using the new API function for
+ retrieving strings.
+
+ 8. Removed warning about getpid() on Solaris.
+
+ 9. Rearranged the man page a bit to be more useful. Minor
+ improvements also done.
+
+ 10. Changed the loop so it does not include 0xffff as a code because
+ it causes crashes when converting some fonts.
+
+Version 1.4 [Never released as binaries]
+===========
+ 1. Changed the names of two MS encodings (Wansung and Johab) to
+ KSC5601.1987 and KSC5601.1992.
+
+ 2. Added the '-n' command line flag to turn hinting off.
+
+ 3. Added the '-c' command line flag to set the font spacing.
+
+ 4. Added the '-t', '-w', and '-s' command line options to override the
+ default typeface, weight and slant names.
+
+Version 1.3
+===========
+ 1. Converted to use the new FreeType API.
+
+ 2. Added the '-rh' and '-rv' command line parameters to allow both the
+ horizontal and vertical resolutions to be set individually.
+
+ 3. Fixed a problem with ignoring undefined glyphs. All undefined were
+ being rendered which caused missing glyphs on the end.
+
+ 4. Fixed a problem with offset calculations needed to render glyph
+ bitmaps.
+
+Version 1.2
+===========
+ 1. Fixed a problem with dashes that appear in the font family name causing
+ parse problems with the XLFD font names.
+
+ 2. Fixed a problem with certain bitmaps missing their final byte on each
+ row.
+
+ 3. Fixed an incorrect FONT_DESCENT value.
+
+ 4. Changed things around so names can be retrieved in a more general way.
+
+ 5. Fixed a problem with bitmaps not being generated after a certain point.
+
+Version 1.1
+===========
+ 1. Fixed the actual glyph count for the CHARS line.
+
+ 2. Swapped the Big5 and GB2312 XLFD encoding strings because of incorrect TT
+ specifications.
+
+ 3. Fixed a problem with bitmap generation for glyphs that are width 1 or
+ height 1.
+
+ 4. Added command line parameters to set the font and render pool memory
+ sizes in Kilobytes from the command line.
+
+Version 1.0
+===========
+ 1. Initial release.
+
+mleisher@crl.nmsu.edu (Mark Leisher)
+15 October 1997
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/configure b/xc/extras/FreeType/contrib/ttf2bdf/configure
new file mode 100755
index 000000000..720dab829
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/configure
@@ -0,0 +1,1280 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # 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 << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.12"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=../../lib/freetype.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:526: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:555: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ ac_prog_rejected=no
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:603: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 613 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:637: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:642: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:651: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:666: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+
+OLDLIBS=$LIBS
+LIBS="$LIBS -L../../lib/.libs"
+CPPFLAGS="$CPPFLAGS -I../../lib"
+echo $ac_n "checking for TT_Init_FreeType in -lttf""... $ac_c" 1>&6
+echo "configure:698: checking for TT_Init_FreeType in -lttf" >&5
+ac_lib_var=`echo ttf'_'TT_Init_FreeType | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lttf $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 706 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char TT_Init_FreeType();
+
+int main() {
+TT_Init_FreeType()
+; return 0; }
+EOF
+if { (eval echo configure:717: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -lttf"
+else
+ echo "$ac_t""no" 1>&6
+
+ { echo "configure: error: Can't find ttf library! Compile FreeType first." 1>&2; exit 1; }
+fi
+
+
+
+
+if test "x$CC" = xgcc; then
+ XX_CFLAGS="-Wall -pedantic"
+else
+ case "$host" in
+ alpha-dec-osf*)
+ XX_CFLAGS="-std1 -O2 -g3"
+ ;;
+ *)
+ XX_CFLAGS=
+ ;;
+ esac
+fi
+
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:759: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RM"; then
+ ac_cv_prog_RM="$RM" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RM="rm"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RM="$ac_cv_prog_RM"
+if test -n "$RM"; then
+ echo "$ac_t""$RM" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:786: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 801 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:807: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 818 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:824: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:847: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 852 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:860: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ ac_cv_header_stdc=yes
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 877 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 895 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ rm -rf conftest*
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+ :
+else
+ cat > conftest.$ac_ext <<EOF
+#line 916 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:927: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ :
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+ cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:954: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 959 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:964: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+done
+
+
+echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
+echo "configure:992: checking for 8-bit clean memcmp" >&5
+if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_memcmp_clean=no
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1000 "configure"
+#include "confdefs.h"
+
+main()
+{
+ char c0 = 0x40, c1 = 0x80, c2 = 0x81;
+ exit(memcmp(&c0, &c2, 1) < 0 && memcmp(&c1, &c2, 1) < 0 ? 0 : 1);
+}
+
+EOF
+if { (eval echo configure:1010: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+ ac_cv_func_memcmp_clean=yes
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -fr conftest*
+ ac_cv_func_memcmp_clean=no
+fi
+rm -fr conftest*
+fi
+
+fi
+
+echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6
+test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.o"
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "Makefile" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CC@%$CC%g
+s%@XX_CFLAGS@%$XX_CFLAGS%g
+s%@RM@%$RM%g
+s%@CPP@%$CPP%g
+s%@LIBOBJS@%$LIBOBJS%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/configure.in b/xc/extras/FreeType/contrib/ttf2bdf/configure.in
new file mode 100644
index 000000000..49a5a5b7f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/configure.in
@@ -0,0 +1,40 @@
+dnl $Id: configure.in,v 1.1.1.1 1999/12/05 01:23:19 daryll Exp $
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(../../lib/freetype.h)
+
+AC_PROG_CC
+
+OLDLIBS=$LIBS
+LIBS="$LIBS -L../../lib/.libs"
+CPPFLAGS="$CPPFLAGS -I../../lib"
+AC_CHECK_LIB(ttf, TT_Init_FreeType, LIBS="$LIBS -lttf",[
+ AC_MSG_ERROR([Can't find ttf library! Compile FreeType first.])])
+AC_SUBST(LIBS)
+
+dnl get Compiler flags right.
+
+if test "x$CC" = xgcc; then
+ XX_CFLAGS="-Wall -pedantic"
+else
+ case "$host" in
+ alpha-dec-osf*)
+ XX_CFLAGS="-std1 -O2 -g3"
+ ;;
+ *)
+ XX_CFLAGS=
+ ;;
+ esac
+fi
+AC_SUBST(XX_CFLAGS)
+
+AC_CHECK_PROG(RM, rm, rm)
+
+dnl Checks for header files.
+AC_HEADER_STDC
+AC_CHECK_HEADERS(unistd.h)
+
+dnl Checks for library functions.
+AC_FUNC_MEMCMP
+
+AC_OUTPUT(Makefile)
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/contrib/KOI2iso_pcf b/xc/extras/FreeType/contrib/ttf2bdf/contrib/KOI2iso_pcf
new file mode 100755
index 000000000..b88caa761
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/contrib/KOI2iso_pcf
@@ -0,0 +1,28 @@
+#!/usr/local/bin/perl
+#
+# hack a XFLD info - alias all fonts, declared as koi8*, to iso8859-1
+#
+# usage:
+# cd fontdir; ../ISO2koi < fonts.dir >> fonts.alias
+#
+# 1996/08/29 - vsv
+#
+while (<>) {
+ chop;
+ ($z, $koi8) = split /[ \t]+/;
+ $iso = $koi8;
+ $iso =~ s/-koi8r-1/-iso8859-1/g;
+ $iso =~ s/-koi8-1/-iso8859-1/g;
+ $iso =~ s/-koi8-r/-iso8859-1/g;
+ $iso =~ s/-cronyx-/-adobe-/g;
+ $iso =~ s/-cronix-/-adobe-/g;
+ ## $iso =~ s/-cronix-/-hack-/g;
+ ## $iso =~ s/-cronyx-/-hack-/g;
+ # Elvis+ fonts...
+ ## $iso =~ s/-adobe-/-hack-/g;
+ ## $iso =~ s/-dec-/-hack-/g;
+ next if ("$iso" !~ /-iso8859-/);
+ @z = split (/-/, $iso);
+ # no matter, 10 or 12, must be more then 3-4 ;)
+ printf ("\"%s\"\t\"%s\"\n", $iso, $koi8) if (@z > 10);
+}
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/contrib/create_type b/xc/extras/FreeType/contrib/ttf2bdf/contrib/create_type
new file mode 100755
index 000000000..4dc27c71b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/contrib/create_type
@@ -0,0 +1,60 @@
+#!/bin/csh
+# -*- mode:SH; -*-
+#
+# This script creates series of bdf files from TTF file.
+#
+#
+# Please set up parameters
+#
+# Font dpi:
+set DPI=96
+
+#
+# TrueType files dir.
+set ttf_dir=~/ttf
+
+# TTF files, please specify only base name
+# Script will try to use BolD, Italic and BoldItalic versions of face
+set FACES="ARIAL ARIBLK ARIALN TAHOMA TIMES VERDANA"
+
+
+# Output codepage
+# koi8.r
+# windows.1251
+# iso8859.5
+# iso8859.2
+set LANG_ID=koi8.r
+
+foreach x ( 7 8 9 10 11 12 14 16 18 20 24 30 50 100 150)
+foreach z ( $FACES )
+set y = ${ttf_dir}/${z}
+#
+# Simple face
+ if( -e ${y}.TTF ) then
+ echo ${y} at ${x}pt
+ ./ttf2bdf -m $LANG_ID -p $x -r $DPI ${y}.TTF | bdftopcf | compress > ${DPI}dpi/${z}${x}.pcf.Z
+ endif
+#
+# Bold face
+ if( -e ${y}BD.TTF ) then
+ echo Bold ${y} at ${x}pt
+ ./ttf2bdf -m $LANG_ID -p $x -r $DPI -w bold ${y}BD.TTF | bdftopcf | compress > ${DPI}dpi/${z}bd${x}.pcf.Z
+ endif
+#
+# Italic face
+ if( -e ${y}I.TTF ) then
+ echo Italic ${y} at ${x}pt
+ ./ttf2bdf -m $LANG_ID -p $x -r $DPI -s o ${y}I.TTF | bdftopcf | compress >${DPI}dpi/${z}i${x}.pcf.Z
+ endif
+#
+# Bold Italic face
+ if( -e ${y}BI.TTF ) then
+ echo Bold Italic ${y} at ${x}pt
+ ./ttf2bdf -m $LANG_ID -p $x -r $DPI -w bold -s o ${y}BI.TTF | bdftopcf | compress > ${DPI}dpi/${z}bi${x}.pcf.Z
+ endif
+end
+end
+
+echo Creating fonts directory...
+cd ${DPI}dpi
+mkfontdir
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/contrib/create_type_m b/xc/extras/FreeType/contrib/ttf2bdf/contrib/create_type_m
new file mode 100755
index 000000000..da9d6a1a1
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/contrib/create_type_m
@@ -0,0 +1,59 @@
+#!/bin/csh
+# -*- mode:SH; -*-
+#
+# This script creates series of bdf files from TTF file.
+#
+#
+# Please set up parameters
+#
+# Font dpi:
+set DPI=96
+
+#
+# TrueType files dir.
+set ttf_dir=~/ttf
+
+# TTF files, please specify only base name
+# Script will try to use BolD, Italic and BoldItalic versions of face
+set FACES="COUR MONOTYPE"
+
+# Output codepage
+# koi8.r
+# windows.1251
+# iso8859.5
+# iso8859.2
+set LANG_ID=koi8.r
+
+foreach x ( 7 8 9 10 11 12 14 16 18 20 24 30 50 100 150)
+foreach z ( $FACES )
+set y = ${ttf_dir}/${z}
+#
+# Simple face
+ if( -e ${y}.TTF ) then
+ echo ${z} at ${x}pt
+ ./ttf2bdf -c m -m $LANG_ID -p $x -r $DPI ${y}.TTF | bdftopcf | compress > ${DPI}dpi/${z}${x}.pcf.Z
+ endif
+#
+# Bold face
+ if( -e ${y}BD.TTF ) then
+ echo Bold ${z} at ${x}pt
+ ./ttf2bdf -c m -m $LANG_ID -p $x -r $DPI -w bold ${y}BD.TTF | bdftopcf | compress > ${DPI}dpi/${z}bd${x}.pcf.Z
+ endif
+#
+# Italic face
+ if( -e ${y}I.TTF ) then
+ echo Italic ${z} at ${x}pt
+ ./ttf2bdf -c m -m $LANG_ID -p $x -r $DPI -s o ${y}I.TTF | bdftopcf | compress >${DPI}dpi/${z}i${x}.pcf.Z
+ endif
+#
+# Bold Italic face
+ if( -e ${y}BI.TTF ) then
+ echo Bold Italic ${z} at ${x}pt
+ ./ttf2bdf -c m -m $LANG_ID -p $x -r $DPI -w bold -s o ${y}BI.TTF | bdftopcf | compress > ${DPI}dpi/${z}bi${x}.pcf.Z
+ endif
+end
+end
+
+#echo Creating fonts directory...
+#cd ${DPI}dpi
+#mkfontdir
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.2 b/xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.2
new file mode 100644
index 000000000..4e2dbb603
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.2
@@ -0,0 +1,241 @@
+#
+# SAMPLE TTF2BDF MAPPING TABLE
+#
+# Mapping table from Unicode to ISO8859-2. Names are from the Unicode
+# Character Database on ftp.unicode.org.
+#
+# Two keywords are used to specify the character set registry and encoding:
+# REGISTRY and ENCODING. These will be used when creating the XLFD name
+# for the font.
+#
+# Column 1 is the Unicode value, and column 2 is the ISO8859-2 value. The
+# columns can be separated by tabs or whitespace, and only the first two
+# columns are used.
+#
+# Empty lines and lines starting with '#' are ignored.
+#
+REGISTRY ISO8859
+ENCODING 2
+0x0000 0x00 # <control>
+0x0001 0x01 # <control>
+0x0002 0x02 # <control>
+0x0003 0x03 # <control>
+0x0004 0x04 # <control>
+0x0005 0x05 # <control>
+0x0006 0x06 # <control>
+0x0007 0x07 # <control>
+0x0008 0x08 # <control>
+0x0009 0x09 # <control>
+0x000A 0x0A # <control>
+0x000B 0x0B # <control>
+0x000C 0x0C # <control>
+0x000D 0x0D # <control>
+0x000E 0x0E # <control>
+0x000F 0x0F # <control>
+0x0010 0x10 # <control>
+0x0011 0x11 # <control>
+0x0012 0x12 # <control>
+0x0013 0x13 # <control>
+0x0014 0x14 # <control>
+0x0015 0x15 # <control>
+0x0016 0x16 # <control>
+0x0017 0x17 # <control>
+0x0018 0x18 # <control>
+0x0019 0x19 # <control>
+0x001A 0x1A # <control>
+0x001B 0x1B # <control>
+0x001C 0x1C # <control>
+0x001D 0x1D # <control>
+0x001E 0x1E # <control>
+0x001F 0x1F # <control>
+0x0020 0x20 # SPACE
+0x0021 0x21 # EXCLAMATION MARK
+0x0022 0x22 # QUOTATION MARK
+0x0023 0x23 # NUMBER SIGN
+0x0024 0x24 # DOLLAR SIGN
+0x0025 0x25 # PERCENT SIGN
+0x0026 0x26 # AMPERSAND
+0x0027 0x27 # APOSTROPHE
+0x0028 0x28 # LEFT PARENTHESIS
+0x0029 0x29 # RIGHT PARENTHESIS
+0x002A 0x2A # ASTERISK
+0x002B 0x2B # PLUS SIGN
+0x002C 0x2C # COMMA
+0x002D 0x2D # HYPHEN-MINUS
+0x002E 0x2E # FULL STOP
+0x002F 0x2F # SOLIDUS
+0x0030 0x30 # DIGIT ZERO
+0x0031 0x31 # DIGIT ONE
+0x0032 0x32 # DIGIT TWO
+0x0033 0x33 # DIGIT THREE
+0x0034 0x34 # DIGIT FOUR
+0x0035 0x35 # DIGIT FIVE
+0x0036 0x36 # DIGIT SIX
+0x0037 0x37 # DIGIT SEVEN
+0x0038 0x38 # DIGIT EIGHT
+0x0039 0x39 # DIGIT NINE
+0x003A 0x3A # COLON
+0x003B 0x3B # SEMICOLON
+0x003C 0x3C # LESS-THAN SIGN
+0x003D 0x3D # EQUALS SIGN
+0x003E 0x3E # GREATER-THAN SIGN
+0x003F 0x3F # QUESTION MARK
+0x0040 0x40 # COMMERCIAL AT
+0x0041 0x41 # LATIN CAPITAL LETTER A
+0x0042 0x42 # LATIN CAPITAL LETTER B
+0x0043 0x43 # LATIN CAPITAL LETTER C
+0x0044 0x44 # LATIN CAPITAL LETTER D
+0x0045 0x45 # LATIN CAPITAL LETTER E
+0x0046 0x46 # LATIN CAPITAL LETTER F
+0x0047 0x47 # LATIN CAPITAL LETTER G
+0x0048 0x48 # LATIN CAPITAL LETTER H
+0x0049 0x49 # LATIN CAPITAL LETTER I
+0x004A 0x4A # LATIN CAPITAL LETTER J
+0x004B 0x4B # LATIN CAPITAL LETTER K
+0x004C 0x4C # LATIN CAPITAL LETTER L
+0x004D 0x4D # LATIN CAPITAL LETTER M
+0x004E 0x4E # LATIN CAPITAL LETTER N
+0x004F 0x4F # LATIN CAPITAL LETTER O
+0x0050 0x50 # LATIN CAPITAL LETTER P
+0x0051 0x51 # LATIN CAPITAL LETTER Q
+0x0052 0x52 # LATIN CAPITAL LETTER R
+0x0053 0x53 # LATIN CAPITAL LETTER S
+0x0054 0x54 # LATIN CAPITAL LETTER T
+0x0055 0x55 # LATIN CAPITAL LETTER U
+0x0056 0x56 # LATIN CAPITAL LETTER V
+0x0057 0x57 # LATIN CAPITAL LETTER W
+0x0058 0x58 # LATIN CAPITAL LETTER X
+0x0059 0x59 # LATIN CAPITAL LETTER Y
+0x005A 0x5A # LATIN CAPITAL LETTER Z
+0x005B 0x5B # LEFT SQUARE BRACKET
+0x005C 0x5C # REVERSE SOLIDUS
+0x005D 0x5D # RIGHT SQUARE BRACKET
+0x005E 0x5E # CIRCUMFLEX ACCENT
+0x005F 0x5F # LOW LINE
+0x0060 0x60 # GRAVE ACCENT
+0x0061 0x61 # LATIN SMALL LETTER A
+0x0062 0x62 # LATIN SMALL LETTER B
+0x0063 0x63 # LATIN SMALL LETTER C
+0x0064 0x64 # LATIN SMALL LETTER D
+0x0065 0x65 # LATIN SMALL LETTER E
+0x0066 0x66 # LATIN SMALL LETTER F
+0x0067 0x67 # LATIN SMALL LETTER G
+0x0068 0x68 # LATIN SMALL LETTER H
+0x0069 0x69 # LATIN SMALL LETTER I
+0x006A 0x6A # LATIN SMALL LETTER J
+0x006B 0x6B # LATIN SMALL LETTER K
+0x006C 0x6C # LATIN SMALL LETTER L
+0x006D 0x6D # LATIN SMALL LETTER M
+0x006E 0x6E # LATIN SMALL LETTER N
+0x006F 0x6F # LATIN SMALL LETTER O
+0x0070 0x70 # LATIN SMALL LETTER P
+0x0071 0x71 # LATIN SMALL LETTER Q
+0x0072 0x72 # LATIN SMALL LETTER R
+0x0073 0x73 # LATIN SMALL LETTER S
+0x0074 0x74 # LATIN SMALL LETTER T
+0x0075 0x75 # LATIN SMALL LETTER U
+0x0076 0x76 # LATIN SMALL LETTER V
+0x0077 0x77 # LATIN SMALL LETTER W
+0x0078 0x78 # LATIN SMALL LETTER X
+0x0079 0x79 # LATIN SMALL LETTER Y
+0x007A 0x7A # LATIN SMALL LETTER Z
+0x007B 0x7B # LEFT CURLY BRACKET
+0x007C 0x7C # VERTICAL LINE
+0x007D 0x7D # RIGHT CURLY BRACKET
+0x007E 0x7E # TILDE
+0x00A0 0xA0 # NO-BREAK SPACE
+0x0104 0xA1 # LATIN CAPITAL LETTER A WITH OGONEK
+0x02D8 0xA2 # BREVE
+0x0141 0xA3 # LATIN CAPITAL LETTER L WITH STROKE
+0x00A4 0xA4 # CURRENCY SIGN
+0x013D 0xA5 # LATIN CAPITAL LETTER L WITH CARON
+0x015A 0xA6 # LATIN CAPITAL LETTER S WITH ACUTE
+0x00A7 0xA7 # SECTION SIGN
+0x00A8 0xA8 # DIAERESIS
+0x0160 0xA9 # LATIN CAPITAL LETTER S WITH CARON
+0x015E 0xAA # LATIN CAPITAL LETTER S WITH CEDILLA
+0x0164 0xAB # LATIN CAPITAL LETTER T WITH CARON
+0x0179 0xAC # LATIN CAPITAL LETTER Z WITH ACUTE
+0x00AD 0xAD # SOFT HYPHEN
+0x017D 0xAE # LATIN CAPITAL LETTER Z WITH CARON
+0x017B 0xAF # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0x00B0 0xB0 # DEGREE SIGN
+0x0105 0xB1 # LATIN SMALL LETTER A WITH OGONEK
+0x02DB 0xB2 # OGONEK
+0x0142 0xB3 # LATIN SMALL LETTER L WITH STROKE
+0x00B4 0xB4 # ACUTE ACCENT
+0x013E 0xB5 # LATIN SMALL LETTER L WITH CARON
+0x015B 0xB6 # LATIN SMALL LETTER S WITH ACUTE
+0x02C7 0xB7 # CARON
+0x00B8 0xB8 # CEDILLA
+0x0161 0xB9 # LATIN SMALL LETTER S WITH CARON
+0x015F 0xBA # LATIN SMALL LETTER S WITH CEDILLA
+0x0165 0xBB # LATIN SMALL LETTER T WITH CARON
+0x017A 0xBC # LATIN SMALL LETTER Z WITH ACUTE
+0x02DD 0xBD # DOUBLE ACUTE ACCENT
+0x017E 0xBE # LATIN SMALL LETTER Z WITH CARON
+0x017C 0xBF # LATIN SMALL LETTER Z WITH DOT ABOVE
+0x0154 0xC0 # LATIN CAPITAL LETTER R WITH ACUTE
+0x00C1 0xC1 # LATIN CAPITAL LETTER A WITH ACUTE
+0x00C2 0xC2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0x0102 0xC3 # LATIN CAPITAL LETTER A WITH BREVE
+0x00C4 0xC4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x0139 0xC5 # LATIN CAPITAL LETTER L WITH ACUTE
+0x0106 0xC6 # LATIN CAPITAL LETTER C WITH ACUTE
+0x00C7 0xC7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x010C 0xC8 # LATIN CAPITAL LETTER C WITH CARON
+0x00C9 0xC9 # LATIN CAPITAL LETTER E WITH ACUTE
+0x0118 0xCA # LATIN CAPITAL LETTER E WITH OGONEK
+0x00CB 0xCB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0x011A 0xCC # LATIN CAPITAL LETTER E WITH CARON
+0x00CD 0xCD # LATIN CAPITAL LETTER I WITH ACUTE
+0x00CE 0xCE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0x010E 0xCF # LATIN CAPITAL LETTER D WITH CARON
+0x0110 0xD0 # LATIN CAPITAL LETTER D WITH STROKE
+0x0143 0xD1 # LATIN CAPITAL LETTER N WITH ACUTE
+0x0147 0xD2 # LATIN CAPITAL LETTER N WITH CARON
+0x00D3 0xD3 # LATIN CAPITAL LETTER O WITH ACUTE
+0x00D4 0xD4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0x0150 0xD5 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0x00D6 0xD6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x00D7 0xD7 # MULTIPLICATION SIGN
+0x0158 0xD8 # LATIN CAPITAL LETTER R WITH CARON
+0x016E 0xD9 # LATIN CAPITAL LETTER U WITH RING ABOVE
+0x00DA 0xDA # LATIN CAPITAL LETTER U WITH ACUTE
+0x0170 0xDB # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0x00DC 0xDC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x00DD 0xDD # LATIN CAPITAL LETTER Y WITH ACUTE
+0x0162 0xDE # LATIN CAPITAL LETTER T WITH CEDILLA
+0x00DF 0xDF # LATIN SMALL LETTER SHARP S
+0x0155 0xE0 # LATIN SMALL LETTER R WITH ACUTE
+0x00E1 0xE1 # LATIN SMALL LETTER A WITH ACUTE
+0x00E2 0xE2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x0103 0xE3 # LATIN SMALL LETTER A WITH BREVE
+0x00E4 0xE4 # LATIN SMALL LETTER A WITH DIAERESIS
+0x013A 0xE5 # LATIN SMALL LETTER L WITH ACUTE
+0x0107 0xE6 # LATIN SMALL LETTER C WITH ACUTE
+0x00E7 0xE7 # LATIN SMALL LETTER C WITH CEDILLA
+0x010D 0xE8 # LATIN SMALL LETTER C WITH CARON
+0x00E9 0xE9 # LATIN SMALL LETTER E WITH ACUTE
+0x0119 0xEA # LATIN SMALL LETTER E WITH OGONEK
+0x00EB 0xEB # LATIN SMALL LETTER E WITH DIAERESIS
+0x011B 0xEC # LATIN SMALL LETTER E WITH CARON
+0x00ED 0xED # LATIN SMALL LETTER I WITH ACUTE
+0x00EE 0xEE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x010F 0xEF # LATIN SMALL LETTER D WITH CARON
+0x0111 0xF0 # LATIN SMALL LETTER D WITH STROKE
+0x0144 0xF1 # LATIN SMALL LETTER N WITH ACUTE
+0x0148 0xF2 # LATIN SMALL LETTER N WITH CARON
+0x00F3 0xF3 # LATIN SMALL LETTER O WITH ACUTE
+0x00F4 0xF4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x0151 0xF5 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0x00F6 0xF6 # LATIN SMALL LETTER O WITH DIAERESIS
+0x00F7 0xF7 # DIVISION SIGN
+0x0159 0xF8 # LATIN SMALL LETTER R WITH CARON
+0x016F 0xF9 # LATIN SMALL LETTER U WITH RING ABOVE
+0x00FA 0xFA # LATIN SMALL LETTER U WITH ACUTE
+0x0171 0xFB # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0x00FC 0xFC # LATIN SMALL LETTER U WITH DIAERESIS
+0x00FD 0xFD # LATIN SMALL LETTER Y WITH ACUTE
+0x0163 0xFE # LATIN SMALL LETTER T WITH CEDILLA
+0x02D9 0xFF # DOT ABOVE
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.5 b/xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.5
new file mode 100644
index 000000000..477c09024
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/maps/iso8859.5
@@ -0,0 +1,202 @@
+#/*
+# * Unicode 2.0 -> iso8859-5
+# *
+# * 04 Jan 98 | Eugene Bobin, <gene@ftim.ustu.ru>
+# *
+# */
+REGISTRY iso8859
+ENCODING 5
+0x001F 0x001F #
+0x0020 0x0020 #
+0x0021 0x0021 #
+0x0022 0x0022 #
+0x0023 0x0023 #
+0x0024 0x0024 #
+0x0025 0x0025 #
+0x0026 0x0026 #
+0x0027 0x0027 #
+0x0028 0x0028 #
+0x0029 0x0029 #
+0x002A 0x002A #
+0x002B 0x002B #
+0x002C 0x002C #
+0x002D 0x002D #
+0x002E 0x002E #
+0x002F 0x002F #
+0x0030 0x0030 #
+0x0031 0x0031 #
+0x0032 0x0032 #
+0x0033 0x0033 #
+0x0034 0x0034 #
+0x0035 0x0035 #
+0x0036 0x0036 #
+0x0037 0x0037 #
+0x0038 0x0038 #
+0x0039 0x0039 #
+0x003A 0x003A #
+0x003B 0x003B #
+0x003C 0x003C #
+0x003D 0x003D #
+0x003E 0x003E #
+0x003F 0x003F #
+0x0040 0x0040 #
+0x0041 0x0041 #
+0x0042 0x0042 #
+0x0043 0x0043 #
+0x0044 0x0044 #
+0x0045 0x0045 #
+0x0046 0x0046 #
+0x0047 0x0047 #
+0x0048 0x0048 #
+0x0049 0x0049 #
+0x004A 0x004A #
+0x004B 0x004B #
+0x004C 0x004C #
+0x004D 0x004D #
+0x004E 0x004E #
+0x004F 0x004F #
+0x0050 0x0050 #
+0x0051 0x0051 #
+0x0052 0x0052 #
+0x0053 0x0053 #
+0x0054 0x0054 #
+0x0055 0x0055 #
+0x0056 0x0056 #
+0x0057 0x0057 #
+0x0058 0x0058 #
+0x0059 0x0059 #
+0x005A 0x005A #
+0x005B 0x005B #
+0x005C 0x005C #
+0x005D 0x005D #
+0x005E 0x005E #
+0x005F 0x005F #
+0x0060 0x0060 #
+0x0061 0x0061 #
+0x0062 0x0062 #
+0x0063 0x0063 #
+0x0064 0x0064 #
+0x0065 0x0065 #
+0x0066 0x0066 #
+0x0067 0x0067 #
+0x0068 0x0068 #
+0x0069 0x0069 #
+0x006A 0x006A #
+0x006B 0x006B #
+0x006C 0x006C #
+0x006D 0x006D #
+0x006E 0x006E #
+0x006F 0x006F #
+0x0070 0x0070 #
+0x0071 0x0071 #
+0x0072 0x0072 #
+0x0073 0x0073 #
+0x0074 0x0074 #
+0x0075 0x0075 #
+0x0076 0x0076 #
+0x0077 0x0077 #
+0x0078 0x0078 #
+0x0079 0x0079 #
+0x007A 0x007A #
+0x007B 0x007B #
+0x007C 0x007C #
+0x007D 0x007D #
+0x007E 0x007E #
+0x00A0 0x00A0 #
+0x00A2 0x00A2 #
+0x00A3 0x00A3 #
+0x0451 0x00F1 # /* £ */
+0x00A4 0x00A4 #
+0x00A5 0x00A5 #
+0x00A6 0x00A6 #
+0x00A7 0x00A7 #
+0x00A8 0x00A8 #
+0x00A9 0x00A9 #
+0x00AA 0x00AA #
+0x00AB 0x00AB #
+0x00AC 0x00AC #
+0x00AD 0x00AD #
+0x00AE 0x00AE #
+0x00AF 0x00AF #
+0x00F0 0x00F0 #
+0x00F2 0x00F2 #
+0x00F3 0x00F3 #
+0x0401 0x00A1 # /* ³ */
+0x00F4 0x00F4 #
+0x00F5 0x00F5 #
+0x00F6 0x00F6 #
+0x00F7 0x00F7 #
+0x00F8 0x00F8 #
+0x00F9 0x00F9 #
+0x00FA 0x00FA #
+0x00FB 0x00FB #
+0x00FC 0x00FC #
+0x00FD 0x00FD #
+0x00FE 0x00FE #
+0x00FF 0x00FF #
+
+0x044E 0x00EE # /* À */
+0x0430 0x00D0 # /* Á */
+0x0431 0x00D1 # /* Â */
+0x0446 0x00E6 # /* Ã */
+0x0434 0x00D4 # /* Ä */
+0x0435 0x00D5 # /* Å */
+0x0444 0x00E4 # /* Æ */
+0x0433 0x00D3 # /* Ç */
+0x0445 0x00E5 # /* È */
+0x0438 0x00D8 # /* É */
+0x0439 0x00D9 # /* Ê */
+0x043A 0x00DA # /* Ë */
+0x043B 0x00DB # /* Ì */
+0x043C 0x00DC # /* Í */
+0x043D 0x00DD # /* Î */
+0x043E 0x00DE # /* Ï */
+0x043F 0x00DF # /* Ð */
+0x044F 0x00EF # /* Ñ */
+0x0440 0x00E0 # /* Ò */
+0x0441 0x00E1 # /* Ó */
+0x0442 0x00E2 # /* Ô */
+0x0443 0x00E3 # /* Õ */
+0x0436 0x00D6 # /* Ö */
+0x0432 0x00D2 # /* × */
+0x044C 0x00EC # /* Ø */
+0x044B 0x00EB # /* Ù */
+0x0437 0x00D7 # /* Ú */
+0x0448 0x00E8 # /* Û */
+0x044D 0x00ED # /* Ü */
+0x0449 0x00E9 # /* Ý */
+0x0447 0x00E7 # /* Þ */
+0x044A 0x00EA # /* ß */
+
+0x042E 0x00CE # /* à */
+0x0410 0x00B0 # /* á */
+0x0411 0x00B1 # /* â */
+0x0426 0x00C6 # /* ã */
+0x0414 0x00B4 # /* ä */
+0x0415 0x00B5 # /* å */
+0x0424 0x00C4 # /* æ */
+0x0413 0x00B3 # /* ç */
+0x0425 0x00C5 # /* è */
+0x0418 0x00B8 # /* é */
+0x0419 0x00B9 # /* ê */
+0x041A 0x00BA # /* ë */
+0x041B 0x00BB # /* ì */
+0x041C 0x00BC # /* í */
+0x041D 0x00BD # /* î */
+0x041E 0x00BE # /* ï */
+0x041F 0x00BF # /* ð */
+0x042F 0x00CF # /* ñ */
+0x0420 0x00C0 # /* ò */
+0x0421 0x00C1 # /* ó */
+0x0422 0x00C2 # /* ô */
+0x0423 0x00C3 # /* õ */
+0x0416 0x00B6 # /* ö */
+0x0412 0x00B2 # /* ÷ */
+0x042C 0x00CC # /* ø */
+0x042B 0x00CB # /* ù */
+0x0417 0x00B7 # /* ú */
+0x0428 0x00C8 # /* û */
+0x042D 0x00CD # /* ü */
+0x0429 0x00C9 # /* ý */
+0x0427 0x00C7 # /* þ */
+0x042A 0x00CA # /* ÿ */
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/maps/koi8.r b/xc/extras/FreeType/contrib/ttf2bdf/maps/koi8.r
new file mode 100644
index 000000000..5de7d8068
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/maps/koi8.r
@@ -0,0 +1,203 @@
+#/*
+# * Unicode 2.0 -> KOI8-R
+# *
+# * 11 Jan 97 | Eugene Bobin, <gene@ftim.ustu.ru>
+# *
+# */
+REGISTRY koi8
+ENCODING r
+0x001F 0x001F #
+0x0020 0x0020 #
+0x0021 0x0021 #
+0x0022 0x0022 #
+0x0023 0x0023 #
+0x0024 0x0024 #
+0x0025 0x0025 #
+0x0026 0x0026 #
+0x0027 0x0027 #
+0x0028 0x0028 #
+0x0029 0x0029 #
+0x002A 0x002A #
+0x002B 0x002B #
+0x002C 0x002C #
+0x002D 0x002D #
+0x002E 0x002E #
+0x002F 0x002F #
+0x0030 0x0030 #
+0x0031 0x0031 #
+0x0032 0x0032 #
+0x0033 0x0033 #
+0x0034 0x0034 #
+0x0035 0x0035 #
+0x0036 0x0036 #
+0x0037 0x0037 #
+0x0038 0x0038 #
+0x0039 0x0039 #
+0x003A 0x003A #
+0x003B 0x003B #
+0x003C 0x003C #
+0x003D 0x003D #
+0x003E 0x003E #
+0x003F 0x003F #
+0x0040 0x0040 #
+0x0041 0x0041 #
+0x0042 0x0042 #
+0x0043 0x0043 #
+0x0044 0x0044 #
+0x0045 0x0045 #
+0x0046 0x0046 #
+0x0047 0x0047 #
+0x0048 0x0048 #
+0x0049 0x0049 #
+0x004A 0x004A #
+0x004B 0x004B #
+0x004C 0x004C #
+0x004D 0x004D #
+0x004E 0x004E #
+0x004F 0x004F #
+0x0050 0x0050 #
+0x0051 0x0051 #
+0x0052 0x0052 #
+0x0053 0x0053 #
+0x0054 0x0054 #
+0x0055 0x0055 #
+0x0056 0x0056 #
+0x0057 0x0057 #
+0x0058 0x0058 #
+0x0059 0x0059 #
+0x005A 0x005A #
+0x005B 0x005B #
+0x005C 0x005C #
+0x005D 0x005D #
+0x005E 0x005E #
+0x005F 0x005F #
+0x0060 0x0060 #
+0x0061 0x0061 #
+0x0062 0x0062 #
+0x0063 0x0063 #
+0x0064 0x0064 #
+0x0065 0x0065 #
+0x0066 0x0066 #
+0x0067 0x0067 #
+0x0068 0x0068 #
+0x0069 0x0069 #
+0x006A 0x006A #
+0x006B 0x006B #
+0x006C 0x006C #
+0x006D 0x006D #
+0x006E 0x006E #
+0x006F 0x006F #
+0x0070 0x0070 #
+0x0071 0x0071 #
+0x0072 0x0072 #
+0x0073 0x0073 #
+0x0074 0x0074 #
+0x0075 0x0075 #
+0x0076 0x0076 #
+0x0077 0x0077 #
+0x0078 0x0078 #
+0x0079 0x0079 #
+0x007A 0x007A #
+0x007B 0x007B #
+0x007C 0x007C #
+0x007D 0x007D #
+0x007E 0x007E #
+0x00A0 0x00A0 #
+0x00A1 0x00A1 #
+0x00A2 0x00A2 #
+0x0451 0x00A3 # /* £ */
+0x00A4 0x00A4 #
+0x00A5 0x00A5 #
+0x00A6 0x00A6 #
+0x00A7 0x00A7 #
+0x00A8 0x00A8 #
+0x00A9 0x00A9 #
+0x00AA 0x00AA #
+0x00AB 0x00AB #
+0x00AC 0x00AC #
+0x00AD 0x00AD #
+0x00AE 0x00AE #
+0x00AF 0x00AF #
+0x00B0 0x00B0 #
+0x00B1 0x00B1 #
+0x00B2 0x00B2 #
+0x0401 0x00B3 # /* ³ */
+0x00B4 0x00B4 #
+0x00B5 0x00B5 #
+0x00B6 0x00B6 #
+0x00B7 0x00B7 #
+0x00B8 0x00B8 #
+0x00B9 0x00B9 #
+0x00BA 0x00BA #
+0x00BB 0x00BB #
+0x00BC 0x00BC #
+0x00BD 0x00BD #
+0x00BE 0x00BE #
+0x00BF 0x00BF #
+
+0x044E 0x00C0 # /* À */
+0x0430 0x00C1 # /* Á */
+0x0431 0x00C2 # /* Â */
+0x0446 0x00C3 # /* Ã */
+0x0434 0x00C4 # /* Ä */
+0x0435 0x00C5 # /* Å */
+0x0444 0x00C6 # /* Æ */
+0x0433 0x00C7 # /* Ç */
+0x0445 0x00C8 # /* È */
+0x0438 0x00C9 # /* É */
+0x0439 0x00CA # /* Ê */
+0x043A 0x00CB # /* Ë */
+0x043B 0x00CC # /* Ì */
+0x043C 0x00CD # /* Í */
+0x043D 0x00CE # /* Î */
+0x043E 0x00CF # /* Ï */
+0x043F 0x00D0 # /* Ð */
+0x044F 0x00D1 # /* Ñ */
+0x0440 0x00D2 # /* Ò */
+0x0441 0x00D3 # /* Ó */
+0x0442 0x00D4 # /* Ô */
+0x0443 0x00D5 # /* Õ */
+0x0436 0x00D6 # /* Ö */
+0x0432 0x00D7 # /* × */
+0x044C 0x00D8 # /* Ø */
+0x044B 0x00D9 # /* Ù */
+0x0437 0x00DA # /* Ú */
+0x0448 0x00DB # /* Û */
+0x044D 0x00DC # /* Ü */
+0x0449 0x00DD # /* Ý */
+0x0447 0x00DE # /* Þ */
+0x044A 0x00DF # /* ß */
+
+0x042E 0x00E0 # /* à */
+0x0410 0x00E1 # /* á */
+0x0411 0x00E2 # /* â */
+0x0426 0x00E3 # /* ã */
+0x0414 0x00E4 # /* ä */
+0x0415 0x00E5 # /* å */
+0x0424 0x00E6 # /* æ */
+0x0413 0x00E7 # /* ç */
+0x0425 0x00E8 # /* è */
+0x0418 0x00E9 # /* é */
+0x0419 0x00EA # /* ê */
+0x041A 0x00EB # /* ë */
+0x041B 0x00EC # /* ì */
+0x041C 0x00ED # /* í */
+0x041D 0x00EE # /* î */
+0x041E 0x00EF # /* ï */
+0x041F 0x00F0 # /* ð */
+0x042F 0x00F1 # /* ñ */
+0x0420 0x00F2 # /* ò */
+0x0421 0x00F3 # /* ó */
+0x0422 0x00F4 # /* ô */
+0x0423 0x00F5 # /* õ */
+0x0416 0x00F6 # /* ö */
+0x0412 0x00F7 # /* ÷ */
+0x042C 0x00F8 # /* ø */
+0x042B 0x00F9 # /* ù */
+0x0417 0x00FA # /* ú */
+0x0428 0x00FB # /* û */
+0x042D 0x00FC # /* ü */
+0x0429 0x00FD # /* ý */
+0x0427 0x00FE # /* þ */
+0x042A 0x00FF # /* ÿ */
+
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/maps/windows.1251 b/xc/extras/FreeType/contrib/ttf2bdf/maps/windows.1251
new file mode 100644
index 000000000..825cab6b9
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/maps/windows.1251
@@ -0,0 +1,204 @@
+#/*
+# * Unicode 2.0 -> Windows CP_1251 (Must Die ;)
+# *
+# * 11 Jan 97 | Eugene Bobin, <gene@ftim.ustu.ru>
+# *
+# */
+#
+REGISTRY windows
+ENCODING 1251
+0x001F 0x001F #
+0x0020 0x0020 #
+0x0021 0x0021 #
+0x0022 0x0022 #
+0x0023 0x0023 #
+0x0024 0x0024 #
+0x0025 0x0025 #
+0x0026 0x0026 #
+0x0027 0x0027 #
+0x0028 0x0028 #
+0x0029 0x0029 #
+0x002A 0x002A #
+0x002B 0x002B #
+0x002C 0x002C #
+0x002D 0x002D #
+0x002E 0x002E #
+0x002F 0x002F #
+0x0030 0x0030 #
+0x0031 0x0031 #
+0x0032 0x0032 #
+0x0033 0x0033 #
+0x0034 0x0034 #
+0x0035 0x0035 #
+0x0036 0x0036 #
+0x0037 0x0037 #
+0x0038 0x0038 #
+0x0039 0x0039 #
+0x003A 0x003A #
+0x003B 0x003B #
+0x003C 0x003C #
+0x003D 0x003D #
+0x003E 0x003E #
+0x003F 0x003F #
+0x0040 0x0040 #
+0x0041 0x0041 #
+0x0042 0x0042 #
+0x0043 0x0043 #
+0x0044 0x0044 #
+0x0045 0x0045 #
+0x0046 0x0046 #
+0x0047 0x0047 #
+0x0048 0x0048 #
+0x0049 0x0049 #
+0x004A 0x004A #
+0x004B 0x004B #
+0x004C 0x004C #
+0x004D 0x004D #
+0x004E 0x004E #
+0x004F 0x004F #
+0x0050 0x0050 #
+0x0051 0x0051 #
+0x0052 0x0052 #
+0x0053 0x0053 #
+0x0054 0x0054 #
+0x0055 0x0055 #
+0x0056 0x0056 #
+0x0057 0x0057 #
+0x0058 0x0058 #
+0x0059 0x0059 #
+0x005A 0x005A #
+0x005B 0x005B #
+0x005C 0x005C #
+0x005D 0x005D #
+0x005E 0x005E #
+0x005F 0x005F #
+0x0060 0x0060 #
+0x0061 0x0061 #
+0x0062 0x0062 #
+0x0063 0x0063 #
+0x0064 0x0064 #
+0x0065 0x0065 #
+0x0066 0x0066 #
+0x0067 0x0067 #
+0x0068 0x0068 #
+0x0069 0x0069 #
+0x006A 0x006A #
+0x006B 0x006B #
+0x006C 0x006C #
+0x006D 0x006D #
+0x006E 0x006E #
+0x006F 0x006F #
+0x0070 0x0070 #
+0x0071 0x0071 #
+0x0072 0x0072 #
+0x0073 0x0073 #
+0x0074 0x0074 #
+0x0075 0x0075 #
+0x0076 0x0076 #
+0x0077 0x0077 #
+0x0078 0x0078 #
+0x0079 0x0079 #
+0x007A 0x007A #
+0x007B 0x007B #
+0x007C 0x007C #
+0x007D 0x007D #
+0x007E 0x007E #
+0x00A0 0x00A0 #
+0x00A1 0x00A1 #
+0x00A2 0x00A2 #
+0x0451 0x00A3 # /* £ */
+0x00A4 0x00A4 #
+0x00A5 0x00A5 #
+0x00A6 0x00A6 #
+0x00A7 0x00A7 #
+0x00A8 0x00A8 #
+0x00A9 0x00A9 #
+0x00AA 0x00AA #
+0x00AB 0x00AB #
+0x00AC 0x00AC #
+0x00AD 0x00AD #
+0x00AE 0x00AE #
+0x00AF 0x00AF #
+0x00B0 0x00B0 #
+0x00B1 0x00B1 #
+0x00B2 0x00B2 #
+0x0401 0x00B3 # /* ³ */
+0x00B4 0x00B4 #
+0x00B5 0x00B5 #
+0x00B6 0x00B6 #
+0x00B7 0x00B7 #
+0x00B8 0x00B8 #
+0x00B9 0x00B9 #
+0x00BA 0x00BA #
+0x00BB 0x00BB #
+0x00BC 0x00BC #
+0x00BD 0x00BD #
+0x00BE 0x00BE #
+0x00BF 0x00BF #
+
+0x044E 0x00C0 # /* À */
+0x0430 0x00C1 # /* Á */
+0x0431 0x00C2 # /* Â */
+0x0446 0x00C3 # /* Ã */
+0x0434 0x00C4 # /* Ä */
+0x0435 0x00C5 # /* Å */
+0x0444 0x00C6 # /* Æ */
+0x0433 0x00C7 # /* Ç */
+0x0445 0x00C8 # /* È */
+0x0438 0x00C9 # /* É */
+0x0439 0x00CA # /* Ê */
+0x043A 0x00CB # /* Ë */
+0x043B 0x00CC # /* Ì */
+0x043C 0x00CD # /* Í */
+0x043D 0x00CE # /* Î */
+0x043E 0x00CF # /* Ï */
+0x043F 0x00D0 # /* Ð */
+0x044F 0x00D1 # /* Ñ */
+0x0440 0x00D2 # /* Ò */
+0x0441 0x00D3 # /* Ó */
+0x0442 0x00D4 # /* Ô */
+0x0443 0x00D5 # /* Õ */
+0x0436 0x00D6 # /* Ö */
+0x0432 0x00D7 # /* × */
+0x044C 0x00D8 # /* Ø */
+0x044B 0x00D9 # /* Ù */
+0x0437 0x00DA # /* Ú */
+0x0448 0x00DB # /* Û */
+0x044D 0x00DC # /* Ü */
+0x0449 0x00DD # /* Ý */
+0x0447 0x00DE # /* Þ */
+0x044A 0x00DF # /* ß */
+
+0x042E 0x00E0 # /* à */
+0x0410 0x00E1 # /* á */
+0x0411 0x00E2 # /* â */
+0x0426 0x00E3 # /* ã */
+0x0414 0x00E4 # /* ä */
+0x0415 0x00E5 # /* å */
+0x0424 0x00E6 # /* æ */
+0x0413 0x00E7 # /* ç */
+0x0425 0x00E8 # /* è */
+0x0418 0x00E9 # /* é */
+0x0419 0x00EA # /* ê */
+0x041A 0x00EB # /* ë */
+0x041B 0x00EC # /* ì */
+0x041C 0x00ED # /* í */
+0x041D 0x00EE # /* î */
+0x041E 0x00EF # /* ï */
+0x041F 0x00F0 # /* ð */
+0x042F 0x00F1 # /* ñ */
+0x0420 0x00F2 # /* ò */
+0x0421 0x00F3 # /* ó */
+0x0422 0x00F4 # /* ô */
+0x0423 0x00F5 # /* õ */
+0x0416 0x00F6 # /* ö */
+0x0412 0x00F7 # /* ÷ */
+0x042C 0x00F8 # /* ø */
+0x042B 0x00F9 # /* ù */
+0x0417 0x00FA # /* ú */
+0x0428 0x00FB # /* û */
+0x042D 0x00FC # /* ü */
+0x0429 0x00FD # /* ý */
+0x0427 0x00FE # /* þ */
+0x042A 0x00FF # /* ÿ */
+
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/remap.c b/xc/extras/FreeType/contrib/ttf2bdf/remap.c
new file mode 100644
index 000000000..6df0c3e1d
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/remap.c
@@ -0,0 +1,684 @@
+/*
+ * Copyright 1996, 1997, 1998 Computing Research Labs, New Mexico State
+ * University
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef lint
+#ifdef __GNUC__
+static char rcsid[] __attribute__ ((unused)) = "$Id: remap.c,v 1.1.1.1 1999/12/05 01:23:19 daryll Exp $";
+#else
+static char rcsid[] = "$Id: remap.c,v 1.1.1.1 1999/12/05 01:23:19 daryll Exp $";
+#endif
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/*
+ * Structure for managing simple lists in place.
+ */
+typedef struct {
+ unsigned char *bfield;
+ unsigned long bsize;
+ unsigned long bused;
+ unsigned char **field;
+ unsigned long size;
+ unsigned long used;
+} list_t;
+
+/*
+ * Callback type used with the high speed text file reader function.
+ */
+typedef int (*scanlines_callback_t)(
+#ifdef __STDC__
+ unsigned char *line,
+ unsigned long linelen,
+ unsigned long lineno,
+ void *client_data
+#endif
+);
+
+/*
+ * Various utility routines.
+ */
+
+#define setsbit(m, cc) (m[(cc) >> 3] |= (1 << ((cc) & 7)))
+#define sbitset(m, cc) (m[(cc) >> 3] & (1 << ((cc) & 7)))
+
+/*
+ * An empty string for empty fields.
+ */
+static unsigned char empty[1] = { 0 };
+
+/*
+ * Assume the line is NULL terminated and that the `list' parameter was
+ * initialized the first time it was used.
+ */
+static void
+#ifdef __STDC__
+splitline(unsigned char *separators, unsigned char *line,
+ unsigned long linelen, list_t *list)
+#else
+splitline(separators, line, linelen, list)
+unsigned char *separators, *line;
+unsigned long linelen;
+list_t *list;
+#endif
+{
+ int mult, final_empty;
+ unsigned char *sp, *ep, *end;
+ unsigned char seps[32];
+
+ /*
+ * Initialize the list.
+ */
+ list->used = list->bused = 0;
+
+ /*
+ * If the line is empty, then simply return.
+ */
+ if (linelen == 0 || line[0] == 0)
+ return;
+
+ /*
+ * If the `separators' parameter is NULL or empty, split the list into
+ * individual bytes.
+ */
+ if (separators == 0 || *separators == 0) {
+ if (linelen > list->bsize) {
+ if (list->bsize)
+ list->bfield = (unsigned char *) malloc(linelen);
+ else
+ list->bfield = (unsigned char *) realloc(list->bfield, linelen);
+ list->bsize = linelen;
+ }
+ list->bused = linelen;
+ (void) memcpy(list->bfield, line, linelen);
+ return;
+ }
+
+ /*
+ * Prepare the separator bitmap.
+ */
+ (void) memset((char *) seps, 0, 32);
+
+ /*
+ * If the very last character of the separator string is a plus, then set
+ * the `mult' flag to indicate that multiple separators should be
+ * collapsed into one.
+ */
+ for (mult = 0, sp = separators; sp && *sp; sp++) {
+ if (*sp == '+' && *(sp + 1) == 0)
+ mult = 1;
+ else
+ setsbit(seps, *sp);
+ }
+
+ /*
+ * Break the line up into fields.
+ */
+ for (final_empty = 0, sp = ep = line, end = sp + linelen;
+ sp < end && *sp;) {
+ /*
+ * Collect everything that is not a separator.
+ */
+ for (; ep < end && *ep && !sbitset(seps, *ep); ep++) ;
+
+ /*
+ * Resize the list if necessary.
+ */
+ if (list->used == list->size) {
+ if (list->size == 0)
+ list->field = (unsigned char **)
+ malloc(sizeof(unsigned char *) << 3);
+ else
+ list->field = (unsigned char **)
+ realloc((char *) list->field,
+ sizeof(unsigned char *) * (list->size + 8));
+
+ list->size += 8;
+ }
+
+ /*
+ * Assign the field appropriately.
+ */
+ list->field[list->used++] = (ep > sp) ? sp : empty;
+
+ sp = ep;
+ if (mult) {
+ /*
+ * If multiple separators should be collapsed, do it now by
+ * setting all the separator characters to 0.
+ */
+ for (; ep < end && *ep && sbitset(seps, *ep); ep++)
+ *ep = 0;
+ } else
+ /*
+ * Don't collapse multiple separators by making them 0, so just
+ * make the one encountered 0.
+ */
+ *ep++ = 0;
+ final_empty = (ep > sp && *ep == 0);
+ sp = ep;
+ }
+
+ /*
+ * Finally, NULL terminate the list.
+ */
+ if (list->used + final_empty + 1 >= list->size) {
+ if (list->used == list->size) {
+ if (list->size == 0)
+ list->field = (unsigned char **)
+ malloc(sizeof(unsigned char *) << 3);
+ else
+ list->field = (unsigned char **)
+ realloc((unsigned char *) list->field,
+ sizeof(char *) * (list->size + 8));
+ list->size += 8;
+ }
+ }
+ if (final_empty)
+ list->field[list->used++] = empty;
+
+ if (list->used == list->size) {
+ if (list->size == 0)
+ list->field = (unsigned char **)
+ malloc(sizeof(unsigned char *) << 3);
+ else
+ list->field = (unsigned char **)
+ realloc((char *) list->field,
+ sizeof(unsigned char *) * (list->size + 8));
+ list->size += 8;
+ }
+ list->field[list->used] = 0;
+}
+
+static int
+#ifdef __STDC__
+scanlines(int fd, scanlines_callback_t callback, void *client_data,
+ unsigned long *lineno)
+#else
+scanlines(fd, callback, client_data, lineno)
+int fd;
+scanlines_callback_t callback;
+void *client_data;
+unsigned long *lineno;
+#endif
+{
+ unsigned long lno;
+ int n, res, done, refill, bytes, hold;
+ char *ls, *le, *pp, *pe, *hp;
+ char buf[65536];
+
+ if (callback == 0)
+ return -1;
+
+ lno = 1;
+ (void) memset(buf, 0, 65536);
+ res = done = 0;
+ pp = ls = le = buf;
+ bytes = 65536;
+ while (!done && (n = read(fd, pp, bytes)) > 0) {
+ /*
+ * Determine the new end of the buffer pages.
+ */
+ pe = pp + n;
+
+ for (refill = 0; done == 0 && refill == 0; ) {
+ while (le < pe && *le != '\n' && *le != '\r')
+ le++;
+
+ if (le == pe) {
+ /*
+ * Hit the end of the last page in the buffer.
+ * Need to find out how many pages to shift
+ * and how many pages need to be read in.
+ * Adjust the line start and end pointers down
+ * to point to the right places in the pages.
+ */
+ pp = buf + (((ls - buf) >> 13) << 13);
+ n = pp - buf;
+ ls -= n;
+ le -= n;
+ n = pe - pp;
+ (void) memcpy(buf, pp, n);
+ pp = buf + n;
+ bytes = 65536 - n;
+ refill = 1;
+ } else {
+ /*
+ * Temporarily NULL terminate the line.
+ */
+ hp = le;
+ hold = *le;
+ *le = 0;
+
+ if (callback && *ls != '#' && *ls != 0x1a && le > ls &&
+ (res = (*callback)((unsigned char *) ls, le - ls, lno,
+ client_data)) != 0)
+ done = 1;
+ else {
+ ls = ++le;
+ /*
+ * Handle the case of DOS CRLF sequences.
+ */
+ if (le < pe && hold == '\n' && *le =='\r')
+ ls = ++le;
+ }
+
+ /*
+ * Increment the line number.
+ */
+ lno++;
+
+ /*
+ * Restore the character at the end of the line.
+ */
+ *hp = hold;
+ }
+ }
+ }
+
+ /*
+ * Return with the last line number processed.
+ */
+ *lineno = lno;
+
+ return res;
+}
+
+static unsigned char a2i[128] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+static unsigned char odigits[32] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static unsigned char ddigits[32] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+static unsigned char hdigits[32] = {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
+ 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+
+#define isdigok(m, d) (m[(d) >> 3] & (1 << ((d) & 7)))
+
+static unsigned short
+#ifdef __STDC__
+my_atous(unsigned char *s, unsigned char **end, int base)
+#else
+my_atous(s, end, base)
+unsigned char *s, **end;
+int base;
+#endif
+{
+ unsigned short v;
+ unsigned char *dmap;
+
+ if (s == 0 || *s == 0)
+ return 0;
+
+ /*
+ * Make sure the radix is something recognizable. Default to 10.
+ */
+ switch (base) {
+ case 8: dmap = odigits; break;
+ case 16: dmap = hdigits; break;
+ default: base = 10; dmap = ddigits; break;
+ }
+
+ /*
+ * Check for the special hex prefix.
+ */
+ if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {
+ base = 16;
+ dmap = hdigits;
+ s += 2;
+ }
+
+ for (v = 0; isdigok(dmap, *s); s++)
+ v = (v * base) + a2i[(int) *s];
+
+ if (end != 0)
+ *end = s;
+
+ return v;
+}
+
+/********************************************************************
+ *
+ * Routines to load, unload, and use mapping tables to remap BDF fonts
+ * generated using ttf2bdf.
+ *
+ ********************************************************************/
+
+/*
+ * Strings used to store the registry and encoding values specified
+ * in the mapping table.
+ */
+static char *registry;
+static char *encoding;
+
+/*
+ * Trie node structure.
+ */
+typedef struct {
+ unsigned short key; /* Key value. */
+ unsigned short val; /* Data for the key. */
+ unsigned long sibs; /* Offset of siblings from trie beginning. */
+ unsigned long kids; /* Offset of children from trie beginning. */
+} node_t;
+
+/*
+ * The trie used for remapping codes.
+ */
+static node_t *nodes;
+static unsigned long nodes_size = 0;
+static unsigned long nodes_used = 0;
+
+/*
+ * Gets the next available node in the trie.
+ */
+static unsigned long
+#ifdef __STDC__
+getnode(unsigned short key)
+#else
+getnode(key)
+unsigned short key;
+#endif
+{
+ unsigned long loc;
+ node_t *np;
+
+ if (nodes_used == nodes_size) {
+ if (nodes_size == 0)
+ nodes = (node_t *) malloc(sizeof(node_t) << 7);
+ else
+ nodes = (node_t *) realloc((char *) nodes, sizeof(node_t) *
+ (nodes_size + 128));
+ np = nodes + nodes_size;
+ nodes_size += 128;
+ (void) memset((char *) np, 0, sizeof(node_t) << 7);
+ }
+
+ loc = nodes_used++;
+ np = nodes + loc;
+ np->kids = np->sibs = 0;
+ np->key = key;
+ return loc;
+}
+
+/*
+ * Inserts a node in the trie.
+ */
+static void
+#ifdef __STDC__
+trie_insert(unsigned short key, unsigned short val)
+#else
+trie_insert(key, val)
+unsigned short key, val;
+#endif
+{
+ unsigned long i, n, t, l;
+ unsigned short codes[2];
+
+ /*
+ * Convert the incoming key into two codes to make the trie lookup more
+ * efficient.
+ */
+ codes[0] = (key >> 8) & 0xff;
+ codes[1] = key & 0xff;
+
+ for (i = t = 0; i < 2; i++) {
+ if (nodes[t].kids == 0) {
+ n = getnode(codes[i]);
+ nodes[t].kids = t = n;
+ } else if (nodes[nodes[t].kids].key == codes[i])
+ t = nodes[t].kids;
+ else if (nodes[nodes[t].kids].key > codes[i]) {
+ n = getnode(codes[i]);
+ nodes[n].sibs = nodes[t].kids;
+ nodes[t].kids = t = n;
+ } else {
+ t = nodes[t].kids;
+ for (l = t; nodes[t].sibs && nodes[t].key < codes[i]; ) {
+ l = t;
+ t = nodes[t].sibs;
+ }
+ if (nodes[t].key < codes[i]) {
+ n = getnode(codes[i]);
+ nodes[t].sibs = t = n;
+ } else if (nodes[t].key > codes[i]) {
+ n = getnode(codes[i]);
+ nodes[n].sibs = t;
+ nodes[l].sibs = t = n;
+ }
+ }
+ }
+
+ /*
+ * Set the value in the leaf node.
+ */
+ nodes[t].val = val;
+}
+
+/*
+ * List used by the routine that parses the map lines.
+ */
+static list_t list;
+
+/*
+ * Routine to parse each line of the mapping file.
+ */
+static int
+#ifdef __STDC__
+add_mapping(unsigned char *line, unsigned long linelen, unsigned long lineno,
+ void *client_data)
+#else
+add_mapping(line, linelen, lineno, client_data)
+unsigned char *line;
+unsigned long linelen, lineno;
+void *client_data;
+#endif
+{
+ unsigned short key, val;
+
+ /*
+ * Split the line into parts separted by one or more spaces or tabs.
+ */
+ splitline((unsigned char *) " \t+", line, linelen, &list);
+
+ /*
+ * Check to see if the line starts with one of the keywords.
+ */
+ if (memcmp((char *) list.field[0], "REGISTRY", 8) == 0) {
+ /*
+ * Collect the XLFD CHARSET_REGISTRY value.
+ */
+ if (registry != 0)
+ free((char *) registry);
+ if ((val = strlen((char *) list.field[1])) == 0)
+ registry = 0;
+ else {
+ registry = (char *) malloc(val + 1);
+ (void) memcpy(registry, (char *) list.field[1], val + 1);
+ }
+ return 0;
+ }
+
+ if (memcmp((char *) list.field[0], "ENCODING", 8) == 0) {
+ /*
+ * Collect the XLFD CHARSET_ENCODING value.
+ */
+ if (encoding != 0)
+ free((char *) encoding);
+ if ((val = strlen((char *) list.field[1])) == 0)
+ encoding = 0;
+ else {
+ encoding = (char *) malloc(val + 1);
+ (void) memcpy(encoding, (char *) list.field[1], val + 1);
+ }
+ return 0;
+ }
+
+ /*
+ * Get the left hand value. Always assume the values are in hex.
+ */
+ key = my_atous(list.field[0], 0, 16);
+ val = my_atous(list.field[1], 0, 16);
+
+ trie_insert(key, val);
+
+ return 0;
+}
+
+/********************************************************************
+ *
+ * API for mapping table support.
+ *
+ ********************************************************************/
+
+int
+#ifdef __STDC__
+ttf2bdf_load_map(FILE *in)
+#else
+ttf2bdf_load_map(in)
+FILE *in;
+#endif
+{
+ unsigned long lineno;
+
+ /*
+ * Allocate some nodes initially.
+ */
+ if (nodes_size == 0) {
+ nodes = (node_t *) malloc(sizeof(node_t) << 7);
+ nodes_size = 128;
+ }
+
+ /*
+ * Reset the trie in case more than one gets loaded for some reason.
+ */
+ if (nodes_size > 0)
+ (void) memset((char *) nodes, 0, sizeof(node_t) * nodes_size);
+ nodes_used = 1;
+
+ return scanlines(fileno(in), add_mapping, 0, &lineno);
+}
+
+/*
+ * Routine that deallocates the mapping trie.
+ */
+void
+#ifdef __STDC__
+ttf2bdf_free_map(void)
+#else
+ttf2bdf_free_map()
+#endif
+{
+ if (registry != 0)
+ free((char *) registry);
+ if (encoding != 0)
+ free((char *) encoding);
+ registry = encoding = 0;
+
+ if (list.size > 0)
+ free((char *) list.field);
+ list.size = list.used = 0;
+
+ if (nodes_size > 0)
+ free((char *) nodes);
+ nodes_size = nodes_used = 0;
+}
+
+/*
+ * The routine that actually remaps the code by looking it up in the trie.
+ */
+int
+#ifdef __STDC__
+ttf2bdf_remap(unsigned short *code)
+#else
+ttf2bdf_remap(code)
+unsigned short *code;
+#endif
+{
+ unsigned long i, n, t;
+ unsigned short c, codes[2];
+
+ /*
+ * If no mapping table was loaded, then simply return the code.
+ */
+ if (nodes_used == 0)
+ return 1;
+
+ c = *code;
+ codes[0] = (c >> 8) & 0xff;
+ codes[1] = c & 0xff;
+
+ for (i = n = 0; i < 2; i++) {
+ t = nodes[n].kids;
+ if (t == 0)
+ return 0;
+ for (; nodes[t].sibs && nodes[t].key != codes[i]; t = nodes[t].sibs);
+ if (nodes[t].key != codes[i])
+ return 0;
+ n = t;
+ }
+
+ *code = nodes[n].val;
+ return 1;
+}
+
+void
+#ifdef __STDC__
+ttf2bdf_remap_charset(char **registry_name, char **encoding_name)
+#else
+ttf2bdf_remap_charset(registry_name, encoding_name)
+char **registry_name, **encoding_name;
+#endif
+{
+ if (registry_name != 0)
+ *registry_name = registry;
+ if (encoding_name != 0)
+ *encoding_name = encoding;
+}
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/remap.h b/xc/extras/FreeType/contrib/ttf2bdf/remap.h
new file mode 100644
index 000000000..9591acc4f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/remap.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright 1996, 1997, 1998 Computing Research Labs, New Mexico State
+ * University
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef _h_remap
+#define _h_remap
+
+/*
+ * $Id: remap.h,v 1.1.1.1 1999/12/05 01:23:19 daryll Exp $
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int ttf2bdf_load_map(
+#ifdef __STDC__
+ FILE *in
+#endif
+);
+
+extern void ttf2bdf_free_map(
+#ifdef __STDC__
+ void
+#endif
+);
+
+extern int ttf2bdf_remap(
+#ifdef __STDC__
+ unsigned short *code
+#endif
+);
+
+extern void ttf2bdf_remap_charset(
+#ifdef __STDC__
+ char **registry_name,
+ char **encoding_name
+#endif
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _h_remap */
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.c b/xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.c
new file mode 100644
index 000000000..055011b11
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.c
@@ -0,0 +1,1563 @@
+/*
+ * Copyright 1996, 1997, 1998 Computing Research Labs, New Mexico State
+ * University
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+ * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef lint
+#ifdef __GNUC__
+static char rcsid[] __attribute__ ((unused)) = "$Id: ttf2bdf.c,v 1.1.1.1 1999/12/05 01:23:20 daryll Exp $";
+#else
+static char rcsid[] = "$Id: ttf2bdf.c,v 1.1.1.1 1999/12/05 01:23:20 daryll Exp $";
+#endif
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "freetype.h"
+
+/*
+ * Include the remapping support.
+ */
+#include "remap.h"
+
+/**************************************************************************
+ *
+ * Macros.
+ *
+ **************************************************************************/
+
+/*
+ * The version of ttf2bdf.
+ */
+#define TTF2BDF_VERSION "2.2"
+
+/*
+ * Set the default values used to generate a BDF font.
+ */
+#ifndef DEFAULT_PLATFORM_ID
+#define DEFAULT_PLATFORM_ID 3
+#endif
+
+#ifndef DEFAULT_ENCODING_ID
+#define DEFAULT_ENCODING_ID 1
+#endif
+
+#ifndef DEFAULT_POINT_SIZE
+#define DEFAULT_POINT_SIZE 12
+#endif
+
+#ifndef DEFAULT_RESOLUTION
+#define DEFAULT_RESOLUTION 100
+#endif
+
+/*
+ * Used as a fallback for XLFD names where the character set/encoding can not
+ * be determined.
+ */
+#ifndef DEFAULT_XLFD_CSET
+#define DEFAULT_XLFD_CSET "-FontSpecific-0"
+#endif
+
+/*
+ * nameID macros for getting strings from the TT font.
+ */
+#define TTF_COPYRIGHT 0
+#define TTF_TYPEFACE 1
+#define TTF_PSNAME 6
+
+#ifndef MAX
+#define MAX(h,i) ((h) > (i) ? (h) : (i))
+#endif
+
+#ifndef MIN
+#define MIN(l,o) ((l) < (o) ? (l) : (o))
+#endif
+
+/**************************************************************************
+ *
+ * General globals set from command line.
+ *
+ **************************************************************************/
+
+/*
+ * The program name.
+ */
+static char *prog;
+
+/*
+ * The flag indicating whether messages should be printed or not.
+ */
+static int verbose = 0;
+
+/*
+ * Flags used when loading glyphs.
+ */
+static int load_flags = TTLOAD_SCALE_GLYPH | TTLOAD_HINT_GLYPH;
+
+/*
+ * The default platform and encoding ID's.
+ */
+static int pid = DEFAULT_PLATFORM_ID;
+static int eid = DEFAULT_ENCODING_ID;
+
+/*
+ * Default point size and resolutions.
+ */
+static int point_size = DEFAULT_POINT_SIZE;
+static int hres = DEFAULT_RESOLUTION;
+static int vres = DEFAULT_RESOLUTION;
+
+/*
+ * The user supplied foundry name to use in the XLFD name.
+ */
+static char *foundry_name = 0;
+
+/*
+ * The user supplied typeface name to use in the XLFD name.
+ */
+static char *face_name = 0;
+
+/*
+ * The user supplied weight name to use in the XLFD name.
+ */
+static char *weight_name = 0;
+
+/*
+ * The user supplied slant name to use in the XLFD name.
+ */
+static char *slant_name = 0;
+
+/*
+ * The user supplied width name to use in the XLFD name.
+ */
+static char *width_name = 0;
+
+/*
+ * The user supplied additional style name to use in the XLFD name.
+ */
+static char *style_name = 0;
+
+/*
+ * The user supplied spacing (p = proportional, c = character cell,
+ * m = monospace).
+ */
+static int spacing = 0;
+
+/*
+ * The dash character to use in the names retrieved from the font. Default is
+ * the space.
+ */
+static int dashchar = ' ';
+
+/*
+ * Flag, bitmask, and max code for generating a subset of the glyphs in a font.
+ */
+static int do_subset = 0;
+static unsigned short maxcode;
+static unsigned long subset[2048];
+
+/*
+ * The flag that indicates the remapping table should be used to
+ * reencode the font.
+ */
+static int do_remap = 0;
+
+/**************************************************************************
+ *
+ * Internal globals.
+ *
+ **************************************************************************/
+
+/*
+ * Structure used for calculating the font bounding box as the glyphs are
+ * generated.
+ */
+typedef struct {
+ short minlb;
+ short maxlb;
+ short maxrb;
+ short maxas;
+ short maxds;
+ short rbearing;
+} bbx_t;
+
+static bbx_t bbx;
+
+/*
+ * The buffer used to transfer the temporary file to the actual output file.
+ */
+#define TTF2BDF_IOBUFSIZ 8192
+static char iobuf[TTF2BDF_IOBUFSIZ];
+
+/*
+ * The Units Per Em value used in numerous places.
+ */
+static TT_UShort upm;
+
+/*
+ * A flag indicating if a CMap was found or not.
+ */
+static TT_UShort nocmap;
+
+/*
+ * The scaling factor needed to compute the SWIDTH (scalable width) value
+ * for BDF glyphs.
+ */
+static double swscale;
+
+/*
+ * Mac encoding names used when creating the BDF XLFD font name.
+ */
+static char *mac_encodings[] = {
+ "-MacRoman-0", "-MacJapanese-0", "-MacChinese-0", "-MacKorean-0",
+ "-MacArabic-0", "-MacHebrew-0", "-MacGreek-0", "-MacRussian-0",
+ "-MacRSymbol-0", "-MacDevanagari-0", "-MacGurmukhi-0", "-MacGujarati-0",
+ "-MacOriya-0", "-MacBengali-0", "-MacTamil-0", "-MacTelugu-0",
+ "-MacKannada-0", "-MacMalayalam-0", "-MacSinhalese-0", "-MacBurmese-0",
+ "-MacKhmer-0", "-MacThai-0", "-MacLaotian-0", "-MacGeorgian-0",
+ "-MacArmenian-0", "-MacMaldivian-0", "-MacTibetan-0", "-MacMongolian-0",
+ "-MacGeez-0", "-MacSlavic-0", "-MacVietnamese-0","-MacSindhi-0",
+ "-MacUninterp-0"
+};
+static int num_mac_encodings = sizeof(mac_encodings) /
+ sizeof(mac_encodings[0]);
+
+/*
+ * ISO encoding names used when creating the BDF XLFD font name.
+ */
+static char *iso_encodings[] = {
+ "-ASCII-0", "-ISO10646-0", "-ISO8859-1"
+};
+static int num_iso_encodings = sizeof(iso_encodings) /
+ sizeof(iso_encodings[0]);
+
+/*
+ * Microsoft encoding names used when creating the BDF XLFD font name.
+ */
+static char *ms_encodings[] = {
+ "-Symbol-0", "-ISO10646-1", "-ShiftJIS-0", "-GB2312.1980-0", "-Big5-0",
+ "-KSC5601.1987-0", "-KSC5601.1992-0"
+};
+static int num_ms_encodings = sizeof(ms_encodings) /
+ sizeof(ms_encodings[0]);
+
+/*
+ * The propery names for all the XLFD properties.
+ */
+static char *xlfd_props[] = {
+ "FOUNDRY",
+ "FAMILY_NAME",
+ "WEIGHT_NAME",
+ "SLANT",
+ "SETWIDTH_NAME",
+ "ADD_STYLE_NAME",
+ "PIXEL_SIZE",
+ "POINT_SIZE",
+ "RESOLUTION_X",
+ "RESOLUTION_Y",
+ "SPACING",
+ "AVERAGE_WIDTH",
+ "CHARSET_REGISTRY",
+ "CHARSET_ENCODING",
+};
+
+/**************************************************************************
+ *
+ * Freetype globals.
+ *
+ **************************************************************************/
+
+static TT_Engine engine;
+static TT_Face face;
+static TT_Face_Properties properties;
+
+static TT_Instance instance;
+
+static TT_Glyph glyph;
+static TT_Glyph_Metrics metrics;
+static TT_Instance_Metrics imetrics;
+
+static TT_Raster_Map raster;
+
+static TT_CharMap cmap;
+
+/**************************************************************************
+ *
+ * Freetype related code.
+ *
+ **************************************************************************/
+
+/*
+ * A generic routine to get a name from the TT name table. This routine
+ * always looks for English language names and checks three possibilities:
+ * 1. English names with the MS Unicode encoding ID.
+ * 2. English names with the MS unknown encoding ID.
+ * 3. English names with the Apple Unicode encoding ID.
+ *
+ * The particular name ID mut be provided (e.g. nameID = 0 for copyright
+ * string, nameID = 6 for Postscript name, nameID = 1 for typeface name.
+ *
+ * If the `dash' flag is non-zero, all dashes (-) in the name will be replaced
+ * with the character passed.
+ *
+ * Returns the number of bytes added.
+ */
+static int
+#ifdef __STDC__
+ttf_get_english_name(char *name, int nameID, int dash)
+#else
+ttf_get_english_name(name, nameID, dash)
+char *name;
+int nameID, dash_to_space;
+#endif
+{
+ TT_UShort slen;
+ int i, j, encid, nrec;
+ short nrPlatformID, nrEncodingID, nrLanguageID, nrNameID;
+ char *s;
+
+ nrec = TT_Get_Name_Count(face);
+
+ for (encid = 1, j = 0; j < 2; j++, encid--) {
+ /*
+ * Locate one of the MS English font names.
+ */
+ for (i = 0; i < nrec; i++) {
+ TT_Get_Name_ID(face, i, &nrPlatformID, &nrEncodingID,
+ &nrLanguageID, &nrNameID);
+ if (nrPlatformID == 3 &&
+ nrEncodingID == encid &&
+ nrNameID == nameID &&
+ (nrLanguageID == 0x0409 || nrLanguageID == 0x0809 ||
+ nrLanguageID == 0x0c09 || nrLanguageID == 0x1009 ||
+ nrLanguageID == 0x1409 || nrLanguageID == 0x1809)) {
+ TT_Get_Name_String(face, i, &s, &slen);
+ break;
+ }
+ }
+
+ if (i < nrec) {
+ /*
+ * Found one of the MS English font names. The name is by
+ * definition encoded in Unicode, so copy every second byte into
+ * the `name' parameter, assuming there is enough space.
+ */
+ for (i = 1; s != 0 && i < slen; i += 2) {
+ if (dash)
+ *name++ = (s[i] == '-' || s[i] == ' ') ? dash : s[i];
+ else
+ *name++ = s[i];
+ }
+ *name = 0;
+ return (slen >> 1);
+ }
+ }
+
+ /*
+ * No MS English name found, attempt to find an Apple Unicode English
+ * name.
+ */
+ for (i = 0; i < nrec; i++) {
+ TT_Get_Name_ID(face, i, &nrPlatformID, &nrEncodingID,
+ &nrLanguageID, &nrNameID);
+ if (nrPlatformID == 0 && nrLanguageID == 0 &&
+ nrNameID == nameID) {
+ TT_Get_Name_String(face, i, &s, &slen);
+ break;
+ }
+ }
+
+ if (i < nrec) {
+ /*
+ * Found the Apple Unicode English name. The name is by definition
+ * encoded in Unicode, so copy every second byte into the `name'
+ * parameter, assuming there is enough space.
+ */
+ for (i = 1; s != 0 && i < slen; i += 2) {
+ if (dash)
+ *name++ = (s[i] == '-' || s[i] == ' ') ? dash : s[i];
+ else
+ *name++ = s[i];
+ }
+ *name = 0;
+ return (slen >> 1);
+ }
+
+ return 0;
+}
+
+/**************************************************************************
+ *
+ * General code.
+ *
+ **************************************************************************/
+
+/*
+ * Create an XLFD name. Assumes there is enough space in the string passed
+ * to fit a reasonably long XLFD name into, up to the 256 byte maximum.
+ */
+static void
+#ifdef __STDC__
+make_xlfd_name(char *name, TT_Long awidth, int ismono)
+#else
+make_xlfd_name(name, awidth, ismono)
+char *name;
+TT_Long awidth;
+int ismono;
+#endif
+{
+ TT_Long i;
+ TT_ULong val;
+ char *r, *e;
+ double dr, dp;
+
+ /*
+ * Default the foundry name to "FreeType" in honor of the project and
+ * because the foundry name is too difficult to automatically determine
+ * from the names in TT fonts. But the user can provide his own.
+ */
+ if (foundry_name == 0) {
+ (void) strcpy(name, "-FreeType");
+ name += 9;
+ } else {
+ *(name++)='-';
+ strcpy(name,foundry_name);
+ name+=strlen(foundry_name);
+ }
+
+ /*
+ * Add the typeface name from the font. The fallback default will be
+ * "Unknown".
+ */
+ *name++ = '-';
+ if (face_name == 0) {
+ if((i = ttf_get_english_name(name, TTF_TYPEFACE, dashchar)))
+ name += i;
+ else {
+ (void) strcpy(name, "Unknown");
+ name += 7;
+ }
+ } else {
+ (void) strcpy(name, face_name);
+ name += strlen(face_name);
+ }
+
+ /*
+ * Add the weight name. The default will be "Medium".
+ */
+ if (weight_name != 0) {
+ sprintf(name, "-%s", weight_name);
+ name += strlen(weight_name) + 1;
+ } else {
+ if (properties.os2->fsSelection & 0x20) {
+ (void) strcpy(name, "-Bold");
+ name += 5;
+ } else {
+ (void) strcpy(name, "-Medium");
+ name += 7;
+ }
+ }
+
+ /*
+ * Add the slant name. The default will be 'R'.
+ */
+ if (slant_name) {
+ sprintf(name, "-%s", slant_name);
+ name += strlen(slant_name) + 1;
+ } else {
+ *name++ = '-';
+ if (properties.os2->fsSelection & 0x01)
+ *name++ = 'I';
+ else
+ *name++ = 'R';
+ }
+
+ /*
+ * Default the setwidth name to "Normal" but user can specify one.
+ */
+ if (width_name == 0) {
+ (void) strcpy(name, "-Normal");
+ name += 7;
+ } else {
+ *(name++)='-';
+ strcpy(name,width_name);
+ name+=strlen(width_name);
+ }
+
+ /*
+ * Default the additional style name to NULL but user can specify one.
+ */
+ *name++ = '-';
+ if (style_name != 0) {
+ strcpy(name,style_name);
+ name+=strlen(style_name);
+ }
+
+ /*
+ * Determine the pixel size from the point size and resolution.
+ */
+ dr = (double) vres;
+ dp = (double) (point_size * 10);
+ val = (unsigned long) (((dp * dr) / 722.7) + 0.5);
+
+ /*
+ * Set the pixel size, point size, and resolution.
+ */
+ sprintf(name, "-%ld-%d-%d-%d", val, point_size * 10, hres, vres);
+ name += strlen(name);
+
+ switch (spacing) {
+ case 'p': case 'P': spacing = 'P'; break;
+ case 'm': case 'M': spacing = 'M'; break;
+ case 'c': case 'C': spacing = 'C'; break;
+ default: spacing = 0; break;
+ }
+
+ /*
+ * Set the spacing.
+ */
+ if (!spacing)
+ spacing = (ismono) ? 'M' : 'P';
+ *name++ = '-';
+ *name++ = spacing;
+
+ /*
+ * Add the average width.
+ */
+ sprintf(name, "-%ld", awidth);
+ name += strlen(name);
+
+ /*
+ * Check to see if the remapping table specified a registry and encoding
+ * and use those if they both exist.
+ */
+ ttf2bdf_remap_charset(&r, &e);
+ if (r != 0 && e != 0) {
+ sprintf(name, "-%s-%s", r, e);
+ return;
+ }
+
+ /*
+ * If the cmap for the platform and encoding id was not found, or the
+ * platform id is unknown, assume the character set registry and encoding
+ * are the XLFD default.
+ */
+ if (nocmap || pid > 3)
+ (void) strcpy(name, DEFAULT_XLFD_CSET);
+ else {
+ /*
+ * Finally, determine the character set registry and encoding from the
+ * platform and encoding ID.
+ */
+ switch (pid) {
+ case 0:
+ /*
+ * Apple Unicode platform, so "Unicode-2.0" is the default.
+ */
+ (void) strcpy(name, "-Unicode-2.0");
+ break;
+ case 1:
+ /*
+ * Macintosh platform, so choose from the Macintosh encoding
+ * strings.
+ */
+ if (eid < 0 || eid >= num_mac_encodings)
+ (void) strcpy(name, DEFAULT_XLFD_CSET);
+ else
+ (void) strcpy(name, mac_encodings[eid]);
+ break;
+ case 2:
+ /*
+ * ISO platform, so choose from the ISO encoding strings.
+ */
+ if (eid < 0 || eid >= num_iso_encodings)
+ (void) strcpy(name, DEFAULT_XLFD_CSET);
+ else
+ (void) strcpy(name, iso_encodings[eid]);
+ break;
+ case 3:
+ /*
+ * Microsoft platform, so choose from the MS encoding strings.
+ */
+ if (eid < 0 || eid >= num_ms_encodings)
+ (void) strcpy(name, DEFAULT_XLFD_CSET);
+ else
+ (void) strcpy(name, ms_encodings[eid]);
+ break;
+ }
+ }
+}
+
+static int
+#ifdef __STDC__
+generate_font(FILE *out, char *iname, char *oname)
+#else
+generate_font(out, iname, oname)
+FILE *out;
+char *iname, *oname;
+#endif
+{
+ int eof, ismono, i;
+ FILE *tmp;
+ TT_Short maxx, maxy, minx, miny, xoff, yoff, dwidth, swidth;
+ TT_Short y_off, x_off;
+ TT_UShort sx, sy, ex, ey, wd, ht;
+ TT_Long code, idx, ng, aw;
+ TT_UShort remapped_code;
+ unsigned char *bmap;
+ double dw;
+ char *xp, xlfd[256];
+ char *tmpdir, tmpfile[BUFSIZ];
+
+ /*
+ * Open a temporary file to store the bitmaps in until the exact number
+ * of bitmaps are known.
+ */
+ if ((tmpdir = getenv("TMPDIR")) == 0)
+ tmpdir = "/tmp";
+ sprintf(tmpfile, "%s/ttf2bdf%ld", tmpdir, (long) getpid());
+ if ((tmp = fopen(tmpfile, "w")) == 0) {
+ fprintf(stderr, "%s: unable to open temporary file '%s'.\n",
+ prog, tmpfile);
+ return -1;
+ }
+
+ /*
+ * Calculate the scale factor for the SWIDTH field.
+ */
+ swscale = ((double) vres) * ((double) point_size);
+
+ /*
+ * Calculate the font bounding box again so enough storage for the largest
+ * bitmap can be allocated.
+ */
+ minx = (properties.header->xMin * imetrics.x_ppem) / upm;
+ miny = (properties.header->yMin * imetrics.y_ppem) / upm;
+ maxx = (properties.header->xMax * imetrics.x_ppem) / upm;
+ maxy = (properties.header->yMax * imetrics.y_ppem) / upm;
+
+ maxx -= minx; ++maxx;
+ maxy -= miny; ++maxy;
+
+ /*
+ * Initialize the flag that tracks if the font is monowidth or not and
+ * initialize the glyph width variable that is used for testing for a
+ * monowidth font.
+ */
+ wd = 0xffff;
+ ismono = 1;
+
+ /*
+ * Use the upward flow because the version of FreeType being used when
+ * this was written did not support TT_Flow_Down. This insures that this
+ * routine will not mess up if TT_Flow_Down is implemented at some point.
+ */
+ raster.flow = TT_Flow_Up;
+ raster.width = maxx;
+ raster.rows = maxy;
+ raster.cols = (maxx + 7) >> 3;
+ raster.size = raster.cols * raster.rows;
+ raster.bitmap = (void *) malloc(raster.size);
+
+ for (ng = code = 0, eof = 0, aw = 0; eof != EOF && code < 0xffff; code++) {
+
+ /*
+ * If a remap is indicated, attempt to remap the code. If a remapped
+ * code is not found, then skip generating the glyph.
+ */
+ remapped_code = (TT_UShort) code;
+ if (do_remap && !ttf2bdf_remap(&remapped_code))
+ continue;
+
+ /*
+ * If a subset is being generated and the code is greater than the max
+ * code of the subset, break out of the loop to avoid doing any more
+ * work.
+ */
+ if (do_subset && remapped_code > maxcode)
+ break;
+
+ /*
+ * If a subset is being generated and the index is not in the subset
+ * bitmap, just continue.
+ */
+ if (do_subset &&
+ !(subset[remapped_code >> 5] & (1 << (remapped_code & 31))))
+ continue;
+
+ if (nocmap) {
+ if (code >= properties.num_Glyphs)
+
+ /*
+ * At this point, all the glyphs are done.
+ */
+ break;
+ idx = code;
+ } else
+ idx = TT_Char_Index(cmap, code);
+
+ /*
+ * If the glyph could not be loaded for some reason, or a subset is
+ * being generated and the index is not in the subset bitmap, just
+ * continue.
+ */
+
+ if (idx <= 0 || TT_Load_Glyph(instance, glyph, idx, load_flags))
+ continue;
+
+ (void) TT_Get_Glyph_Metrics(glyph, &metrics);
+
+ /*
+ * Clear the raster bitmap.
+ */
+ (void) memset((char *) raster.bitmap, 0, raster.size);
+
+ /*
+ * Grid fit to determine the x and y offsets that will force the
+ * bitmap to fit into the storage provided.
+ */
+ xoff = (63 - metrics.bbox.xMin) & -64;
+ yoff = (63 - metrics.bbox.yMin) & -64;
+
+ /*
+ * If the bitmap cannot be generated, simply continue.
+ */
+ if (TT_Get_Glyph_Bitmap(glyph, &raster, xoff, yoff))
+ continue;
+
+ /*
+ * Determine the DWIDTH (device width, or advance width in TT
+ * terms) and the SWIDTH (scalable width) values.
+ */
+ dwidth = metrics.advance >> 6;
+ dw = (double) dwidth;
+ swidth = (TT_Short) ((dw * 72000.0) / swscale);
+
+ /*
+ * Determine the actual bounding box of the glyph bitmap. Do not
+ * forget that the glyph is rendered upside down!
+ */
+ sx = ey = 0xffff;
+ sy = ex = 0;
+ bmap = (unsigned char *) raster.bitmap;
+ for (miny = 0; miny < raster.rows; miny++) {
+ for (minx = 0; minx < raster.width; minx++) {
+ if (bmap[(miny * raster.cols) + (minx >> 3)] &
+ (0x80 >> (minx & 7))) {
+ if (minx < sx)
+ sx = minx;
+ if (minx > ex)
+ ex = minx;
+ if (miny > sy)
+ sy = miny;
+ if (miny < ey)
+ ey = miny;
+ }
+ }
+ }
+
+ /*
+ * If the glyph is actually an empty bitmap, set the size to 0 all
+ * around.
+ */
+ if (sx == 0xffff && ey == 0xffff && sy == 0 && ex == 0)
+ sx = ex = sy = ey = 0;
+
+ /*
+ * Increment the number of glyphs generated.
+ */
+ ng++;
+
+ /*
+ * Test to see if the font is going to be monowidth or not by
+ * comparing the current glyph width against the last one.
+ */
+ if (ismono && (ex - sx) + 1 != wd)
+ ismono = 0;
+
+ /*
+ * Adjust the font bounding box.
+ */
+ wd = (ex - sx) + 1;
+ ht = (sy - ey) + 1;
+ x_off = sx - (xoff >> 6);
+ y_off = ey - (yoff >> 6);
+
+ bbx.maxas = MAX(bbx.maxas, ht + y_off);
+ bbx.maxds = MAX(bbx.maxds, -y_off);
+ bbx.rbearing = wd + x_off;
+ bbx.maxrb = MAX(bbx.maxrb, bbx.rbearing);
+ bbx.minlb = MIN(bbx.minlb, x_off);
+ bbx.maxlb = MAX(bbx.maxlb, x_off);
+
+ /*
+ * Add to the average width accumulator.
+ */
+ aw += wd;
+
+ /*
+ * Print the bitmap header.
+ */
+ fprintf(tmp, "STARTCHAR %04lX\nENCODING %ld\n", code,
+ (long) remapped_code);
+ fprintf(tmp, "SWIDTH %hd 0\n", swidth);
+ fprintf(tmp, "DWIDTH %hd 0\n", dwidth);
+ fprintf(tmp, "BBX %hd %hd %hd %hd\n", wd, ht, x_off, y_off);
+
+ /*
+ * Check for an error return here in case the temporary file system
+ * fills up or the file is deleted while it is being used.
+ */
+ eof = fprintf(tmp, "BITMAP\n");
+
+ /*
+ * Now collect the bits so they can be printed.
+ */
+ for (miny = sy; eof != EOF && miny >= ey; miny--) {
+ for (idx = 0, minx = sx; eof != EOF && minx <= ex; minx++) {
+ if (minx > sx && ((minx - sx) & 7) == 0) {
+ /*
+ * Print the next byte.
+ */
+ eof = fprintf(tmp, "%02lX", idx & 0xff);
+ idx = 0;
+ }
+ if (bmap[(miny * raster.cols) + (minx >> 3)] &
+ (0x80 >> (minx & 7)))
+ idx |= 0x80 >> ((minx - sx) & 7);
+ }
+ if (eof != EOF)
+ /*
+ * Because of the structure of the loop, the last byte should
+ * always be printed.
+ */
+ fprintf(tmp, "%02lX\n", idx & 0xff);
+ }
+ if (eof != EOF)
+ fprintf(tmp, "ENDCHAR\n");
+ }
+
+ fclose(tmp);
+
+ /*
+ * If a write error occured, delete the temporary file and issue an error
+ * message.
+ */
+ if (eof == EOF) {
+ (void) unlink(tmpfile);
+ fprintf(stderr, "%s: problem writing to temporary file '%s'.\n",
+ prog, tmpfile);
+ if (raster.size > 0)
+ free((char *) raster.bitmap);
+ return -1;
+ }
+
+ /*
+ * If no characters were generated, just unlink the temp file and issue a
+ * warning.
+ */
+ if (ng == 0) {
+ (void) unlink(tmpfile);
+ fprintf(stderr, "%s: no glyphs generated from '%s'.\n", prog, iname);
+ if (raster.size > 0)
+ free((char *) raster.bitmap);
+ return -1;
+ }
+
+ /*
+ * Reopen the temporary file so it can be copied to the actual output
+ * file.
+ */
+ if ((tmp = fopen(tmpfile, "r")) == 0) {
+ /*
+ * Unable to open the file for read, so attempt to delete it and issue
+ * an error message.
+ */
+ (void) unlink(tmpfile);
+ fprintf(stderr, "%s: unable to open temporary file '%s' for read.\n",
+ prog, tmpfile);
+ if (raster.size > 0)
+ free((char *) raster.bitmap);
+ return -1;
+ }
+
+ /*
+ * Free up the raster storage.
+ */
+ if (raster.size > 0)
+ free((char *) raster.bitmap);
+
+ /*
+ * Calculate the average width.
+ */
+ aw = (TT_Long) ((((double) aw / (double) ng) + 0.5) * 10.0);
+
+ /*
+ * Generate the XLFD font name.
+ */
+ make_xlfd_name(xlfd, aw, ismono);
+
+ /*
+ * Start writing the font out.
+ */
+ fprintf(out, "STARTFONT 2.1\n");
+
+ /*
+ * Add the vanity comments.
+ */
+ fprintf(out, "COMMENT\n");
+ fprintf(out, "COMMENT Converted from TrueType font \"%s\" by \"%s %s\".\n",
+ iname, prog, TTF2BDF_VERSION);
+ fprintf(out, "COMMENT\n");
+
+ fprintf(out, "FONT %s\n", xlfd);
+ fprintf(out, "SIZE %d %d %d\n", point_size, hres, vres);
+
+ /*
+ * Generate the font bounding box.
+ */
+ fprintf(out, "FONTBOUNDINGBOX %hd %hd %hd %hd\n",
+ bbx.maxrb - bbx.minlb, bbx.maxas + bbx.maxds,
+ bbx.minlb, -bbx.maxds);
+
+ /*
+ * Print the properties.
+ */
+ fprintf(out, "STARTPROPERTIES 19\n");
+
+ /*
+ * Print the font properties from the XLFD name.
+ */
+ for (i = 0, xp = xlfd; i < 14; i++) {
+ /*
+ * Print the XLFD property name.
+ */
+ fprintf(out, "%s ", xlfd_props[i]);
+
+ /*
+ * Make sure the ATOM properties are wrapped in double quotes.
+ */
+ if (i < 6 || i == 10 || i > 11)
+ putc('"', out);
+
+ /*
+ * Skip the leading '-' in the XLFD name.
+ */
+ xp++;
+
+ /*
+ * Skip until the next '-' or NULL.
+ */
+ for (; *xp && *xp != '-'; xp++)
+ putc(*xp, out);
+
+ /*
+ * Make sure the ATOM properties are wrapped in double quotes.
+ */
+ if (i < 6 || i == 10 || i > 11)
+ putc('"', out);
+
+ putc('\n', out);
+ }
+
+ /*
+ * Make sure to add the FONT_ASCENT and FONT_DESCENT properties
+ * because X11 can not live without them.
+ */
+ fprintf(out, "FONT_ASCENT %hd\nFONT_DESCENT %hd\n",
+ (properties.horizontal->Ascender * imetrics.y_ppem) / upm,
+ -((properties.horizontal->Descender * imetrics.y_ppem) / upm));
+
+ /*
+ * Get the copyright string from the font.
+ */
+ (void) ttf_get_english_name(xlfd, TTF_COPYRIGHT, 0);
+ fprintf(out, "COPYRIGHT \"%s\"\n", xlfd);
+
+ /*
+ * Last, print the two user-defined properties _TTF_FONTFILE and
+ * _TTF_PSNAME. _TTF_FONTFILE provides a reference to the original TT
+ * font file which some systems can take advantage of, and _TTF_PSNAME
+ * provides the Postscript name of the font if it exists.
+ */
+ (void) ttf_get_english_name(xlfd, TTF_PSNAME, 0);
+ fprintf(out, "_TTF_FONTFILE \"%s\"\n_TTF_PSNAME \"%s\"\n", iname, xlfd);
+
+ fprintf(out, "ENDPROPERTIES\n");
+
+ /*
+ * Print the actual number of glyphs to the output file.
+ */
+ eof = fprintf(out, "CHARS %ld\n", ng);
+
+ /*
+ * Copy the temporary file to the output file.
+ */
+ while (eof != EOF && (ng = fread(iobuf, 1, TTF2BDF_IOBUFSIZ, tmp))) {
+ if (fwrite(iobuf, 1, ng, out) == 0)
+ eof = EOF;
+ }
+
+ /*
+ * Close the temporary file and delete it.
+ */
+ fclose(tmp);
+ (void) unlink(tmpfile);
+
+ /*
+ * If an error occured when writing to the output file, issue a warning
+ * and return.
+ */
+ if (eof == EOF) {
+ fprintf(stderr, "%s: problem writing to output file '%s'.\n",
+ prog, oname);
+ if (raster.size > 0)
+ free((char *) raster.bitmap);
+ return -1;
+ }
+
+ /*
+ * End the font and do memory cleanup on the glyph and raster structures.
+ */
+ eof = fprintf(out, "ENDFONT\n");
+
+ return eof;
+}
+
+static int
+#ifdef __STDC__
+generate_bdf(FILE *out, char *iname, char *oname)
+#else
+generate_bdf(out, iname, oname)
+FILE *out;
+char *iname, *oname;
+#endif
+{
+ TT_Long i;
+ TT_Short p, e;
+
+ /*
+ * Get the requested cmap.
+ */
+ for (i = 0; i < TT_Get_CharMap_Count(face); i++) {
+ if (!TT_Get_CharMap_ID(face, i, &p, &e) &&
+ p == pid && e == eid)
+ break;
+ }
+ if (i == TT_Get_CharMap_Count(face) && pid == 3 && eid == 1) {
+ /*
+ * Make a special case when this fails with pid == 3 and eid == 1.
+ * Change to eid == 0 and try again. This captures the two possible
+ * cases for MS fonts. Some other method should be used to cycle
+ * through all the alternatives later.
+ */
+ for (i = 0; i < TT_Get_CharMap_Count(face); i++) {
+ if (!TT_Get_CharMap_ID(face, i, &p, &e) &&
+ p == pid && e == 0)
+ break;
+ }
+ if (i < TT_Get_CharMap_Count(face)) {
+ if (!TT_Get_CharMap(face, i, &cmap))
+ eid = 0;
+ else
+ nocmap = 1;
+ }
+ } else {
+ /*
+ * A CMap was found for the platform and encoding IDs.
+ */
+ if (i < TT_Get_CharMap_Count(face) && TT_Get_CharMap(face, i, &cmap))
+ nocmap = 1;
+ else
+ nocmap = 0;
+ }
+
+ if (nocmap && verbose) {
+ fprintf(stderr,
+ "%s: no character map for platform %d encoding %d. ",
+ prog, pid, eid);
+ fprintf(stderr, "Generating all glyphs.\n");
+ }
+
+ /*
+ * Now go through and generate the glyph bitmaps themselves.
+ */
+ return generate_font(out, iname, oname);
+}
+
+#define isdig(cc) ((cc) >= '0' && (cc) <= '9')
+
+/*
+ * Routine to parse a subset specification supplied on the command line.
+ * The syntax for this specification is the same as the syntax used for
+ * the XLFD font names (XLFD documentation, page 9).
+ *
+ * Example:
+ *
+ * "60 70 80_90" means the glyphs at codes 60, 70, and between 80 and
+ * 90 inclusive.
+ */
+static void
+#ifdef __STDC__
+parse_subset(char *s)
+#else
+parse_subset(s)
+char *s;
+#endif
+{
+ long l, r;
+
+ /*
+ * Make sure to clear the flag and bitmap in case more than one subset is
+ * specified on the command line.
+ */
+ maxcode = 0;
+ do_subset = 0;
+ (void) memset((char *) subset, 0, sizeof(unsigned long) * 2048);
+
+ while (*s) {
+ /*
+ * Collect the next code value.
+ */
+ for (l = r = 0; *s && isdig(*s); s++)
+ l = (l * 10) + (*s - '0');
+
+ /*
+ * If the next character is an '_', advance and collect the end of the
+ * specified range.
+ */
+ if (*s == '_') {
+ s++;
+ for (; *s && isdig(*s); s++)
+ r = (r * 10) + (*s - '0');
+ } else
+ r = l;
+
+ /*
+ * Add the range just collected to the subset bitmap and set the flag
+ * that indicates a subset is wanted.
+ */
+ for (; l <= r; l++) {
+ do_subset = 1;
+ subset[l >> 5] |= (1 << (l & 31));
+ if (l > maxcode)
+ maxcode = l;
+ }
+
+ /*
+ * Skip all non-digit characters.
+ */
+ while (*s && !isdig(*s))
+ s++;
+ }
+}
+
+static void
+#ifdef __STDC__
+usage(int eval)
+#else
+usage(eval)
+int eval;
+#endif
+{
+ fprintf(stderr, "Usage: %s [options below] font.ttf\n", prog);
+ fprintf(stderr, "-h\t\tThis message.\n");
+ fprintf(stderr, "-v\t\tPrint warning messages during conversion.\n");
+ fprintf(stderr,
+ "-l \"subset\"\tSpecify a subset of glyphs to generate.\n");
+ fprintf(stderr, "-m mapfile\tGlyph reencoding file.\n");
+ fprintf(stderr, "-n\t\tTurn off glyph hinting.\n");
+ fprintf(stderr,
+ "-c c\t\tSet the character spacing (default: from font).\n");
+ fprintf(stderr,
+ "-f name\t\tSet the foundry name (default: freetype).\n");
+ fprintf(stderr,
+ "-t name\t\tSet the typeface name (default: from font).\n");
+ fprintf(stderr, "-w name\t\tSet the weight name (default: Medium).\n");
+ fprintf(stderr, "-s name\t\tSet the slant name (default: R).\n");
+ fprintf(stderr, "-k name\t\tSet the width name (default: Normal).\n");
+ fprintf(stderr,
+ "-d name\t\tSet the additional style name (default: empty).\n");
+ fprintf(stderr, "-u char\t\tSet the character to replace '-' in names ");
+ fprintf(stderr, "(default: space).\n");
+ fprintf(stderr,
+ "-pid id\t\tSet the platform ID for encoding (default: %d).\n",
+ DEFAULT_PLATFORM_ID);
+ fprintf(stderr,
+ "-eid id\t\tSet the encoding ID for encoding (default: %d).\n",
+ DEFAULT_ENCODING_ID);
+ fprintf(stderr, "-p n\t\tSet the point size (default: %dpt).\n",
+ DEFAULT_POINT_SIZE);
+ fprintf(stderr, "-r n\t\tSet the horizontal and vertical resolution ");
+ fprintf(stderr, "(default: %ddpi).\n", DEFAULT_RESOLUTION);
+ fprintf(stderr, "-rh n\t\tSet the horizontal resolution ");
+ fprintf(stderr, "(default: %ddpi)\n", DEFAULT_RESOLUTION);
+ fprintf(stderr, "-rv n\t\tSet the vertical resolution ");
+ fprintf(stderr, "(default: %ddpi)\n", DEFAULT_RESOLUTION);
+ fprintf(stderr,
+ "-o outfile\tSet the output filename (default: stdout).\n");
+ exit(eval);
+}
+
+void
+#ifdef __STDC__
+main(int argc, char *argv[])
+#else
+main(argc, argv)
+int argc;
+char *argv[];
+#endif
+{
+ int res;
+ char *infile, *outfile, *iname, *oname;
+ FILE *out, *mapin;
+
+ if ((prog = strrchr(argv[0], '/')))
+ prog++;
+ else
+ prog = argv[0];
+
+ out = stdout;
+ infile = outfile = 0;
+
+ argc--;
+ argv++;
+
+ while (argc > 0) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'v': case 'V':
+ verbose = 1;
+ break;
+ case 'l': case 'L':
+ argc--;
+ argv++;
+ parse_subset(argv[0]);
+ break;
+ case 'n': case 'N':
+ load_flags &= ~TTLOAD_HINT_GLYPH;
+ break;
+ case 'c': case 'C':
+ argc--;
+ argv++;
+ spacing = argv[0][0];
+ break;
+ case 't': case 'T':
+ argc--;
+ argv++;
+ face_name = argv[0];
+ break;
+ case 'w': case 'W':
+ argc--;
+ argv++;
+ weight_name = argv[0];
+ break;
+ case 's': case 'S':
+ argc--;
+ argv++;
+ slant_name = argv[0];
+ break;
+ case 'k': case 'K':
+ argc--;
+ argv++;
+ width_name = argv[0];
+ break;
+ case 'd': case 'D':
+ argc--;
+ argv++;
+ style_name = argv[0];
+ break;
+ case 'f': case 'F':
+ argc--;
+ argv++;
+ foundry_name = argv[0];
+ break;
+ case 'u': case 'U':
+ argc--;
+ argv++;
+ dashchar = argv[0][0];
+ break;
+ case 'p': case 'P':
+ res = argv[0][2];
+ argc--;
+ argv++;
+ if (res == 'i' || res == 'I')
+ /*
+ * Set the platform ID.
+ */
+ pid = atoi(argv[0]);
+ else
+ /*
+ * Set the point size.
+ */
+ point_size = atoi(argv[0]);
+ break;
+ case 'e': case 'E':
+ /*
+ * Set the encoding ID.
+ */
+ argc--;
+ argv++;
+ eid = atoi(argv[0]);
+ break;
+ case 'r':
+ /*
+ * Set the horizontal and vertical resolutions.
+ */
+ if (argv[0][2] == 'h')
+ hres = atoi(argv[1]);
+ else if (argv[0][2] == 'v')
+ vres = atoi(argv[1]);
+ else
+ hres = vres = atoi(argv[1]);
+ argc--;
+ argv++;
+ break;
+ case 'm': case 'M':
+ /*
+ * Try to load a remap table.
+ */
+ argc--;
+ argv++;
+
+ /*
+ * Always reset the `do_remap' variable here in case more than
+ * one map file appears on the command line.
+ */
+ do_remap = 0;
+ if ((mapin = fopen(argv[0], "r")) == 0)
+ fprintf(stderr, "%s: unable to open the remap table '%s'.\n",
+ prog, argv[0]);
+ else {
+ if (ttf2bdf_load_map(mapin) < 0) {
+ fprintf(stderr,
+ "%s: problem loading remap table '%s'.\n",
+ prog, argv[0]);
+ do_remap = 0;
+ } else
+ do_remap = 1;
+ fclose(mapin);
+ }
+ break;
+ case 'o': case 'O':
+ /*
+ * Set the output file name.
+ */
+ argc--;
+ argv++;
+ outfile = argv[0];
+ break;
+ default:
+ usage(1);
+ }
+ } else
+ /*
+ * Set the input file name.
+ */
+ infile = argv[0];
+
+ argc--;
+ argv++;
+ }
+
+ /*
+ * Validate the values passed on the command line.
+ */
+ if (infile == 0) {
+ fprintf(stderr, "%s: no input file provided.\n", prog);
+ usage(1);
+ }
+ /*
+ * Set the input filename that will be passed to the generator
+ * routine.
+ */
+ if ((iname = strrchr(infile, '/')))
+ iname++;
+ else
+ iname = infile;
+
+ /*
+ * Check the platform and encoding IDs.
+ */
+ if (pid < 0 || pid > 255) {
+ fprintf(stderr, "%s: invalid platform ID '%d'.\n", prog, pid);
+ exit(1);
+ }
+ if (eid < 0 || eid > 65535) {
+ fprintf(stderr, "%s: invalid encoding ID '%d'.\n", prog, eid);
+ exit(1);
+ }
+
+ /*
+ * Arbitrarily limit the point size to a minimum of 2pt and maximum of
+ * 256pt.
+ */
+ if (point_size < 2 || point_size > 256) {
+ fprintf(stderr, "%s: invalid point size '%dpt'.\n", prog, point_size);
+ exit(1);
+ }
+
+ /*
+ * Arbitrarily limit the resolutions to a minimum of 50dpi and a maximum
+ * of 1200dpi.
+ */
+ if (hres < 50 || hres > 1200) {
+ fprintf(stderr, "%s: invalid horizontal resolution '%ddpi'.\n",
+ prog, hres);
+ exit(1);
+ }
+ if (vres < 50 || vres > 1200) {
+ fprintf(stderr, "%s: invalid vertical resolution '%ddpi'.\n",
+ prog, vres);
+ exit(1);
+ }
+
+ /*
+ * Open the output file if specified.
+ */
+ if (outfile != 0) {
+ /*
+ * Attempt to open the output file.
+ */
+ if ((out = fopen(outfile, "w")) == 0) {
+ fprintf(stderr, "%s: unable to open the output file '%s'.\n",
+ prog, outfile);
+ exit(1);
+ }
+ /*
+ * Set the output filename to be passed to the generator routine.
+ */
+ if ((oname = strrchr(outfile, '/')))
+ oname++;
+ else
+ oname = outfile;
+ } else
+ /*
+ * Set the default output file name to <stdout>.
+ */
+ oname = "<stdout>";
+
+ /*
+ * Intialize Freetype.
+ */
+ if ((res = TT_Init_FreeType(&engine))) {
+ /*
+ * Close the output file.
+ */
+ if (out != stdout) {
+ fclose(out);
+ (void) unlink(outfile);
+ }
+ fprintf(stderr, "%s[%d]: unable to initialize renderer.\n",
+ prog, res);
+ exit(1);
+ }
+
+ /*
+ * Open the input file.
+ */
+ if ((res = TT_Open_Face(engine, infile, &face))) {
+ if (out != stdout) {
+ fclose(out);
+ (void) unlink(outfile);
+ }
+ fprintf(stderr, "%s[%d]: unable to open input file '%s'.\n",
+ prog, res, infile);
+ exit(1);
+ }
+
+ /*
+ * Create a new instance.
+ */
+ if ((res = TT_New_Instance(face, &instance))) {
+ (void) TT_Close_Face(face);
+ if (out != stdout) {
+ fclose(out);
+ (void) unlink(outfile);
+ }
+ fprintf(stderr, "%s[%d]: unable to create instance.\n",
+ prog, res);
+ exit(1);
+ }
+
+ /*
+ * Set the instance resolution and point size and the relevant
+ * metrics.
+ */
+ (void) TT_Set_Instance_Resolutions(instance, hres, vres);
+ (void) TT_Set_Instance_CharSize(instance, point_size*64);
+ (void) TT_Get_Instance_Metrics(instance, &imetrics);
+
+ /*
+ * Get the face properties and set the global units per em value for
+ * convenience.
+ */
+ (void) TT_Get_Face_Properties(face, &properties);
+ upm = properties.header->Units_Per_EM;
+
+ /*
+ * Create a new glyph container.
+ */
+ if ((res = TT_New_Glyph(face, &glyph))) {
+ (void) TT_Done_Instance(instance);
+ (void) TT_Close_Face(face);
+ if (out != stdout) {
+ fclose(out);
+ (void) unlink(outfile);
+ }
+ fprintf(stderr, "%s[%d]: unable to create glyph.\n",
+ prog, res);
+ exit(1);
+ }
+
+ /*
+ * Generate the BDF font from the TrueType font.
+ */
+ res = generate_bdf(out, iname, oname);
+
+ /*
+ * Free up the mapping table if one was loaded.
+ */
+ ttf2bdf_free_map();
+
+ /*
+ * Close the input and output files.
+ */
+ (void) TT_Close_Face(face);
+ if (out != stdout) {
+ fclose(out);
+ if (res < 0)
+ /*
+ * An error occured when generating the font, so delete the
+ * output file.
+ */
+ (void) unlink(outfile);
+ }
+
+ /*
+ * Shut down the renderer.
+ */
+ (void) TT_Done_FreeType(engine);
+
+ exit(res);
+}
diff --git a/xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.man b/xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.man
new file mode 100644
index 000000000..ccdc18428
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2bdf/ttf2bdf.man
@@ -0,0 +1,190 @@
+.\"
+.\" $Id: ttf2bdf.man,v 1.1.1.1 1999/12/05 01:23:20 daryll Exp $
+.\"
+.TH TTF2BDF 1 "26 June 1998" "X Version 11"
+.SH NAME
+ttf2bdf \- TrueType to BDF font converter
+
+.SH SYNOPSIS
+.B ttf2bdf
+[\fIoptions\fP] [\fIfont.ttf\fP]
+
+.SH DESCRIPTION
+.I ttf2bdf
+will convert a TrueType font to a BDF font using the FreeType renderer.
+
+.SH OPTIONS
+.I ttf2bdf
+accepts the following command line arguments:
+
+.PP
+.TP 8
+.I -v
+print warning messages when the font is converted.
+.PP
+.TP 8
+.I -p n
+set the desired point size (see default value by running the program with the
+-h option).
+.PP
+.TP 8
+.I -r n
+set both the horizontal and the vertical resolution (see default value by
+running the program with the -h option).
+.PP
+.TP 8
+.I -rh n
+set the horizontal resolution (see default value by running the program with
+the -h option).
+.PP
+.TP 8
+.I -rv n
+set the vertical resolution (see default value by running the program with
+the -h option).
+.PP
+.TP 8
+.I -o outfile
+sets the output filename (default output is to stdout).
+.PP
+.TP 8
+.I -pid id
+set the platform id for selecting the character map (see default value by
+running the program with the -h option).
+.PP
+.TP 8
+.I -eid id
+set the encoding id for selecting the character map (see default value by
+running the program with the -h option).
+.PP
+.TP 8
+.I -c c
+set the character spacing. This should be one of `P' for proportional,
+`M' for monospace, or `C' for character cell. By default, the spacing
+of a font will be automatically determined to be either `M' or `P'
+according to values provided in the font.
+.PP
+.TP 8
+.I -f name
+set the foundry name used in the XLFD name. The default value is
+`Freetype'.
+.PP
+.TP 8
+.I -t name
+set the typeface name used in the XLFD name. By default,
+.I ttf2bdf
+will attempt to get a name from the font first and then it will use the
+name supplied with this command line option, and if all else fails, it
+will use the name `Unknown'.
+.PP
+.TP 8
+.I -w name
+set the weight name used in the XLFD name. If this value is not
+supplied, the default value is assumed to be `Medium'. Some common
+values for this are `Thin', `Delicate', `ExtraLight', `Light', `Normal',
+`Medium', `SemiCondensed', `Condensed', `SemiBold', `Bold', `Heavy',
+`ExtraBold', and `ExtraHeavy'.
+.PP
+.TP 8
+.I -s name
+set the slant name used in the XLFD name. If this value is not
+supplied, the default value is assumed to be `R', for Roman. Some common
+values for this are `R' for Roman, `I' for Italic, `O' for Oblique, `RI'
+for Reverse Italic, and `RO' for Reverse Oblique.
+.PP
+.TP 8
+.I -k name
+set the width name used in the XLFD name. The default is `Normal'.
+.PP
+.TP 8
+.I -d name
+set the additional style name used in the XLFD name. The default is an empty
+string.
+.PP
+.TP 8
+.I -u char
+set the character used to replace the dashes/spaces in a font name. The
+default is the space character.
+.PP
+.TP 8
+.I -l subset
+define a list of character codes which will be used to select a subset
+of glyphs from the font. The syntax of the subset string is the same
+as the syntax for selecting subsets in X11 XLFD font names. Example:
+.sp
+% ttf2bdf -l '60 70 80_90' font.ttf -o font.bdf
+.sp
+The command above will only generate the glyphs for codes 60, 70, and 80
+through 90 inclusive. Glyphs that are not in the subset are not
+generated.
+.PP
+.TP 8
+.I -m mapfile
+specifies a mapping file which will reencode the BDF font when it is
+generated. Any glyphs with codes that do not have a mapping will not
+be generated.
+.sp
+The remapping file should begin with two lines, one which starts with
+REGISTRY followed by the character set registry and one which starts
+with ENCODING followed by the encoding. An example from the
+iso8859.2 file:
+.sp
+REGISTRY ISO8859
+.br
+ENCODING 2
+.sp
+The remapping data should be two columns of hexadecimal numbers,
+separated by spaces or tabs. The first column should be the hexadecimal
+code of the glyph in the "cmap" table ttf2bdf is using. The second
+column should have the code which should be used in the BDF font. An
+example mapping file is provided which will map fonts from Unicode
+(default cmap table) to ISO8859-2.
+.sp
+Unicode is not the only option. If you choose another platform and
+encoding ID on the command line, then the remapping is assumed to map
+from the chosen platform and encoding to some other character set.
+
+.SH "SEE ALSO"
+xmbdfed(1), xfed(1), bdftopcf(1), bdftosnf(1)
+.br
+\fIGlyph Bitmap Distribution Format (BDF) Specification\fP, Application
+Note 5005, Adobe System Inc, 1993
+.br
+\fIX Logical Font Description Conventions\fP, X Consortium
+
+.SH ACKNOWLEDGMENTS
+
+The FreeType project for providing the renderer!
+.br
+Robert Wilhelm <robert@physiol.med.tu-muenchen.de> for pointing out a
+crucial problem with the pre-1.0 code.
+.br
+Lho Li-Da <ollie@ms1.hinet.net> for problem reports.
+.br
+Adrian Havill <havill@threeweb.ad.jp> for unintentionally pointing out a
+missing feature.
+.br
+Richard Verhoeven <rcb5@win.tue.nl> for problem reports and patches.
+.br
+Choi Jun Ho <junker@jazz.snu.ac.kr> whose implementation provided some
+nice new features.
+.br
+Pavel Kankovsky <peak@kerberos.troja.mff.cuni.cz> for providing some
+critical metrics fixes and other improvements.
+.br
+Matti Koskinen <mjkoskin@sci.fi> for pointing out a problem.
+.br
+Eugene Bobin <gene@ftim.ustu.ru> for mapping tables and shell scripts.
+.br
+Oleg N. Yakovlev <yashka@optima.dnepropetrovsk.ua> for pointing out a problem.
+.br
+Bertrand Petit <elrond@phoe.frmug.org> for additional functionality.
+.br
+Roman Czyborra <czyborra@cs.tu-berlin.de> for pointing out some problems.
+.SH AUTHOR
+Mark Leisher
+.br
+Computing Research Lab
+.br
+New Mexico State University
+.br
+Email: mleisher@crl.nmsu.edu
diff --git a/xc/extras/FreeType/contrib/ttf2pfb/TODO b/xc/extras/FreeType/contrib/ttf2pfb/TODO
new file mode 100644
index 000000000..51788ec94
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pfb/TODO
@@ -0,0 +1,35 @@
+ttf2pfb is oriented towards support for CJK fonts containing several
+thousand glyphs to be splitted into subfonts with 256 characters each usable
+by TeX. Nevertheless, it is quite generic and works with normal ttf files
+too.
+
+Some features are still missing (to make it really useful for non-CJK
+fonts) or should be added for convenience:
+
+ Dokumentation. ttf2pbf explains itself; t1asm is a filter which converts
+ the (disassembled) pseudo font created by ttf2pfb into a real .pfa font (or
+ .pfb if you use the `-b' command line switch).
+
+ Creation of afm files to have kerning data.
+
+ Inclusion of t1asm and t1binary into ttf2pfb so that ttf2pfb can directly
+ produce .pfa and pfb files.
+
+ Support for glyph names (currently glyph names are /cjk003f etc).
+
+ A more flexible encoding file format (maybe similar to ttf2tfm) which can
+ handle glyph names.
+
+ Makefile, configure. Currently you have to compile all tools manually with
+
+ gcc -O -g -DDEBUG -o ttf2pfb ttf2pfb.c -lttf
+ gcc -O -g -o t1asm t1asm.c
+
+ If you get an error message about `undefined reference to dgettext' while
+ compiling ttf2pfb, append `-lintl' to the compiling command.
+
+ [t1asm has been slightly patched to allow partial font downloading with
+ dvips.]
+
+ Note that compiling ttf2pfb with `-O2' doesn't work, most probably due to
+ a compiler bug (we've tested with gcc 2.7.2.1 and 2.7.2.3).
diff --git a/xc/extras/FreeType/contrib/ttf2pfb/t1asm.c b/xc/extras/FreeType/contrib/ttf2pfb/t1asm.c
new file mode 100644
index 000000000..5b63aab06
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pfb/t1asm.c
@@ -0,0 +1,529 @@
+/* t1asm
+**
+** This program `assembles' Adobe Type-1 font programs in pseudo-PostScript
+** form into either PFB or PFA format. The human readable/editable input is
+** charstring- and eexec-encrypted as specified in the `Adobe Type 1 Font
+** Format' version 1.1 (the `black book'). There is a companion program,
+** t1disasm, which `disassembles' PFB and PFA files into a pseudo-PostScript
+** file.
+**
+** Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.
+**
+** Permission is hereby granted to use, modify, and distribute this program
+** for any purpose provided this copyright notice and the one below remain
+** intact.
+**
+** author: I. Lee Hetherington (ilh@lcs.mit.edu)
+*/
+
+#ifndef lint
+static char sccsid[] =
+ "@(#) t1asm.c 1.2 10:09:46 5/22/92";
+static char copyright[] =
+ "@(#) Copyright (c) 1992 by I. Lee Hetherington, all rights reserved.";
+#endif
+
+/* Note: this is ANSI C. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef MSDOS
+#define WB "wb"
+#else
+#define WB "w"
+#endif
+
+#define BANNER "This is t1asm 1.2.\n"
+#define LINESIZE 256
+
+#define MAXBLOCKLEN ((1<<17)-6)
+#define MINBLOCKLEN ((1<<8)-6)
+
+#define MARKER 128
+#define ASCII 1
+#define BINARY 2
+#define DONE 3
+
+typedef unsigned char byte;
+
+static FILE *ifp = stdin;
+static FILE *ofp = stdout;
+
+/* flags */
+static int pfb = 0;
+static int active = 0;
+static int start_charstring = 0;
+static int in_eexec = 0;
+
+static char line[LINESIZE + 1];
+
+/* lenIV and charstring start command */
+static int lenIV = 4;
+static char cs_start[10];
+
+/* for charstring buffering */
+static byte charstring_buf[65535];
+static byte *charstring_bp;
+
+/* for PFB block buffering */
+static byte blockbuf[MAXBLOCKLEN];
+static int blocklen = MAXBLOCKLEN;
+static int blockpos = -1;
+static int blocktyp = ASCII;
+
+/* decryption stuff */
+static unsigned short er, cr;
+static unsigned short c1 = 52845, c2 = 22719;
+
+/* table of charstring commands */
+static struct command {
+ char *name;
+ int one, two;
+} command_table[] = {
+ { "callothersubr", 12, 16 },
+ { "callsubr", 10, -1 },
+ { "closepath", 9, -1 },
+ { "div", 12, 12 },
+ { "dotsection", 12, 0 },
+ { "endchar", 14, -1 },
+ { "escape", 12, -1 },
+ { "hlineto", 6, -1 },
+ { "hmoveto", 22, -1 },
+ { "hsbw", 13, -1 },
+ { "hstem", 1, -1 },
+ { "hstem3", 12, 2 },
+ { "hvcurveto", 31, -1 },
+ { "pop", 12, 17 },
+ { "return", 11, -1 },
+ { "rlineto", 5, -1 },
+ { "rmoveto", 21, -1 },
+ { "rrcurveto", 8, -1 },
+ { "sbw", 12, 7 },
+ { "seac", 12, 6 },
+ { "setcurrentpoint", 12, 33 },
+ { "vhcurveto", 30, -1 },
+ { "vlineto", 7, -1 },
+ { "vmoveto", 4, -1 },
+ { "vstem", 3, -1 },
+ { "vstem3", 12, 1 },
+}; /* alphabetical */
+
+/* Two separate decryption functions because eexec and charstring decryption
+ must proceed in parallel. */
+
+static byte eencrypt(byte plain)
+{
+ byte cipher;
+
+ cipher = (plain ^ (er >> 8));
+ er = (cipher + er) * c1 + c2;
+ return cipher;
+}
+
+static byte cencrypt(byte plain)
+{
+ byte cipher;
+
+ cipher = (plain ^ (cr >> 8));
+ cr = (cipher + cr) * c1 + c2;
+ return cipher;
+}
+
+/* This function flushes a buffered PFB block. */
+
+static void output_block()
+{
+ int i;
+
+ /* output four-byte block length */
+ fputc(blockpos & 0xff, ofp);
+ fputc((blockpos >> 8) & 0xff, ofp);
+ fputc((blockpos >> 16) & 0xff, ofp);
+ fputc((blockpos >> 24) & 0xff, ofp);
+
+ /* output block data */
+ for (i = 0; i < blockpos; i++)
+ fputc(blockbuf[i], ofp);
+
+ /* mark block buffer empty and uninitialized */
+ blockpos = -1;
+}
+
+/* This function outputs a single byte. If output is in PFB format then output
+ is buffered through blockbuf[]. If output is in PFA format, then output
+ will be hexadecimal if in_eexec is set, ASCII otherwise. */
+
+static void output_byte(byte b)
+{
+ static char *hexchar = "0123456789ABCDEF";
+ static int hexcol = 0;
+
+ if (pfb) {
+ /* PFB */
+ if (blockpos < 0) {
+ fputc(MARKER, ofp);
+ fputc(blocktyp, ofp);
+ blockpos = 0;
+ }
+ blockbuf[blockpos++] = b;
+ if (blockpos == blocklen)
+ output_block();
+ } else {
+ /* PFA */
+ if (in_eexec) {
+ /* trim hexadecimal lines to 64 columns */
+ if (hexcol >= 64) {
+ fputc('\n', ofp);
+ hexcol = 0;
+ }
+ fputc(hexchar[(b >> 4) & 0xf], ofp);
+ fputc(hexchar[b & 0xf], ofp);
+ hexcol += 2;
+ } else {
+ fputc(b, ofp);
+ }
+ }
+}
+
+/* This function outputs a byte through possible eexec encryption. */
+
+static void eexec_byte(byte b)
+{
+ if (in_eexec)
+ output_byte(eencrypt(b));
+ else
+ output_byte(b);
+}
+
+/* This function outputs a null-terminated string through possible eexec
+ encryption. */
+
+static void eexec_string(char *string)
+{
+ while (*string)
+ eexec_byte((byte) *string++);
+}
+
+/* This function gets ready for the eexec-encrypted data. If output is in
+ PFB format then flush current ASCII block and get ready for binary block.
+ We start encryption with four random (zero) bytes. */
+
+static void eexec_start()
+{
+ eexec_string(line);
+ if (pfb) {
+ output_block();
+ blocktyp = BINARY;
+ }
+
+ in_eexec = 1;
+ er = 55665;
+ eexec_byte(0);
+ eexec_byte(0);
+ eexec_byte(0);
+ eexec_byte(0);
+}
+
+/* This function wraps-up the eexec-encrypted data and writes ASCII trailer.
+ If output is in PFB format then this entails flushing binary block and
+ starting an ASCII block. */
+
+static void eexec_end()
+{
+ int i, j;
+
+ if (pfb) {
+ output_block();
+ blocktyp = ASCII;
+ } else {
+ fputc('\n', ofp);
+ }
+ in_eexec = 0;
+ for (i = 0; i < 7; i++) {
+ for (j = 0; j < 64; j++)
+ eexec_byte('0');
+ eexec_byte('\n');
+ }
+ eexec_string("cleartomark\n");
+ if (pfb) {
+ output_block();
+ fputc(MARKER, ofp);
+ fputc(DONE, ofp);
+ }
+}
+
+/* This function returns an input line of characters. A line is terminated by
+ length (including terminating null) greater than LINESIZE, a newline \n, or
+ when active (looking for charstrings) by '{'. When terminated by a newline
+ the newline is put into line[]. When terminated by '{', the '{' is not put
+ into line[], and the flag start_charstring is set to 1. */
+
+static void getline()
+{
+ int c;
+ char *p = line;
+ int comment = 0;
+
+ start_charstring = 0;
+ while (p < line + LINESIZE) {
+ c = fgetc(ifp);
+ if (c == EOF)
+ break;
+ if (c == '%')
+ comment = 1;
+ if (active && !comment && c == '{') {
+ start_charstring = 1;
+ break;
+ }
+ *p++ = (char) c;
+ if (c == '\n')
+ break;
+ }
+ *p = '\0';
+}
+
+/* This function is used by the binary search, bsearch(), for command names in
+ the command table. */
+
+static int command_compare(const void *key, const void *item)
+{
+ return strcmp((char *) key, ((struct command *) item)->name);
+}
+
+/* This function returns 1 if the string is an integer and 0 otherwise. */
+
+static int is_integer(char *string)
+{
+ if (isdigit(string[0]) || string[0] == '-' || string[0] == '+') {
+ while (*++string && isdigit(*string))
+ ; /* deliberately empty */
+ if (!*string)
+ return 1;
+ }
+ return 0;
+}
+
+/* This function initializes charstring encryption. Note that this is called
+ at the beginning of every charstring. */
+
+static void charstring_start()
+{
+ int i;
+
+ charstring_bp = charstring_buf;
+ cr = 4330;
+ for (i = 0; i < lenIV; i++)
+ *charstring_bp++ = cencrypt((byte) 0);
+}
+
+/* This function encrypts and buffers a single byte of charstring data. */
+
+static void charstring_byte(v)
+ int v;
+{
+ byte b = ((unsigned int)v) & 0xff;
+
+ if (charstring_bp - charstring_buf > sizeof(charstring_buf)) {
+ fprintf(stderr, "error: charstring_buf full (%d bytes)\n",
+ sizeof(charstring_buf));
+ exit(1);
+ }
+ *charstring_bp++ = cencrypt(b);
+}
+
+/* This function outputs buffered, encrypted charstring data through possible
+ eexec encryption. */
+
+static void charstring_end()
+{
+ byte *bp;
+
+ sprintf(line, "%d %s ", charstring_bp - charstring_buf, cs_start);
+ eexec_string(line);
+ for (bp = charstring_buf; bp < charstring_bp; bp++)
+ eexec_byte(*bp);
+}
+
+/* This function generates the charstring representation of an integer. */
+
+static void charstring_int(int num)
+{
+ int x;
+
+ if (num >= -107 && num <= 107) {
+ charstring_byte(num + 139);
+ } else if (num >= 108 && num <= 1131) {
+ x = num - 108;
+ charstring_byte(x / 256 + 247);
+ charstring_byte(x % 256);
+ } else if (num >= -1131 && num <= -108) {
+ x = abs(num) - 108;
+ charstring_byte(x / 256 + 251);
+ charstring_byte(x % 256);
+ } else if (num >= (-2147483647-1) && num <= 2147483647) {
+ charstring_byte(255);
+ charstring_byte(num >> 24);
+ charstring_byte(num >> 16);
+ charstring_byte(num >> 8);
+ charstring_byte(num);
+ } else {
+ fprintf(stderr,
+ "error: cannot format the integer %d, too large\n", num);
+ exit(1);
+ }
+}
+
+/* This function parses an entire charstring into integers and commands,
+ outputting bytes through the charstring buffer. */
+
+static void parse_charstring()
+{
+ struct command *cp;
+
+ charstring_start();
+ while (fscanf(ifp, "%s", line) == 1) {
+ if (line[0] == '%') {
+ /* eat comment to end of line */
+ while (fgetc(ifp) != '\n' && !feof(ifp))
+ ; /* deliberately empty */
+ continue;
+ }
+ if (line[0] == '}')
+ break;
+ if (is_integer(line)) {
+ charstring_int(atoi(line));
+ } else {
+ cp = (struct command *)
+ bsearch((void *) line, (void *) command_table,
+ sizeof(command_table) / sizeof(struct command),
+ sizeof(struct command),
+ command_compare);
+ if (cp) {
+ charstring_byte(cp->one);
+ if (cp->two >= 0)
+ charstring_byte(cp->two);
+ } else {
+ fprintf(stderr, "error: cannot use `%s' in charstring\n", cp->name);
+ exit(1);
+ }
+ }
+ }
+ charstring_end();
+}
+
+static void usage()
+{
+ fprintf(stderr,
+ "usage: t1asm [-b] [-l block-length] [input [output]]\n");
+ fprintf(stderr,
+ "\n-b means output in PFB format, otherwise PFA format.\n");
+ fprintf(stderr,
+ "The block length applies to the length of blocks in the\n");
+ fprintf(stderr,
+ "PFB output file; the default is to use the largest possible.\n");
+ exit(1);
+}
+
+
+int main(int argc, char **argv)
+{
+ char *p, *q, *r;
+ int c;
+
+ extern char *optarg;
+ extern int optind;
+ extern int getopt(int argc, char **argv, char *optstring);
+
+ fprintf(stderr, "%s", BANNER);
+
+ /* interpret command line arguments using getopt */
+ while ((c = getopt(argc, argv, "bl:")) != -1)
+ switch (c) {
+ case 'b':
+ pfb = 1;
+ break;
+ case 'l':
+ blocklen = atoi(optarg);
+ if (blocklen < MINBLOCKLEN) {
+ blocklen = MINBLOCKLEN;
+ fprintf(stderr,
+ "warning: using minimum block length of %d\n",
+ blocklen);
+ } else if (blocklen > MAXBLOCKLEN) {
+ blocklen = MAXBLOCKLEN;
+ fprintf(stderr,
+ "warning: using maximum block length of %d\n",
+ blocklen);
+ }
+ break;
+ default:
+ usage();
+ break;
+ }
+ if (argc - optind > 2)
+ usage();
+
+ /* possibly open input & output files */
+ if (argc - optind >= 1) {
+ ifp = fopen(argv[optind], "r");
+ if (!ifp) {
+ fprintf(stderr, "error: cannot open %s for reading\n", argv[1]);
+ exit(1);
+ }
+ }
+ if (argc - optind >= 2) {
+ ofp = fopen(argv[optind + 1], WB);
+ if (!ofp) {
+ fprintf(stderr, "error: cannot open %s for writing\n", argv[2]);
+ exit(1);
+ }
+ }
+
+ /* Finally, we loop until no more input. Some special things to look for
+ are the `currentfile eexec' line, the beginning of the `/Subrs'
+ definition, the definition of `/lenIV', and the definition of the
+ charstring start command which has `...string currentfile...' in it. */
+
+ while (!feof(ifp) && !ferror(ifp)) {
+ getline();
+ if (strcmp(line, "currentfile eexec\n") == 0) {
+ eexec_start();
+ continue;
+ } else if (strstr(line, "/Subrs") && isspace(line[6])) {
+ active = 1;
+ } else if ((p = strstr(line, "/lenIV"))) {
+ sscanf(p, "%*s %d", &lenIV);
+ } else if ((p = strstr(line, "string currentfile"))) {
+ /* locate the name of the charstring start command */
+ *p = '\0'; /* damage line[] */
+ q = strrchr(line, '/');
+ if (q) {
+ r = cs_start;
+ ++q;
+ while (!isspace(*q) && *q != '{')
+ *r++ = *q++;
+ *r = '\0';
+ }
+ *p = 's'; /* repair line[] */
+ }
+ /* output line data */
+ eexec_string(line);
+ if (start_charstring) {
+ if (!cs_start[0]) {
+ fprintf(stderr, "error: couldn't find charstring start command\n");
+ exit(1);
+ }
+ parse_charstring();
+ }
+ }
+ eexec_end();
+
+ fclose(ifp);
+ fclose(ofp);
+
+ return 0;
+}
+
diff --git a/xc/extras/FreeType/contrib/ttf2pfb/ttf2pfb.c b/xc/extras/FreeType/contrib/ttf2pfb/ttf2pfb.c
new file mode 100644
index 000000000..1dbc27dd4
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pfb/ttf2pfb.c
@@ -0,0 +1,1293 @@
+/*
+ * ttf2pfb.c -- TrueType to PostScript Type 1 Font converter.
+ *
+ * Author: Chun-Yu Lee <d791013@ce.ntu.edu.tw>
+ *
+ * The generated output is in a raw Type 1 Font format, required
+ * encoders (e.g. t1asm or t1binary) converting to PFA or PFB font.
+ *
+ * This program was adapted from the ntu2cjk package (part of the
+ * LaTeX2e CJK package (by Werner Lemberg <wl@gnu.org>))
+ * and those of contributed and test programs in the FreeType archive
+ * tree.
+ */
+
+/*
+ * Requirement:
+ * - the FreeType (v1.0, maybe higher) Library.
+ * - T1asm or similar converter if PFA or PFB format required
+ * - getafm or similar one if AFM font metrics required.
+ * - afm2tfm or similar one if TFM form metrics required.
+ * - CJK package (including the ntu2cjk part) if typesetting LaTeX
+ * documents using the generated fonts.
+ * - dvips 5.66 or higher if self-contained PostScript document
+ * outputs are required.
+ * - Ghostscript 3.33 or higher to be complement of some packages
+ * listed above.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+
+#include "freetype.h"
+
+#ifndef lint
+char rcsid[] = "$Id: ttf2pfb.c,v 1.1.1.1 1999/12/05 01:23:22 daryll Exp $";
+#endif
+
+#ifndef TTF2PFB_VERSION
+#define TTF2PFB_VERSION "alpha"
+#endif
+
+/* Set default values */
+#ifndef DEFAULT_PLATFORM_ID
+#define DEFAULT_PLATFORM_ID 3 /* for MS platform */
+#endif
+
+#ifndef DEFAULT_ENCODING_ID
+#define DEFAULT_ENCODING_ID 4 /* for Big-5 encoding (ideally) */
+/* #define DEFAULT_ENCODING_ID 1 */ /* for Unicode encoding */
+#endif
+
+#define PID_UNICODE 3
+#define EID_UNICODE 1
+#define PID_SJIS 3
+#define EID_SJIS 2
+#define PID_GB 3
+#define EID_GB 3
+#define PID_BIG5 3
+#define EID_BIG5 4
+#if 0
+#define PID_KS 3 /* ???? */
+#define EID_KS 5 /* ???? */
+#endif
+
+/* The possible values for the `force_enc' variable. */
+typedef enum _enc_type
+{
+ GB = 1, JIS, KS, SJIS, X
+} enc_type;
+
+/* A variable to enforce a certain font encoding (if > 0). */
+enc_type force_enc = 0;
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#define FAILURE -1
+#endif
+
+#define LINELEN 40 /* max # of columns of code range file */
+
+/*
+ * Flags and globals
+ */
+int verbose = FALSE; /* messages should be printed or not. */
+int compact = FALSE; /* generate compact font? */
+float fontShift = 0;
+/* float fontShift = -0.15; */ /* shift down each char 15 percent of bbox */
+
+#ifndef UShort
+typedef unsigned short UShort;
+#endif
+#ifndef UChar
+typedef unsigned char UChar;
+#endif
+
+#define TT_Flag_On_Curve 1
+
+/* default platform and encoding ID's. */
+int pid = DEFAULT_PLATFORM_ID;
+int eid = DEFAULT_ENCODING_ID;
+
+char* prog; /* program name */
+
+/* for orthogonality with fprintf */
+#define Fputs(_string_) fprintf(out, "%s\n", _string_)
+
+/* Postscript font related defines and functions */
+TT_F26Dot6 lastpsx, lastpsy;
+
+#define Coord(x) (int)(x)
+#define PS_LastPt(x,y) lastpsx = x; lastpsy = y
+#define PS_Moveto(x,y) \
+ fprintf(out, "%d %d rmoveto\n", \
+ Coord(x-lastpsx),Coord(y-lastpsy)); \
+ PS_LastPt(x,y)
+#define PS_Lineto(x,y) \
+ fprintf(out, "%d %d rlineto\n", \
+ Coord(x-lastpsx),Coord(y-lastpsy)); \
+ PS_LastPt(x,y)
+
+/*
+ * Freetype globals.
+ */
+
+TT_Engine engine;
+TT_Face face;
+TT_Instance instance;
+TT_Glyph glyph;
+TT_CharMap cmap;
+TT_Error error;
+
+TT_Outline outline;
+TT_Glyph_Metrics metrics;
+TT_Face_Properties properties;
+/* TT_BBox bbox; */
+
+/*
+ * Data structures defined for encoding vector
+ */
+
+/* A code range file for the encoding vector of a font contains code
+ range pairs, each pair a line. Code starting and ending are seperated
+ by ' - ', note that the spaces before and after the minus sign are
+ significant. Several types of syntax are shown as follows:
+
+ (Note that declared code ranges must be appeared in ascending order.)
+
+ 1. Absolute range, i.e. code is two byte number, e.g.:
+
+ 0xA140 - 0xA17E
+ 41280 - 41342
+ 0xE00000 - 0xE000FF
+
+ The first two lines represent the same range.
+
+ 2. Relative range, i.e. code is one byte number. If the line is ended
+ with a colon ':', it is designated the high byte(s) range, otherwise the
+ low byte range (only the last one byte). If there is no high byte(s)
+ range declared before the low byte range, the lastest defined high
+ byte(s) range or '0x00 - 0x00:' will be used. e.g.:
+
+ 0xA1 - 0xFE:
+ 0x40 - 0x7E
+ 0xA1 - 0xFE
+
+ which is the Big-5 Encoding.
+
+ 3. Single code. Similar to absolute or relative range but the second
+ number of the range is the same as the first number. E.g.:
+
+ 0xA141 == 0xA141 - 0xA141
+ 0xA1: == 0xA1 - 0xA1:
+ 0xA1 == 0xA1 - 0xA1
+
+ 4. If the high byte range is declared and there is no low byte range
+ declared consecutively, it is assumed the low byte range is '0x00 - 0xFF'.
+
+ 5. Comment line. A hash mark '#' followed by any stuffs to the end of the
+ line is ignored. Blank line is also discarded.
+
+ */
+
+typedef struct _EVHigh
+{
+ UShort start, end;
+} EVHigh;
+
+typedef struct _EVLow
+{
+ UChar start, end;
+} EVLow;
+
+typedef struct _EVcRange
+{
+ EVHigh high;
+ UShort numLowRanges;
+ EVLow* low;
+} EVcRange;
+
+typedef struct _EncVec
+{
+ UShort numCodeRanges;
+ EVcRange* codeRange;
+} EncVec;
+
+/* Select encoding vector with respect to pid and eid */
+EncVec* eVecMap[5][10];
+
+/* Select encoding vector with respect to force_enc */
+EncVec* eVecMap_force[10];
+
+/*
+ Functions
+*/
+
+void
+mesg (const char *msg, ...)
+{
+ va_list ap;
+ va_start (ap, msg);
+ vfprintf (stderr, msg, ap);
+ va_end (ap);
+}
+
+/*
+ * Usage
+ */
+void
+Usage (int eval)
+{
+#ifdef DEBUG
+ mesg ("Usage: %s [-h][-v][-c][-d charcode][-l][-ng][-nc]\n", prog);
+#else
+ mesg ("Usage: %s [-h][-v][-c]\n", prog);
+#endif
+ mesg ("\t[-pid id] [-eid id] [-force enc] [-enc file]\n");
+ mesg ("\t[-plane pl] [-f fname] [-uid id] [-s shift]\n");
+ mesg ("\t[-o output] [-ttf font.ttf | font.ttf]\n");
+ mesg ("-h\t\tThis message.\n");
+ mesg ("-v\t\tPrint messages during conversion.\n");
+ mesg ("-c\t\tCompact font, ie 256 chars a font");
+ mesg (" (useful for the CJK package).\n");
+#ifdef DEBUG
+ mesg ("-d charcode\tDebug CharString for the given character code.\n");
+ mesg ("-l\t\tDisplay point labels.\n");
+ mesg ("-ng\t\tDo not show glyph outline.\n");
+ mesg ("-nc\t\tDo not show control paths.\n");
+#endif
+ mesg ("-pid id\t\tSet the platform ID [%d].\n", DEFAULT_PLATFORM_ID);
+ mesg ("-eid id\t\tSet the encoding ID [%d].\n", DEFAULT_ENCODING_ID);
+ mesg ("\t\t(use a strange pid & eid pair to list all possible pid,eid)\n");
+ mesg ("-force enc\tForce a certain encoding [none].\n");
+ mesg ("\t\tpossible values are GB, JIS, KS, SJIS, and X).\n");
+ mesg ("-enc file\tFile contains code ranges [none].\n");
+ mesg ("-plane pl\tA single font plane [0x0].\n");
+ mesg ("-f fname\tFont name [UNKNOWN].\n");
+ mesg ("-uid id\t\tThe first four digits of UID of Type1 font [7000].\n");
+ mesg ("-s shift\tY-offset factor [%5.3f].\n", fontShift);
+ mesg ("-o outfile\tSet the output filename [stdout].\n");
+ mesg ("-ttf ttfpath\tThe TTF font pathname.\n");
+
+ exit(eval);
+}
+
+void
+fatal (const char *msg, ...)
+{
+ va_list ap;
+ va_start (ap, msg);
+ fprintf (stderr, "%s: ", prog);
+ vfprintf (stderr, msg, ap);
+ fprintf (stderr, "\n");
+ va_end (ap);
+ exit (FAILURE);
+}
+
+void
+fatal_error (const char *msg, ...)
+{
+ va_list ap;
+ va_start (ap, msg);
+ fprintf (stderr, "%s: error code 0x%04lx: ", prog, error);
+ vfprintf (stderr, msg, ap);
+ fprintf (stderr, "\n");
+ va_end (ap);
+ exit (FAILURE);
+}
+
+/*
+ * Realloc a pointer.
+ */
+void *
+re_alloc (void* ptr, size_t size, char* sub)
+{
+ register void* value = realloc (ptr, size);
+ if (value == NULL)
+ fatal ("%s: Virtual memory exhausted.\n", sub);
+ return value;
+}
+
+/* We have to introduce the `dummy' integer to assure correct handling of
+ the stack. Using `UShort' as the first parameter may fail in case
+ this type is promoted to a different type (as happens e.g. under
+ emx for DOS */
+EncVec*
+Alloc_EncVec (int dummy, ...)
+{
+ va_list vp;
+ EncVec* encVec = NULL;
+ EVcRange* cRange = NULL;
+ EVLow* evLow = NULL;
+ UShort numCR, numLows;
+ int i,j;
+
+ va_start (vp, dummy);
+ numCR = va_arg (vp, UShort);
+
+ encVec = re_alloc (encVec, 1*sizeof(EncVec), "Alloc_EncVec");
+ encVec->numCodeRanges = numCR;
+
+ cRange = re_alloc (cRange, numCR*sizeof(EVcRange), "Alloc_EncVec");
+ for (i=0; i<numCR; i++) {
+ (cRange+i)->high.start = va_arg (vp, UShort);
+ (cRange+i)->high.end = va_arg (vp, UShort);
+ (cRange+i)->numLowRanges = numLows = va_arg (vp, UShort);
+ evLow = NULL;
+ evLow = re_alloc (evLow, numLows*sizeof(EVLow), "Alloc_EncVec");
+ for (j=0; j<numLows; j++) {
+ (evLow+j)->start = va_arg (vp, UChar);
+ (evLow+j)->end = va_arg (vp, UChar);
+ }
+ (cRange+i)->low = evLow;
+ }
+ encVec->codeRange = cRange;
+
+ va_end (vp);
+ return encVec;
+}
+
+void
+Known_Encodings (void)
+{
+ EncVec* encVec;
+
+ /* Big-5 encoding */
+ encVec = Alloc_EncVec (1, 1, 0xA1, 0xFE, 2, 0x40, 0x7E, 0xA1, 0xFE);
+ eVecMap[PID_BIG5][EID_BIG5] = encVec;
+ /* eVecMap_force[BIG5] = encVec; */
+
+ /* GB encoding */
+ encVec = Alloc_EncVec (2, 1, 0xA1, 0xF7, 1, 0xA1, 0xFE);
+ eVecMap[PID_GB][EID_GB] = encVec;
+ eVecMap_force[GB] = encVec;
+
+ /* KS encoding */
+ encVec = Alloc_EncVec (3, 1, 0xA1, 0xFE, 1, 0xA1, 0xFE);
+ /* eVecMap[PID_KS][EID_KS] = encVec; */
+ eVecMap_force[KS] = encVec;
+
+ /* JIS encoding */
+ encVec = Alloc_EncVec (4, 1, 0xA1, 0xF4, 1, 0xA1, 0xFE);
+ /* eVecMap[PID_JIS][EID_JIS] = encVec; */
+ eVecMap_force[JIS] = encVec;
+ eVecMap_force[X] = encVec; /* will be internally translated to SJIS */
+
+ /* Unicode encoding */
+ encVec = Alloc_EncVec (5, 1, 0x00, 0xFF, 1, 0x00, 0xFF);
+ eVecMap[PID_UNICODE][EID_UNICODE] = encVec;
+ /* eVecMap_force[UNICODE] = encVec; */
+
+ /* SJIS encoding */
+ encVec = Alloc_EncVec (6, 3, 0x0, 0x0, 1, 0xA1, 0xDF,
+ 0x81, 0x9F, 2, 0x40, 0x7E, 0x80, 0xFC,
+ 0xE0, 0xEF, 2, 0x40, 0x7E, 0x80, 0xFC);
+ eVecMap[PID_SJIS][EID_SJIS] = encVec;
+ eVecMap_force[SJIS] = encVec;
+}
+
+/*
+ * Convert JIS to SJIS encoding.
+ */
+UShort
+JIS_to_SJIS (UShort code)
+{
+ UShort index;
+ UShort cc0 = (code >> 8) & 0xFF;
+ UShort cc1 = code & 0xFF;
+
+ index = (cc0 - 0xa1) * (0xfe - 0xa1 + 1) + (cc1 - 0xa1);
+ cc0 = index / ((0x7e - 0x40 + 1) + (0xfc - 0x80 + 1));
+ cc1 = index % ((0x7e - 0x40 + 1) + (0xfc - 0x80 + 1));
+ if (cc0 < (0x9f - 0x81 + 1))
+ cc0 += 0x81;
+ else
+ cc0 += 0xe0 - (0x9f - 0x81 + 1);
+ if (cc1 < (0x7e - 0x40 + 1))
+ cc1 += 0x40;
+ else
+ cc1 += 0x80 - (0x7E - 0x40 + 1);
+
+ return (cc0 << 8) + cc1;
+}
+
+/*
+ * Open TTF file and select cmap
+ */
+int
+Init_Font_Engine (char* infile)
+{
+ short cmapindex, platformID, encodingID, num_cmap;
+
+ error = TT_Init_FreeType (&engine);
+ if (error)
+ fatal_error ("couldn't initialize FreeType engine.");
+ /* Open the input file. */
+ error = TT_Open_Face (engine, infile, &face);
+ if (error) fatal_error ("unable to open input file '%s'", infile);
+ /* Load the instance. */
+ error = TT_New_Instance (face, &instance);
+ if (error) fatal_error ("couldn't create instance.");
+
+ error = TT_Set_Instance_Resolutions (instance, 600, 600);
+ if (error) fatal_error ("error setting resoluations.");
+ error = TT_Set_Instance_CharSize (instance, 120*64);
+ if (error) fatal_error ("error setting character size.");
+
+ error = TT_New_Glyph (face, &glyph);
+ if (error) fatal_error ("couldn't create new glyph.");
+ /* Get the requested cmap. */
+ num_cmap = TT_Get_CharMap_Count (face);
+ for (cmapindex=0; cmapindex < num_cmap; cmapindex++) {
+ TT_Get_CharMap_ID (face, cmapindex, &platformID, &encodingID);
+ if (platformID == pid && encodingID == eid) break;
+ }
+ if (cmapindex == num_cmap) {
+ mesg ("Possible platform and encoding ID pairs:");
+ for (cmapindex=0; cmapindex < num_cmap; cmapindex++) {
+ TT_Get_CharMap_ID (face, cmapindex, &platformID, &encodingID);
+ mesg (" (%d, %d)", platformID, encodingID);
+ }
+ mesg ("\n");
+ fatal ("No character map for given platform %d encoding %d.", pid, eid);
+ }
+ /* malloc for glyph data */
+ error = TT_Get_CharMap (face, cmapindex, &cmap);
+ if (error) fatal_error ("cannot load cmap.");
+
+ return TRUE;
+}
+
+/*
+ * Load glyph's outline and metrics
+ */
+int
+LoadTrueTypeChar (int idx)
+{
+ TT_Matrix scale = {(1<<16)/64, 0, 0, (1<<16)/64};
+ error = TT_Load_Glyph (instance, glyph, idx, TTLOAD_DEFAULT);
+ if (error) fatal_error ("load glyph");
+ error = TT_Get_Glyph_Outline (glyph, &outline);
+ if (error) fatal_error ("get glyph outlines.");
+ TT_Transform_Outline (&outline, &scale);
+ error = TT_Get_Glyph_Metrics (glyph, &metrics);
+ if (error) fatal_error ("get glyph_metrics.");
+
+ return TRUE;
+}
+
+/*
+ * Header of Type1 font.
+ */
+void
+PS_Head(FILE *out, int plane, EncVec* planeEV, char* font, int UID)
+{
+ EVcRange* cRange = planeEV->codeRange;
+ UShort numCR = planeEV->numCodeRanges;
+ int cjk = 0, nGlyph = 0, irange;
+ EVLow* pLow = cRange->low;
+ UShort nLow = cRange->numLowRanges;
+ int ipl, ilow, ich;
+
+
+ fprintf(out, "%%!FontType1-1.0: CJK-%s 001.001\n",font);
+ fprintf(out, "%%%%Creator: %s ", prog);
+ fprintf(out, "%s %s\n", TTF2PFB_VERSION, rcsid);
+ Fputs("%%CreationDate: Feb 1st, 1998");
+ Fputs("%%VMusage: 030000 030000");
+ Fputs("11 dict begin");
+ Fputs("/FontInfo 8 dict dup begin");
+ Fputs("/version (001.001) readonly def");
+ if (compact)
+ fprintf(out, "/FullName (%s%02d) readonly def\n",font,plane);
+ else
+ fprintf(out, "/FullName (%s%02X) readonly def\n",font,plane);
+ fprintf(out, "/FamilyName (%s) readonly def\n",font);
+ Fputs("/Weight (Regular) readonly def");
+ Fputs("/ItalicAngle 0 def");
+ Fputs("/isFixedPitch false def");
+ /* Fputs("/UnderlineThickness 50 def"); */
+ Fputs("end readonly def");
+ if (compact)
+ fprintf(out, "/FontName /%s%02d def\n",font,plane);
+ else
+ fprintf(out, "/FontName /%s%02X def\n",font,plane);
+ Fputs("/PaintType 0 def");
+ Fputs("/FontType 1 def");
+ if (fontShift == 0)
+ Fputs("/FontMatrix [0.001 0 0 0.001 0 0] readonly def");
+ else
+ fprintf(out, "/FontMatrix [0.001 0 0 0.001 0 %5.3f] readonly def\n",
+ fontShift);
+ Fputs("/Encoding 256 array");
+ Fputs("0 1 255 {1 index exch /.notdef put} for");
+ /* encoding vector */
+ for (irange=0; irange<numCR; irange++, cRange++) {
+ pLow = cRange->low;
+ nLow = cRange->numLowRanges;
+ for (ipl=cRange->high.start; ipl<=cRange->high.end; ipl++) {
+ if (nLow == 0) {
+ nGlyph = 0x100;
+ for (ich=0; ich<=0xff; ich++)
+ fprintf(out, "dup %d /cjk%02X%02X put\n",ich,ipl,ich);
+ } else
+ for (ilow = 0; ilow < nLow; ilow++, pLow++) {
+ if (!compact) cjk = pLow->start;
+ nGlyph += pLow->end - pLow->start + 1;
+ for (ich=pLow->start; ich<=pLow->end; ich++, cjk++)
+ fprintf(out, "dup %d /cjk%02X%02X put\n",cjk,ipl,ich);
+ }
+ }
+ }
+
+ Fputs("readonly def");
+ Fputs("/FontBBox [0 -300 1000 1000] readonly def");
+ fprintf(out, "/UniqueID %d%03d def\n",UID,plane);
+ Fputs("currentdict end");
+ Fputs("currentfile eexec");
+ Fputs("dup /Private 8 dict dup begin");
+ Fputs("/-| { string currentfile exch readstring pop } executeonly def");
+ Fputs("/|- { noaccess def } executeonly def");
+ Fputs("/| { noaccess put } executeonly def");
+ Fputs("/BlueValues [ ] |-");
+ Fputs("/ForceBold true def");
+ Fputs("/LanguageGroup 1 def");
+ Fputs("/RndStemUp false def");
+ Fputs("/MinFeature{16 16} |-");
+ Fputs("/password 5839 def");
+ fprintf(out, "/UniqueID %d%03d def\n",UID,plane);
+ Fputs("/Subrs 4 array");
+ Fputs("dup 0 { 3 0 callothersubr pop pop setcurrentpoint return } |");
+ Fputs("dup 1 { 0 1 callothersubr return } |");
+ Fputs("dup 2 { 0 2 callothersubr return } |");
+ Fputs("dup 3 { return } |");
+ Fputs("|-");
+ fprintf(out, "2 index /CharStrings %d dict dup begin\n", nGlyph+1);
+}
+
+/*
+ * tail of Type1 font
+ */
+void
+PS_Tail (FILE *out)
+{
+ Fputs("/.notdef { 0 250 hsbw endchar } |-");
+ Fputs("end end readonly put noaccess put");
+ Fputs("dup /FontName get exch definefont pop");
+ Fputs("mark currentfile closefile");
+}
+
+/*
+ * use the rrcurveto command on more than one off points
+ */
+void
+PS_Curveto (FILE *out, TT_F26Dot6 x, TT_F26Dot6 y, int s, int e)
+{
+ int N, i;
+ TT_F26Dot6 sx[3], sy[3], cx[4], cy[4];
+
+ N = e-s+1;
+ cx[0] = lastpsx; cy[0] = lastpsy;
+ if (s == e) {
+ cx[1] = (2*outline.points[s].x+outline.points[s-1].x)/3;
+ cy[1] = (2*outline.points[s].y+outline.points[s-1].y)/3;
+ cx[2] = (2*outline.points[s].x+x)/3;
+ cy[2] = (2*outline.points[s].y+y)/3;
+ cx[3] = x;
+ cy[3] = y;
+ fprintf(out, "%d %d %d %d %d %d rrcurveto\n",
+ Coord(cx[1]-cx[0]),Coord(cy[1]-cy[0]),
+ Coord(cx[2]-cx[1]),Coord(cy[2]-cy[1]),
+ Coord(cx[3]-cx[2]),Coord(cy[3]-cy[2]));
+ } else {
+ for(i=0; i<N; i++) {
+ sx[0] = (i==0) ? outline.points[s-1].x :
+ (outline.points[i+s].x+outline.points[i+s-1].x)/2;
+ sy[0] = (i==0) ? outline.points[s-1].y :
+ (outline.points[i+s].y+outline.points[i+s-1].y)/2;
+ sx[1] = outline.points[s+i].x;
+ sy[1] = outline.points[s+i].y;
+ sx[2] = (i==N-1) ? x : (outline.points[s+i].x+outline.points[s+i+1].x)/2;
+ sy[2] = (i==N-1) ? y : (outline.points[s+i].y+outline.points[s+i+1].y)/2;
+ cx[1] = (2*sx[1]+sx[0])/3;
+ cy[1] = (2*sy[1]+sy[0])/3;
+ cx[2] = (2*sx[1]+sx[2])/3;
+ cy[2] = (2*sy[1]+sy[2])/3;
+ cx[3] = sx[2];
+ cy[3] = sy[2];
+ fprintf(out, "%d %d %d %d %d %d rrcurveto\n",
+ Coord(cx[1]-cx[0]),Coord(cy[1]-cy[0]),
+ Coord(cx[2]-cx[1]),Coord(cy[2]-cy[1]),
+ Coord(cx[3]-cx[2]),Coord(cy[3]-cy[2]));
+ cx[0] = cx[3]; cy[0] = cy[3];
+ }
+ }
+ PS_LastPt(x,y);
+}
+
+#ifdef DEBUG
+int debug_Char_Code = 0xFFFF;
+FILE* tmpout;
+int showlabel = FALSE;
+int no_glyph = FALSE;
+int no_control= FALSE;
+#define Fputps(_msg_) fprintf(tmpout, "%s\n", _msg_)
+
+void
+tmp_out (FILE* tmpout)
+{
+ int i, j;
+ /* backup the line for easy coding this postscript program */
+ /*
+ fprintf(tmpout,"/llx %d.0 def /lly %d.0 def /urx %d.0 def /ury %d.0 def\n",
+ Coord(metrics.bbox.xMin/64), Coord(metrics.bbox.yMin/64),
+ Coord(metrics.bbox.xMax/64), Coord(metrics.bbox.yMax/64));
+ */
+
+ Fputps("%!PS");
+ Fputps("%%% CharString debugging program.");
+ Fputps("%%% Generated by: ttf2pfb $Revision: 1.1.1.1 $");
+ Fputps("%%% plot char-string (pathes defined in /cjkxxxx)");
+ Fputps("");
+ Fputps("%%% user-defined parameter");
+ Fputps("/scalefactor .6 def");
+ Fputps("%% 0 black, 1 white");
+ Fputps("/glyph-outline-gray 0 def");
+ Fputps("/control-point-gray 0.7 def");
+ Fputps("");
+ Fputps("%%% calculate shifts and scale factor");
+ Fputps("currentpagedevice /PageSize get dup");
+ Fputps("0 get /pagewidth exch def");
+ Fputps("1 get /pageheight exch def");
+ Fputps("");
+ fprintf(tmpout,"/llx %d.0 def /lly %d.0 def /urx %d.0 def /ury %d.0 def\n",
+ Coord(metrics.bbox.xMin/64), Coord(metrics.bbox.yMin/64),
+ Coord(metrics.bbox.xMax/64), Coord(metrics.bbox.yMax/64));
+ Fputps("/olwidth urx llx sub def");
+ Fputps("/olheight ury lly sub def");
+ Fputps("");
+ Fputps("/scale scalefactor pagewidth mul olwidth div def");
+ Fputps("/xshift pagewidth 1 scalefactor sub mul 2 div def");
+ Fputps("/yshift pageheight olheight scale mul sub 2 div def");
+ Fputps("");
+ Fputps("%% save old gray-scale value");
+ Fputps("/oldgray currentgray def");
+ Fputps("");
+ Fputps("%%% for point sequence label");
+ Fputps("/TimesRoman 8 selectfont");
+ Fputps("/i++ {i /i i 1 add def} def");
+ Fputps("/itos {4 string cvs} def");
+ Fputps("/point {2 copy i++ 3 1 roll 5 3 roll} def");
+ Fputps("/drawlabel");
+ Fputps(" {{moveto dup 0 eq {exit}");
+ Fputps(" {itos show} ifelse} loop pop} def");
+ Fputps("/nodrawlabel {clear} def");
+ Fputps("/i 0 def");
+ Fputps("");
+ Fputps("%%% for drawing glyph paths, redefine commands used in CharString");
+ Fputps("%% scaled to proper size");
+ Fputps("/addr {scale mul 3 -1 roll add 3 1 roll");
+ Fputps(" scale mul add exch 2 copy} def");
+ if (no_glyph) {
+ Fputps("/rmoveto {addr pop pop point} def");
+ Fputps("/rlineto {addr pop pop point} def");
+ Fputps("/rrcurveto {8 4 roll addr 8 -2 roll addr 8 -2 roll addr");
+ Fputps(" 8 2 roll 6 {pop} repeat point} def");
+ } else {
+ Fputps("/rmoveto {addr moveto point} def");
+ Fputps("/rlineto {addr lineto point} def");
+ Fputps("/rrcurveto {8 4 roll addr 8 -2 roll addr 8 -2 roll addr");
+ Fputps(" 8 2 roll curveto point} def");
+ }
+ Fputps("/hsbw {pop pop");
+ Fputps(" xshift llx scale mul sub");
+ Fputps(" yshift lly scale mul sub} def");
+ Fputps("/endchar {stroke pop pop} def");
+ Fputps("");
+ Fputps("%%% for drawing control paths");
+ Fputps("/T {pop lly sub scale mul yshift add exch");
+ Fputps(" llx sub scale mul xshift add exch } def");
+ Fputps("/mt {T 2 copy moveto} def");
+ if (no_control)
+ Fputps("/lt {T} def");
+ else
+ Fputps("/lt {T 2 copy lineto} def");
+ Fputps("");
+ Fputps("1 setlinecap 1 setlinejoin");
+ Fputps("%%% draw control points and paths");
+ Fputps("control-point-gray setgray");
+
+ for (i = 0, j = 0; i < outline.n_contours; i++) {
+ fprintf (tmpout, "\n");
+ fprintf (tmpout, "%d %d %d %d mt\n", j, Coord(outline.points[j].x),
+ Coord(outline.points[j].y), outline.flags[j]);
+ j++;
+ for (; j <= outline.contours[i]; j++)
+ fprintf (tmpout, "%d %d %d %d lt\n", j, Coord(outline.points[j].x),
+ Coord(outline.points[j].y), outline.flags[j]);
+ Fputps("closepath");
+ }
+ Fputps("stroke");
+ if (showlabel && !no_control)
+ Fputps("drawlabel");
+ else
+ Fputps("nodrawlabel");
+ Fputps("");
+ Fputps("%%% draw glyph outlines");
+ Fputps("glyph-outline-gray setgray");
+ Fputps("");
+}
+#endif
+
+/*
+ * Construct CharString of a glyph
+ */
+short
+PS_CharString (FILE *out, UShort char_Code)
+{
+ int idx, i, j;
+ UShort start_offpt, end_offpt = 0, fst;
+#if DEBUG
+ FILE* oldout = out;
+ int loop = 1;
+#endif
+
+ if (force_enc == X)
+ char_Code = JIS_to_SJIS (char_Code);
+
+ idx = TT_Char_Index (cmap, char_Code);
+ if (idx == 0) {
+ fprintf(out, "/cjk%04X { 0 250 hsbw endchar } |-\n", char_Code);
+ return FALSE;
+ }
+
+ if (!LoadTrueTypeChar(idx))
+ fatal ("couldn't load character: %d, code= %d", idx, char_Code);
+
+ /* Begin string */
+ fprintf(out, "/cjk%04X {\n", char_Code);
+
+#ifdef DEBUG
+ if (char_Code == debug_Char_Code) {
+ tmp_out(tmpout);
+ out = tmpout;
+ loop = 0;
+ }
+ for (;loop<2;loop++) {
+#endif
+
+ /* coordinates are all relative to (0,0) in FreeType */
+ fprintf(out, "0 %d hsbw\n", (int)(metrics.advance/64));
+
+ /* Initialize ending contour point, relative coordinates */
+ lastpsx = lastpsy = 0;
+
+ for (i = 0, j = 0; i < outline.n_contours /*contours*/; i++) {
+ fst = j;
+ PS_Moveto (outline.points[j].x, outline.points[j].y);
+ j++;
+
+ start_offpt = 0; /*start at least 1*/
+ /* data pts for all contours stored in one array.
+ each round j init at last j + 1 */
+
+ /* start_offpt means start of off points.
+ 0 means no off points in record.
+ N means the position of the off point.
+ end_offpt means the ending off point.
+ lastx, lasty is the last ON point from which Curve and Line
+ shall start.
+ */
+
+ /* start with j=0. into loop, j=1.
+ if pt[1] off, if start_offpt == 0, toggle start_offpt
+ next j=2. if on, now start_off != 0, run Curveto.
+ if pt[1] on, start_off == 0, will run Lineto.
+ */
+ for (; j <= outline.contours[i]; j++) {
+ if (!(outline.flags[j] & TT_Flag_On_Curve)) {
+ if (!start_offpt) { start_offpt = end_offpt = j; }
+ else end_offpt++;
+ }
+ else { /*On Curve*/
+ if (start_offpt) {
+ /* start_offpt stuck at j, end_offpt++.
+ end_offpt - start_offpt gives no of off pts.
+ start_offpt gives start of sequence.
+ why need outline.xCoord[j] outline.yCoord[j]?
+ */
+ PS_Curveto(out, outline.points[j].x, outline.points[j].y,
+ start_offpt, end_offpt);
+ start_offpt = 0;
+
+ /* also use start_offpt as indicator to save one variable!!
+ after curveto, reset condition. */
+ }
+ else PS_Lineto(outline.points[j].x, outline.points[j].y);
+ }
+ }
+ /* looks like closepath fst = first, i.e. go back to first */
+ if (start_offpt)
+ PS_Curveto(out, outline.points[fst].x, outline.points[fst].y,
+ start_offpt, end_offpt);
+ else
+ Fputs("closepath");
+ }
+
+ Fputs("endchar");
+
+#if DEBUG
+ out = oldout;
+ }
+ if (char_Code == debug_Char_Code) {
+ if (showlabel && !no_glyph)
+ Fputps("drawlabel");
+ else
+ Fputps("nodrawlabel");
+ Fputps("");
+ Fputps("%%% end of drawing");
+ Fputps("oldgray setgray");
+ Fputps("showpage");
+ fclose(tmpout);
+ }
+#endif
+
+ Fputs(" } |-");
+ return TRUE;
+}
+
+/*
+ * Get code ranges of an encoding scheme either from
+ * the eVecMap or an code range file.
+ */
+EncVec*
+Get_EncVec (FILE *enc)
+{
+ EncVec* encVec = NULL;
+ EVcRange* cRange = NULL;
+ EVLow* lByte = NULL;
+ UShort numCR = 0, numLow = 0;
+ int start, end;
+ int buflen = LINELEN, numAssigned;
+ char buf[LINELEN];
+
+ if (force_enc != 0)
+ return eVecMap_force[force_enc];
+
+ if (enc == NULL && eVecMap[pid][eid] != NULL)
+ return eVecMap[pid][eid];
+ /* parse each code range line */
+ while (fgets(buf, buflen, enc) != NULL) {
+ if (buf[0] != '#' && buf[0] != '\n') {
+ if (strrchr(buf,':') != NULL) {
+ /* if there is no high declared before low */
+ if (lByte != NULL) {
+ if (cRange == NULL) {
+ /* default code range '0x00-0x00:' */
+ cRange = re_alloc (cRange, ++numCR*sizeof(EVcRange), "Get_EncVec");
+ cRange->high.start = cRange->high.end = 0;
+ }
+ /* Assign the lastest low */
+ cRange->low = lByte;
+ cRange->numLowRanges = numLow;
+ }
+ /* New high byte range */
+ cRange = re_alloc (cRange, ++numCR*sizeof(EVcRange), "Get_EncVec");
+ (cRange+numCR-1)->numLowRanges = numLow = 0;
+ lByte = NULL;
+ /* Parse code range */
+ numAssigned = sscanf (buf, "%i %*40s %i", &start, &end);
+ if (numAssigned <= 0 || numAssigned > 2) {
+ mesg ("%s: Get_EncVec: wrong code range.\n", prog);
+ return NULL;
+ } else {
+ (cRange+numCR-1)->high.start = start;
+ if (numAssigned == 1)
+ (cRange+numCR-1)->high.end = start;
+ else
+ (cRange+numCR-1)->high.end = end;
+ }
+ } else {
+ lByte = re_alloc (lByte, ++numLow*sizeof(EVLow), "Get_EncVec");
+ numAssigned = sscanf (buf, "%i %*40s %i", &start, &end);
+ if (numAssigned <= 0 || numAssigned > 2) {
+ mesg ("%s: Get_EncVec: wrong code range.\n", prog);
+ return NULL;
+ } else {
+ (lByte+numLow-1)->start = start;
+ if (numAssigned == 1)
+ (lByte+numLow-1)->end = start;
+ else
+ (lByte+numLow-1)->end = end;
+ }
+ }
+ }
+ }
+ if (cRange == NULL) {
+ cRange = re_alloc (cRange, ++numCR*sizeof(EVcRange), "Get_EncVec");
+ cRange->high.start = cRange->high.end = 0;
+ cRange->numLowRanges = 0;
+ }
+ if (lByte != NULL) {
+ cRange->low = lByte;
+ cRange->numLowRanges = numLow;
+ }
+ encVec = re_alloc (encVec, 1*sizeof(EncVec), "Get_EncVec");
+ encVec->numCodeRanges = numCR;
+ encVec->codeRange = cRange;
+ return encVec;
+}
+
+/*
+ * Match code ranges by a font plane.
+ */
+
+EncVec*
+Get_PlaneEV (EncVec* encVec, int plane)
+{
+ UShort numCR = encVec->numCodeRanges;
+ EVcRange* cRange = encVec->codeRange;
+
+ EncVec* encV = NULL;
+ EVcRange* planeCR = NULL;
+ EVLow* planeLow = NULL;
+ UShort nCR = 0, nLow = 0;
+
+ int icr;
+
+ if (compact) {
+ int iChar = 0; /* summed # of chars */
+ int nChar = (plane-1) * 256; /* the first char code ranges recorded */
+ int recording = 0;
+ /* if compact, plane starts from 1 to be */
+ /* compatible to the CJK package */
+ if (plane < 1 || plane > 256)
+ fatal ("Get_PlaneEV: given plane out of range.");
+
+ for (icr = 0; icr < numCR; icr++, cRange++) {
+ UShort numLow = cRange->numLowRanges;
+ int ipl;
+
+ for (ipl=cRange->high.start; ipl<=cRange->high.end; ipl++) {
+ EVLow* pLow = cRange->low;
+ int ilow;
+
+ if (recording) { /* if we have made a hit */
+ if (planeLow != NULL) { /* if low byte range has not been saved */
+ (planeCR+nCR-1)->low = planeLow;
+ (planeCR+nCR-1)->numLowRanges = nLow;
+ planeLow = NULL;
+ }
+ /* each new plane starts a EVcRange if */
+ /* iChar is still less than nChar */
+ if (iChar <= nChar) {
+ planeCR = re_alloc (planeCR, ++nCR*sizeof(EVcRange), "Get_PlaneEV");
+ (planeCR+nCR-1)->high.start = (planeCR+nCR-1)->high.end = ipl;
+ (planeCR+nCR-1)->numLowRanges = nLow = 0;
+ }
+ }
+ /* scan each low byte range */
+ for (ilow = 0; ilow < (numLow==0?1:numLow); ilow++, pLow++) {
+ int start, end, nLowChar;
+
+ if (numLow == 0) { /* default range */
+ start = 0x0;
+ end = 0xff;
+ } else {
+ start = pLow->start;
+ end = pLow->end;
+ }
+ nLowChar = end - start + 1;
+ if (iChar+nLowChar > nChar) { /* a hit! */
+ int bchar = start + nChar - iChar;
+ if (planeCR == NULL) { /* the first time code range is recorded */
+ planeCR = re_alloc (planeCR, ++nCR*sizeof(EVcRange), "Get_PlaneEV");
+ (planeCR+nCR-1)->high.start = ipl;
+ (planeCR+nCR-1)->high.end = ipl;
+ }
+ /* adjust range boundary */
+ if (recording==0)
+ start = bchar;
+ else
+ end = bchar;
+ nChar += 0xff;
+ /* recording starts */
+ recording++;
+ }
+ iChar += nLowChar; /* next range */
+
+ if (recording) {
+ /* a new low range */
+ if (iChar <= nChar) {
+ planeLow = re_alloc (planeLow, ++nLow*sizeof(EVLow), "Get_PlaneEV");
+ (planeLow+nLow-1)->start = start;
+ (planeLow+nLow-1)->end = end;
+ }
+ if (recording > 1 || iChar > nChar) { /* beyond recording range */
+ (planeCR+nCR-1)->numLowRanges = nLow;
+ (planeCR+nCR-1)->low = planeLow;
+ encV = re_alloc (encV, 1*sizeof(EncVec), "Get_PlaneEV");
+ encV->numCodeRanges = nCR;
+ encV->codeRange = planeCR;
+ return encV;
+ }
+ }
+ }
+ }
+ }
+ } else
+ for (icr = 0; icr < numCR; icr++, cRange++) {
+ if (plane >= cRange->high.start && plane <= cRange->high.end) {
+ encV = re_alloc (encV, 1*sizeof(EncVec), "Get_PlaneEV");
+ planeCR = re_alloc (planeCR, 1*sizeof(EVcRange), "Get_PlaneEV");
+
+ planeCR->high.start = planeCR->high.end = plane;
+ planeCR->numLowRanges = cRange->numLowRanges;
+ planeCR->low = cRange->low;
+ encV->numCodeRanges = 1;
+ encV->codeRange = planeCR;
+ return encV;
+ }
+ }
+ return NULL;
+}
+
+/*
+ * The main subroutine for generate Type1 font.
+ * One subfont per call.
+ */
+short
+Generate_Fonts (FILE *out, int plane, FILE *enc, char *fname, int pfxUID)
+{
+ EncVec* encVec = Get_EncVec (enc);
+ EncVec* planeEncVec;
+ EVcRange* cRange;
+ UShort numCR;
+ UShort code;
+ int ilow, iplan, ichar, irange;
+
+ if (encVec == NULL)
+ return FALSE;
+ if ((planeEncVec = Get_PlaneEV (encVec, plane)) == NULL) {
+ mesg ("%s: can't find encoding vector for the font plane 0x%X.\n",
+ prog, plane);
+ return FALSE;
+ }
+ /* Header of Type1 font */
+ PS_Head (out, plane, planeEncVec, fname, pfxUID);
+
+ numCR = planeEncVec->numCodeRanges;
+ cRange = planeEncVec->codeRange;
+ for (irange=0; irange<numCR; irange++, cRange++) {
+ EVLow* pLow = cRange->low;
+ UShort nLow = cRange->numLowRanges;
+ for (iplan=cRange->high.start; iplan<=cRange->high.end; iplan++) {
+ if (nLow == 0) {
+ for (ichar=0; ichar<=0xff; ichar++) {
+ code = iplan<<8 | ichar;
+ PS_CharString (out, code);
+ }
+ } else
+ for (ilow = 0; ilow < nLow; ilow++, pLow++)
+ for (ichar=pLow->start; ichar<=pLow->end; ichar++) {
+ code = iplan<<8 | ichar;
+ PS_CharString (out, code);
+ }
+ }
+ }
+ PS_Tail (out);
+
+ return TRUE;
+}
+
+/*
+ * Main: process options, file I/O, etc.
+ */
+void
+main(int argc, char *argv[])
+{
+ char *infile, *outfile, *encFile, *fname = "UNKNOWN";
+ FILE *out, *enc;
+ int result, plane = 0, pfxUID = 7000;
+
+ if ((prog = strrchr(argv[0], '/')))
+ prog++;
+ else
+ prog = argv[0];
+
+ /* setup encoding vectors of all I known */
+ Known_Encodings ();
+
+ out = stdout;
+ enc = NULL;
+ infile = outfile = encFile = NULL;
+
+ argc--;
+ argv++;
+
+ while (argc > 0) {
+ if (argv[0][0] == '-') {
+ switch (argv[0][1]) {
+ case 'v': case 'V':
+ verbose = TRUE;
+ break;
+ case 'c': case 'C':
+ compact = TRUE;
+ break;
+ case 'p': case 'P':
+ result = argv[0][2];
+ argc--;
+ argv++;
+ if (result == 'i' || result == 'I') {
+ /* Set the platform ID. Assumed upper bound is 64 */
+ if ((pid = atoi(argv[0])) < 0 || pid > 64)
+ /* Check the platform and encoding IDs. */
+ fatal ("%s: invalid platform ID '%d'.\n", prog, pid);
+ }
+ else if (result == 'l' || result == 'L') {
+ result = 0;
+ while (argv[0][result] == '0' &&
+ toupper(argv[0][result+1]) != 'X')
+ result++; /* no octal number */
+ sscanf (&argv[0][result], "%i", &plane);
+ }
+ break;
+ case 'e': case 'E':
+ /* Set the encoding ID. */
+ result = argv[0][2];
+ argc--;
+ argv++;
+ if (result == 'i' || result == 'I') {
+ if ((eid = atoi(argv[0])) < 0 || eid > 64) {
+ fatal ("%s: invalid encoding ID '%d'.\n", prog, eid);
+ exit (1);
+ }}
+ else if (result == 'n' || result == 'N')
+ encFile = argv[0];
+ break;
+ case 'u': case 'U':
+ argc--;
+ argv++;
+ pfxUID = atoi(argv[0]);
+ break;
+ case 'f': case 'F':
+ result = argv[0][2];
+ argc--;
+ argv++;
+ if (result == '\0')
+ fname = argv[0];
+ else if (result == 'o' || result == 'O') {
+ switch (argv[0][0]) {
+ case 'g': case 'G':
+ force_enc = GB;
+ break;
+ case 'k': case 'K':
+ force_enc = KS;
+ break;
+ case 'j': case 'J':
+ force_enc = JIS;
+ break;
+ case 's': case 'S':
+ force_enc = SJIS;
+ break;
+ case 'x': case 'X':
+ force_enc = X;
+ }
+ }
+ break;
+ case 't': case 'T':
+ /* Get the TTF file name. */
+ argc--;
+ argv++;
+ infile = argv[0];
+ break;
+ case 'o': case 'O':
+ /* Set the output file name. */
+ argc--;
+ argv++;
+ outfile = argv[0];
+ break;
+ case 's': case 'S': /* shift font bbox up or down */
+ argc--; argv++;
+ sscanf(argv[0], "%f", &fontShift);
+ break;
+#ifdef DEBUG
+ case 'd': case 'D': /* character code for debuging */
+ argc--; argv++;
+ sscanf(argv[0], "%i", &debug_Char_Code);
+ tmpout = fopen("charstr-debug.ps", "wt");
+ mesg ("You have specified the character code 0x%04x for debugging.\n",
+ debug_Char_Code);
+ mesg ("A PostScript program named charstr-debug.ps will be created.\n");
+ break;
+ case 'l': case 'L':
+ showlabel = TRUE;
+ break;
+ case 'n': case 'N':
+ result = argv[0][2];
+ if (result == 'g' || result == 'G')
+ no_glyph = TRUE;
+ else if (result == 'c' || result == 'C')
+ no_control = TRUE;
+ break;
+#endif
+ default:
+ Usage(1);
+ }
+ } else
+ /* Set the input file name. */
+ infile = argv[0];
+
+ argc--;
+ argv++;
+ }
+
+ /* Open the output file if specified. */
+ if (outfile != NULL)
+ /* Attempt to open the output file. */
+ if ((out = fopen(outfile, "wt")) == 0) {
+ fatal ("%s: unable to open the output file '%s'.\n",
+ prog, outfile);
+ exit(1);
+ }
+
+ /* Validate the values passed on the
+ command line. */
+ if (infile == NULL) {
+ mesg ("%s: no input TTF file provided.\n", prog);
+ Usage(1);
+ }
+
+ if (encFile != NULL) {
+ if ((enc = fopen(encFile, "rt")) == 0) {
+ fatal ("%s: no input code range file.\n", prog);
+ exit (1);
+ }
+ }
+ /* Initialize font engine */
+ if (! Init_Font_Engine (infile)) {
+ if (out != stdout) {
+ fclose(out);
+ (void) unlink(outfile);
+ }
+ exit (1);
+ }
+ /* Generate the disassembled PFB font
+ from the TrueType font. */
+ if (Generate_Fonts (out, plane, enc, fname, pfxUID))
+ result = 0;
+ else
+ result = 2;
+
+ if (out != stdout) {
+ fclose(out);
+ if (result != 0) {
+ mesg ("%s: An error occured when generating", prog);
+ mesg (" the font, so delete the output file.\n");
+ /* (void) unlink(outfile); */
+ }
+ }
+
+ TT_Close_Face (face);
+ TT_Done_FreeType (engine);
+
+ exit(result);
+}
+
+
+/* end of ttf2pfb.c */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/BUGS b/xc/extras/FreeType/contrib/ttf2pk/BUGS
new file mode 100644
index 000000000..af531e4c2
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/BUGS
@@ -0,0 +1,3 @@
+
+Some characters (Arial A) have a bounding box that extends outside the
+character width... such a character will get an italic correction.
diff --git a/xc/extras/FreeType/contrib/ttf2pk/MakeSub.in b/xc/extras/FreeType/contrib/ttf2pk/MakeSub.in
new file mode 100644
index 000000000..948f13b5a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/MakeSub.in
@@ -0,0 +1,6 @@
+# This file is part of the ttf2pk package
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+bindir = @bindir@
+mandir = @mandir@
diff --git a/xc/extras/FreeType/contrib/ttf2pk/Makefile.dm b/xc/extras/FreeType/contrib/ttf2pk/Makefile.dm
new file mode 100644
index 000000000..9c147451f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/Makefile.dm
@@ -0,0 +1,71 @@
+# Makefile for ttf2pk -- loyer@enst.fr, wl@gnu.org
+#
+# This Makefile assumes that you've already built and installed
+# the FreeType library.
+#
+# It builds the ttf2pk and ttf2tfm for emx-gcc.
+#
+# You will need dmake.
+#
+# Use this file while with the following statement:
+#
+# dmake -r -f Makefile.dm
+
+
+.IMPORT: COMSPEC
+SHELL := $(COMSPEC)
+SHELLFLAGS := /c
+GROUPSHELL := $(SHELL)
+GROUPFLAGS := $(SHELLFLAGS)
+GROUPSUFFIX := .bat
+SHELLMETAS := *"?<>&|
+
+CC = gcc
+LIBDIR = ../../lib
+INCDIR = -I$(LIBDIR) -I.
+
+# CFLAGS = -Wall -O2 -g $(INCDIR) -fbounds-checking -DHAVE_EMTEXDIR -DMSDOS
+CFLAGS = -Wall -O2 -s $(INCDIR) -DHAVE_EMTEXDIR -DMSDOS
+
+SRC = case.c emdir.c emtexdir.c errormsg.c filesrch.c ligkern.c newobj.c \
+ parse.c pklib.c subfont.c texenc.c tfmaux.c ttf2pk.c ttf2tfm.c \
+ ttfaux.c ttfenc.c ttflib.c vplaux.c
+
+ttf2pkobjs = emdir.o emtexdir.o errormsg.o filesrch.o ligkern.o newobj.o \
+ parse.o pklib.o subfont.o texenc.o ttf2pk.o ttfenc.o ttflib.o
+ttf2tfmobjs = case.o emdir.o emtexdir.o errormsg.o filesrch.o ligkern.o \
+ newobj.o parse.o subfont.o texenc.o tfmaux.o ttf2tfm.o \
+ ttfaux.o ttfenc.o vplaux.o
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+%.exe:
+ $(CC) $(CFLAGS) -o $@ @$(mktmp $(&:t"\n")\n)
+
+
+PROGRAMS = ttf2pk.exe ttf2tfm.exe
+
+.PHONY: all clean distclean
+
+
+all: $(PROGRAMS)
+
+ttf2pk.exe: $(ttf2pkobjs) $(LIBDIR)/libttf.a
+ttf2tfm.exe: $(ttf2tfmobjs) $(LIBDIR)/libttf.a
+
+
+clean:
+-[
+ del *.o
+]
+
+distclean: clean
+-[
+ del dep.end
+ del *.exe
+ del core
+]
+
+#end of Makefile.dm
diff --git a/xc/extras/FreeType/contrib/ttf2pk/Makefile.in b/xc/extras/FreeType/contrib/ttf2pk/Makefile.in
new file mode 100644
index 000000000..af7e495b3
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/Makefile.in
@@ -0,0 +1,116 @@
+# Makefile for ttf2pk -- loyer@enst.fr, wl@gnu.org
+#
+# This Makefile assumes that you've already built and installed
+# the FreeType library.
+
+VPATH = @srcdir@
+srcdir = @srcdir@
+
+RM = @RM@
+RMF = @RM@ -f
+RMDIR = @RMDIR@
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+
+CC = @CC@
+CPP = @CPP@
+
+LIBTOOL = ../../libtool
+MKINSTALLDIRS = $(srcdir)/../../mkinstalldirs
+
+include MakeSub
+
+CFLAGS = @CFLAGS@ @XX_CFLAGS@
+CPPFLAGS = @CPPFLAGS@ @DEFS@
+FT_CFLAGS = $(CFLAGS) $(CPPFLAGS)
+LDFLAGS = @LDFLAGS@ @LIBS@
+LIBDIR = ../../lib
+
+SRC = $(srcdir)/case.c \
+ $(srcdir)/errormsg.c \
+ $(srcdir)/filesrch.c \
+ $(srcdir)/ligkern.c \
+ $(srcdir)/newobj.c \
+ $(srcdir)/parse.c \
+ $(srcdir)/pklib.c \
+ $(srcdir)/subfont.c \
+ $(srcdir)/texenc.c \
+ $(srcdir)/tfmaux.c \
+ $(srcdir)/ttf2pk.c \
+ $(srcdir)/ttf2tfm.c \
+ $(srcdir)/ttfaux.c \
+ $(srcdir)/ttfenc.c \
+ $(srcdir)/ttflib.c \
+ $(srcdir)/vplaux.c
+
+ttf2pkobjs = errormsg.o filesrch.o ligkern.o newobj.o parse.o pklib.o \
+ subfont.o texenc.o ttf2pk.o ttfenc.o ttflib.o
+ttf2tfmobjs = case.o errormsg.o filesrch.o ligkern.o newobj.o parse.o \
+ subfont.o texenc.o tfmaux.o ttf2tfm.o ttfaux.o ttfenc.o \
+ vplaux.o
+
+
+.c.o:
+ $(CC) -c $(FT_CFLAGS) $<
+
+
+PROGRAMS = ttf2pk ttf2tfm
+
+default all: $(PROGRAMS)
+
+ttf2pk: $(ttf2pkobjs) $(LIBDIR)/libttf.la
+ $(LIBTOOL) --mode=link $(CC) $(FT_CFLAGS) -o ttf2pk $(ttf2pkobjs) \
+ $(LIBDIR)/libttf.la $(LDFLAGS)
+
+ttf2tfm: $(ttf2tfmobjs) $(LIBDIR)/libttf.la
+ $(LIBTOOL) --mode=link $(CC) $(FT_CFLAGS) -o ttf2tfm $(ttf2tfmobjs) \
+ $(LIBDIR)/libttf.la $(LDFLAGS)
+
+install: $(PROGRAMS)
+ $(MKINSTALLDIRS) $(bindir) $(mandir)/man1
+ for P in $(PROGRAMS) ; do \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$P $(bindir)/$$P ; \
+ $(INSTALL_DATA) $(srcdir)/$$P.1 $(mandir)/man1 ; \
+ done
+
+uninstall:
+ -for P in $(PROGRAMS) ; do \
+ $(LIBTOOL) --mode=uninstall $(RM) $(bindir)/$$P ; \
+ $(RMF) $(mandir)/man1/$$P.1 ; \
+ done
+
+clean: do_clean
+
+distclean: do_clean
+ -$(RMF) dep.end $(PROGRAMS)
+ -$(RMF) *~ *.orig core *.core
+ -$(RMF) config.cache config.log config.status Makefile MakeSub
+ -$(RMF) .libs/*
+ -$(RMDIR) .libs
+
+do_clean:
+ -$(RMF) *.o
+
+
+depend:
+ (echo '/^#.* PUT NO STUFF BELOW/,$$d' ; echo w ; echo q) | \
+ ed - Makefile
+ echo '# Dependencies generated by make depend: PUT NO STUFF BELOW' \
+ >> Makefile
+ for file in $(SRC) ; do \
+ $(CPP) $(CPPFLAGS) $$file | \
+ sed -n -e 's|^# [1-9][0-9]* "\([^/].*\.h\)".*|\1|p' \
+ -e 's|^# [1-9][0-9]* "\($(srcdir)/.*\.h\)".*|\1|p' | \
+ sed -e 's|/\./|.|g' -e "s/^/`basename $$file .c`.o: /" ; \
+ done | \
+ sort -u | \
+ awk '{ if (LINE == 1) \
+ { line = last = $$1 } \
+ else if ($$1 != last) \
+ { print line ; line = last = $$1 } \
+ line = line " " $$2 } \
+ END { print line }' >> Makefile
+
+# Dependencies generated by make depend: PUT NO STUFF BELOW
diff --git a/xc/extras/FreeType/contrib/ttf2pk/README b/xc/extras/FreeType/contrib/ttf2pk/README
new file mode 100644
index 000000000..e9274def7
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/README
@@ -0,0 +1,94 @@
+This directory contains ttf2tfm and ttf2pk, two utilities based on
+
+ afm2tfm (dvipsk distribution),
+ gsftopkk (dvipsk distribution),
+ and the FreeType rasterizer for TrueType fonts.
+
+
+Compile the FreeType library first! It is recommended to use the kpathsea
+library if you want to use the programs with web2c resp. teTeX. Source files
+for emTeX-like search routines are included. Nevertheless, as a last resort,
+you can compile both programs without a search library too.
+
+The kpathsea library is *not* part of the ttf2pk package (see notes below).
+
+
+
+Under UNIX-like systems say
+
+ ./configure --with-kpathsea-dir=<kpathsea base directory>
+ make
+
+[Note 1:
+ Try to find `libkpathsea.*' on your system. Use the directory above this
+ one as the argument for --with-kpathsea-dir. This should work in most
+ cases. If you can't find the library, you probably have a web2c package
+ with statically linked binaries. This means that you have to get the web2c
+ sources from CTAN, configure it with something like
+
+ ./configure --prefix=/usr/local/TeX --datadir=/usr/local/TeX \
+ --enable-shared --disable-static
+
+ according to your setup; then change to the kpathsea directory and say
+ `make' and `make install' (Do the latter with caution not to overwrite
+ binaries like kpsewhich).
+
+ It even works with the source tree from the TeX Live CD 3! You just have
+ to add a proper --srcdir option to the configure script.
+
+ Unfortunately, teTeX-0.4 uses a very old kpathsea library version without
+ automatical shared-library support, thus you have to install the static
+ libraries:
+
+ .) unpack the sources (basically you need only the contents of kpse-2.6
+ and the two subdirs `kpathsea' and `make'.
+
+ .) say
+
+ ./configure --prefix=...
+ make
+
+ in the kpse-2.6 directory
+
+ .) say
+
+ make install-library
+
+ in the kpathsea subdirectory. See Note 2 also.
+
+ DON'T USE A NEWER KPATHSEA VERSION IF YOU USE teTeX 0.4 BINARIES! Newer
+ kpathsea versions are not compatible with version 2.6.
+
+ Note 2:
+ It seems that c-auto.h created during the kpathsea library compiling
+ process won't be installed for some older web2c versions. You should add
+ it manually, i.e., copy <web2c source tree>/kpathsea/c-auto.h to the
+ location where the other kpathsea header files have been installed.
+
+ Note 3:
+ If you want to use the --srcdir option of the configure script, you must
+ compile FreeType with --srcdir too. You have to use the same directory
+ structure to make it work (i.e., if you have said for FreeType
+ `./configure --srcdir=foo', and you are in the `bar' directory, FreeType's
+ configure script will generate all the needed subdirs for compiling
+ FreeType. You've then manually to add the directory `bar/contrib/ttf2pk';
+ there you should start to say ./configure --srcdir=foo/contrib/ttf2pk').]
+
+
+
+Use Makefile.dm for emx + dmake and say
+
+ dmake -r -f Makefile.dm
+
+[Note: It should work with djgpp too, but I haven't tested this.]
+
+
+
+Primary author of afm2tfm: T. Rokicki,
+Primary author of gsftopk: P.Vojta
+Primary author of the kpathsea library,
+ afm2tfm/gsftopk adaptation: K. Berry.
+
+--
+Frederic Loyer <loyer@ensta.fr>
+Werner Lemberg <wl@gnu.org>
diff --git a/xc/extras/FreeType/contrib/ttf2pk/TODO b/xc/extras/FreeType/contrib/ttf2pk/TODO
new file mode 100644
index 000000000..c58e977d1
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/TODO
@@ -0,0 +1,18 @@
+. rotated glyphs (useful for vertical writing of Chinese and Japanese).
+
+. support for different horizontal and vertical resolutions.
+
+. character composition via the vpl file.
+
+. Omega support
+
+. afm output
+
+. possibility to create `real' fonts, i.e., avoiding virtual fonts for small
+ caps etc. -- some dvi previewers still can't handle virtual fonts. Due to
+ the huge amount of work to support this it is rather unlikely that I'll do
+ it.
+
+. using hash tables to store glyph names for better performance
+
+. show replacement glyphs too in glyph listings
diff --git a/xc/extras/FreeType/contrib/ttf2pk/c-auto.h b/xc/extras/FreeType/contrib/ttf2pk/c-auto.h
new file mode 100644
index 000000000..1533bc21b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/c-auto.h
@@ -0,0 +1,23 @@
+/*
+ * c-auto.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef C_AUTO_H
+#define C_AUTO_H
+
+/*
+ * We need to get kpathsea's configuration file.
+ */
+
+#include "kpathsea/c-auto.h"
+
+#endif /* C_AUTO_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/case.c b/xc/extras/FreeType/contrib/ttf2pk/case.c
new file mode 100644
index 000000000..f33e35597
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/case.c
@@ -0,0 +1,179 @@
+/*
+ * case.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdlib.h> /* for definition of NULL */
+
+#include "case.h"
+
+
+/* This is a table of uppercase/lowercase pairs which can't be deduced */
+/* by lowercasing the uppercase Adobe glyph name. */
+/* It has been extracted from the ucs2ps.um database compiled by */
+/* Bjorn Brox <brox@corena.no>. */
+
+Case casetable[] =
+{
+ {"afii10017", "afii10065"},
+ {"afii10018", "afii10066"},
+ {"afii10019", "afii10067"},
+ {"afii10020", "afii10068"},
+ {"afii10021", "afii10069"},
+ {"afii10022", "afii10070"},
+ {"afii10023", "afii10071"},
+ {"afii10024", "afii10072"},
+ {"afii10025", "afii10073"},
+ {"afii10026", "afii10074"},
+ {"afii10027", "afii10075"},
+ {"afii10028", "afii10076"},
+ {"afii10029", "afii10077"},
+ {"afii10030", "afii10078"},
+ {"afii10031", "afii10079"},
+ {"afii10032", "afii10080"},
+ {"afii10033", "afii10081"},
+ {"afii10034", "afii10082"},
+ {"afii10035", "afii10083"},
+ {"afii10036", "afii10084"},
+ {"afii10037", "afii10085"},
+ {"afii10038", "afii10086"},
+ {"afii10039", "afii10087"},
+ {"afii10040", "afii10088"},
+ {"afii10041", "afii10089"},
+ {"afii10042", "afii10090"},
+ {"afii10043", "afii10091"},
+ {"afii10044", "afii10092"},
+ {"afii10045", "afii10093"},
+ {"afii10046", "afii10094"},
+ {"afii10047", "afii10095"},
+ {"afii10048", "afii10096"},
+ {"afii10049", "afii10097"},
+ {"afii10050", "afii10098"},
+ {"afii10051", "afii10099"},
+ {"afii10052", "afii10100"},
+ {"afii10053", "afii10101"},
+ {"afii10054", "afii10102"},
+ {"afii10055", "afii10103"},
+ {"afii10056", "afii10104"},
+ {"afii10057", "afii10105"},
+ {"afii10058", "afii10106"},
+ {"afii10059", "afii10107"},
+ {"afii10060", "afii10108"},
+ {"afii10061", "afii10109"},
+ {"afii10062", "afii10110"},
+ {"afii10145", "afii10193"},
+ {"afii10146", "afii10194"},
+ {"afii10147", "afii10195"},
+ {"afii10148", "afii10196"},
+ {"afii10149", "afii10197"},
+ {"afii10152", "afii10200"},
+ {"afii10202", "afii10154"},
+ {"afii10155", "afii10203"},
+ {"afii10156", "afii10204"},
+ {"afii10157", "afii10205"},
+ {"afii10158", "afii10206"},
+ {"afii10160", "afii10208"},
+ {"afii10161", "afii10209"},
+ {"afii10162", "afii10210"},
+ {"afii10163", "afii10211"},
+ {"afii10164", "afii10212"},
+ {"afii10166", "afii10214"},
+ {"afii10167", "afii10215"},
+ {"afii10168", "afii10216"},
+ {"afii10170", "afii10218"},
+ {"afii10171", "afii10219"},
+ {"afii10172", "afii10220"},
+ {"afii10173", "afii10221"},
+ {"afii10174", "afii10222"},
+ {"afii10176", "afii10224"},
+ {"afii10178", "afii10226"},
+ {"afii10179", "afii10227"},
+ {"afii10181", "afii10229"},
+ {"afii10182", "afii10230"},
+ {"afii10184", "afii10232"},
+ {"afii10185", "afii10233"},
+ {"afii10187", "afii10235"},
+ {"afii10188", "afii10236"},
+ {"afii10190", "afii10238"},
+ {"afii10785", "afii10833"},
+ {"afii10786", "afii10834"},
+ {"afii10787", "afii10835"},
+ {"afii10795", "afii10843"},
+ {"afii10798", "afii10846"},
+ {"afii10799", "afii10847"},
+ {"afii10800", "afii10848"},
+ {"afii10801", "afii10849"},
+ {"afii64308", "afii64436"},
+ {"afii10803", "afii10851"},
+ {"afii10808", "afii10856"},
+ {"afii10809", "afii10857"},
+ {"afii10810", "afii10858"},
+ {"afii10811", "afii10859"},
+ {"afii10817", "afii10865"},
+ {"afii10818", "afii10866"},
+ {"afii10819", "afii10867"},
+ {"afii10822", "afii10870"},
+ {"afii10827", "afii10875"},
+ {"afii10914", "afii10962"},
+ {"afii10920", "afii10968"},
+ {"afii10924", "afii10972"},
+ {"afii10927", "afii10975"},
+ {"afii10929", "afii10977"},
+ {"afii10930", "afii10978"},
+ {"afii10931", "afii10979"},
+ {"afii10932", "afii10980"},
+ {"afii10934", "afii10982"},
+ {"afii10943", "afii10991"},
+ {"afii10944", "afii10992"},
+ {"afii10951", "afii10967"},
+/*{? "ash"} */
+ {"Beta", "beta1"},
+ {"Bhook", "bhooktop"},
+ {"Chook", "chooktop"},
+/*{"Oopen" "cturn" ?} */
+ {"Dbar1", "dbar"},
+ {"Dhook", "dhooktop"},
+ {"Dmacron", "dmacron3"},
+ {"Dslash", "dmacron"},
+ {"I", "dotlessi"},
+ {"J", "dotlessj"},
+/*{"Dbar", "drighttail" ?} */
+/*{"Dbar" "drthook" ?} */
+/*{"Dslash", ?} */
+ {"Fhook", "fscript"},
+ {"Ghook", "ghooktop"},
+ {"Ibar", "ibarred"},
+ {"I", "iundotted"},
+ {"Kappa", "kappa1"},
+ {"Khook", "khooktop"},
+ {"S", "longs"},
+ {"mcapturn", "mturn"},
+ {"mcapturn", "mturned"},
+ {"Mu", "mu1"},
+ {"Nhook", "nlefthookatleft"},
+ {"Nhook", "nlftlfthook"},
+ {"Obar", "obarred"},
+ {"Pi", "omega1"},
+ {"Phi", "phi1"},
+ {"Phi", "philatin"},
+ {"Pi", "pi1"},
+ {"Rho", "rho1"},
+ {"Sigma", "sigma1"},
+ {"Sigma", "sigmafinal"},
+ {"Sigma", "sigmalunate"},
+ {"S", "slong"},
+ {"Theta", "theta1"},
+ {"Thook", "thooktop"},
+ {"Trthook", "trighttail"},
+ {"Upsilon2", "upsilon"},
+ {"Vcursive", "vscript"},
+ {NULL, NULL}
+};
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/case.h b/xc/extras/FreeType/contrib/ttf2pk/case.h
new file mode 100644
index 000000000..4e4f70b69
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/case.h
@@ -0,0 +1,27 @@
+/*
+ * case.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef CASE_H
+#define CASE_H
+
+struct _Case
+{
+ char *upper;
+ char *lower;
+};
+typedef struct _Case Case;
+
+
+extern Case casetable[];
+
+#endif /* CASE_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/configure b/xc/extras/FreeType/contrib/ttf2pk/configure
new file mode 100755
index 000000000..bb7c032d0
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/configure
@@ -0,0 +1,1609 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+ --with-kpathsea-dir=DIR Location of the kpathsea base dir (/usr/local)"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ case "$ac_option" in
+ -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) ac_optarg= ;;
+ esac
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case "$ac_option" in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir="$ac_optarg" ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build="$ac_optarg" ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file="$ac_optarg" ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir="$ac_optarg" ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ eval "enable_${ac_feature}=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+ fi
+ ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix="$ac_optarg" ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he)
+ # 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 << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+ --cache-file=FILE cache test results in FILE
+ --help print this message
+ --no-create do not create output files
+ --quiet, --silent do not print \`checking...' messages
+ --version print the version of autoconf that created configure
+Directory and file names:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [same as prefix]
+ --bindir=DIR user executables in DIR [EPREFIX/bin]
+ --sbindir=DIR system admin executables in DIR [EPREFIX/sbin]
+ --libexecdir=DIR program executables in DIR [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data in DIR
+ [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data in DIR
+ [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var]
+ --libdir=DIR object code libraries in DIR [EPREFIX/lib]
+ --includedir=DIR C header files in DIR [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include]
+ --infodir=DIR info documentation in DIR [PREFIX/info]
+ --mandir=DIR man documentation in DIR [PREFIX/man]
+ --srcdir=DIR find the sources in DIR [configure dir or ..]
+ --program-prefix=PREFIX prepend PREFIX to installed program names
+ --program-suffix=SUFFIX append SUFFIX to installed program names
+ --program-transform-name=PROGRAM
+ run sed PROGRAM on installed program names
+EOF
+ cat << EOF
+Host type:
+ --build=BUILD configure for building on BUILD [BUILD=HOST]
+ --host=HOST configure for HOST [guessed]
+ --target=TARGET configure for TARGET [TARGET=HOST]
+Features and packages:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+EOF
+ if test -n "$ac_help"; then
+ echo "--enable and --with options recognized:$ac_help"
+ fi
+ exit 0 ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host="$ac_optarg" ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir="$ac_optarg" ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir="$ac_optarg" ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir="$ac_optarg" ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir="$ac_optarg" ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir="$ac_optarg" ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir="$ac_optarg" ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir="$ac_optarg" ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix="$ac_optarg" ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix="$ac_optarg" ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix="$ac_optarg" ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name="$ac_optarg" ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir="$ac_optarg" ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir="$ac_optarg" ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site="$ac_optarg" ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir="$ac_optarg" ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir="$ac_optarg" ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target="$ac_optarg" ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers)
+ echo "configure generated by autoconf version 2.12"
+ exit 0 ;;
+
+ -with-* | --with-*)
+ ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case "$ac_option" in
+ *=*) ;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_${ac_package}='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+ # Reject names that are not valid shell variable names.
+ if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+ { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+ fi
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ eval "with_${ac_package}=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes="$ac_optarg" ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries="$ac_optarg" ;;
+
+ -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+ ;;
+
+ *)
+ if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+ echo "configure: warning: $ac_option: invalid host type" 1>&2
+ fi
+ if test "x$nonopt" != xNONE; then
+ { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+ fi
+ nonopt="$ac_option"
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+ case "$ac_arg" in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+ esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set. These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=../../lib/freetype.h
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+ else
+ { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+ fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ echo "loading site script $ac_site_file"
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ echo "loading cache $cache_file"
+ . $cache_file
+else
+ echo "creating cache $cache_file"
+ > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Do some error checking and defaulting for the host and target type.
+# The inputs are:
+# configure --host=HOST --target=TARGET --build=BUILD NONOPT
+#
+# The rules are:
+# 1. You are not allowed to specify --host, --target, and nonopt at the
+# same time.
+# 2. Host defaults to nonopt.
+# 3. If nonopt is not specified, then host defaults to the current host,
+# as determined by config.guess.
+# 4. Target and build default to nonopt.
+# 5. If nonopt is not specified, then target and build default to host.
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+case $host---$target---$nonopt in
+NONE---*---* | *---NONE---* | *---*---NONE) ;;
+*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } ;;
+esac
+
+
+# Make sure we can run config.sub.
+if $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:572: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+ case $nonopt in
+ NONE)
+ if host_alias=`$ac_config_guess`; then :
+ else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+ fi ;;
+ *) host_alias=$nonopt ;;
+ esac ;;
+esac
+
+host=`$ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+echo $ac_n "checking target system type""... $ac_c" 1>&6
+echo "configure:593: checking target system type" >&5
+
+target_alias=$target
+case "$target_alias" in
+NONE)
+ case $nonopt in
+ NONE) target_alias=$host_alias ;;
+ *) target_alias=$nonopt ;;
+ esac ;;
+esac
+
+target=`$ac_config_sub $target_alias`
+target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$target" 1>&6
+
+echo $ac_n "checking build system type""... $ac_c" 1>&6
+echo "configure:611: checking build system type" >&5
+
+build_alias=$build
+case "$build_alias" in
+NONE)
+ case $nonopt in
+ NONE) build_alias=$host_alias ;;
+ *) build_alias=$nonopt ;;
+ esac ;;
+esac
+
+build=`$ac_config_sub $build_alias`
+build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$build" 1>&6
+
+test "$host_alias" != "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:637: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_CC="gcc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:666: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ ac_prog_rejected=no
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+ fi
+ ac_cv_prog_CC="cc"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" "$@"
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+ echo "$ac_t""$CC" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+ test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:714: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 724 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:728: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ ac_cv_prog_cc_works=yes
+ # If we can't run a trivial program, we are probably using a cross compiler.
+ if (./conftest; exit) 2>/dev/null; then
+ ac_cv_prog_cc_cross=no
+ else
+ ac_cv_prog_cc_cross=yes
+ fi
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+ { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:748: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:753: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:762: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ ac_cv_prog_gcc=yes
+else
+ ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+ GCC=yes
+ ac_test_CFLAGS="${CFLAGS+set}"
+ ac_save_CFLAGS="$CFLAGS"
+ CFLAGS=
+ echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:777: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+ ac_cv_prog_cc_g=yes
+else
+ ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+ if test "$ac_test_CFLAGS" = set; then
+ CFLAGS="$ac_save_CFLAGS"
+ elif test $ac_cv_prog_cc_g = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-O2"
+ fi
+else
+ GCC=
+ test "${CFLAGS+set}" = set || CFLAGS="-g"
+fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:805: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ # This must be in double quotes, not single quotes, because CPP may get
+ # substituted into the Makefile and "${CC-cc}" will confuse make.
+ CPP="${CC-cc} -E"
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp.
+ cat > conftest.$ac_ext <<EOF
+#line 820 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:826: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP="${CC-cc} -E -traditional-cpp"
+ cat > conftest.$ac_ext <<EOF
+#line 837 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:843: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ :
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+ ac_cv_prog_CPP="$CPP"
+fi
+ CPP="$ac_cv_prog_CPP"
+else
+ ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+
+# Check whether --with-kpathsea-dir or --without-kpathsea-dir was given.
+if test "${with_kpathsea_dir+set}" = set; then
+ withval="$with_kpathsea_dir"
+
+ if test x$withval = xyes; then
+ echo "configure: warning: Usage is: --with-kpathsea-dir=basedir" 1>&2
+ else
+ if test x$withval = xno; then
+ echo "configure: warning: Usage is: --with-kpathsea-dir=basedir" 1>&2
+ else
+ kpathsea_dir=$withval
+ fi
+ fi
+
+fi
+
+
+if test -n "$kpathsea_dir"; then
+ LIBS="$LIBS -L$kpathsea_dir/lib"
+ CPPFLAGS="$CPPFLAGS -I$kpathsea_dir/include -I$srcdir"
+
+ echo $ac_n "checking for kpse_set_program_name in -lkpathsea""... $ac_c" 1>&6
+echo "configure:888: checking for kpse_set_program_name in -lkpathsea" >&5
+ac_lib_var=`echo kpathsea'_'kpse_set_program_name | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lkpathsea $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 896 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char kpse_set_program_name();
+
+int main() {
+kpse_set_program_name()
+; return 0; }
+EOF
+if { (eval echo configure:907: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+
+else
+ echo "$ac_t""no" 1>&6
+cat >> confdefs.h <<\EOF
+#define OLD_KPATHSEA 1
+EOF
+
+fi
+
+
+ echo $ac_n "checking for kpse_init_prog in -lkpathsea""... $ac_c" 1>&6
+echo "configure:933: checking for kpse_init_prog in -lkpathsea" >&5
+ac_lib_var=`echo kpathsea'_'kpse_init_prog | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lkpathsea $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 941 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char kpse_init_prog();
+
+int main() {
+kpse_init_prog()
+; return 0; }
+EOF
+if { (eval echo configure:952: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo kpathsea | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lkpathsea $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+
+ { echo "configure: error: Can't find kpathsea library! Use --with-kpathsea-dir option." 1>&2; exit 1; }
+fi
+
+
+ ac_safe=`echo "kpathsea/kpathsea.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for kpathsea/kpathsea.h""... $ac_c" 1>&6
+echo "configure:984: checking for kpathsea/kpathsea.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 989 "configure"
+#include "confdefs.h"
+#include <kpathsea/kpathsea.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:994: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+
+else
+ echo "$ac_t""no" 1>&6
+cat >> confdefs.h <<\EOF
+#define VERY_OLD_KPATHSEA 1
+EOF
+
+fi
+
+
+ ac_safe=`echo "kpathsea/c-auto.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for kpathsea/c-auto.h""... $ac_c" 1>&6
+echo "configure:1022: checking for kpathsea/c-auto.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ cat > conftest.$ac_ext <<EOF
+#line 1027 "configure"
+#include "confdefs.h"
+#include <kpathsea/c-auto.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1032: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out`
+if test -z "$ac_err"; then
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=yes"
+else
+ echo "$ac_err" >&5
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ :
+else
+ echo "$ac_t""no" 1>&6
+
+ { echo "configure: error: Can't find kpathsea include files! Use --with-kpathsea-dir option." 1>&2; exit 1; }
+fi
+
+else
+ CPPFLAGS="$CPPFLAGS -I$srcdir"
+fi
+
+echo $ac_n "checking for floor in -lm""... $ac_c" 1>&6
+echo "configure:1060: checking for floor in -lm" >&5
+ac_lib_var=`echo m'_'floor | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1068 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char floor();
+
+int main() {
+floor()
+; return 0; }
+EOF
+if { (eval echo configure:1079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lm $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+echo $ac_n "checking for gettext in -lintl""... $ac_c" 1>&6
+echo "configure:1107: checking for gettext in -lintl" >&5
+ac_lib_var=`echo intl'_'gettext | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lintl $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1115 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gettext();
+
+int main() {
+gettext()
+; return 0; }
+EOF
+if { (eval echo configure:1126: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ ac_tr_lib=HAVE_LIB`echo intl | sed -e 's/[^a-zA-Z0-9_]/_/g' \
+ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
+ cat >> confdefs.h <<EOF
+#define $ac_tr_lib 1
+EOF
+
+ LIBS="-lintl $LIBS"
+
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+
+OLDLIBS=$LIBS
+LIBS="$LIBS -L../../lib/.libs"
+CPPFLAGS="$CPPFLAGS -I$srcdir/../../lib"
+echo $ac_n "checking for TT_Init_FreeType in -lttf""... $ac_c" 1>&6
+echo "configure:1158: checking for TT_Init_FreeType in -lttf" >&5
+ac_lib_var=`echo ttf'_'TT_Init_FreeType | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ ac_save_LIBS="$LIBS"
+LIBS="-lttf $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1166 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error. */
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char TT_Init_FreeType();
+
+int main() {
+TT_Init_FreeType()
+; return 0; }
+EOF
+if { (eval echo configure:1177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=yes"
+else
+ echo "configure: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ rm -rf conftest*
+ eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+ echo "$ac_t""yes" 1>&6
+ LIBS="$LIBS -lttf"
+else
+ echo "$ac_t""no" 1>&6
+
+ { echo "configure: error: Can't find ttf library! Compile FreeType first." 1>&2; exit 1; }
+fi
+
+LIBS=$OLDLIBS
+
+
+if test "x$CC" = xgcc; then
+ XX_CFLAGS="-Wall -ansi -pedantic"
+else
+ case "$host" in
+ alpha-dec-osf*)
+ XX_CFLAGS="-std1 -O2 -g3"
+ ;;
+ *)
+ XX_CFLAGS=
+ ;;
+ esac
+fi
+
+
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1219: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RM'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RM"; then
+ ac_cv_prog_RM="$RM" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RM="rm"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RM="$ac_cv_prog_RM"
+if test -n "$RM"; then
+ echo "$ac_t""$RM" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Extract the first word of "rmdir", so it can be a program name with args.
+set dummy rmdir; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:1247: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_RMDIR'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ if test -n "$RMDIR"; then
+ ac_cv_prog_RMDIR="$RMDIR" # Let the user override the test.
+else
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ ac_cv_prog_RMDIR="rmdir"
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+fi
+fi
+RMDIR="$ac_cv_prog_RMDIR"
+if test -n "$RMDIR"; then
+ echo "$ac_t""$RMDIR" 1>&6
+else
+ echo "$ac_t""no" 1>&6
+fi
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1283: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+ echo $ac_n "(cached) $ac_c" 1>&6
+else
+ IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ # Account for people who put trailing slashes in PATH elements.
+ case "$ac_dir/" in
+ /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ for ac_prog in ginstall installbsd scoinst install; do
+ if test -f $ac_dir/$ac_prog; then
+ if test $ac_prog = install &&
+ grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ # OSF/1 installbsd also uses dspmsg, but is usable.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+ IFS="$ac_save_IFS"
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL="$ac_cv_path_install"
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL="$ac_install_sh"
+ fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs. It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already. You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+ case `(ac_space=' '; set) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote substitution
+ # turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ -e "s/'/'\\\\''/g" \
+ -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+ ;;
+ esac >> confcache
+if cmp -s $cache_file confcache; then
+ :
+else
+ if test -w $cache_file; then
+ echo "updating cache $cache_file"
+ cat confcache > $cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+# Transform confdefs.h into DEFS.
+# Protect against shell expansion while executing Makefile rules.
+# Protect against Makefile macro expansion.
+cat > conftest.defs <<\EOF
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%-D\1=\2%g
+s%[ `~#$^&*(){}\\|;'"<>?]%\\&%g
+s%\[%\\&%g
+s%\]%\\&%g
+s%\$%$$%g
+EOF
+DEFS=`sed -f conftest.defs confdefs.h | tr '\012' ' '`
+rm -f conftest.defs
+
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+ case "\$ac_option" in
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+ exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+ -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+ echo "$CONFIG_STATUS generated by autoconf version 2.12"
+ exit 0 ;;
+ -help | --help | --hel | --he | --h)
+ echo "\$ac_cs_usage"; exit 0 ;;
+ *) echo "\$ac_cs_usage"; exit 1 ;;
+ esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile MakeSub" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@target@%$target%g
+s%@target_alias@%$target_alias%g
+s%@target_cpu@%$target_cpu%g
+s%@target_vendor@%$target_vendor%g
+s%@target_os@%$target_os%g
+s%@build@%$build%g
+s%@build_alias@%$build_alias%g
+s%@build_cpu@%$build_cpu%g
+s%@build_vendor@%$build_vendor%g
+s%@build_os@%$build_os%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@XX_CFLAGS@%$XX_CFLAGS%g
+s%@RM@%$RM%g
+s%@RMDIR@%$RMDIR%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+ else
+ sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+ fi
+ if test ! -s conftest.s$ac_file; then
+ ac_more_lines=false
+ rm -f conftest.s$ac_file
+ else
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f conftest.s$ac_file"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+ fi
+ ac_file=`expr $ac_file + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_cmds`
+ fi
+done
+if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile MakeSub"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case "$ac_file" in
+ *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+ ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+ *) ac_file_in="${ac_file}.in" ;;
+ esac
+
+ # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+ # Remove last slash and all that follows it. Not all systems have dirname.
+ ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ # The file is in a subdirectory.
+ test ! -d "$ac_dir" && mkdir "$ac_dir"
+ ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case "$ac_given_srcdir" in
+ .) srcdir=.
+ if test -z "$ac_dots"; then top_srcdir=.
+ else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+ /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+ *) # Relative path.
+ srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+ top_srcdir="$ac_dots$ac_given_srcdir" ;;
+ esac
+
+ case "$ac_given_INSTALL" in
+ [/$]*) INSTALL="$ac_given_INSTALL" ;;
+ *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+ esac
+
+ echo creating "$ac_file"
+ rm -f "$ac_file"
+ configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+ case "$ac_file" in
+ *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+ *) ac_comsub= ;;
+ esac
+
+ ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+ sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
diff --git a/xc/extras/FreeType/contrib/ttf2pk/configure.in b/xc/extras/FreeType/contrib/ttf2pk/configure.in
new file mode 100644
index 000000000..3ac9cee46
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/configure.in
@@ -0,0 +1,79 @@
+dnl This file is part of the ttf2pk package
+
+dnl Process this file with autoconf to produce a configure script.
+
+dnl Some tests are ommitted since we assume that you've built the
+dnl FreeType library successfully.
+
+AC_INIT(../../lib/freetype.h)
+
+AC_CANONICAL_SYSTEM
+
+AC_PROG_CC
+AC_PROG_CPP
+
+AC_ARG_WITH(kpathsea-dir,
+ [ --with-kpathsea-dir=DIR Location of the kpathsea base dir (/usr/local)],[
+ if test x$withval = xyes; then
+ AC_MSG_WARN(Usage is: --with-kpathsea-dir=basedir)
+ else
+ if test x$withval = xno; then
+ AC_MSG_WARN(Usage is: --with-kpathsea-dir=basedir)
+ else
+ kpathsea_dir=$withval
+ fi
+ fi
+])
+
+if test -n "$kpathsea_dir"; then
+ LIBS="$LIBS -L$kpathsea_dir/lib"
+ CPPFLAGS="$CPPFLAGS -I$kpathsea_dir/include -I$srcdir"
+
+ dnl the function kpse_set_program_name() is available since kpathsea 3.2
+ AC_CHECK_LIB(kpathsea, kpse_set_program_name, [[]], AC_DEFINE(OLD_KPATHSEA))
+
+ AC_CHECK_LIB(kpathsea, kpse_init_prog, ,[
+ AC_MSG_ERROR([Can't find kpathsea library! Use --with-kpathsea-dir option.])])
+
+ dnl the header file kpathsea.h doesn't exist in kpathsea 2.6 and before
+ AC_CHECK_HEADER(kpathsea/kpathsea.h, [[]], AC_DEFINE(VERY_OLD_KPATHSEA))
+
+ AC_CHECK_HEADER(kpathsea/c-auto.h, ,[
+ AC_MSG_ERROR([Can't find kpathsea include files! Use --with-kpathsea-dir option.])])
+else
+ CPPFLAGS="$CPPFLAGS -I$srcdir"
+fi
+
+AC_CHECK_LIB(m, floor)
+AC_CHECK_LIB(intl, gettext)
+
+OLDLIBS=$LIBS
+LIBS="$LIBS -L../../lib/.libs"
+CPPFLAGS="$CPPFLAGS -I$srcdir/../../lib"
+AC_CHECK_LIB(ttf, TT_Init_FreeType, LIBS="$LIBS -lttf",[
+ AC_MSG_ERROR([Can't find ttf library! Compile FreeType first.])])
+LIBS=$OLDLIBS
+
+dnl get Compiler flags right.
+
+if test "x$CC" = xgcc; then
+ XX_CFLAGS="-Wall -ansi -pedantic"
+else
+ case "$host" in
+ alpha-dec-osf*)
+ XX_CFLAGS="-std1 -O2 -g3"
+ ;;
+ *)
+ XX_CFLAGS=
+ ;;
+ esac
+fi
+AC_SUBST(XX_CFLAGS)
+
+AC_CHECK_PROG(RM, rm, rm)
+AC_CHECK_PROG(RMDIR, rmdir, rmdir)
+AC_PROG_INSTALL
+
+AC_OUTPUT(Makefile MakeSub)
+
+dnl end of configure.in
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/Big5.sfd b/xc/extras/FreeType/contrib/ttf2pk/data/Big5.sfd
new file mode 100644
index 000000000..56a4486f9
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/Big5.sfd
@@ -0,0 +1,65 @@
+# Big5.sfd
+#
+# subfont numbers for Big 5 encoding and its corresponding code ranges
+# to be used with the CJK package for LaTeX.
+
+01 0xA140_0xA17E 0xA1A1_0xA1FE 0xA240_0xA27E 0xA2A1_0xA2C4
+02 0xA2C5_0xA2FE 0xA340_0xA37E 0xA3A1_0xA3FE 0xA440_0xA468
+03 0xA469_0xA47E 0xA4A1_0xA4FE 0xA540_0xA57E 0xA5A1_0xA5ED
+04 0xA5EE_0xA5FE 0xA640_0xA67E 0xA6A1_0xA6FE 0xA740_0xA77E 0xA7A1_0xA7B3
+05 0xA7B4_0xA7FE 0xA840_0xA87E 0xA8A1_0xA8FE 0xA940_0xA957
+06 0xA958_0xA97E 0xA9A1_0xA9FE 0xAA40_0xAA7E 0xAAA1_0xAADC
+07 0xAADD_0xAAFE 0xAB40_0xAB7E 0xABA1_0xABFE 0xAC40_0xAC7E 0xACA1_0xACA2
+08 0xACA3_0xACFE 0xAD40_0xAD7E 0xADA1_0xADFE 0xAE40_0xAE46
+09 0xAE47_0xAE7E 0xAEA1_0xAEFE 0xAF40_0xAF7E 0xAFA1_0xAFCB
+10 0xAFCC_0xAFFE 0xB040_0xB07E 0xB0A1_0xB0FE 0xB140_0xB16F
+11 0xB170_0xB17E 0xB1A1_0xB1FE 0xB240_0xB27E 0xB2A1_0xB2F4
+12 0xB2F5_0xB2FE 0xB340_0xB37E 0xB3A1_0xB3FE 0xB440_0xB47E 0xB4A1_0xB4BA
+13 0xB4BB_0xB4FE 0xB540_0xB57E 0xB5A1_0xB5FE 0xB640_0xB65E
+14 0xB65F_0xB67E 0xB6A1_0xB6FE 0xB740_0xB77E 0xB7A1_0xB7E3
+15 0xB7E4_0xB7FE 0xB840_0xB87E 0xB8A1_0xB8FE 0xB940_0xB97E 0xB9A1_0xB9A9
+16 0xB9AA_0xB9FE 0xBA40_0xBA7E 0xBAA1_0xBAFE 0xBB40_0xBB4D
+17 0xBB4E_0xBB7E 0xBBA1_0xBBFE 0xBC40_0xBC7E 0xBCA1_0xBCD2
+18 0xBCD3_0xBCFE 0xBD40_0xBD7E 0xBDA1_0xBDFE 0xBE40_0xBE76
+19 0xBE77_0xBE7E 0xBEA1_0xBEFE 0xBF40_0xBF7E 0xBFA1_0xBFFB
+20 0xBFFC_0xBFFE 0xC040_0xC07E 0xC0A1_0xC0FE 0xC140_0xC17E 0xC1A1_0xC1C1
+21 0xC1C2_0xC1FE 0xC240_0xC27E 0xC2A1_0xC2FE 0xC340_0xC365
+22 0xC366_0xC37E 0xC3A1_0xC3FE 0xC440_0xC47E 0xC4A1_0xC4EA
+23 0xC4EB_0xC4FE 0xC540_0xC57E 0xC5A1_0xC5FE 0xC640_0xC67E 0xC6A1_0xC6B0
+24 0xC6B1_0xC6FE 0xC740_0xC77E 0xC7A1_0xC7FE 0xC840_0xC854
+25 0xC855_0xC87E 0xC8A1_0xC8FE 0xC940_0xC97E 0xC9A1_0xC9D9
+26 0xC9DA_0xC9FE 0xCA40_0xCA7E 0xCAA1_0xCAFE 0xCB40_0xCB7D
+27 0xCB7E 0xCBA1_0xCBFE 0xCC40_0xCC7E 0xCCA1_0xCCFE 0xCD40_0xCD43
+28 0xCD44_0xCD7E 0xCDA1_0xCDFE 0xCE40_0xCE7E 0xCEA1_0xCEC8
+29 0xCEC9_0xCEFE 0xCF40_0xCF7E 0xCFA1_0xCFFE 0xD040_0xD06C
+30 0xD06D_0xD07E 0xD0A1_0xD0FE 0xD140_0xD17E 0xD1A1_0xD1F1
+31 0xD1F2_0xD1FE 0xD240_0xD27E 0xD2A1_0xD2FE 0xD340_0xD37E 0xD3A1_0xD3B7
+32 0xD3B8_0xD3FE 0xD440_0xD47E 0xD4A1_0xD4FE 0xD540_0xD55B
+33 0xD55C_0xD57E 0xD5A1_0xD5FE 0xD640_0xD67E 0xD6A1_0xD6E0
+34 0xD6E1_0xD6FE 0xD740_0xD77E 0xD7A1_0xD7FE 0xD840_0xD87E 0xD8A1_0xD8A6
+35 0xD8A7_0xD8FE 0xD940_0xD97E 0xD9A1_0xD9FE 0xDA40_0xDA4A
+36 0xDA4B_0xDA7E 0xDAA1_0xDAFE 0xDB40_0xDB7E 0xDBA1_0xDBCF
+37 0xDBD0_0xDBFE 0xDC40_0xDC7E 0xDCA1_0xDCFE 0xDD40_0xDD73
+38 0xDD74_0xDD7E 0xDDA1_0xDDFE 0xDE40_0xDE7E 0xDEA1_0xDEF8
+39 0xDEF9_0xDEFE 0xDF40_0xDF7E 0xDFA1_0xDFFE 0xE040_0xE07E 0xE0A1_0xE0BE
+40 0xE0BF_0xE0FE 0xE140_0xE17E 0xE1A1_0xE1FE 0xE240_0xE262
+41 0xE263_0xE27E 0xE2A1_0xE2FE 0xE340_0xE37E 0xE3A1_0xE3E7
+42 0xE3E8_0xE3FE 0xE440_0xE47E 0xE4A1_0xE4FE 0xE540_0xE57E 0xE5A1_0xE5AD
+43 0xE5AE_0xE5FE 0xE640_0xE67E 0xE6A1_0xE6FE 0xE740_0xE751
+44 0xE752_0xE77E 0xE7A1_0xE7FE 0xE840_0xE87E 0xE8A1_0xE8D6
+45 0xE8D7_0xE8FE 0xE940_0xE97E 0xE9A1_0xE9FE 0xEA40_0xEA7A
+46 0xEA7B_0xEA7E 0xEAA1_0xEAFE 0xEB40_0xEB7E 0xEBA1_0xEBFE
+47 0xEC41_0xEC7E 0xECA1_0xECFE 0xED40_0xED7E 0xEDA1_0xEDC5
+48 0xEDC6_0xEDFE 0xEE40_0xEE7E 0xEEA1_0xEEFE 0xEF40_0xEF69
+49 0xEF6A_0xEF7E 0xEFA1_0xEFFE 0xF040_0xF07E 0xF0A1_0xF0EE
+50 0xF0EF_0xF0FE 0xF140_0xF17E 0xF1A1_0xF1FE 0xF240_0xF27E 0xF2A1_0xF2B4
+51 0xF2B5_0xF2FE 0xF340_0xF37E 0xF3A1_0xF3FE 0xF440_0xF458
+52 0xF459_0xF47E 0xF4A1_0xF4FE 0xF540_0xF57E 0xF5A1_0xF5DD
+53 0xF5DE_0xF5FE 0xF640_0xF67E 0xF6A1_0xF6FE 0xF740_0xF77E 0xF7A1_0xF7A3
+54 0xF7A4_0xF7FE 0xF840_0xF87E 0xF8A1_0xF8FE 0xF940_0xF947
+55 0xF948_0xF97E 0xF9A1_0xF9FE 0xFA40_0xFA7E 0xFAA1_0xFACC
+56 0xFACD_0xFAFE 0xFB40_0xFB7E 0xFBA1_0xFBFE 0xFC40_0xFC70
+57 0xFC71_0xFC7E 0xFCA1_0xFCFE 0xFD40_0xFD7E 0xFDA1_0xFDF5
+58 0xFDF6_0xFDFE 0xFE40_0xFE7E 0xFEA1_0xFEFE
+
+# eof
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/ET5.enc b/xc/extras/FreeType/contrib/ttf2pk/data/ET5.enc
new file mode 100644
index 000000000..dc47f889a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/ET5.enc
@@ -0,0 +1,119 @@
+% ET5.enc
+%
+%
+% This is LaTeX ET5 encoding for Vietnamese.
+%
+%
+% LIGKERN question quoteleft =: questiondown ;
+% LIGKERN exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ;
+% LIGKERN endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+% LIGKERN comma comma =: quotedblbase ;
+%
+% LIGKERN f i =: fi ;
+% LIGKERN f l =: fl ;
+% LIGKERN f f =: ff ;
+% LIGKERN ff i =: ffi ;
+% LIGKERN ff l =: ffl ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers.
+%
+% LIGKERN space {} * ; * {} space ;
+% LIGKERN zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ;
+% LIGKERN two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ;
+% LIGKERN four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ;
+% LIGKERN six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ;
+% LIGKERN eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+
+/ET5encoding [
+% 0x00
+ /Abrevehookabove /Abrevetilde /Acircumflextilde /Yhookabove
+ /Ytilde /Ydotbelow /Sigma /Upsilon
+ /Phi /Psi /Omega /ff
+ /fi /fl /ffi /ffl
+% 0x10
+ /dotlessi /dotlessj /grave /acute
+ /caron /breve /macron /ring
+ /cedilla /germandbls /ae /oe
+ /oslash /AE /OE /Oslash
+% 0x20
+ /.notdef /exclam /quotedblright /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus
+ /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three
+ /four /five /six /seven
+ /eight /nine /colon /semicolon
+ /exclamdown /equal /questiondown /question
+% 0x40
+ /at /A /B /C
+ /D /E /F /G
+ /H /I /J /K
+ /L /M /N /O
+% 0x50
+ /P /Q /R /S
+ /T /U /V /W
+ /X /Y /Z /bracketleft
+ /quotedblleft /bracketright /circumflex /dotaccent
+% 0x60
+ /quoteleft /a /b /c
+ /d /e /f /g
+ /h /i /j /k
+ /l /m /n /o
+% 0x70
+ /p /q /r /s
+ /t /u /v /w
+ /x /y /z /endash
+ /emdash /hungarumlaut /tilde /dieresis
+% 0x80
+ /Adotbelow /Abreveacute /Abrevegrave /Abrevedotbelow
+ /Acircumflexacute /Acircumflexgrave /Acircumflexhookabove /Acircumflexdotbelow
+ /Etilde /Edotbelow /Ecircumflexacute /Ecircumflexgrave
+ /Ecircumflexhookabove /Ecircumflextilde /Ecircumflexdotbelow /Ocircumflexacute
+% 0x90
+ /Ocircumflexgrave /Ocircumflexhookabove /Ocircumflextilde /Ocircumflexdotbelow
+ /Ohorndotbelow /Ohornacute /Ohorngrave /Ohornhookabove
+ /Idotbelow /Ohookabove /Odotbelow /Ihookabove
+ /Uhookabove /Utilde /Udotbelow /Ygrave
+% 0xA0
+ /Otilde /abreveacute /abrevegrave /abrevedotbelow
+ /acircumflexacute /acircumflexgrave /acircumflexhookabove /acircumflexdotbelow
+ /etilde /edotbelow /ecircumflexacute /ecircumflexgrave
+ /ecircumflexhookabove /ecircumflextilde /ecircumflexdotbelow /ocircumflexacute
+% 0xB0
+ /ocircumflexgrave /ocircumflexhookabove /ocircumflextilde /Ohorntilde
+ /Ohorn /ocircumflexdotbelow /ohorngrave /ohornhookabove
+ /idotbelow /Uhorndotbelow /Uhornacute /Uhorngrave
+ /Uhornhookabove /ohorn /ohornacute /Uhorn
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde
+ /Ahookabove /Abreve /abrevehookabove /abrevetilde
+ /Egrave /Eacute /Ecircumflex /Ehookabove
+ /Igrave /Iacute /Itilde /ygrave
+% 0xD0
+ /Dbar /uhornacute /Ograve /Oacute
+ /Ocircumflex /adotbelow /yhookabove /uhorngrave
+ /uhornhookabove /Ugrave /Uacute /ytilde
+ /ydotbelow /Yacute /ohorntilde /uhorn
+% 0xE0
+ /agrave /aacute /acircumflex /atilde
+ /ahookabove /abreve /uhorntilde /acircumflextilde
+ /egrave /eacute /ecircumflex /ehookabove
+ /igrave /iacute /itilde /ihookabove
+% 0xF0
+ /dbar /uhorndotbelow /ograve /oacute
+ /ocircumflex /otilde /ohookabove /odotbelow
+ /udotbelow /ugrave /uacute /utilde
+ /uhookabove /yacute /ohorndotbelow /Uhorntilde
+] def
+
+% eof
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/EUC.sfd b/xc/extras/FreeType/contrib/ttf2pk/data/EUC.sfd
new file mode 100644
index 000000000..ea5002e0c
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/EUC.sfd
@@ -0,0 +1,42 @@
+# EUC.sfd
+#
+# subfont numbers for EUC encodings and its corresponding code ranges
+# to be used with the CJK package for LaTeX.
+
+01 0xA1A1_0xA1FE 0xA2A1_0xA2FE 0xA3A1_0xA3E4
+02 0xA3E5_0xA3FE 0xA4A1_0xA4FE 0xA5A1_0xA5FE 0xA6A1_0xA6CA
+03 0xA6CB_0xA6FE 0xA7A1_0xA7FE 0xA8A1_0xA8FE 0xA9A1_0xA9B0
+04 0xA9B1_0xA9FE 0xAAA1_0xAAFE 0xABA1_0xABF4
+05 0xABF5_0xABFE 0xACA1_0xACFE 0xADA1_0xADFE 0xAEA1_0xAEDA
+06 0xAEDB_0xAEFE 0xAFA1_0xAFFE 0xB0A1_0xB0FE 0xB1A1_0xB1C0
+07 0xB1C1_0xB1FE 0xB2A1_0xB2FE 0xB3A1_0xB3FE 0xB4A1_0xB4A6
+08 0xB4A7_0xB4FE 0xB5A1_0xB5FE 0xB6A1_0xB6EA
+09 0xB6EB_0xB6FE 0xB7A1_0xB7FE 0xB8A1_0xB8FE 0xB9A1_0xB9D0
+10 0xB9D1_0xB9FE 0xBAA1_0xBAFE 0xBBA1_0xBBFE 0xBCA1_0xBCB6
+11 0xBCB7_0xBCFE 0xBDA1_0xBDFE 0xBEA1_0xBEFA
+12 0xBEFB_0xBEFE 0xBFA1_0xBFFE 0xC0A1_0xC0FE 0xC1A1_0xC1E0
+13 0xC1E1_0xC1FE 0xC2A1_0xC2FE 0xC3A1_0xC3FE 0xC4A1_0xC4C6
+14 0xC4C7_0xC4FE 0xC5A1_0xC5FE 0xC6A1_0xC6FE 0xC7A1_0xC7AC
+15 0xC7AD_0xC7FE 0xC8A1_0xC8FE 0xC9A1_0xC9F0
+16 0xC9F1_0xC9FE 0xCAA1_0xCAFE 0xCBA1_0xCBFE 0xCCA1_0xCCD6
+17 0xCCD7_0xCCFE 0xCDA1_0xCDFE 0xCEA1_0xCEFE 0xCFA1_0xCFBC
+18 0xCFBD_0xCFFE 0xD0A1_0xD0FE 0xD1A1_0xD1FE 0xD2A1_0xD2A2
+19 0xD2A3_0xD2FE 0xD3A1_0xD3FE 0xD4A1_0xD4E6
+20 0xD4E7_0xD4FE 0xD5A1_0xD5FE 0xD6A1_0xD6FE 0xD7A1_0xD7CC
+21 0xD7CD_0xD7FE 0xD8A1_0xD8FE 0xD9A1_0xD9FE 0xDAA1_0xDAB2
+22 0xDAB3_0xDAFE 0xDBA1_0xDBFE 0xDCA1_0xDCF6
+23 0xDCF7_0xDCFE 0xDDA1_0xDDFE 0xDEA1_0xDEFE 0xDFA1_0xDFDC
+24 0xDFDD_0xDFFE 0xE0A1_0xE0FE 0xE1A1_0xE1FE 0xE2A1_0xE2C2
+25 0xE2C3_0xE2FE 0xE3A1_0xE3FE 0xE4A1_0xE4FE 0xE5A1_0xE5A8
+26 0xE5A9_0xE5FE 0xE6A1_0xE6FE 0xE7A1_0xE7EC
+27 0xE7ED_0xE7FE 0xE8A1_0xE8FE 0xE9A1_0xE9FE 0xEAA1_0xEAD2
+28 0xEAD3_0xEAFE 0xEBA1_0xEBFE 0xECA1_0xECFE 0xEDA1_0xEDB8
+29 0xEDB9_0xEDFE 0xEEA1_0xEEFE 0xEFA1_0xEFFC
+30 0xEFFD_0xEFFE 0xF0A1_0xF0FE 0xF1A1_0xF1FE 0xF2A1_0xF2E2
+31 0xF2E3_0xF2FE 0xF3A1_0xF3FE 0xF4A1_0xF4FE 0xF5A1_0xF5C8
+32 0xF5C9_0xF5FE 0xF6A1_0xF6FE 0xF7A1_0xF7FE 0xF8A1_0xF8AE
+33 0xF8AF_0xF8FE 0xF9A1_0xF9FE 0xFAA1_0xFAF2
+34 0xFAF3_0xFAFE 0xFBA1_0xFBFE 0xFCA1_0xFCFE 0xFDA1_0xFDD8
+35 0xFDD9_0xFDFE 0xFEA1_0xFEFE
+
+# eof
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/SJIS.sfd b/xc/extras/FreeType/contrib/ttf2pk/data/SJIS.sfd
new file mode 100644
index 000000000..cf7387b85
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/SJIS.sfd
@@ -0,0 +1,52 @@
+# SJIS.sfd
+#
+# subfont numbers for SJIS encoding and its corresponding code ranges
+# to be used with the CJK package for LaTeX.
+
+01 0x8140_0x817E 0x8180_0x81FC 0x8240_0x827E 0x8280_0x8284
+02 0x8285_0x82FC 0x8340_0x837E 0x8380_0x83C8
+03 0x83C9_0x83FC 0x8440_0x847E 0x8480_0x84FC 0x8540_0x854F
+04 0x8550_0x857E 0x8580_0x85FC 0x8640_0x867E 0x8680_0x8694
+05 0x8695_0x86FC 0x8740_0x877E 0x8780_0x87D8
+06 0x87D9_0x87FC 0x8840_0x887E 0x8880_0x88FC 0x8940_0x895F
+07 0x8960_0x897E 0x8980_0x89FC 0x8A40_0x8A7E 0x8A80_0x8AA4
+08 0x8AA5_0x8AFC 0x8B40_0x8B7E 0x8B80_0x8BE8
+09 0x8BE9_0x8BFC 0x8C40_0x8C7E 0x8C80_0x8CFC 0x8D40_0x8D6F
+10 0x8D70_0x8D7E 0x8D80_0x8DFC 0x8E40_0x8E7E 0x8E80_0x8EB4
+11 0x8EB5_0x8EFC 0x8F40_0x8F7E 0x8F80_0x8FF8
+12 0x8FF9_0x8FFC 0x9040_0x907E 0x9080_0x90FC 0x9140_0x917E 0x9180
+13 0x9181_0x91FC 0x9240_0x927E 0x9280_0x92C4
+14 0x92C5_0x92FC 0x9340_0x937E 0x9380_0x93FC 0x9440_0x944B
+15 0x944C_0x947E 0x9480_0x94FC 0x9540_0x957E 0x9580_0x9590
+16 0x9591_0x95FC 0x9640_0x967E 0x9680_0x96D4
+17 0x96D5_0x96FC 0x9740_0x977E 0x9780_0x97FC 0x9840_0x985B
+18 0x985C_0x987E 0x9880_0x98FC 0x9940_0x997E 0x9980_0x99A0
+19 0x99A1_0x99FC 0x9A40_0x9A7E 0x9A80_0x9AE4
+20 0x9AE5_0x9AFC 0x9B40_0x9B7E 0x9B80_0x9BFC 0x9C40_0x9C6B
+21 0x9C6C_0x9C7E 0x9C80_0x9CFC 0x9D40_0x9D7E 0x9D80_0x9DB0
+22 0x9DB1_0x9DFC 0x9E40_0x9E7E 0x9E80_0x9EF4
+23 0x9EF5_0x9EFC 0x9F40_0x9F7E 0x9F80_0x9FFC 0xE040_0xE07B
+24 0xE07C_0xE07E 0xE080_0xE0FC 0xE140_0xE17E 0xE180_0xE1C0
+25 0xE1C1_0xE1FC 0xE240_0xE27E 0xE280_0xE2FC 0xE340_0xE347
+26 0xE348_0xE37E 0xE380_0xE3FC 0xE440_0xE47E 0xE480_0xE48C
+27 0xE48D_0xE4FC 0xE540_0xE57E 0xE580_0xE5D0
+28 0xE5D1_0xE5FC 0xE640_0xE67E 0xE680_0xE6FC 0xE740_0xE757
+29 0xE758_0xE77E 0xE780_0xE7FC 0xE840_0xE87E 0xE880_0xE89C
+30 0xE89D_0xE8FC 0xE940_0xE97E 0xE980_0xE9E0
+31 0xE9E1_0xE9FC 0xEA40_0xEA7E 0xEA80_0xEAFC 0xEB40_0xEB67
+32 0xEB68_0xEB7E 0xEB80_0xEBFC 0xEC40_0xEC7E 0xEC80_0xECAC
+33 0xECAD_0xECFC 0xED40_0xED7E 0xED80_0xEDF0
+34 0xEDF1_0xEDFC 0xEE40_0xEE7E 0xEE80_0xEEFC 0xEF40_0xEF77
+35 0xEF78_0xEF7E 0xEF80_0xEFFC 0xF040_0xF07E 0xF080_0xF0BC
+36 0xF0BD_0xF0FC 0xF140_0xF17E 0xF180_0xF1FC 0xF240_0xF243
+37 0xF244_0xF27E 0xF280_0xF2FC 0xF340_0xF37E 0xF380_0xF388
+38 0xF389_0xF3FC 0xF440_0xF47E 0xF480_0xF4CC
+39 0xF4CD_0xF4FC 0xF540_0xF57E 0xF580_0xF5FC 0xF640_0xF653
+40 0xF654_0xF67E 0xF680_0xF6FC 0xF740_0xF77E 0xF780_0xF798
+41 0xF799_0xF7FC 0xF840_0xF87E 0xF880_0xF8DC
+42 0xF8DD_0xF8FC 0xF940_0xF97E 0xF980_0xF9FC 0xFA40_0xFA63
+43 0xFA64_0xFA7E 0xFA80_0xFAFC 0xFB40_0xFB7E 0xFB80_0xFBA8
+44 0xFBA9_0xFBFC 0xFC40_0xFC7E 0xFC80_0xFCEC
+45 0xFCED_0xFCFC
+
+# eof
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/T1-WGL4.enc b/xc/extras/FreeType/contrib/ttf2pk/data/T1-WGL4.enc
new file mode 100644
index 000000000..064c723a8
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/T1-WGL4.enc
@@ -0,0 +1,128 @@
+% T1-WGL4.enc
+%
+%
+% This is LaTeX T1 encoding for WGL4 encoded TrueType fonts
+% (e.g. from Windows 95)
+%
+%
+% Note that /hyphen appears twice (for the T1 code points `hyphen' 0x2d
+% and `hyphenchar' 0x7f).
+%
+%
+% LIGKERN space l =: lslash ;
+% LIGKERN space L =: Lslash ;
+% LIGKERN question quoteleft =: questiondown ;
+% LIGKERN exclam quoteleft =: exclamdown ;
+% LIGKERN hyphen hyphen =: endash ;
+% LIGKERN endash hyphen =: emdash ;
+% LIGKERN quoteleft quoteleft =: quotedblleft ;
+% LIGKERN quoteright quoteright =: quotedblright ;
+% LIGKERN comma comma =: quotedblbase ;
+% LIGKERN less less =: guillemotleft ;
+% LIGKERN greater greater =: guillemotright ;
+%
+% LIGKERN f i =: fi ;
+% LIGKERN f l =: fl ;
+% LIGKERN f f =: ff ;
+% LIGKERN ff i =: ffi ;
+% LIGKERN ff l =: ffl ;
+%
+% We blow away kerns to and from spaces (TeX doesn't have a
+% space) and also remove any kerns from the numbers.
+%
+% LIGKERN space {} * ; * {} space ;
+% LIGKERN zero {} * ; * {} zero ;
+% LIGKERN one {} * ; * {} one ;
+% LIGKERN two {} * ; * {} two ;
+% LIGKERN three {} * ; * {} three ;
+% LIGKERN four {} * ; * {} four ;
+% LIGKERN five {} * ; * {} five ;
+% LIGKERN six {} * ; * {} six ;
+% LIGKERN seven {} * ; * {} seven ;
+% LIGKERN eight {} * ; * {} eight ;
+% LIGKERN nine {} * ; * {} nine ;
+
+/T1Encoding [ % now 256 chars follow
+% 0x00
+ /grave /acute /circumflex /tilde
+ /dieresis /hungarumlaut /ring /caron
+ /breve /macron /dotaccent /cedilla
+ /ogonek /quotesinglbase /guilsinglleft /guilsinglright
+% 0x10
+ /quotedblleft /quotedblright /quotedblbase /guillemotleft
+ /guillemotright /endash /emdash /compwordmark
+ /perthousandzero /dotlessi /dotlessj /ff
+ /fi /fl /ffi /ffl
+% 0x20
+ /visualspace /exclam /quotedbl /numbersign
+ /dollar /percent /ampersand /quoteright
+ /parenleft /parenright /asterisk /plus
+ /comma /hyphen /period /slash
+% 0x30
+ /zero /one /two /three
+ /four /five /six /seven
+ /eight /nine /colon /semicolon
+ /less /equal /greater /question
+% 0x40
+ /at /A /B /C
+ /D /E /F /G
+ /H /I /J /K
+ /L /M /N /O
+% 0x50
+ /P /Q /R /S
+ /T /U /V /W
+ /X /Y /Z /bracketleft
+ /backslash /bracketright /asciicircum /underscore
+% 0x60
+ /quoteleft /a /b /c
+ /d /e /f /g
+ /h /i /j /k
+ /l /m /n /o
+% 0x70
+ /p /q /r /s
+ /t /u /v /w
+ /x /y /z /braceleft
+ /bar /braceright /asciitilde /hyphen
+% 0x80
+ /Abreve /Aogonek /Cacute /Ccaron
+ /Dcaron /Ecaron /Eogonek /Gbreve
+ /Lacute /Lcaron /Lslash /Nacute
+ /Ncaron /Eng /Odblacute /Racute
+% 0x90
+ /Rcaron /Sacute /Scaron /Scedilla
+ /Tcaron /Tcedilla /Udblacute /Uring
+ /Ydieresis /Zacute /Zcaron /Zdot
+ /IJ /Idot /dmacron /section
+% 0xA0
+ /abreve /aogonek /cacute /ccaron
+ /dcaron /ecaron /eogonek /gbreve
+ /lacute /lcaron /lslash /nacute
+ /ncaron /eng /odblacute /racute
+% 0xB0
+ /rcaron /sacute /scaron /scedilla
+ /tcaron /tcedilla /udblacute /uring
+ /ydieresis /zacute /zcaron /zdot
+ /ij /exclamdown /questiondown /sterling
+% 0xC0
+ /Agrave /Aacute /Acircumflex /Atilde
+ /Adieresis /Aring /AE /Ccedilla
+ /Egrave /Eacute /Ecircumflex /Edieresis
+ /Igrave /Iacute /Icircumflex /Idieresis
+% 0xD0
+ /Eth /Ntilde /Ograve /Oacute
+ /Ocircumflex /Otilde /Odieresis /OE
+ /Oslash /Ugrave /Uacute /Ucircumflex
+ /Udieresis /Yacute /Thorn /Germandbls
+% 0xE0
+ /agrave /aacute /acircumflex /atilde
+ /adieresis /aring /ae /ccedilla
+ /egrave /eacute /ecircumflex /edieresis
+ /igrave /iacute /icircumflex /idieresis
+% 0xF0
+ /eth /ntilde /ograve /oacute
+ /ocircumflex /otilde /odieresis /oe
+ /oslash /ugrave /uacute /ucircumflex
+ /udieresis /yacute /thorn /germandbls
+] def
+
+% eof
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/Unicode.sfd b/xc/extras/FreeType/contrib/ttf2pk/data/Unicode.sfd
new file mode 100644
index 000000000..fc23b6bf3
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/Unicode.sfd
@@ -0,0 +1,265 @@
+# Unicode.sfd
+#
+# subfont numbers for Unicode encoding and its corresponding code ranges
+# to be used with the CJK package for LaTeX.
+
+00 0x0_0xFF
+01 0x100_0x1FF
+02 0x200_0x2FF
+03 0x300_0x3FF
+04 0x400_0x4FF
+05 0x500_0x5FF
+06 0x600_0x6FF
+07 0x700_0x7FF
+08 0x800_0x8FF
+09 0x900_0x9FF
+0a 0xA00_0xAFF
+0b 0xB00_0xBFF
+0c 0xC00_0xCFF
+0d 0xD00_0xDFF
+0e 0xE00_0xEFF
+0f 0xF00_0xFFF
+10 0x1000_0x10FF
+11 0x1100_0x11FF
+12 0x1200_0x12FF
+13 0x1300_0x13FF
+14 0x1400_0x14FF
+15 0x1500_0x15FF
+16 0x1600_0x16FF
+17 0x1700_0x17FF
+18 0x1800_0x18FF
+19 0x1900_0x19FF
+1a 0x1A00_0x1AFF
+1b 0x1B00_0x1BFF
+1c 0x1C00_0x1CFF
+1d 0x1D00_0x1DFF
+1e 0x1E00_0x1EFF
+1f 0x1F00_0x1FFF
+20 0x2000_0x20FF
+21 0x2100_0x21FF
+22 0x2200_0x22FF
+23 0x2300_0x23FF
+24 0x2400_0x24FF
+25 0x2500_0x25FF
+26 0x2600_0x26FF
+27 0x2700_0x27FF
+28 0x2800_0x28FF
+29 0x2900_0x29FF
+2a 0x2A00_0x2AFF
+2b 0x2B00_0x2BFF
+2c 0x2C00_0x2CFF
+2d 0x2D00_0x2DFF
+2e 0x2E00_0x2EFF
+2f 0x2F00_0x2FFF
+30 0x3000_0x30FF
+31 0x3100_0x31FF
+32 0x3200_0x32FF
+33 0x3300_0x33FF
+34 0x3400_0x34FF
+35 0x3500_0x35FF
+36 0x3600_0x36FF
+37 0x3700_0x37FF
+38 0x3800_0x38FF
+39 0x3900_0x39FF
+3a 0x3A00_0x3AFF
+3b 0x3B00_0x3BFF
+3c 0x3C00_0x3CFF
+3d 0x3D00_0x3DFF
+3e 0x3E00_0x3EFF
+3f 0x3F00_0x3FFF
+40 0x4000_0x40FF
+41 0x4100_0x41FF
+42 0x4200_0x42FF
+43 0x4300_0x43FF
+44 0x4400_0x44FF
+45 0x4500_0x45FF
+46 0x4600_0x46FF
+47 0x4700_0x47FF
+48 0x4800_0x48FF
+49 0x4900_0x49FF
+4a 0x4A00_0x4AFF
+4b 0x4B00_0x4BFF
+4c 0x4C00_0x4CFF
+4d 0x4D00_0x4DFF
+4e 0x4E00_0x4EFF
+4f 0x4F00_0x4FFF
+50 0x5000_0x50FF
+51 0x5100_0x51FF
+52 0x5200_0x52FF
+53 0x5300_0x53FF
+54 0x5400_0x54FF
+55 0x5500_0x55FF
+56 0x5600_0x56FF
+57 0x5700_0x57FF
+58 0x5800_0x58FF
+59 0x5900_0x59FF
+5a 0x5A00_0x5AFF
+5b 0x5B00_0x5BFF
+5c 0x5C00_0x5CFF
+5d 0x5D00_0x5DFF
+5e 0x5E00_0x5EFF
+5f 0x5F00_0x5FFF
+60 0x6000_0x60FF
+61 0x6100_0x61FF
+62 0x6200_0x62FF
+63 0x6300_0x63FF
+64 0x6400_0x64FF
+65 0x6500_0x65FF
+66 0x6600_0x66FF
+67 0x6700_0x67FF
+68 0x6800_0x68FF
+69 0x6900_0x69FF
+6a 0x6A00_0x6AFF
+6b 0x6B00_0x6BFF
+6c 0x6C00_0x6CFF
+6d 0x6D00_0x6DFF
+6e 0x6E00_0x6EFF
+6f 0x6F00_0x6FFF
+70 0x7000_0x70FF
+71 0x7100_0x71FF
+72 0x7200_0x72FF
+73 0x7300_0x73FF
+74 0x7400_0x74FF
+75 0x7500_0x75FF
+76 0x7600_0x76FF
+77 0x7700_0x77FF
+78 0x7800_0x78FF
+79 0x7900_0x79FF
+7a 0x7A00_0x7AFF
+7b 0x7B00_0x7BFF
+7c 0x7C00_0x7CFF
+7d 0x7D00_0x7DFF
+7e 0x7E00_0x7EFF
+7f 0x7F00_0x7FFF
+80 0x8000_0x80FF
+81 0x8100_0x81FF
+82 0x8200_0x82FF
+83 0x8300_0x83FF
+84 0x8400_0x84FF
+85 0x8500_0x85FF
+86 0x8600_0x86FF
+87 0x8700_0x87FF
+88 0x8800_0x88FF
+89 0x8900_0x89FF
+8a 0x8A00_0x8AFF
+8b 0x8B00_0x8BFF
+8c 0x8C00_0x8CFF
+8d 0x8D00_0x8DFF
+8e 0x8E00_0x8EFF
+8f 0x8F00_0x8FFF
+90 0x9000_0x90FF
+91 0x9100_0x91FF
+92 0x9200_0x92FF
+93 0x9300_0x93FF
+94 0x9400_0x94FF
+95 0x9500_0x95FF
+96 0x9600_0x96FF
+97 0x9700_0x97FF
+98 0x9800_0x98FF
+99 0x9900_0x99FF
+9a 0x9A00_0x9AFF
+9b 0x9B00_0x9BFF
+9c 0x9C00_0x9CFF
+9d 0x9D00_0x9DFF
+9e 0x9E00_0x9EFF
+9f 0x9F00_0x9FFF
+a0 0xA000_0xA0FF
+a1 0xA100_0xA1FF
+a2 0xA200_0xA2FF
+a3 0xA300_0xA3FF
+a4 0xA400_0xA4FF
+a5 0xA500_0xA5FF
+a6 0xA600_0xA6FF
+a7 0xA700_0xA7FF
+a8 0xA800_0xA8FF
+a9 0xA900_0xA9FF
+aa 0xAA00_0xAAFF
+ab 0xAB00_0xABFF
+ac 0xAC00_0xACFF
+ad 0xAD00_0xADFF
+ae 0xAE00_0xAEFF
+af 0xAF00_0xAFFF
+b0 0xB000_0xB0FF
+b1 0xB100_0xB1FF
+b2 0xB200_0xB2FF
+b3 0xB300_0xB3FF
+b4 0xB400_0xB4FF
+b5 0xB500_0xB5FF
+b6 0xB600_0xB6FF
+b7 0xB700_0xB7FF
+b8 0xB800_0xB8FF
+b9 0xB900_0xB9FF
+ba 0xBA00_0xBAFF
+bb 0xBB00_0xBBFF
+bc 0xBC00_0xBCFF
+bd 0xBD00_0xBDFF
+be 0xBE00_0xBEFF
+bf 0xBF00_0xBFFF
+c0 0xC000_0xC0FF
+c1 0xC100_0xC1FF
+c2 0xC200_0xC2FF
+c3 0xC300_0xC3FF
+c4 0xC400_0xC4FF
+c5 0xC500_0xC5FF
+c6 0xC600_0xC6FF
+c7 0xC700_0xC7FF
+c8 0xC800_0xC8FF
+c9 0xC900_0xC9FF
+ca 0xCA00_0xCAFF
+cb 0xCB00_0xCBFF
+cc 0xCC00_0xCCFF
+cd 0xCD00_0xCDFF
+ce 0xCE00_0xCEFF
+cf 0xCF00_0xCFFF
+d0 0xD000_0xD0FF
+d1 0xD100_0xD1FF
+d2 0xD200_0xD2FF
+d3 0xD300_0xD3FF
+d4 0xD400_0xD4FF
+d5 0xD500_0xD5FF
+d6 0xD600_0xD6FF
+d7 0xD700_0xD7FF
+# Surrogates
+#
+# d8 0xD800_0xD8FF
+# d9 0xD900_0xD9FF
+# da 0xDA00_0xDAFF
+# db 0xDB00_0xDBFF
+dc 0xDC00_0xDCFF
+dd 0xDD00_0xDDFF
+de 0xDE00_0xDEFF
+df 0xDF00_0xDFFF
+e0 0xE000_0xE0FF
+e1 0xE100_0xE1FF
+e2 0xE200_0xE2FF
+e3 0xE300_0xE3FF
+e4 0xE400_0xE4FF
+e5 0xE500_0xE5FF
+e6 0xE600_0xE6FF
+e7 0xE700_0xE7FF
+e8 0xE800_0xE8FF
+e9 0xE900_0xE9FF
+ea 0xEA00_0xEAFF
+eb 0xEB00_0xEBFF
+ec 0xEC00_0xECFF
+ed 0xED00_0xEDFF
+ee 0xEE00_0xEEFF
+ef 0xEF00_0xEFFF
+f0 0xF000_0xF0FF
+f1 0xF100_0xF1FF
+f2 0xF200_0xF2FF
+f3 0xF300_0xF3FF
+f4 0xF400_0xF4FF
+f5 0xF500_0xF5FF
+f6 0xF600_0xF6FF
+f7 0xF700_0xF7FF
+f8 0xF800_0xF8FF
+f9 0xF900_0xF9FF
+fa 0xFA00_0xFAFF
+fb 0xFB00_0xFBFF
+fc 0xFC00_0xFCFF
+fd 0xFD00_0xFDFF
+fe 0xFE00_0xFEFF
+ff 0xFF00_0xFFFF
+
+# eof
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/VPS.rpl b/xc/extras/FreeType/contrib/ttf2pk/data/VPS.rpl
new file mode 100644
index 000000000..1b37e3898
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/VPS.rpl
@@ -0,0 +1,244 @@
+% VPS.rpl
+%
+%
+% This file maps VPS encoding for Vietnamese to Adobe glyph names used
+% in the file ET5.enc.
+%
+% VPS is a commonly used program to write Vietnamese.
+%
+% This file has been tested with the font vpsdlac.ttfm using the cmap (3,0)
+
+.c0x0002 Adotbelow
+.c0x0003 Acircumflexdotbelow
+.c0x0004 Abrevedotbelow
+.c0x0005 Edotbelow
+.c0x0006 Ecircumflexdotbelow
+.c0x0015 Uhorndotbelow
+.c0x0019 Ydotbelow
+.c0x001c Acircumflextilde
+.c0x001d Uhorntilde
+.c0x0020 space
+.c0x0021 exclam
+.c0x0022 quotedbl
+.c0x0023 numbersign
+.c0x0024 dollar
+.c0x0025 percent
+.c0x0026 ampersand
+.c0x0027 quotesingle
+.c0x0028 parenleft
+.c0x0029 parenright
+.c0x002a asterisk
+.c0x002b plus
+.c0x002c comma
+.c0x002d hyphen
+.c0x002e period
+.c0x002f slash
+.c0x0030 zero
+.c0x0031 one
+.c0x0032 two
+.c0x0033 three
+.c0x0034 four
+.c0x0035 five
+.c0x0036 six
+.c0x0037 seven
+.c0x0038 eight
+.c0x0039 nine
+.c0x003a colon
+.c0x003b semicolon
+.c0x003c less
+.c0x003d equal
+.c0x003e greater
+.c0x003f question
+.c0x0040 at
+.c0x0041 A
+.c0x0042 B
+.c0x0043 C
+.c0x0044 D
+.c0x0045 E
+.c0x0046 F
+.c0x0047 G
+.c0x0048 H
+.c0x0049 I
+.c0x004a J
+.c0x004b K
+.c0x004c L
+.c0x004d M
+.c0x004e N
+.c0x004f O
+.c0x0050 P
+.c0x0051 Q
+.c0x0052 R
+.c0x0053 S
+.c0x0054 T
+.c0x0055 U
+.c0x0056 V
+.c0x0057 W
+.c0x0058 X
+.c0x0059 Y
+.c0x005a Z
+.c0x005b bracketleft
+.c0x005c backslash
+.c0x005d bracketright
+.c0x005e asciicircum
+.c0x005f underscore
+.c0x0060 grave
+.c0x0061 a
+.c0x0062 b
+.c0x0063 c
+.c0x0064 d
+.c0x0065 e
+.c0x0066 f
+.c0x0067 g
+.c0x0068 h
+.c0x0069 i
+.c0x006a j
+.c0x006b k
+.c0x006c l
+.c0x006d m
+.c0x006e n
+.c0x006f o
+.c0x0070 p
+.c0x0071 q
+.c0x0072 r
+.c0x0073 s
+.c0x0074 t
+.c0x0075 u
+.c0x0076 v
+.c0x0077 w
+.c0x0078 x
+.c0x0079 y
+.c0x007a z
+.c0x007b braceleft
+.c0x007c bar
+.c0x007d braceright
+.c0x007e asciitilde
+.c0x0080 Agrave
+.c0x0081 Ahookabove
+.c0x008d Abreveacute
+.c0x008e Abrevegrave
+.c0x008f Abrevehookabove
+.c0x0090 Ecircumflexacute
+.c0x009d Ohornacute
+.c0x009e Ohorngrave
+.c0x00a0 nbspace
+.c0x00a1 abreveacute
+.c0x00a2 abrevegrave
+.c0x00a3 abrevehookabove
+.c0x00a4 abrevetilde
+.c0x00a5 abrevedotbelow
+.c0x00a6 Ohorntilde
+.c0x00a7 ohornacute
+.c0x00a8 Ugrave
+.c0x00a9 ohorngrave
+.c0x00aa ohornhookabove
+.c0x00ab ohorntilde
+.c0x00ac Utilde
+.c0x00ad Uhornacute
+.c0x00ae ohorndotbelow
+.c0x00af Uhorngrave
+.c0x00b0 ocircumflexhookabove
+.c0x00b1 Uhornhookabove
+.c0x00b2 Ygrave
+.c0x00b3 Ytilde
+.c0x00b4 Iacute
+.c0x00b5 Igrave
+.c0x00b6 ocircumflexdotbelow
+.c0x00b8 Itilde
+.c0x00b9 Oacute
+.c0x00ba uhornhookabove
+.c0x00bb uhorntilde
+.c0x00bc Ograve
+.c0x00bd Ohookabove
+.c0x00be Otilde
+.c0x00bf uhorndotbelow
+.c0x00c0 acircumflexgrave
+.c0x00c1 Aacute
+.c0x00c2 Acircumflex
+.c0x00c3 acircumflexacute
+.c0x00c4 acircumflexhookabove
+.c0x00c5 acircumflextilde
+.c0x00c6 acircumflexdotbelow
+.c0x00c7 dbar
+.c0x00c8 ehookabove
+.c0x00c9 Eacute
+.c0x00ca Ecircumflex
+.c0x00cb edotbelow
+.c0x00cc ihookabove
+.c0x00cd ecircumflextilde
+.c0x00ce idotbelow
+.c0x00cf ytilde
+.c0x00d0 Uhorn
+.c0x00d1 Uhookabove
+.c0x00d2 ocircumflexgrave
+.c0x00d3 ocircumflexacute
+.c0x00d4 Ocircumflex
+.c0x00d5 ohookabove
+.c0x00d6 ohorn
+.c0x00d7 Egrave
+.c0x00d8 uhorngrave
+.c0x00d9 uhornacute
+.c0x00da Uacute
+.c0x00db utilde
+.c0x00dc uhorn
+.c0x00dd Yacute
+.c0x00de Ehookabove
+.c0x00df germandbls
+.c0x00e0 agrave
+.c0x00e1 aacute
+.c0x00e2 acircumflex
+.c0x00e3 atilde
+.c0x00e4 ahookabove
+.c0x00e5 adotbelow
+.c0x00e6 abreve
+.c0x00e7 ccedilla
+.c0x00e8 egrave
+.c0x00e9 eacute
+.c0x00ea ecircumflex
+.c0x00eb etilde
+.c0x00ec igrave
+.c0x00ed iacute
+.c0x00ee icircumflex
+.c0x00ef itilde
+.c0x00f0 Abrevetilde
+.c0x00f1 Dbar
+.c0x00f2 ograve
+.c0x00f3 oacute
+.c0x00f4 ocircumflex
+.c0x00f5 otilde
+.c0x00f6 odieresis
+.c0x00f7 Ohorn
+.c0x00f8 udotbelow
+.c0x00f9 ugrave
+.c0x00fa uacute
+.c0x00fb uhookabove
+.c0x00fc udieresis
+.c0x00fd Yhookabove
+.c0x00fe Etilde
+.c0x00ff ygrave
+.c0x0152 ecircumflexdotbelow
+.c0x0153 ydotbelow
+.c0x0160 ecircumflexgrave
+.c0x0161 yacute
+.c0x0178 Ohornhookabove
+.c0x0192 Acircumflexacute
+.c0x02c6 Abreve
+.c0x02dc Ocircumflexhookabove
+.c0x2013 Ocircumflexacute
+.c0x2014 Ocircumflexgrave
+.c0x2018 quoteleft
+.c0x2019 quoteright
+.c0x201a Atilde
+.c0x201c Ecircumflexgrave
+.c0x201d Ecircumflexhookabove
+.c0x201e Acircumflexgrave
+.c0x2020 odotbelow
+.c0x2021 ocircumflextilde
+.c0x2022 Ecircumflextilde
+.c0x2026 Acircumflexhookabove
+.c0x2030 ecircumflexacute
+.c0x2039 ecircumflexhookabove
+.c0x203a yhookabove
+.c0x2122 Ocircumflextilde
+.c0x2219 Ihookabove
+
+% eof
diff --git a/xc/extras/FreeType/contrib/ttf2pk/data/ttfonts.map b/xc/extras/FreeType/contrib/ttf2pk/data/ttfonts.map
new file mode 100644
index 000000000..beb15d062
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/data/ttfonts.map
@@ -0,0 +1,10 @@
+arials arial.ttf Slant=0.25
+arial arial.ttf Slant=0 Extend=1 Pid = 1 Eid = 0
+arialx arial.ttf Slant=0 Extend=1.5
+
+times times.ttf Encoding=T1-WGL4.enc \
+ .g0xc7=ring .g0xc9=caron .g0xc4=dotlessi
+times95 times95.ttf Encoding=T1-WGL4.enc
+
+ntukai@Big5@ /dos/texmf/fonts/truetype/chinese/ntu_kai.ttf Pid = 3 Eid = 4
+mincho@Unicode@ mincho.ttc Fontindex = 0
diff --git a/xc/extras/FreeType/contrib/ttf2pk/dvidrv.btm b/xc/extras/FreeType/contrib/ttf2pk/dvidrv.btm
new file mode 100644
index 000000000..34d0e2ec5
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/dvidrv.btm
@@ -0,0 +1,334 @@
+::
+:: This is dvidrv.btm, a batch file for 4DOS/4OS2 written by
+:: Werner Lemberg <wl@gnu.org> partially based on the
+:: dvidrv.btm file of the 4allTeX package written by Phons Bloemen.
+::
+:: It is a replacement for dvidrv.exe of the emTeX package.
+::
+:: Additional features: support of ps2pk
+:: support of ttf2pk
+:: support of hbf2gf for HBFs (Hanzi bitmap fonts)
+::
+:: Only quadratic printer modes are supported for ttf2pk!
+::
+:: All needed binaries will be searched in the path.
+
+iff %# lt 2 then
+ echo ``
+ echo Usage: %0 dvi-driver dvi-file [parameters]
+ quit
+endiff
+
+setlocal
+ :: we set a default value only if the corresponding environment variable
+ :: is empty. The `=' must follow the variable name immediately.
+ alias set_def `iff "%[%@word["=",0,%1]]" eq "" then %+ set %& %+ endiff`
+
+ :: =========================================
+ :: ======== User defined variables. ========
+ :: =========================================
+ ::
+ :: Can be overridden in the environment (except %ps2pk, %ttf2pk, %hbf2gf,
+ :: %pre_dpi, and %post_dpi).
+
+ :: Set these values to `no' for the programs you don't want to use.
+ set ps2pk=yes
+ set ttf2pk=yes
+ set hbf2gf=yes
+
+ :: where the PK files will be installed created by ps2pk, ttf2pk, and
+ :: hbf2gf.
+ :: dvidrv.btm adds `\modeless\XXXdpi' to this string (see below for the
+ :: exact string).
+ set_def pkdir=%emtexdir\pixel\tmp\pk
+
+ :: where the TrueType fonts reside. Supports trailing `!' and `!!'.
+ set_def ttfonts=%emtexdir\fonts\truetype
+ :: where auxiliary files of ttf2pk are located. Supports trailing `!'
+ :: and `!!'.
+ set_def ttfcfg=%emtexdir\ttf2pk
+
+ :: where the HBF files reside. Supports trailing `!' and `!!'.
+ set_def hbfonts=%emtexdir\fonts\hbf
+ :: where the hbf2gf config files are. Supports trailing `!' and `!!'.
+ set_def hbfcfg=%emtexdir\hbf2gf
+
+ :: the dpi-subdirectory has various forms; the most common are XXXdpi and
+ :: dpiXXX, e.g. 300dpi and dpi300. Here we define two variables which
+ :: control this behaviour.
+ :: [dpiXXX is used for TDS compatible TeX trees.]
+ set pre_dpi=dpi
+ set post_dpi=
+
+ :: ================================================
+ :: ======== End of user defined variables. ========
+ :: ================================================
+
+ :: the base name for log files etc.
+ set basename=%@name[%1]
+
+ :: do we run dvips?
+ iff "%basename" ne "dvips" then
+ goto nodvips1
+ endiff
+
+ :: we delete dvips.mfj if it exists.
+ del dvips.mfj >& nul
+
+ :: now we run dvips with all supplied parameters.
+ %&
+
+ :: do we have to generate fonts?
+ iff exist dvips.mfj then
+ goto generate_fonts
+ endiff
+
+ :: else all is done.
+ goto end
+
+
+:nodvips1
+ :: here we call the dvi driver with all supplied parameters.
+ %& -pj:%basename.mfj
+
+ :: do we have to generate fonts?
+ iff errorlevel 8 then
+ goto generate_fonts
+ endiff
+
+ :: else all is done.
+ goto end
+
+
+:generate_fonts
+ gosub call_mfjob
+
+ :: do we run dvips?
+ iff "%basename" ne "dvips" then
+ goto nodvips2
+ endiff
+
+ :: we now call dvips a second time
+ %&
+
+ :: since no fonts will be generated in the second run we remove dvips.mfj
+ del dvips.mfj >& nul
+
+ goto end
+
+
+:nodvips2
+ :: we call the dvi driver a second time (without font generation).
+ %& -pj -fm
+
+ del %basename.mfj >& nul
+
+ goto end
+
+
+:: this is the main subroutine which calls mfjob and then parses the mfjob
+:: file for fonts which can be handled by ps2pk, ttf2pk, or hbf2gf.
+:call_mfjob
+ :: this alias prints a message on the screen and writes it into the logfile.
+ alias echolog=`echo %& | tee /a %basename.mlg`
+
+ echo ======== DVIDRV.BTM logfile ======== > %basename.mlg
+ echo Commandline: dvidrv.btm %& >> %basename.mlg
+ echo `` >> %basename.mlg
+ echo basename=%basename >> %basename.mlg
+ echo emtexdir=%emtexdir >> %basename.mlg
+ echo dvidrvfonts=%dvidrvfonts >> %basename.mlg
+ echo mfinput=%mfinput >> %basename.mlg
+ echo mfjobopt=%mfjobopt >> %basename.mlg
+ echo textfm=%textfm >> %basename.mlg
+ echo psfonts=%psfonts >> %basename.mlg
+ echo ttfonts=%ttfonts >> %basename.mlg
+ echo ttfcfg=%ttfcfg >> %basename.mlg
+ echo hbfonts=%hbfonts >> %basename.mlg
+ echo hbfcfg=%hbfcfg >> %basename.mlg
+ echo `` >> %basename.mlg
+
+ iff "%@search[mfjob]" eq "" then
+ echolog MFJOB not found in the path.
+ echolog Can't generate PK fonts from METAFONT automatically.
+ echo ``
+ quit
+ endiff
+
+ :: now we call mfjob.
+ echolog mfjob %mfjobopt -g%basename.mfl %basename.mfj
+ mfjob %mfjobopt -g%basename.mfl %basename.mfj
+ iff %? gt 0 then
+ echolog ``
+ echolog Something went wrong while running METAFONT.
+ echolog Look into the log files...
+ echolog ``
+ endiff
+
+ :: after running mfjob we scan the mfjob input file for fonts which can
+ :: be handled by ps2pk, ttf2pk or hbf2gf.
+ set lnnr=0
+ set totlines=%@lines[%basename.mfj]
+
+ do while %lnnr le %totlines
+ :: input a line.
+ set scratch=%@line[%basename.mfj,%lnnr]
+ set lnnr=%@inc[%lnnr]
+
+ :: get resolutions (METAFONT mode will be ignored).
+ :: example:
+ :: mode=lqlores[180 180];
+ iff %@index[%scratch,mode] ge 0 then
+ set temp=%@word["[]",1,%scratch]
+ set xdpi=%@word[0,%temp]
+ set ydpi=%@word[1,%temp]
+ endiff
+
+ :: get fontname and magnification; we then compute the font resolutions
+ :: (rounded to the nearest integer---there is no necessity to adjust
+ :: these values further because of possible rounding errors since both
+ :: emTeX's dvi drivers and dvips check neighbored values too).
+ :: example:
+ :: {font=cmr10; mag=0.5;}
+ iff %@index[%scratch,{font] ge 0 then
+ set testfont=%@word["=;",1,%scratch]
+ set temp=%@word["=;",3,%scratch]
+ :: we use highest arithmetic precision for these calculations.
+ :: Additionally we write 1/2 instead of 0.5 to avoid problems with
+ :: countries which use a comma instead of a colon as the decimal
+ :: separator.
+ set fontresx=%@int[%@eval[%xdpi*%temp+1/2=8]]
+ set fontresy=%@int[%@eval[%ydpi*%temp+1/2=8]]
+ set pksubdir=modeless\%[pre_dpi]%[fontresx]%post_dpi
+
+ set success=0
+
+ :: check whether %testfont leads to a PS font (we call ps2pkmfj).
+ iff %success == 0 .and. "%ps2pk" eq "yes" then
+ gosub call_ps2pk
+ endiff
+
+ :: check whether %testfont leads to a TrueType font.
+ iff %success == 0 .and. "%ttf2pk" eq "yes" then
+ gosub call_ttf2pk
+ endiff
+
+ :: check whether %testfont leads to a HBF file.
+ iff %success == 0 .and. "%hbf2gf" eq "yes" then
+ gosub call_hbf2gf
+ endiff
+ endiff
+ enddo
+
+ iff exist %basename.mfp then
+ echo `` >> %basename.mlg
+ echo `` >> %basename.mlg
+ echo ======== PS2PK logfile ======== >> %basename.mlg
+ echo `` >> %basename.mlg
+ type %basename.mfp >> %basename.mlg
+ echo `` >> %basename.mlg
+ del %basename.mfp >& nul
+ endiff
+
+ iff exist %basename.mfl then
+ echo `` >> %basename.mlg
+ type %basename.mfl >> %basename.mlg
+ echo `` >> %basename.mlg
+ del %basename.mfl >& nul
+ endiff
+
+ return
+
+
+:call_ttf2pk
+ iff "%@search[ttf2pk]" eq "" then
+ echolog TTF2PK not found in the path.
+ echolog Can't generate PK fonts from TrueType fonts automatically.
+ echo ``
+ quit
+ endiff
+
+ echolog ttf2pk -q -n %testfont %fontresx
+ ttf2pk -q -n %testfont %fontresx
+
+ iff %? == 0 then
+ echolog Font %pkdir\%pksubdir\%testfont.pk generated.
+ mkdir /s %pkdir\%pksubdir >& nul
+ move %testfont.pk %pkdir\%pksubdir >& nul
+ set success=1
+ elseiff %? == 2 then
+ echolog (%lnnr/%totlines): Font %testfont is no TrueType font.
+ set success=0
+ else
+ echolog Error running TTF2PK for font %testfont!
+ endiff
+
+ return
+
+
+:call_hbf2gf
+ iff "%@search[hbf2gf]" eq "" then
+ echolog HBF2GF not found in the path.
+ echolog Can't generate PK fonts from HBF files automatically.
+ echo ``
+ quit
+ endiff
+
+ echolog hbf2gf -q -p -n %testfont %fontresx %fontresy
+ hbf2gf -q -p -n %testfont %fontresx %fontresy
+
+ iff %? == 0 then
+ echolog Font %pkdir\%pksubdir\%testfont.pk generated.
+ mkdir /s %pkdir\%pksubdir >& nul
+ gftopk %testfont.gf %testfont.pk
+ move %testfont.pk %pkdir\%pksubdir >& nul
+ del %testfont.gf >& nul
+ set success=1
+ elseiff %? == 2 then
+ echolog (%lnnr/%totlines): Font %testfont is no HBF.
+ set success=0
+ else
+ echolog Error running HBF2GF for font %testfont!
+ endiff
+
+ return
+
+
+:call_ps2pk
+ iff not exist %pkdir\%pksubdir\%testfont.pk then
+ iff "%@search[ps2pkmfj]" eq "" .or. "%@search[ps2pk]" eq "" then
+ echolog PS2PKMFJ and/or PS2PK not found in the path.
+ echolog Can't generate PK fonts from PostScript fonts automatically.
+ echo ``
+ quit
+ endiff
+
+ echolog ps2pkmfj -X%fontresx -Y%fontresy %testfont %testfont.pk
+ ps2pkmfj -X%fontresx -Y%fontresy %testfont %testfont.pk | input %%pspkline
+
+ iff errorlevel != 1 then
+ %pspkline >> %basename.mfp
+ iff %? == 0 then
+ echolog Font %pkdir\%pksubdir\%testfont.pk generated.
+ mkdir /s %pkdir\%pksubdir >& nul
+ move %testfont.pk %pkdir\%pksubdir >& nul
+ success=1
+ else
+ echolog Error running PS2PK for font %testfont!
+ endiff
+ else
+ echolog (%lnnr/%totlines): Font %testfont is no PS font.
+ success=0
+ endiff
+ else
+ echolog Font %pkdir\%pksubdir\%testfont.pk already exists.
+ endiff
+
+ return
+
+
+:end
+
+endlocal
+
+:: ==== end of dvidrv.btm ====
diff --git a/xc/extras/FreeType/contrib/ttf2pk/emdir.c b/xc/extras/FreeType/contrib/ttf2pk/emdir.c
new file mode 100644
index 000000000..4e759c83e
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/emdir.c
@@ -0,0 +1,109 @@
+/* emdir.c -- Written by Eberhard Mattes, donated to the public domain */
+
+#include "emdir.h"
+
+#ifdef OS2
+
+#undef HPS
+#define INCL_DOSFILEMGR
+#include <os2.h>
+#include <string.h>
+
+#define FHDIR(b) (*(HDIR *)(b)->reserved)
+
+static void fconv (struct ll_findbuffer *dst, const FILEFINDBUF *src)
+{
+ dst->attr = src->attrFile;
+ dst->time = *(unsigned *)&src->ftimeLastWrite;
+ dst->date = *(unsigned *)&src->fdateLastWrite;
+ dst->size = src->cbFile;
+ strcpy (dst->name, src->achName);
+}
+
+
+int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer)
+{
+ USHORT rc;
+ ULONG count;
+ HDIR hdir;
+ FILEFINDBUF ffbuf;
+
+ hdir = HDIR_CREATE;
+ count = 1;
+ rc = DosFindFirst ((PSZ)path, &hdir, attr, &ffbuf, sizeof (ffbuf),
+ &count, 0L);
+ if (rc != 0 || count != 1)
+ return 0;
+ FHDIR (buffer) = hdir;
+ fconv (buffer, &ffbuf);
+ return 1;
+}
+
+
+int ll_findnext (struct ll_findbuffer *buffer)
+{
+ USHORT rc;
+ ULONG count;
+ HDIR hdir;
+ FILEFINDBUF ffbuf;
+
+ hdir = FHDIR (buffer);
+ count = 1;
+ rc = DosFindNext (hdir, &ffbuf, sizeof (ffbuf), &count);
+ if (rc != 0 || count != 1)
+ {
+ DosFindClose (hdir);
+ return 0;
+ }
+ fconv (buffer, &ffbuf);
+ return 1;
+}
+
+
+#elif defined(DJGPP)
+
+/* djgpp support by Hartmut Schirmer (hsc@techfak.uni-kiel.de), May 30, 1997 */
+
+#include <dos.h>
+#include <dir.h>
+
+static int ll_attr = 0;
+int ll_findnext (struct ll_findbuffer *buffer)
+{
+ int res;
+ do {
+ res = _dos_findnext ((struct find_t *)buffer);
+ if (res != 0) return 0;
+ } while ( (buffer->attrib&ll_attr) == 0);
+ return 1;
+}
+
+int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer)
+{
+ int res;
+ ll_attr = attr;
+ res = _dos_findfirst((char *)path, attr, (struct find_t *)buffer);
+ if (res != 0) return 0;
+ if ( (buffer->attrib&ll_attr) == 0)
+ return ll_findnext(buffer);
+ return 1;
+}
+
+#elif !defined(__EMX__) /* if not OS2 nor DJGPP nor __EMX__ defined */
+
+/* Not tested */
+
+#include <dos.h>
+
+int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer)
+{
+ return _dos_findfirst (path, attr, (struct find_t *)buffer) == 0;
+}
+
+
+int ll_findnext (struct ll_findbuffer *buffer)
+{
+ return _dos_findnext ((struct find_t *)buffer) == 0;
+}
+
+#endif
diff --git a/xc/extras/FreeType/contrib/ttf2pk/emdir.h b/xc/extras/FreeType/contrib/ttf2pk/emdir.h
new file mode 100644
index 000000000..0606d476a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/emdir.h
@@ -0,0 +1,25 @@
+/* emdir.h -- Written by Eberhard Mattes, donated to the public domain */
+
+#if defined(DJGPP)
+
+/* djgpp support by Hartmut Schirmer (hsc@techfak.uni-kiel.de), May 30, 1997 */
+#include <dos.h>
+#define ll_findbuffer find_t
+#define attr attrib
+
+#else
+
+struct ll_findbuffer
+{
+ char reserved[21];
+ unsigned char attr;
+ unsigned time;
+ unsigned date;
+ long size;
+ char name[257];
+};
+
+#endif
+
+int ll_findfirst (const char *path, int attr, struct ll_findbuffer *buffer);
+int ll_findnext (struct ll_findbuffer *buffer);
diff --git a/xc/extras/FreeType/contrib/ttf2pk/emtexdir.c b/xc/extras/FreeType/contrib/ttf2pk/emtexdir.c
new file mode 100644
index 000000000..9a35570ad
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/emtexdir.c
@@ -0,0 +1,405 @@
+/* emtexdir.c -- written by Eberhard Mattes, donated to the public domain */
+
+#if defined (__EMX__)
+#include <emx/syscalls.h>
+#else
+#include "emdir.h"
+#endif
+#if defined(DJGPP) || defined(GO32)
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <io.h>
+#include "emtexdir.h"
+
+#define FALSE 0
+#define TRUE 1
+
+void (*emtex_dir_find_callback)(const char *name, int ok) = NULL;
+
+static int setup_add (struct emtex_dir *dst, const char *path)
+{
+ char *p;
+
+ if (dst->used >= dst->alloc)
+ {
+ dst->alloc += 8;
+ dst->list = realloc (dst->list, dst->alloc * sizeof (*dst->list));
+ if (dst->list == NULL)
+ return (FALSE);
+ }
+ p = strdup (path);
+ if (p == NULL)
+ return (FALSE);
+ dst->list[dst->used++] = p;
+ return (TRUE);
+}
+
+
+static int setup_subdir (struct emtex_dir *dst, char *path, size_t add,
+ unsigned flags, int recurse)
+{
+ int ok, i, end, len;
+#if defined (__EMX__)
+ struct _find find;
+#else
+ struct ll_findbuffer find;
+#endif
+
+ i = dst->used;
+ strcpy (path + add, "*.*");
+#if defined (__EMX__)
+ ok = __findfirst (path, 0x10, &find) == 0;
+#else
+ ok = ll_findfirst (path, 0x10, &find);
+#endif
+ while (ok)
+ {
+ if ((find.attr & 0x10)
+ && !(strcmp (find.name, ".") == 0 || strcmp (find.name, "..") == 0))
+ {
+ len = strlen (find.name);
+ memcpy (path + add, find.name, len);
+ path[add+len] = '\\';
+ path[add+len+1] = 0;
+ if (!setup_add (dst, path))
+ return (FALSE);
+ }
+#if defined (__EMX__)
+ ok = __findnext (&find) == 0;
+#else
+ ok = ll_findnext (&find);
+#endif
+ }
+ if (recurse)
+ {
+ end = dst->used;
+ while (i < end)
+ {
+ strcpy (path, dst->list[i]);
+ if (!setup_subdir (dst, path, strlen (path), flags, TRUE))
+ return (FALSE);
+ ++i;
+ }
+ }
+ return (TRUE);
+}
+
+
+static int setup_dir (struct emtex_dir *dst, char *path,
+ const char *base_dir, size_t base_dir_len,
+ const char *sub_dir,
+ unsigned flags)
+{
+ size_t i, len;
+
+ memcpy (path, base_dir, base_dir_len);
+ i = base_dir_len;
+ if ((flags & EDS_BANG) && sub_dir == NULL)
+ {
+ flags &= ~(EDS_ONESUBDIR|EDS_ALLSUBDIR);
+ if (i >= 2 && path[i-1] == '!' && path[i-2] == '!')
+ {
+ flags |= EDS_ALLSUBDIR;
+ i -= 2;
+ }
+ else if (i >= 1 && path[i-1] == '!')
+ {
+ flags |= EDS_ONESUBDIR;
+ --i;
+ }
+ }
+ if (sub_dir != NULL && *sub_dir != 0)
+ {
+ if (i != 0 && path[i-1] != ':' && path[i-1] != '/' && path[i-1] != '\\')
+ path[i++] = '\\';
+ len = strlen (sub_dir);
+ memcpy (path+i, sub_dir, len);
+ i += len;
+ }
+ if (path[i-1] != ':' && path[i-1] != '/' && path[i-1] != '\\')
+ path[i++] = '\\';
+ path[i] = 0;
+ if (!setup_add (dst, path))
+ return (FALSE);
+ if (flags & EDS_ALLSUBDIR)
+ return (setup_subdir (dst, path, i, flags, TRUE));
+ else if (flags & EDS_ONESUBDIR)
+ return (setup_subdir (dst, path, i, flags, FALSE));
+ else
+ return (TRUE);
+}
+
+
+/*static */int setup_list (struct emtex_dir *dst, char *path,
+ const char *list, unsigned flags)
+{
+ const char *end;
+ size_t i;
+
+ for (;;)
+ {
+ while (*list == ' ' || *list == '\t')
+ ++list;
+ if (*list == 0)
+ return (TRUE);
+ end = list;
+ while (*end != 0 && *end != ';')
+ ++end;
+ i = end - list;
+ while (i > 0 && (list[i-1] == ' ' || list[i-1] == '\t'))
+ --i;
+ if (i != 0 && !setup_dir (dst, path, list, i, NULL, flags))
+ return (FALSE);
+ if (*end == 0)
+ return (TRUE);
+ list = end + 1;
+ }
+}
+
+
+int emtex_dir_setup (struct emtex_dir *ed, const char *env, const char *dir,
+ unsigned flags)
+{
+ const char *val;
+ char path[260];
+
+ ed->alloc = 0;
+ ed->used = 0;
+ ed->list = NULL;
+ if (env != NULL && (val = getenv (env)) != NULL)
+ return (setup_list (ed, path, val, flags));
+ else if ((val = getenv ("EMTEXDIR")) != NULL)
+ return (setup_dir (ed, path, val, strlen (val), dir, flags));
+ else
+ return (setup_dir (ed, path, "\\emtex", 6, dir, flags));
+}
+
+
+static void pretty (char *path, unsigned flags)
+{
+ char *p;
+
+ if (flags & EDF_FSLASH)
+ for (p = path; *p != 0; ++p)
+ if (*p == '\\')
+ *p = '/';
+}
+
+
+#define ADDCHAR(C) \
+ if (dst_size < 1) return (EDT_TOOLONG); \
+ *dst++ = (C); --dst_size
+
+int emtex_dir_trunc (char *dst, size_t dst_size, const char *src,
+ unsigned flags, int method)
+{
+ int len, truncated, dot;
+
+ if (src[0] != 0 && src[1] == ':')
+ {
+ ADDCHAR (src[0]);
+ ADDCHAR (src[1]);
+ src += 2;
+ }
+
+ truncated = FALSE; dot = FALSE; len = 0;
+ for (;;)
+ {
+ switch (*src)
+ {
+ case 0:
+ ADDCHAR (0);
+ return (truncated ? EDT_CHANGED : EDT_UNCHANGED);
+
+ case ':':
+ return (EDT_INVALID);
+
+ case '/':
+ case '\\':
+ ADDCHAR (*src);
+ len = 0; dot = FALSE;
+ break;
+
+ case '.':
+ if (dot)
+ return (EDT_INVALID);
+ ADDCHAR (*src);
+
+ /* ".." is allowed -- don't return EDT_INVALID for the next
+ dot. */
+
+ if (!(len == 0 && src[1] == '.'
+ && (src[2] == 0 || src[2] == '/' || src[2] == '\\')))
+ {
+ len = 0; dot = TRUE;
+ }
+ break;
+
+ default:
+ if (dot && len == 3)
+ truncated = TRUE;
+ else if (!dot && len == 8)
+ {
+ truncated = TRUE;
+ if (method == 0)
+ {
+ dst[-3] = dst[-2];
+ dst[-2] = dst[-1];
+ dst[-1] = *src;
+ }
+ }
+ else
+ {
+ ADDCHAR (*src);
+ ++len;
+ }
+ break;
+ }
+ ++src;
+ }
+}
+
+
+static int find2 (const char *name, unsigned flags)
+{
+ int ok;
+
+ ok = (access (name, 4) == 0);
+ if (flags & EDF_TRACE)
+ emtex_dir_find_callback (name, ok);
+ return (ok);
+}
+
+
+static int find1 (char *path, size_t path_size, const char *dir,
+ const char *fname, unsigned flags)
+{
+ char buf[260];
+ int method, rc;
+ size_t len, tmp;
+
+ len = 0;
+ if (dir != NULL)
+ {
+ tmp = strlen (dir);
+ if (tmp >= sizeof (buf))
+ return (FALSE);
+ memcpy (buf, dir, tmp);
+ len = tmp;
+ }
+ tmp = strlen (fname);
+ if (len + tmp >= sizeof (buf))
+ return (FALSE);
+ memcpy (buf + len, fname, tmp + 1);
+ len += tmp;
+#if 0 /* wkim */
+/* disabled for Win95's long file name support */
+/* -- Wonkoo Kim (wkim+@pitt.edu), May 18, 1997 */
+ if (_osmode == DOS_MODE)
+ {
+ rc = emtex_dir_trunc (path, path_size, buf, flags, EDT_5_PLUS_3);
+ if ((rc == EDT_UNCHANGED || rc == EDT_CHANGED) && find2 (path, flags))
+ {
+ pretty (path, flags);
+ return (TRUE);
+ }
+ rc = emtex_dir_trunc (path, path_size, buf, flags, EDT_8);
+ if (rc == EDT_CHANGED && find2 (path, flags))
+ {
+ pretty (path, flags);
+ return (TRUE);
+ }
+ return (FALSE);
+ }
+ else
+#endif /* wkim */
+ {
+ if (len < path_size && find2 (buf, flags))
+ {
+ memcpy (path, buf, len + 1);
+ pretty (path, flags);
+ return (TRUE);
+ }
+ for (method = 0; method < 2; ++method)
+ {
+ rc = emtex_dir_trunc (path, path_size, buf, flags, method);
+ if (rc == EDT_CHANGED && find2 (path, flags))
+ {
+ pretty (path, flags);
+ return (TRUE);
+ }
+ }
+ return (FALSE);
+ }
+}
+
+
+int emtex_dir_find (char *path, size_t path_size,
+ const struct emtex_dir *ed,
+ const char *fname, unsigned flags)
+{
+ int i, absp;
+ const char *p;
+
+ absp = FALSE;
+ for (p = fname; *p != 0; ++p)
+ if (*p == ':' || *p == '/' || *p == '\\')
+ {
+ absp = TRUE;
+ break;
+ }
+
+ if (absp)
+ return (find1 (path, path_size, NULL, fname, flags));
+
+ if ((flags & EDF_CWD) && find1 (path, path_size, NULL, fname, flags))
+ return (TRUE);
+
+ for (i = 0; i < ed->used; ++i)
+ if (find1 (path, path_size, ed->list[i], fname, flags))
+ return (TRUE);
+ return (FALSE);
+}
+
+
+#if defined (TEST)
+
+#include <stdio.h>
+
+int main (int argc, char *argv[])
+{
+ struct emtex_dir ed;
+ int i;
+ unsigned flags1, flags2;
+ char path[260];
+
+ if (argc != 6)
+ {
+ puts ("Usage: emtexdir <flags> <flags> <env> <dir> <fname>");
+ return (1);
+ }
+
+ flags1 = (unsigned)strtol (argv[1], NULL, 0);
+ flags2 = (unsigned)strtol (argv[2], NULL, 0);
+
+ if (!emtex_dir_setup (&ed, argv[3], argv[4], flags1))
+ {
+ fputs ("emtex_dir_setup failed\n", stderr);
+ return (2);
+ }
+
+ printf ("Directories:\n");
+ for (i = 0; i < ed.used; ++i)
+ printf (" %s\n", ed.list[i]);
+
+ if (!emtex_dir_find (path, sizeof (path), &ed, argv[5], flags2))
+ puts ("File not found");
+ else
+ printf ("Path: %s\n", path);
+ return (0);
+}
+
+#endif
diff --git a/xc/extras/FreeType/contrib/ttf2pk/emtexdir.h b/xc/extras/FreeType/contrib/ttf2pk/emtexdir.h
new file mode 100644
index 000000000..a9a986db0
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/emtexdir.h
@@ -0,0 +1,57 @@
+/* emtexdir.h -- written by Eberhard Mattes, donated to the public domain */
+
+#if !defined (_EMTEXDIR_H)
+#define _EMTEXDIR_H
+
+#if defined (__cplusplus)
+extern "C" {
+#endif
+
+
+/* Flags for emtex_dir_setup */
+
+#define EDS_ONESUBDIR 0x0001
+#define EDS_ALLSUBDIR 0x0002
+#define EDS_BANG 0x0004
+
+/* Flags for emtex_dir_find */
+
+#define EDF_CWD 0x0001
+#define EDF_FSLASH 0x0002
+#define EDF_TRACE 0x8000
+
+/* Methods for emtex_dir_trunc */
+
+#define EDT_5_PLUS_3 0 /* 5+3.3 */
+#define EDT_8 1 /* 8.3 */
+
+/* Return values for emtex_dir_trunc */
+
+#define EDT_UNCHANGED 0 /* Path name not changed */
+#define EDT_CHANGED 1 /* Path name truncated */
+#define EDT_TOOLONG 2 /* Path name too long */
+#define EDT_INVALID 3 /* Path name invalid */
+
+struct emtex_dir
+{
+ char **list;
+ int used;
+ int alloc;
+};
+
+extern void (*emtex_dir_find_callback)(const char *name, int ok);
+
+int emtex_dir_setup (struct emtex_dir *ed, const char *env, const char *dir,
+ unsigned flags);
+
+int emtex_dir_find (char *path, size_t path_size, const struct emtex_dir *ed,
+ const char *fname, unsigned flags);
+
+int emtex_dir_trunc (char *dst, size_t dst_size, const char *src,
+ unsigned flags, int method);
+
+#if defined (__cplusplus)
+}
+#endif
+
+#endif /* !defined (_EMTEXDIR_H) */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/errormsg.c b/xc/extras/FreeType/contrib/ttf2pk/errormsg.c
new file mode 100644
index 000000000..d9489e55b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/errormsg.c
@@ -0,0 +1,96 @@
+/*
+ * errormsg.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdio.h>
+#include <stddef.h> /* for size_t */
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "errormsg.h"
+
+
+extern char progname[]; /* the origin of the error/warning message */
+
+
+/*
+ * Print error message and quit.
+ */
+
+void
+oops(const char *message,
+ ...)
+{
+ va_list args;
+
+
+ va_start(args, message);
+ fprintf(stderr, "%s: ERROR: ", progname);
+ vfprintf(stderr, message, args);
+ va_end(args);
+ putc('\n', stderr);
+
+ exit(1);
+}
+
+
+/*
+ * Print error message, a buffer, a '^' at the buffer offset, and quit.
+ */
+
+void
+boops(const char *buffer,
+ size_t offset,
+ const char *message,
+ ...)
+{
+ va_list args;
+
+
+ va_start(args, message);
+ fprintf(stderr, "%s: ERROR: ", progname);
+ vfprintf(stderr, message, args);
+ va_end(args);
+ putc('\n', stderr);
+
+ if (*buffer)
+ {
+ fprintf(stderr, "%s\n", buffer);
+ while (offset)
+ {
+ fprintf(stderr, " ");
+ offset--;
+ }
+ fprintf(stderr, "^\n");
+ }
+
+ exit(1);
+}
+
+
+/*
+ * Print warning message and continue.
+ */
+
+void
+warning(const char *message,
+ ...)
+{
+ va_list args;
+
+
+ va_start(args, message);
+ fprintf(stderr, "%s: WARNING: ", progname);
+ vfprintf(stderr, message, args);
+ va_end(args);
+ putc('\n', stderr);
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/errormsg.h b/xc/extras/FreeType/contrib/ttf2pk/errormsg.h
new file mode 100644
index 000000000..4123f3d4c
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/errormsg.h
@@ -0,0 +1,26 @@
+/*
+ * errormsg.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef ERRORMSG_H
+#define ERRORMSG_H
+
+void oops(const char *message,
+ ...);
+void boops(const char *buffer,
+ size_t offset,
+ const char *message,
+ ...);
+void warning(const char *message,
+ ...);
+
+#endif /* ERRORMSG_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/filesrch.c b/xc/extras/FreeType/contrib/ttf2pk/filesrch.c
new file mode 100644
index 000000000..3b0c89133
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/filesrch.c
@@ -0,0 +1,490 @@
+/*
+ * filesrch.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+/*
+ * Interface to the system specific TeX file search routines.
+ */
+
+#include <stddef.h> /* for size_t */
+#include <stdlib.h>
+#include <string.h>
+
+#include "filesrch.h"
+#include "newobj.h"
+
+
+/****************************
+ * kpathsea library support *
+ ****************************/
+
+#if defined(HAVE_LIBKPATHSEA)
+
+#ifdef VERY_OLD_KPATHSEA
+#include "kpathsea/proginit.h"
+#include "kpathsea/progname.h"
+#include "kpathsea/tex-glyph.h"
+#else
+#include "kpathsea/kpathsea.h"
+#endif
+
+extern char *kpathsea_version_string;
+
+/*
+ * Initialize kpathsea library; arguments are the full name of the
+ * executable (e.g. `/usr/bin/ttf2pk') and two identification strings;
+ * the former for the program itself (to have texmf.cnf constructs like
+ * `TFMFONTS.ttf2pk'), the latter for the environment (to have environment
+ * constructs like `TTF2PKMAKEPK').
+ */
+
+void
+TeX_search_init(char *exec_name,
+ char *program_identifier,
+ char *env_identifier)
+{
+#ifdef OLD_KPATHSEA
+ kpse_set_progname(exec_name);
+#else
+ kpse_set_program_name(exec_name, program_identifier);
+#endif
+
+#ifdef VERY_OLD_KPATHSEA
+ kpse_init_prog(env_identifier, 300, "cx", true, "cmr10");
+#else
+ kpse_init_prog(env_identifier, 300, "cx", "cmr10");
+#endif
+}
+
+
+char *
+TeX_search_version(void)
+{
+ return kpathsea_version_string;
+}
+
+
+char *
+TeX_search_tfm(char **name)
+{
+ /* no extra extension handling necessary */
+
+ return kpse_find_file(*name, kpse_tfm_format, True);
+}
+
+
+char *
+TeX_search_encoding_file(char **name)
+{
+ handle_extension(name, ".enc");
+
+#ifdef OLD_KPATHSEA
+#ifdef VERY_OLD_KPATHSEA
+ return kpse_find_file(*name, kpse_dvips_header_format, True);
+#else
+ return kpse_find_file(*name, kpse_tex_ps_header_format, True);
+#endif
+#else
+ return kpse_find_file(*name, kpse_program_text_format, True);
+#endif
+}
+
+
+char *
+TeX_search_replacement_file(char **name)
+{
+ handle_extension(name, ".rpl");
+
+#ifdef OLD_KPATHSEA
+#ifdef VERY_OLD_KPATHSEA
+ return kpse_find_file(*name, kpse_dvips_header_format, True);
+#else
+ return kpse_find_file(*name, kpse_tex_ps_header_format, True);
+#endif
+#else
+ return kpse_find_file(*name, kpse_program_text_format, True);
+#endif
+}
+
+
+char *
+TeX_search_sfd_file(char **name)
+{
+ handle_extension(name, ".sfd");
+
+#ifdef OLD_KPATHSEA
+#ifdef VERY_OLD_KPATHSEA
+ return kpse_find_file(*name, kpse_dvips_header_format, True);
+#else
+ return kpse_find_file(*name, kpse_tex_ps_header_format, True);
+#endif
+#else
+ return kpse_find_file(*name, kpse_program_text_format, True);
+#endif
+}
+
+
+char *
+TeX_search_config_file(char **name)
+{
+ /* no extra extension handling necessary */
+
+#ifdef OLD_KPATHSEA
+ return kpse_find_file(*name, kpse_dvips_config_format, True);
+#else
+ return kpse_find_file(*name, kpse_program_text_format, True);
+#endif
+}
+
+
+char *
+TeX_search_ttf_file(char **name)
+{
+#ifdef OLD_KPATHSEA
+
+ size_t l;
+ char* real_name;
+
+
+ l = strlen(*name);
+ handle_extension(name, ".ttf");
+#ifdef VERY_OLD_KPATHSEA
+ real_name = kpse_find_file(*name, kpse_dvips_header_format, True);
+#else
+ real_name = kpse_find_file(*name, kpse_type1_format, True);
+#endif
+
+ /* test for .ttc, but only if no extension was given initially */
+ if (!real_name && l != strlen(*name))
+ {
+ (*name)[strlen(*name) - 1] = 'c';
+#ifdef VERY_OLD_KPATHSEA
+ real_name = kpse_find_file(*name, kpse_dvips_header_format, True);
+#else
+ real_name = kpse_find_file(*name, kpse_type1_format, True);
+#endif
+ }
+
+ return real_name;
+
+#else /* OLD_KPATHSEA */
+
+ /* no extra extension handling necessary */
+
+ return kpse_find_file(*name, kpse_truetype_format, True);
+
+#endif
+}
+
+
+/****************************
+ * emtexdir library support *
+ ****************************/
+
+#elif defined(HAVE_EMTEXDIR)
+
+#include "emtexdir.h"
+#include "errormsg.h"
+
+extern int setup_list(struct emtex_dir *dst, char *path,
+ const char *list, unsigned flags);
+
+char emtex_version_string[] = "emTeXdir";
+
+struct emtex_dir tfm_path,
+ enc_path,
+ rpl_path,
+ sfd_path,
+ cfg_path,
+ ttf_path;
+
+
+/*
+ * We slightly modify emtex_dir_setup() to output a warning in case
+ * the environment variable isn't set properly.
+ */
+
+static int
+dir_setup(struct emtex_dir *ed,
+ const char *env,
+ const char *dir,
+ unsigned flags)
+{
+ const char *val;
+ char path[260];
+
+
+ ed->alloc = 0;
+ ed->used = 0;
+ ed->list = NULL;
+
+ if (env != NULL && (val = getenv(env)) != NULL)
+ return setup_list(ed, path, val, flags);
+ else
+ warning("Environment variable %s not set; use current directory.", env);
+
+ return True;
+}
+
+
+static char *
+file_find(char *name, struct emtex_dir *list)
+{
+ char buffer[1024];
+
+
+ if (emtex_dir_find(buffer, sizeof (buffer), list, name, EDF_CWD))
+ return newstring(buffer);
+
+ return NULL;
+}
+
+
+/*
+ * Initialize emtexdir library; arguments are the full name of the
+ * executable (e.g. `c:\bin\ttf2pk.exe') and two identification strings;
+ * the former for the program itself, the latter for the environment.
+ * We ignore all of them.
+ */
+
+void
+TeX_search_init(char *exec_name,
+ char *program_identifier,
+ char *env_identifier)
+{
+ if (!dir_setup(&tfm_path, "TEXTFM", NULL, EDS_BANG))
+ oops("Cannot setup search path for tfm files");
+ if (!dir_setup(&enc_path, "TTFCFG", NULL, EDS_BANG))
+ oops("Cannot setup search path for encoding files");
+#if 0
+ if (!dir_setup(&rpl_path, "TTFCFG", NULL, EDS_BANG))
+ oops("Cannot setup search path for replacement files");
+ if (!dir_setup(&sfd_path, "TTFCFG", NULL, EDS_BANG))
+ oops("Cannot setup search path for subfont definition files");
+ if (!dir_setup(&cfg_path, "TTFCFG", NULL, EDS_BANG))
+ oops("Cannot setup search path for configuration file");
+#else
+ rpl_path = sfd_path = cfg_path = enc_path;
+#endif
+ if (!dir_setup(&ttf_path, "TTFONTS", NULL, EDS_BANG))
+ oops("Cannot setup search path for TrueType font files");
+}
+
+
+char *
+TeX_search_version(void)
+{
+ return emtex_version_string;
+}
+
+
+char *
+TeX_search_tfm(char **name)
+{
+ handle_extension(name, ".tfm");
+ return file_find(*name, &tfm_path);
+}
+
+
+char *
+TeX_search_encoding_file(char **name)
+{
+ handle_extension(name, ".enc");
+ return file_find(*name, &enc_path);
+}
+
+
+char *
+TeX_search_replacement_file(char **name)
+{
+ handle_extension(name, ".rpl");
+ return file_find(*name, &rpl_path);
+}
+
+
+char *
+TeX_search_sfd_file(char **name)
+{
+ handle_extension(name, ".sfd");
+ return file_find(*name, &sfd_path);
+}
+
+
+char *
+TeX_search_config_file(char **name)
+{
+ /* no extra extension handling necessary */
+ return file_find(*name, &cfg_path);
+}
+
+
+char *
+TeX_search_ttf_file(char **name)
+{
+ size_t l;
+ char* real_name;
+
+
+ l = strlen(*name);
+ handle_extension(name, ".ttf");
+ real_name = file_find(*name, &ttf_path);
+
+ /* test for .ttc, but only if no extension was given initially */
+ if (!real_name && l != strlen(*name))
+ {
+ (*name)[strlen(*name) - 1] = 'c';
+ real_name = file_find(*name, &ttf_path);
+ }
+
+ return real_name;
+}
+
+
+/**********************
+ * no library support *
+ **********************/
+
+#else
+
+#include <stdio.h>
+
+char version_string[] = "no search library";
+
+void
+TeX_search_init(char *exec_name,
+ char *program_identifier,
+ char *env_identifier)
+{
+ /* empty */
+}
+
+
+char *
+TeX_search_version(void)
+{
+ return version_string;
+}
+
+
+char *
+TeX_search_tfm(char **name)
+{
+ handle_extension(name, ".tfm");
+ return *name;
+}
+
+
+char *
+TeX_search_encoding_file(char **name)
+{
+ handle_extension(name, ".enc");
+ return *name;
+}
+
+
+char *
+TeX_search_replacement_file(char **name)
+{
+ handle_extension(name, ".rpl");
+ return *name;
+}
+
+
+char *
+TeX_search_sfd_file(char **name)
+{
+ handle_extension(name, ".sfd");
+ return *name;
+}
+
+
+char *
+TeX_search_config_file(char **name)
+{
+ /* no extra extension handling necessary */
+ return *name;
+}
+
+
+/* we only handle .ttf extension */
+
+char *
+TeX_search_ttf_file(char **name)
+{
+ handle_extension(name, ".ttf");
+ return *name;
+}
+
+#endif
+
+
+
+void
+get_tfm_fullname(Font *fnt)
+{
+ size_t len = 0;
+
+
+ if (fnt->fullname)
+ free(fnt->fullname);
+
+ if (fnt->outname)
+ len += strlen(fnt->outname);
+ if (fnt->subfont_name)
+ len += strlen(fnt->subfont_name);
+ if (fnt->outname_postfix)
+ len += strlen(fnt->outname_postfix);
+ len++;
+
+ fnt->fullname = (char *)mymalloc(len);
+ fnt->fullname[0] = '\0';
+
+ if (fnt->outname)
+ strcat(fnt->fullname, fnt->outname);
+ if (fnt->subfont_name)
+ strcat(fnt->fullname, fnt->subfont_name);
+ if (fnt->outname_postfix)
+ strcat(fnt->fullname, fnt->outname_postfix);
+}
+
+
+/*
+ * This function takes the address of a pointer to a string allocated
+ * with malloc() and checks whether it has an extension. If not, a default
+ * extension given as a second argument will be appended using first
+ * realloc() and then strcat().
+ *
+ * '/', ':', and '\\' will be recognized as directory separators.
+ */
+
+void
+handle_extension(char **stringp,
+ char *extension)
+{
+ int i, lastext = -1;
+
+
+ for (i = 0; (*stringp)[i]; i++)
+ if ((*stringp)[i] == '.')
+ lastext = i;
+ else if ((*stringp)[i] == '/' ||
+ (*stringp)[i] == ':' ||
+ (*stringp)[i] == '\\')
+ lastext = -1;
+
+ if (lastext == -1)
+ {
+ *stringp = (char *)myrealloc((void *)*stringp,
+ strlen(*stringp) + strlen(extension) + 1);
+ strcat(*stringp, extension);
+ }
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/filesrch.h b/xc/extras/FreeType/contrib/ttf2pk/filesrch.h
new file mode 100644
index 000000000..1467b44db
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/filesrch.h
@@ -0,0 +1,51 @@
+/*
+ * filesrch.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef FILESRCH_H
+#define FILESRCH_H
+
+#include "ttf2tfm.h"
+
+/*
+ * Arguments are the full program name and two identification strings
+ * (for the program and the environment).
+ */
+
+void TeX_search_init(char *exec_name,
+ char *program_identifier,
+ char *env_identifier);
+
+/*
+ * The next function returns a version string.
+ */
+
+char *TeX_search_version(void);
+
+/*
+ * The following functions take a file name (either relative or absolute),
+ * probably append a default extension, and return the complete path to the
+ * file.
+ */
+
+char *TeX_search_tfm(char **name);
+char *TeX_search_encoding_file(char **name);
+char *TeX_search_replacement_file(char **name);
+char *TeX_search_sfd_file(char **name);
+char *TeX_search_config_file(char **name);
+char *TeX_search_ttf_file(char **name);
+
+void get_tfm_fullname(Font *fnt);
+void handle_extension(char **stringp,
+ char *extension);
+
+#endif /* FILESRCH_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ligkern.c b/xc/extras/FreeType/contrib/ttf2pk/ligkern.c
new file mode 100644
index 000000000..df2b84c76
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ligkern.c
@@ -0,0 +1,275 @@
+/*
+ * ligkern.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <string.h>
+#include <stdlib.h>
+#include <stddef.h> /* for size_t */
+#include <ctype.h>
+
+#include "ttf2tfm.h"
+#include "ligkern.h"
+#include "ttfenc.h"
+#include "texenc.h"
+#include "newobj.h"
+#include "errormsg.h"
+
+
+static char *
+paramstring(char **curp)
+{
+ register char *p, *q;
+
+
+ p = *curp;
+ while (*p && !isspace(*p))
+ p++;
+ q = *curp;
+ if (*p != '\0')
+ *p++ = '\0';
+ while (isspace(*p))
+ p++;
+ *curp = p;
+ return q;
+}
+
+
+/*
+ * Some routines to remove kerns that match certain patterns.
+ */
+
+static kern *
+rmkernmatch(kern *k,
+ char *s)
+{
+ kern *nk;
+
+
+ while (k && strcmp(k->succ, s) == 0)
+ k = k->next;
+
+ if (k)
+ {
+ for (nk = k; nk; nk = nk->next)
+ while (nk->next && strcmp(nk->next->succ, s) == 0)
+ nk->next = nk->next->next;
+ }
+ return k;
+}
+
+
+/*
+ * Recursive to one level.
+ */
+
+static void
+rmkern(char *s1, char *s2,
+ ttfinfo *ti,
+ Font *fnt)
+{
+ if (ti == NULL)
+ {
+ if (strcmp(s1, "*") == 0)
+ {
+ for (ti = fnt->charlist; ti; ti = ti->next)
+ rmkern(s1, s2, ti, fnt);
+ return;
+ }
+ else
+ {
+ ti = findadobe(s1, fnt->charlist);
+ if (ti == NULL)
+ return;
+ }
+ }
+
+ if (strcmp(s2, "*") == 0)
+ ti->kerns = NULL; /* drop them on the floor */
+ else
+ ti->kerns = rmkernmatch(ti->kerns, s2);
+}
+
+
+/*
+ * Make the kerning for character S1 equivalent to that for S2.
+ * If either S1 or S2 do not exist, do nothing.
+ * If S1 already has kerning, do nothing.
+ */
+
+static void
+addkern(char *s1, char *s2,
+ Font *fnt)
+{
+ ttfinfo *ti1 = findadobe(s1, fnt->charlist);
+ ttfinfo *ti2 = findadobe(s2, fnt->charlist);
+
+
+ if (ti1 && ti2 && !ti1->kerns)
+ {
+ /* Put the new one at the head of the list, since order is immaterial. */
+ ttfptr *ap = (ttfptr *)mymalloc(sizeof (ttfptr));
+
+
+ ap->next = ti2->kern_equivs;
+ ap->ch = ti1;
+ ti2->kern_equivs = ap;
+ }
+}
+
+
+/*
+ * Reads a ligkern line, if this is one. Assumes the first character
+ * passed is `%'.
+ */
+
+void
+checkligkern(char *s, Font *fnt)
+{
+ char *mlist[5];
+ char *os;
+ char *orig_s, *pos;
+ size_t offset[5];
+ int n;
+
+
+ os = newstring(s);
+ orig_s = s;
+
+ s++;
+ while (isspace(*s))
+ s++;
+ if (strncmp(s, "LIGKERN", 7) == 0)
+ {
+ fnt->sawligkern = True;
+ s += 7;
+ while (isspace(*s))
+ s++;
+ pos = s;
+ while (*pos)
+ {
+ for (n = 0; n < 5;)
+ {
+ if (*pos == '\0')
+ break;
+ offset[n] = pos - orig_s;
+ mlist[n] = paramstring(&pos);
+ if (strcmp(mlist[n], ";") == 0)
+ break;
+ n++;
+ }
+
+ if (n > 4)
+ boops(os, pos - orig_s, "Too many parameters in lig kern data.");
+ if (n < 3)
+ boops(os, pos - orig_s, "Too few parameters in lig kern data.");
+
+ if (n == 3 && strcmp(mlist[1], "{}") == 0) /* rmkern command */
+ rmkern(mlist[0], mlist[2], (ttfinfo *)0, fnt);
+ else if (n == 3 && strcmp(mlist[1], "<>") == 0) /* addkern */
+ addkern(mlist[0], mlist[2], fnt);
+ else if (n == 3 && strcmp(mlist[0], "||") == 0 &&
+ strcmp(mlist[1], "=") == 0) /* bc command */
+ {
+ ttfinfo *ti = findadobe("||", fnt->charlist);
+
+
+ if (fnt->boundarychar != -1)
+ boops(os, offset[0], "Multiple boundary character commands?");
+ if (sscanf(mlist[2], "%d", &n) != 1)
+ boops(os, offset[2],
+ "Expected number assignment for boundary char.");
+ if (n < 0 || n > 0xFF)
+ boops(os, offset[2], "Boundary character number must be 0..0xFF.");
+
+ fnt->boundarychar = n;
+ if (ti == NULL)
+ oops("Internal error: boundary char.");
+ ti->outcode = n; /* prime the pump, so to speak, for lig/kerns */
+ }
+ else if (n == 4)
+ {
+ int op = -1;
+ ttfinfo *ti;
+
+
+ for (n = 0; encligops[n]; n++)
+ if (strcmp(mlist[2], encligops[n]) == 0)
+ {
+ op = n;
+ break;
+ }
+ if (op < 0)
+ boops(os, offset[2], "Bad ligature op specified.");
+
+ if (NULL != (ti = findadobe(mlist[0], fnt->charlist)))
+ {
+ lig *lig;
+
+
+ if (findadobe(mlist[2], fnt->charlist))
+ /* remove coincident kerns */
+ rmkern(mlist[0], mlist[1], ti, fnt);
+
+ if (strcmp(mlist[3], "||") == 0)
+ boops(os, offset[3], "You can't lig to the boundary character!");
+
+ if (!fnt->fixedpitch) /* fixed pitch fonts get *0* ligs */
+ {
+ for (lig = ti->ligs; lig; lig = lig->next)
+ if (strcmp(lig->succ, mlist[1]) == 0)
+ break; /* we'll re-use this structure */
+
+ if (lig == NULL)
+ {
+ lig = newlig();
+ lig->succ = newstring(mlist[1]);
+ lig->next = ti->ligs;
+ ti->ligs = lig;
+ }
+ lig->sub = newstring(mlist[3]);
+ lig->op = op;
+
+ if (strcmp(mlist[1], "||") == 0)
+ {
+ lig->boundleft = 1;
+ if (strcmp(mlist[0], "||") == 0)
+ boops(os, offset[0],
+ "You can't lig boundarychar boundarychar!");
+ }
+ else
+ lig->boundleft = 0;
+ }
+ }
+ }
+ else
+ boops(os, offset[0], "Bad form in LIGKERN command.");
+ }
+ }
+
+ free(os);
+}
+
+
+void
+getligkerndefaults(Font *fnt)
+{
+ int i;
+ char *buffer;
+
+
+ for (i = 0; staticligkern[i]; i++)
+ {
+ buffer = newstring(staticligkern[i]);
+ checkligkern(buffer, fnt);
+ free(buffer);
+ }
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ligkern.h b/xc/extras/FreeType/contrib/ttf2pk/ligkern.h
new file mode 100644
index 000000000..5566fa218
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ligkern.h
@@ -0,0 +1,23 @@
+/*
+ * ligkern.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef LIGKERN_H
+#define LIGKERN_H
+
+#include "ttf2tfm.h"
+
+
+void checkligkern(char *s, Font *fnt);
+void getligkerndefaults(Font *fnt);
+
+#endif /* LIGKERN_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/newobj.c b/xc/extras/FreeType/contrib/ttf2pk/newobj.c
new file mode 100644
index 000000000..1cc6f4237
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/newobj.c
@@ -0,0 +1,347 @@
+/*
+ * newobj.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdlib.h>
+#include <stddef.h> /* for size_t */
+#include <string.h>
+
+#include "newobj.h"
+#include "ttf2tfm.h"
+#include "errormsg.h"
+#include "texenc.h"
+
+
+void *
+mymalloc(size_t len)
+{
+ void *p;
+
+
+#ifdef SMALLMALLOC
+ if (len > 65500L)
+ oops("Cannot allocate more than 64kByte.");
+#endif
+
+ if (len)
+ p = malloc(len);
+ else
+ p = malloc(1);
+
+ if (p == NULL)
+ oops("Out of memory.");
+
+ return p;
+}
+
+
+void *
+myrealloc(void *oldp, size_t len)
+{
+ void *p;
+
+
+#ifdef SMALLMALLOC
+ if (len > 65500L)
+ oops("Cannot allocate more than 64kByte.");
+#endif
+
+ if (len)
+ p = realloc(oldp, len);
+ else
+ p = realloc(oldp, 1);
+
+ if (p == NULL)
+ oops("Out of memory.");
+
+ return p;
+}
+
+
+/*
+ * This routine gets a line from a file, supporting continuation with
+ * '\' as the last character on the line.
+ *
+ * In case of error, NULL is returned. If EOF is reached a pointer to
+ * a null string is returned. The final newline will be retained.
+ */
+
+char *
+get_line(FILE *f)
+{
+ size_t linelen, len;
+ char *buffer;
+ int c;
+
+
+ linelen = 80;
+ len = 0;
+
+ buffer = (char *)mymalloc(linelen);
+
+ while (1)
+ {
+ c = fgetc(f);
+ buffer[len++] = c;
+
+ if (len == linelen - 1)
+ {
+ linelen += 80;
+ buffer = (char *)myrealloc(buffer, linelen);
+ }
+
+ again:
+ switch (c)
+ {
+ case '\\':
+ c = fgetc(f);
+ if (c == '\n')
+ {
+ len--;
+ break;
+ }
+ else
+ {
+ buffer[len++] = c;
+ goto again;
+ }
+ case '\n':
+ buffer[len] = '\0';
+ return buffer;
+ case EOF:
+ buffer[len - 1] = '\0';
+ if (feof(f))
+ return buffer;
+ else
+ return NULL;
+ default:
+ break;
+ }
+ }
+}
+
+
+/*
+ * getline() is a wrapper function for get_line(). It returns `False' in
+ * case of error and expects a pointer to a buffer to store the current
+ * line. Additionally, the final newline character is stripped.
+ */
+
+Boolean
+getline(char **bufferp, FILE *f)
+{
+ size_t l;
+
+
+ *bufferp = get_line(f);
+
+ if (!(*bufferp && **bufferp))
+ return 0;
+
+ l = strlen(*bufferp);
+ if (l > 0)
+ (*bufferp)[l - 1] = '\0';
+
+ return 1;
+}
+
+
+char *
+newstring(char *s)
+{
+ char *q;
+
+ if (s)
+ {
+ q = mymalloc(strlen(s) + 1);
+ (void)strcpy(q, s);
+ return q;
+ }
+ else
+ return NULL;
+}
+
+
+ttfinfo *
+newchar(Font *fnt)
+{
+ register ttfinfo *ti;
+
+
+ ti = (ttfinfo *)mymalloc(sizeof (ttfinfo));
+
+ ti->next = fnt->charlist;
+
+ ti->charcode = -1;
+ ti->glyphindex = -1;
+ ti->incode = -1;
+ ti->outcode = -1;
+ ti->adobename = NULL;
+
+ ti->width = -1;
+ ti->llx = -1;
+ ti->lly = -1;
+ ti->urx = -1;
+ ti->ury = -1;
+
+ ti->ligs = NULL;
+ ti->kerns = NULL;
+ ti->kern_equivs = NULL;
+ ti->pccs = NULL;
+
+ ti->constructed = False;
+
+ ti->wptr = 0;
+ ti->hptr = 0;
+ ti->dptr = 0;
+ ti->iptr = 0;
+
+ fnt->charlist = ti;
+
+ return ti;
+}
+
+
+kern *
+newkern(void)
+{
+ register kern *nk;
+
+
+ nk = (kern *)mymalloc(sizeof (kern));
+ nk->next = NULL;
+ nk->succ = NULL;
+ nk->delta = 0;
+
+ return nk;
+}
+
+
+pcc *
+newpcc(void)
+{
+ register pcc *np;
+
+
+ np = (pcc *)mymalloc(sizeof (pcc));
+ np->next = NULL;
+ np->partname = NULL;
+ np->xoffset = 0;
+ np->yoffset = 0;
+
+ return np;
+}
+
+
+lig *
+newlig(void)
+{
+ register lig *nl;
+
+
+ nl = (lig *)mymalloc(sizeof (lig));
+ nl->next = NULL;
+ nl->succ = NULL;
+ nl->sub = NULL;
+ nl->op = 0; /* the default =: op */
+ nl->boundleft = 0;
+
+ return nl;
+}
+
+
+stringlist *
+newstringlist(void)
+{
+ register stringlist *sl;
+
+
+ sl = (stringlist *)mymalloc(sizeof (stringlist));
+ sl->next = NULL;
+ sl->old_name = NULL;
+ sl->new_name = NULL;
+ sl->single_replacement = False;
+
+ return sl;
+}
+
+
+void
+init_font_structure(Font *fnt)
+{
+ int i;
+
+
+ fnt->ttfname = NULL;
+
+ fnt->tfm_path = NULL;
+ fnt->tfm_ext = NULL;
+
+ fnt->outname = NULL;
+ fnt->subfont_name = NULL;
+ fnt->outname_postfix = NULL;
+ fnt->fullname = NULL;
+
+ fnt->vplout = NULL;
+ fnt->tfmout = NULL;
+
+ fnt->inencname = NULL;
+ fnt->inencoding = NULL;
+
+ fnt->replacements = NULL;
+ fnt->replacementname = NULL;
+
+ fnt->outencname = NULL;
+ fnt->outencoding = NULL;
+
+ fnt->sfdname = NULL;
+
+ fnt->sawligkern = False;
+
+ fnt->charlist = NULL;
+
+ fnt->boundarychar = -1;
+ fnt->codingscheme = default_codingscheme;
+ fnt->titlebuf = NULL;
+
+ fnt->units_per_em = 0;
+ fnt->italicangle = 0.0;
+ fnt->fixedpitch = 0;
+
+ fnt->fontindex = 0;
+ fnt->pid = 3;
+ fnt->eid = 1;
+
+ fnt->xheight = 400;
+ fnt->fontspace = 0;
+
+ fnt->efactor = 1.0;
+ fnt->slant = 0;
+ fnt->capheight = 0.8;
+ fnt->PSnames = No;
+
+ fnt->efactorparam = NULL;
+ fnt->slantparam = NULL;
+ fnt->fontindexparam = NULL;
+ fnt->pidparam = NULL;
+ fnt->eidparam = NULL;
+
+ for (i = 0; i < 256; i++)
+ {
+ fnt->inencptrs[i] = NULL;
+ fnt->outencptrs[i] = NULL;
+ fnt->uppercase[i] = NULL;
+ fnt->lowercase[i] = NULL;
+ fnt->sf_code[i] = -1;
+ fnt->nextout[i] = -1; /* encoding chains have length 0 */
+ }
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/newobj.h b/xc/extras/FreeType/contrib/ttf2pk/newobj.h
new file mode 100644
index 000000000..235a15da4
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/newobj.h
@@ -0,0 +1,43 @@
+/*
+ * newobj.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef NEWOBJ_H
+#define NEWOBJ_H
+
+#include <stdio.h>
+#include "ttf2tfm.h"
+
+
+#if (defined(MSDOS) && defined(__TURBOC__)) || \
+ (defined(OS2) && defined(_MSC_VER))
+#define SMALLMALLOC
+#endif
+
+
+void *mymalloc(size_t len);
+void *mycalloc(size_t len);
+void *myrealloc(void *oldp, size_t len);
+
+char *get_line(FILE *f);
+Boolean getline(char **bufferp, FILE *f);
+char *newstring(char *s);
+
+ttfinfo *newchar(Font *fnt);
+kern *newkern(void);
+pcc *newpcc(void);
+lig *newlig(void);
+stringlist *newstringlist(void);
+
+void init_font_structure(Font *fnt);
+
+#endif /* NEWOBJ_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/parse.c b/xc/extras/FreeType/contrib/ttf2pk/parse.c
new file mode 100644
index 000000000..d74bcefe0
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/parse.c
@@ -0,0 +1,304 @@
+/*
+ * parse.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h> /* for size_t */
+#include <ctype.h>
+#include <string.h>
+
+#include "ttf2tfm.h"
+#include "errormsg.h"
+#include "newobj.h"
+#include "ligkern.h"
+#include "texenc.h"
+#include "parse.h"
+#include "filesrch.h"
+
+
+/*
+ * Here we get a token from the encoding file. We parse just as much
+ * PostScript as we expect to find in an encoding file. We allow
+ * commented lines and names like 0, .notdef, _foo_. We do not allow
+ * //abc.
+ *
+ * `bufferp' is a pointer to the current line; the offset of the beginning
+ * of the token to be parsed relative to `bufferp' will be returned in
+ * `offsetp'. On the first call of gettoken() `init' must be set to 1 and
+ * to 0 on the following calls.
+ *
+ * If `ignoreligkern' is `True', no LIGKERN data will be extracted from the
+ * encoding file.
+ *
+ * Don't modify `bufferp'!
+ *
+ * The memory management of `bufferp' will be done by gettoken() itself;
+ * nevertheless, it returns a pointer to the current token which should be
+ * freed after it has been used.
+ */
+
+static char *
+gettoken(char **bufferp, size_t *offsetp, FILE *f, Font *fnt,
+ Boolean ignoreligkern, Boolean init)
+{
+ char *p, *q;
+ char tempchar;
+ static char *curp;
+
+
+ if (init)
+ curp = NULL;
+
+ while (1)
+ {
+ while (curp == NULL || *curp == '\0')
+ {
+ if (*bufferp)
+ free(*bufferp);
+
+ if (getline(bufferp, f) == False)
+ oops("Premature end in encoding file.");
+
+ curp = *bufferp;
+
+ for (p = *bufferp; *p; p++)
+ if (*p == '%')
+ {
+ if (ignoreligkern == False)
+ checkligkern(p, fnt);
+ *p = '\0';
+ break;
+ }
+ }
+
+ while (isspace(*curp))
+ curp++;
+
+ *offsetp = curp - *bufferp;
+
+ if (*curp)
+ {
+ if (*curp == '[' || *curp == ']' ||
+ *curp == '{' || *curp == '}')
+ q = curp++;
+ else if (*curp == '/' ||
+ *curp == '-' || *curp == '_' || *curp == '.' ||
+ ('0' <= *curp && *curp <= '9') ||
+ ('a' <= *curp && *curp <= 'z') ||
+ ('A' <= *curp && *curp <= 'Z'))
+ {
+ q = curp++;
+ while (*curp == '-' || *curp == '_' || *curp == '.' ||
+ ('0' <= *curp && *curp <= '9') ||
+ ('a' <= *curp && *curp <= 'z') ||
+ ('A' <= *curp && *curp <= 'Z'))
+ curp++;
+ }
+ else
+ q = curp;
+
+ tempchar = *curp;
+ *curp = '\0';
+ p = newstring(q);
+ *curp = tempchar;
+ return p;
+ }
+ }
+}
+
+
+/*
+ * This routine reads in an encoding file, given the name. It returns
+ * the final total structure. It performs a number of consistency checks.
+ */
+
+encoding *
+readencoding(char **enc, Font *fnt, Boolean ignoreligkern)
+{
+ char *real_encname;
+ FILE *enc_file;
+ char *p, *q, c;
+ char *buffer;
+ char numbuf[9];
+ size_t offset;
+ int i;
+ long l;
+ encoding *e = (encoding *)mymalloc(sizeof (encoding));
+
+
+ if (enc && *enc)
+ {
+ real_encname = TeX_search_encoding_file(enc);
+ if (!real_encname)
+ oops("Cannot find encoding file `%s'.", *enc);
+
+ enc_file = fopen(real_encname, "rt");
+ if (enc_file == NULL)
+ oops("Cannot open encoding file `%s'.", real_encname);
+
+ buffer = NULL;
+ p = gettoken(&buffer, &offset, enc_file, fnt, ignoreligkern, True);
+ if (*p != '/' || p[1] == '\0')
+ boops(buffer, offset,
+ "First token in encoding must be literal encoding name.");
+ e->name = newstring(p + 1);
+ free(p);
+
+ p = gettoken(&buffer, &offset, enc_file, fnt, ignoreligkern, False);
+ if (strcmp(p, "["))
+ boops(buffer, offset,
+ "Second token in encoding must be mark ([) token.");
+ free(p);
+
+ for (i = 0; i < 256; i++)
+ {
+ p = gettoken(&buffer, &offset, enc_file, fnt, ignoreligkern, False);
+ if (*p != '/' || p[1] == 0)
+ boops(buffer, offset,
+ "Tokens 3 to 257 in encoding must be literal names.");
+
+ /* now we test for a generic code point resp. glyph index value */
+
+ c = p[2];
+ if (p[1] == '.' && (c == 'c' || c == 'g') && '0' <= p[3] && p[3] <= '9')
+ {
+ l = strtol(p + 3, &q, 0);
+ if (*q != '\0' || l < 0 || l > 0xFFFF)
+ boops(buffer, offset, "Invalid encoding token.");
+ sprintf(numbuf, ".%c0x%x", c, (unsigned int)l);
+ e->vec[i] = newstring(numbuf);
+ }
+ else
+ e->vec[i] = newstring(p + 1);
+
+ free(p);
+ }
+
+ p = gettoken(&buffer, &offset, enc_file, fnt, ignoreligkern, False);
+ if (strcmp(p, "]"))
+ boops(buffer, offset,
+ "Token 258 in encoding must be make-array (]).");
+ free(p);
+
+ while (getline(&buffer, enc_file))
+ {
+ for (p = buffer; *p; p++)
+ if (*p == '%')
+ {
+ if (ignoreligkern == False)
+ checkligkern(p, fnt);
+ *p = '\0';
+ break;
+ }
+ }
+
+ fclose(enc_file);
+
+ if (ignoreligkern == False && fnt->sawligkern == False)
+ getligkerndefaults(fnt);
+ }
+ else
+ {
+ if (ignoreligkern == False)
+ {
+ e = &staticencoding;
+ getligkerndefaults(fnt);
+ }
+ else
+ e = NULL;
+ }
+
+ return e;
+}
+
+
+/*
+ * We scan a glyph replacement file.
+ * `%' is the comment character.
+ */
+
+void
+get_replacements(Font *fnt)
+{
+ char *real_replacement_name;
+ FILE *replacement_file;
+ char *buffer = NULL, *oldbuffer = NULL;
+ char *p;
+ char *old_name, *new_name;
+ stringlist *sl;
+
+
+ if (!fnt->replacementname)
+ return;
+
+ real_replacement_name = TeX_search_replacement_file(&fnt->replacementname);
+ if (!real_replacement_name)
+ oops("Cannot find replacement file `%s'.", fnt->replacementname);
+
+ replacement_file = fopen(real_replacement_name, "rt");
+ if (replacement_file == NULL)
+ oops("Cannot open replacement file `%s'.", real_replacement_name);
+
+ while (getline(&buffer, replacement_file))
+ {
+ for (p = buffer; *p; p++)
+ if (*p == '%')
+ {
+ *p = '\0';
+ break;
+ }
+
+ if (oldbuffer)
+ free(oldbuffer);
+ oldbuffer = newstring(buffer);
+
+ p = buffer;
+
+ while (isspace(*p))
+ p++;
+ if (!*p)
+ continue;
+
+ old_name = p;
+
+ while (*p && !isspace(*p))
+ p++;
+ if (*p)
+ *p++ = '\0';
+
+ while (*p && isspace(*p))
+ p++;
+ if (!*p)
+ boops(oldbuffer, old_name - oldbuffer, "Replacement glyph missing.");
+
+ new_name = p;
+
+ while (*p && !isspace(*p))
+ p++;
+ if (*p)
+ *p++ = '\0';
+
+ while (*p && isspace(*p))
+ p++;
+ if (*p)
+ boops(oldbuffer, p - oldbuffer, "Invalid replacement syntax.");
+
+ sl = newstringlist();
+ sl->new_name = newstring(new_name);
+ sl->old_name = newstring(old_name);
+ sl->next = fnt->replacements;
+ fnt->replacements = sl;
+ }
+
+ fclose(replacement_file);
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/parse.h b/xc/extras/FreeType/contrib/ttf2pk/parse.h
new file mode 100644
index 000000000..c20469b6b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/parse.h
@@ -0,0 +1,22 @@
+/*
+ * parse.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef PARSE_H
+#define PARSE_H
+
+#include "ttf2tfm.h"
+
+encoding *readencoding(char **enc, Font *fnt, Boolean ignoreligkern);
+void get_replacements(Font *fnt);
+
+#endif /* PARSE_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/pklib.c b/xc/extras/FreeType/contrib/ttf2pk/pklib.c
new file mode 100644
index 000000000..ba9492553
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/pklib.c
@@ -0,0 +1,872 @@
+/*
+ * pklib.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+/*
+ * This code has been derived from the program gsftopk.
+ * Here the original copyright.
+ */
+
+/*
+ * Copyright (c) 1994 Paul Vojta. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h> /* for size_t */
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+
+#include "newobj.h"
+#include "pklib.h"
+#include "errormsg.h"
+#include "filesrch.h"
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 256
+#endif
+
+#define PK_PRE (char)247
+#define PK_ID 89
+#define PK_POST (char)245
+#define PK_NOP (char)246
+
+int dpi;
+
+FILE *pk_file;
+
+
+/*
+ * Information from the .tfm file.
+ */
+
+int tfm_lengths[12];
+
+#define lh tfm_lengths[1]
+#define bc tfm_lengths[2]
+#define ec tfm_lengths[3]
+#define nw tfm_lengths[4]
+
+long checksum;
+long design;
+byte width_index[256];
+long tfm_widths[256];
+
+/*
+ * Information on the bitmap currently being worked on.
+ */
+
+byte *bitmap;
+int width;
+int skip;
+int height;
+int hoff;
+int voff;
+int bytes_wide;
+size_t bm_size;
+byte *bitmap_end;
+int pk_len;
+
+/*
+ * Here's the path searching stuff. First the typedefs and variables.
+ */
+
+static char searchpath[MAXPATHLEN + 1];
+
+#define HUNKSIZE (MAXPATHLEN + 2)
+
+struct spacenode /* used for storage of directory names */
+{
+ struct spacenode *next;
+ char *sp_end; /* end of data for this chunk */
+ char sp[HUNKSIZE];
+} firstnode;
+
+
+
+static FILE *
+search_tfm(char **name)
+{
+ char *p;
+ FILE *f;
+
+
+ p = TeX_search_tfm(name);
+ if (p == NULL)
+ return NULL;
+ strcpy(searchpath, p);
+ f = fopen(searchpath, "rb");
+ return f;
+}
+
+
+static long
+getlong(FILE *f)
+{
+ unsigned long value;
+
+
+ value = (unsigned long)getc(f) << 24;
+ value |= (unsigned long)getc(f) << 16;
+ value |= (unsigned long)getc(f) << 8;
+ value |= (unsigned long)getc(f);
+ return value;
+}
+
+
+char line[82];
+
+
+static byte masks[] = {0, 1, 3, 7, 017, 037, 077, 0177, 0377};
+
+byte flag;
+int pk_dyn_f;
+int pk_dyn_g;
+int base; /* cost of this character if pk_dyn_f = 0 */
+int deltas[13]; /* cost of increasing pk_dyn_f from i to i+1 */
+
+
+/*
+ * Add up statistics for putting out the given shift count.
+ */
+
+static void
+tallyup(int n)
+{
+ int m;
+
+
+ if (n > 208)
+ {
+ ++base;
+ n -= 192;
+ for (m = 0x100; m != 0 && m < n; m <<= 4)
+ base += 2;
+ if (m != 0 && (m = (m - n) / 15) < 13)
+ deltas[m] += 2;
+ }
+ else if (n > 13)
+ ++deltas[(208 - n) / 15];
+ else
+ --deltas[n - 1];
+}
+
+
+/*
+ * Routines for storing the shift counts.
+ */
+
+static Boolean odd = False;
+static byte part;
+
+
+static void
+pk_put_nyb(int n)
+{
+ if (odd)
+ {
+ *bitmap_end++ = (part << 4) | n;
+ odd = False;
+ }
+ else
+ {
+ part = n;
+ odd = True;
+ }
+}
+
+
+static void
+pk_put_long(int n)
+{
+ if (n >= 16)
+ {
+ pk_put_nyb(0);
+ pk_put_long(n / 16);
+ }
+ pk_put_nyb(n % 16);
+}
+
+
+static void
+pk_put_count(int n)
+{
+ if (n > pk_dyn_f)
+ {
+ if (n > pk_dyn_g)
+ pk_put_long(n - pk_dyn_g + 15);
+ else
+ {
+ pk_put_nyb(pk_dyn_f + (n - pk_dyn_f + 15) / 16);
+ pk_put_nyb((n - pk_dyn_f - 1) % 16);
+ }
+ }
+ else
+ pk_put_nyb(n);
+}
+
+
+static void
+trim_bitmap(void)
+{
+ byte *p;
+ byte mask;
+
+
+ /* clear out garbage bits in bitmap */
+
+ if (width % 8 != 0)
+ {
+ mask = ~masks[8 - width % 8];
+ for (p = bitmap + bytes_wide - 1; p < bitmap_end; p += bytes_wide)
+ *p &= mask;
+ }
+
+ /* Find the bounding box of the bitmap. */
+
+ /* trim top */
+
+ skip = 0;
+ mask = 0;
+
+ for (;;)
+ {
+ if (bitmap >= bitmap_end) /* if bitmap is empty */
+ {
+ width = height = hoff = voff = 0;
+ return;
+ }
+
+ p = bitmap + bytes_wide;
+ while (p > bitmap)
+ mask |= *--p;
+ if (mask)
+ break;
+ ++skip;
+ bitmap += bytes_wide;
+ }
+
+ height -= skip;
+ voff -= skip;
+
+#ifdef DEBUG
+ if (skip < 2 || skip > 3)
+ printf("Character has %d empty rows at top\n", skip);
+#endif
+
+ /* trim bottom */
+
+ skip = 0;
+ mask = 0;
+
+ for (;;)
+ {
+ p = bitmap_end - bytes_wide;
+ while (p < bitmap_end)
+ mask |= *p++;
+ if (mask)
+ break;
+ ++skip;
+ bitmap_end -= bytes_wide;
+ }
+
+ height -= skip;
+
+#ifdef DEBUG
+ if (skip < 2 || skip > 3)
+ printf("Character has %d empty rows at bottom\n", skip);
+#endif
+
+ /* trim right */
+
+ skip = 0;
+ --width;
+
+ for (;;)
+ {
+ mask = 0;
+ for (p = bitmap + width / 8; p < bitmap_end; p += bytes_wide)
+ mask |= *p;
+ if (mask & (0x80 >> (width % 8)))
+ break;
+
+ --width;
+ ++skip;
+ }
+
+ ++width;
+
+#ifdef DEBUG
+ if (skip < 2 || skip > 3)
+ printf("Character has %d empty columns at right\n", skip);
+#endif
+
+ /* trim left */
+
+ skip = 0;
+
+ for (;;)
+ {
+ mask = 0;
+ for (p = bitmap + skip / 8; p < bitmap_end; p += bytes_wide)
+ mask |= *p;
+ if (mask & (0x80 >> (skip % 8)))
+ break;
+
+ ++skip;
+ }
+
+ width -= skip;
+ hoff -= skip;
+
+#ifdef DEBUG
+ if (skip < 2 || skip > 3)
+ printf("Character has %d empty columns at left\n", skip);
+#endif
+
+ bitmap += skip / 8;
+ skip = skip % 8;
+}
+
+
+/*
+ * Pack the bitmap using the rll method. (Return false if it's better
+ * to just pack the bits.)
+ */
+
+static Boolean
+pk_rll_cvt(void)
+{
+ static int *counts = NULL; /* area for saving bit counts */
+ static int maxcounts = 0; /* size of this area */
+ unsigned int ncounts; /* max to allow this time */
+ int *nextcount; /* next count value */
+
+ int *counts_end; /* pointer to end */
+ byte *rowptr;
+ byte *p;
+ byte mask;
+ byte *rowdup; /* last row checked for dup */
+ byte paint_switch; /* 0 or 0xff */
+ int bits_left; /* bits left in row */
+ int cost;
+ int i;
+
+
+ /* Allocate space for bit counts. */
+
+ ncounts = (width * height + 3) / 4;
+ if (ncounts > maxcounts)
+ {
+ if (counts != NULL)
+ free(counts);
+ counts = (int *)mymalloc((ncounts + 2) * sizeof (int));
+ maxcounts = ncounts;
+ }
+ counts_end = counts + ncounts;
+
+ /* Form bit counts and collect statistics */
+
+ base = 0;
+ memset(deltas, 0, sizeof (deltas));
+ rowdup = NULL; /* last row checked for duplicates */
+ p = rowptr = bitmap;
+ mask = 0x80 >> skip;
+ flag = 0;
+ paint_switch = 0;
+
+ if (*p & mask)
+ {
+ flag = 8;
+ paint_switch = 0xff;
+ }
+
+ bits_left = width;
+ nextcount = counts;
+
+ while (rowptr < bitmap_end) /* loop over shift counts */
+ {
+ int shift_count = bits_left;
+
+
+ for (;;)
+ {
+ if (bits_left == 0)
+ {
+ if ((p = rowptr += bytes_wide) >= bitmap_end)
+ break;
+ mask = 0x80 >> skip;
+ bits_left = width;
+ shift_count += width;
+ }
+ if (((*p ^ paint_switch) & mask) != 0)
+ break;
+ --bits_left;
+ mask >>= 1;
+ if (mask == 0)
+ {
+ ++p;
+ while (*p == paint_switch && bits_left >= 8)
+ {
+ ++p;
+ bits_left -= 8;
+ }
+ mask = 0x80;
+ }
+ }
+
+ if (nextcount >= counts_end)
+ return False;
+ shift_count -= bits_left;
+ *nextcount++ = shift_count;
+ tallyup(shift_count);
+
+ /* check for duplicate rows */
+ if (rowptr != rowdup && bits_left != width)
+ {
+ byte *p1 = rowptr;
+ byte *q = rowptr + bytes_wide;
+ int repeat_count;
+
+
+ while (q < bitmap_end && *p1 == *q)
+ {
+ ++p1;
+ ++q;
+ }
+ repeat_count = (p1 - rowptr) / bytes_wide;
+ if (repeat_count > 0)
+ {
+ *nextcount++ = -repeat_count;
+ if (repeat_count == 1)
+ --base;
+ else
+ {
+ ++base;
+ tallyup(repeat_count);
+ }
+ rowptr += repeat_count * bytes_wide;
+ }
+ rowdup = rowptr;
+ }
+ paint_switch = ~paint_switch;
+ }
+
+#ifdef DEBUG
+ /*
+ * Dump the bitmap
+ */
+
+ for (p = bitmap; p < bitmap_end; p += bytes_wide)
+ {
+ byte *p1 = p;
+ int j;
+
+
+ mask = 0x80 >> skip;
+ for (j = 0; j < width; ++j)
+ {
+ putchar(*p1 & mask ? '@' : '.');
+ if ((mask >>= 1) == 0)
+ {
+ mask = 0x80;
+ ++p1;
+ }
+ }
+ putchar('\n');
+ }
+ putchar('\n');
+#endif
+
+ /* Determine the best pk_dyn_f */
+
+ pk_dyn_f = 0;
+ cost = base += 2 * (nextcount - counts);
+
+ for (i = 1; i < 14; ++i)
+ {
+ base += deltas[i - 1];
+ if (base < cost)
+ {
+ pk_dyn_f = i;
+ cost = base;
+ }
+ }
+
+ /* last chance to bail out */
+
+ if (cost * 4 > width * height)
+ return False;
+
+ /* Pack the bit counts */
+
+ pk_dyn_g = 208 - 15 * pk_dyn_f;
+ flag |= pk_dyn_f << 4;
+ bitmap_end = bitmap;
+ *nextcount = 0;
+ nextcount = counts;
+
+ while (*nextcount != 0)
+ {
+ if (*nextcount > 0)
+ pk_put_count(*nextcount);
+ else
+ if (*nextcount == -1)
+ pk_put_nyb(15);
+ else
+ {
+ pk_put_nyb(14);
+ pk_put_count(-*nextcount);
+ }
+ ++nextcount;
+ }
+
+ if (odd)
+ {
+ pk_put_nyb(0);
+ ++cost;
+ }
+
+ if (cost != 2 * (bitmap_end - bitmap))
+ printf("Cost miscalculation: expected %d, got %ld\n",
+ cost, (long)(2 * (bitmap_end - bitmap)));
+ pk_len = bitmap_end - bitmap;
+ return True;
+}
+
+
+static void
+pk_bm_cvt(void)
+{
+ byte *rowptr;
+ byte *p;
+ int blib1; /* bits left in byte */
+ int bits_left; /* bits left in row */
+ byte *q;
+ int blib2;
+ byte nextbyte;
+
+
+ flag = 14 << 4;
+ q = bitmap;
+ blib2 = 8;
+ nextbyte = 0;
+
+ for (rowptr = bitmap; rowptr < bitmap_end; rowptr += bytes_wide)
+ {
+ p = rowptr;
+ blib1 = 8 - skip;
+ bits_left = width;
+
+ if (blib2 != 8)
+ {
+ int n;
+
+
+ if (blib1 < blib2)
+ {
+ nextbyte |= *p << (blib2 - blib1);
+ n = blib1;
+ }
+ else
+ {
+ nextbyte |= *p >> (blib1 - blib2);
+ n = blib2;
+ }
+ blib2 -= n;
+ if ((bits_left -= n) < 0)
+ {
+ blib2 -= bits_left;
+ continue;
+ }
+ if ((blib1 -= n) == 0)
+ {
+ blib1 = 8;
+ ++p;
+ if (blib2 > 0)
+ {
+ nextbyte |= *p >> (8 - blib2);
+ blib1 -= blib2;
+ bits_left -= blib2;
+ if (bits_left < 0)
+ {
+ blib2 = -bits_left;
+ continue;
+ }
+ }
+ }
+ *q++ = nextbyte;
+ }
+
+ /* fill up whole (destination) bytes */
+
+ while (bits_left >= 8)
+ {
+ nextbyte = *p++ << (8 - blib1);
+ *q++ = nextbyte | (*p >> blib1);
+ bits_left -= 8;
+ }
+
+ /* now do the remainder */
+
+ nextbyte = *p << (8 - blib1);
+ if (bits_left > blib1)
+ nextbyte |= p[1] >> blib1;
+ blib2 = 8 - bits_left;
+ }
+
+ if (blib2 != 8)
+ *q++ = nextbyte;
+
+ pk_len = q - bitmap;
+}
+
+
+static void
+putshort(short w)
+{
+ putc(w >> 8, pk_file);
+ putc(w, pk_file);
+}
+
+
+static void
+putmed(long w)
+{
+ putc(w >> 16, pk_file);
+ putc(w >> 8, pk_file);
+ putc(w, pk_file);
+}
+
+
+static void
+putlong(long w)
+{
+ putc(w >> 24, pk_file);
+ putc(w >> 16, pk_file);
+ putc(w >> 8, pk_file);
+ putc(w, pk_file);
+}
+
+
+char
+xgetc(FILE *f)
+{
+ int c;
+
+
+ c = getc(f);
+ if (c == EOF)
+ oops("Premature end of file.");
+ return (byte)c;
+}
+
+
+/*
+ * Open and read the tfm file.
+ */
+
+void
+TFMopen(char **filename)
+{
+ FILE *tfm_file;
+ int i;
+ int cc;
+
+
+ tfm_file = search_tfm(filename);
+ if (tfm_file == NULL)
+ oops("Cannot find tfm file.");
+
+ for (i = 0; i < 12; i++)
+ {
+ int j;
+
+
+ j = (int)((byte)getc(tfm_file)) << 8;
+ tfm_lengths[i] = j | (int)((byte)xgetc(tfm_file));
+ }
+
+ checksum = getlong(tfm_file);
+ design = getlong(tfm_file);
+ fseek(tfm_file, 4 * (lh + 6), 0);
+
+ for (cc = bc; cc <= ec; ++cc)
+ {
+ width_index[cc] = (byte)xgetc(tfm_file);
+
+ (void)xgetc(tfm_file);
+ (void)xgetc(tfm_file);
+ (void)xgetc(tfm_file);
+ }
+
+ for (i = 0; i < nw; ++i)
+ tfm_widths[i] = getlong(tfm_file);
+
+ fclose(tfm_file);
+}
+
+
+/*
+ * Create pk file and write preamble.
+ */
+
+void
+PKopen(char *filename,
+ char *ident,
+ int resolution)
+{
+ int ppp;
+ int i;
+
+
+ dpi = resolution;
+
+ if ((pk_file = fopen(filename, "wb")) == NULL)
+ {
+ perror(filename);
+ exit(1);
+ }
+
+ putc(PK_PRE, pk_file);
+ putc(PK_ID, pk_file);
+
+ i = strlen(ident);
+
+ putc(i, pk_file);
+ fwrite(ident, 1, i, pk_file);
+ putlong(design);
+ putlong(checksum);
+ ppp = dpi / 72.27 * 65536.0 + 0.5;
+ putlong(ppp); /* hppp */
+ putlong(ppp); /* vppp */
+}
+
+
+void
+PKputglyph(int cc,
+ int llx, int lly, int urx, int ury,
+ int w, int h,
+ byte *b)
+{
+ float char_width;
+
+ long dm;
+ long tfm_wid;
+
+
+ bitmap = b;
+ width = w;
+ height = h;
+
+ hoff = -llx;
+ voff = ury - 2; /* Don't ask me why `-2' */
+ /* Fred */
+
+ if (width != urx - llx || height != ury - lly)
+ oops("Dimensions do not match: (%d - %d) (%d - %d) <=> %d %d",
+ llx, lly, urx, ury, width, height);
+
+ bytes_wide = (width + 7) / 8;
+ bm_size = bytes_wide * height;
+ bitmap_end = bitmap + bm_size;
+
+ trim_bitmap();
+
+ if (height == 0 || !pk_rll_cvt())
+ pk_bm_cvt();
+
+ if (!width_index[cc])
+ return;
+
+ tfm_wid = tfm_widths[width_index[cc]];
+ char_width = tfm_wid / 1048576.0 * design / 1048576.0 * dpi / 72.27;
+ dm = (long)(char_width + 0.5) - (char_width < -0.5);
+
+ if (pk_len + 8 < 4 * 256 && tfm_wid < (1<<24) &&
+ dm >= 0 && dm < 256 && width < 256 && height < 256 &&
+ hoff >= -128 && hoff < 128 && voff >= -128 && voff < 128)
+ {
+ putc(flag | ((pk_len + 8) >> 8), pk_file);
+ putc(pk_len + 8, pk_file);
+ putc(cc, pk_file);
+ putmed(tfm_wid);
+ putc(dm, pk_file);
+ putc(width, pk_file);
+ putc(height, pk_file);
+ putc(hoff, pk_file);
+ putc(voff, pk_file);
+ }
+ else if (pk_len + 13 < 3 * 65536L && tfm_wid < (1<<24) &&
+ dm >= 0 && dm < 65536L && width < 65536L && height < 65536L &&
+ hoff >= -65536L && hoff < 65536L &&
+ voff >= -65536L && voff < 65536L)
+ {
+ putc(flag | 4 | ((pk_len + 13) >> 16), pk_file);
+ putshort(pk_len + 13);
+ putc(cc, pk_file);
+ putmed(tfm_wid);
+ putshort(dm);
+ putshort(width);
+ putshort(height);
+ putshort(hoff);
+ putshort(voff);
+ }
+ else
+ {
+ putc(flag | 7, pk_file);
+ putlong(pk_len + 28);
+ putlong(cc);
+ putlong(tfm_wid);
+ putlong((long)(char_width * 65536.0 + 0.5) - (char_width < -0.5));
+ putlong(0);
+ putlong(width);
+ putlong(height);
+ putlong(hoff);
+ putlong(voff);
+ }
+ fwrite(bitmap, 1, pk_len, pk_file);
+}
+
+
+void
+PKclose(void)
+{
+ putc(PK_POST, pk_file);
+ while (ftell(pk_file) % 4 != 0)
+ putc(PK_NOP, pk_file);
+
+ fclose(pk_file);
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/pklib.h b/xc/extras/FreeType/contrib/ttf2pk/pklib.h
new file mode 100644
index 000000000..62a9fc1a0
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/pklib.h
@@ -0,0 +1,29 @@
+/*
+ * pklib.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef PKLIB_H
+#define PKLIB_H
+
+typedef unsigned char byte;
+
+
+void TFMopen(char **filename);
+
+void PKopen(char *filename, char *ident, int resolution);
+
+void PKputglyph(int cc, int llx, int lly, int urx, int ury,
+ int w, int h, byte *b);
+
+void PKclose(void);
+
+#endif /* PKLIB_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/README b/xc/extras/FreeType/contrib/ttf2pk/scripts/README
new file mode 100644
index 000000000..c3c2cffad
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/README
@@ -0,0 +1,6 @@
+In these subdirectories you can find diff files for various TeX
+implementations which add support for on-the-fly pk-generation using ttf2pk
+and hbf2gf (which is part of the CJK package for LaTeX 2e).
+
+In case you don't have/want hbf2gf, simply comment out the relevant if-Block
+in the script.
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/teTeX-0.4/MakeTeXPK.diff b/xc/extras/FreeType/contrib/ttf2pk/scripts/teTeX-0.4/MakeTeXPK.diff
new file mode 100644
index 000000000..bc05c4b5b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/teTeX-0.4/MakeTeXPK.diff
@@ -0,0 +1,63 @@
+--- /root/scripts/teTeX-0.4/MakeTeXPK Sun Feb 23 22:12:05 1997
++++ /home/ft/freetype/contrib/ttf2pk/scripts/teTeX-0.4/MakeTeXPK Sat Sep 5 07:57:34 1998
+@@ -80,6 +80,9 @@
+ : ${MAKETEXDIR=$TEXMF/maketex}
+ export TEXMF MAKETEXDIR
+
++unset cmd
++unset psline
++
+ # grep for the font in $PSMAPFILE, if some ps-to-pk is claimed to be supported.
+ # We have to figure out the name of the base font -- $NAME is probably
+ # something like pplr, but it's rpplr or pplr0 or pplr8r that's in psfonts.map.
+@@ -91,7 +94,40 @@
+ # some installations have set up gs in such a way that creating files
+ # is only allowed if the parameter -DNOSAFER is used:
+ GS_OPTIONS=-DNOSAFER; export GS_OPTIONS
+-else
++fi
++
++# test for TTF fonts
++if test -z "$cmd"; then
++ ttf2pk -q $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "ttf2pk failed" >&2
++ exit 1
++ fi
++ MODE=ttf2pk # preferred mode for TDS would be `modeless'
++ cmd=true
++ psline=ttf2pk # suppress gftopk call
++ fi
++fi
++
++# test for HBF fonts
++if test -z "$cmd"; then
++ hbf2gf -q -p $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "hbf2gf failed" >&2
++ exit 1
++ fi
++ MODE=hbf2gf # preferred mode for TDS would be `modeless'
++ cmd=true
++ fi
++fi
++
++if test -z "$cmd"; then
+ # If an explicit mode is not supplied, try to guess. You can get a
+ # list of extant modes from ftp.cs.umb.edu:pub/tex/modes.mf.
+ if test -z "$MODE" || test "$MODE" = default; then
+@@ -141,7 +177,7 @@
+ { echo "$progname: could not mkdir $PKDESTDIR."; exit 1; }'
+ eval "$mdir"
+
+-echo "$progname: Running $cmd"
++test "$cmd" = true || echo "$progname: Running $cmd"
+ $cmd </dev/null || { echo "$progname: \`$cmd' failed." >&2; exit 1; }
+ if test -z "$psline"; then
+ test -r $GFNAME ||
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/MakeTeXPK.diff b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/MakeTeXPK.diff
new file mode 100644
index 000000000..0536dbc7a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/MakeTeXPK.diff
@@ -0,0 +1,75 @@
+--- MakeTeXPK.orig Sun Aug 16 08:05:07 1998
++++ MakeTeXPK Tue Aug 18 07:53:57 1998
+@@ -1,5 +1,5 @@
+ #!/bin/sh
+-# original MakeTeXPK -- make a new PK font, because one wasn't found.
++# MakeTeXPK -- make a new PK font, because one wasn't found.
+ # Version of 12dec94.
+ #
+ # (If you change or delete the word `original' on the previous line,
+@@ -142,11 +142,52 @@
+ test -d $TEMPDIR || mkdir $TEMPDIR
+ cd $TEMPDIR || exit 1
+
++unset cmd
++
++# test for TTF fonts
++if test -z "$cmd"; then
++ ttf2pk -q $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "ttf2pk failed" >&2
++ exit 1
++ fi
++ test -z "$6" && DESTDIR="$DESTROOT/ttf2pk" # preferred mode for TDS
++ # would be `modeless'
++ echo "Successful call to ttf2pk" >&2
++ cmd=ttf2pk
++ fi
++fi
++
++# test for HBF fonts
++if test -z "$cmd"; then
++ hbf2gf -q -p $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "hbf2gf failed" >&2
++ exit 1
++ fi
++ test -z "$6" && DESTDIR="$DESTROOT/hbf2gf" # preferred mode for TDS
++ # would be `modeless'
++ echo "Successful call to hbf2gf" >&2
++ cmd=hbf2gf
++
++ gftopk ./$GFNAME $PKNAME || exit 1
++ fi
++fi
++
+ # grep for the font in $PSMAPFILE, if some ps-to-pk is claimed to be supported.
+ # We have to figure out the name of the base font -- $NAME is probably
+ # something like pplr, but it's rpplr or pplr0 or pplr8r that's in psfonts.map.
+-pattern="^r?$NAME"'(0|8r)?([ ]|$)'
+-test -n "$ps_to_pk" && egrep "$pattern" $PSMAPFILE >psline
++if test -z "$cmd"; then
++ pattern="^r?$NAME"'(0|8r)?([ ]|$)'
++ test -n "$ps_to_pk" && egrep "$pattern" $PSMAPFILE > psline
++fi
++
+ if test -s psline; then
+ # This is a PostScript font.
+ MODE=$ps_to_pk
+@@ -173,8 +214,9 @@
+ export DVIPSHEADERS
+ echo "$0: Running $cmd" >&2
+ $cmd >&2 || { echo "$0: $ps_to_pk failed." >&2; exit 1; }
++fi
+
+-else
++if test -z "$cmd"; then
+ # Try Metafont.
+ MFINPUTS="$MFINPUTS:$SAVEPWD"
+ export MFINPUTS
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/README b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/README
new file mode 100644
index 000000000..eb12bec7a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-6.1/README
@@ -0,0 +1 @@
+This is for web2c-6.1 with the patch for kpathsea 2.6
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.0/MakeTeXPK.diff b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.0/MakeTeXPK.diff
new file mode 100644
index 000000000..23f7cb58f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.0/MakeTeXPK.diff
@@ -0,0 +1,67 @@
+--- MakeTeXPK.orig Sat Feb 8 15:52:00 1997
++++ MakeTeXPK Tue Aug 18 07:58:22 1998
+@@ -1,5 +1,5 @@
+ #!/bin/sh
+-# original MakeTeXPK -- make a new PK font, because one wasn't found.
++# MakeTeXPK -- make a new PK font, because one wasn't found.
+ #
+ # (If you change or delete the word `original' on the previous line,
+ # installation won't write this script over yours.)
+@@ -44,15 +44,54 @@
+ MODE=$5
+ DEST=$6
+
++unset cmd
++
++# test for TTF fonts
++if test -z "$cmd"; then
++ ttf2pk -q $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "ttf2pk failed" >&2
++ exit 1
++ fi
++ MODE=modeless
++ cmd=true
++ fi
++fi
++
++# test for HBF fonts
++if test -z "$cmd"; then
++ hbf2gf -q -p $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "hbf2gf failed" >&2
++ exit 1
++ fi
++ MODE=modeless
++ cmd=true
++ fi
++fi
++
++unset psline
++
+ # grep for the font in $PSMAPFILE. These are base font names, such as
+ # rpplr (the original) or pplr0 (an interim step) or pplr8r (current).
+-pattern="^r?$NAME"'(0|8r)?([ ]|$)'
+-psline=`egrep "$pattern" $PSMAPFILE`
++if test -z "$cmd"; then
++ pattern="^r?$NAME"'(0|8r)?([ ]|$)'
++ psline=`egrep "$pattern" $PSMAPFILE`
++fi
++
+ if test -n "$psline"; then
+ MODE=modeless
+ # ps_to_pk set in MakeTeXcommon and/or MakeTeX.site.
+ cmd="$ps_to_pk $NAME $DPI"
+-else
++fi
++
++if test -z "$cmd"; then
+ # Check that $BDPI and $MODE are consistent; if not, ignore the mode and
+ # hope we can correctly guess it from bdpi. (People like to specify the
+ # resolution on the command line, not the mode so much.)
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/MakeTeXPK.diff b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/MakeTeXPK.diff
new file mode 100644
index 000000000..1faf078ad
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/MakeTeXPK.diff
@@ -0,0 +1,72 @@
+--- MakeTeXPK.orig Fri Oct 31 09:30:54 1997
++++ MakeTeXPK Tue Aug 18 08:01:33 1998
+@@ -1,5 +1,5 @@
+ #!/bin/sh
+-# original MakeTeXPK -- make a new PK font, because one wasn't found.
++# MakeTeXPK -- make a new PK font, because one wasn't found.
+ #
+ # (If you change or delete the word `original' on the previous line,
+ # installation won't write this script over yours.)
+@@ -57,11 +57,48 @@
+ MODE=$5
+ DEST=$6
+
++unset cmd
++
++# test for TTF fonts
++if test -z "$cmd"; then
++ ttf2pk -q $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "ttf2pk failed" >&2
++ exit 1
++ fi
++ MODE=modeless
++ cmd=true
++ fi
++fi
++
++# test for HBF fonts
++if test -z "$cmd"; then
++ hbf2gf -q -p $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "hbf2gf failed" >&2
++ exit 1
++ fi
++ MODE=modeless
++ cmd=true
++ fi
++fi
++
++unset psline
++
+ # grep for the font in $PSMAPFILE. These are base font names, such as
+ # rpplr (the original) or pplr0 (an interim step) or pplr8r (current).
+-: ${PSMAPFILE=`kpsewhich psfonts.map`}
+-pattern="^$NAME"'([ ]|$)'
+-psline=`egrep "$pattern" $PSMAPFILE`
++if test -z "$cmd"; then
++ : ${PSMAPFILE=`kpsewhich psfonts.map`}
++ pattern="^r?$NAME"'(0|8r)?([ ]|$)'
++ psline=`egrep "$pattern" $PSMAPFILE`
++fi
++
+ if test -n "$psline"; then
+ MODE=modeless
+ # ps_to_pk is set in MakeTeX.cnf
+@@ -100,7 +137,9 @@
+ cmd="$ps_to_pk $NAME $DPI"
+ ;;
+ esac
+-else
++fi
++
++if test -z "$cmd"; then
+ # Check that $BDPI and $MODE are consistent; if not, ignore the mode and
+ # hope we can correctly guess it from bdpi. (People like to specify the
+ # resolution on the command line, not the mode so much.)
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/README b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/README
new file mode 100644
index 000000000..ae64fa760
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.1/README
@@ -0,0 +1 @@
+The patch works with web2c-7.0 too (expect a fuzz offset).
diff --git a/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.2/mktexpk.diff b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.2/mktexpk.diff
new file mode 100644
index 000000000..ac703fd7d
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/scripts/web2c-7.2/mktexpk.diff
@@ -0,0 +1,72 @@
+--- mktexpk.orig Fri Feb 20 16:23:22 1998
++++ mktexpk Tue Aug 18 08:04:40 1998
+@@ -1,5 +1,5 @@
+ #!/bin/sh
+-# original mktexpk -- make a new PK font, because one wasn't found.
++# mktexpk -- make a new PK font, because one wasn't found.
+ #
+ # (If you change or delete the word `original' on the previous line,
+ # installation won't write this script over yours.)
+@@ -73,11 +73,48 @@
+
+ NAME=$1
+
++unset cmd
++
++# test for TTF fonts
++if test -z "$cmd"; then
++ ttf2pk -q $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "ttf2pk failed" >&2
++ exit 1
++ fi
++ MODE=modeless
++ cmd=true
++ fi
++fi
++
++# test for HBF fonts
++if test -z "$cmd"; then
++ hbf2gf -q -p $NAME $DPI
++ errstatus=$?
++
++ if test $errstatus -ne 2; then
++ if test $errstatus -ne 0; then
++ echo "hbf2gf failed" >&2
++ exit 1
++ fi
++ MODE=modeless
++ cmd=true
++ fi
++fi
++
++unset psline
++
+ # grep for the font in $PSMAPFILE. These are base font names, such as
+ # rpplr (the original) or pplr0 (an interim step) or pplr8r (current).
+-: ${PSMAPFILE=`kpsewhich psfonts.map`}
+-pattern="^$NAME"'([ ]|$)'
+-psline=`egrep "$pattern" $PSMAPFILE`
++if test -z "$cmd"; then
++ : ${PSMAPFILE=`kpsewhich psfonts.map`}
++ pattern="^r?$NAME"'(0|8r)?([ ]|$)'
++ psline=`egrep "$pattern" $PSMAPFILE`
++fi
++
+ if test -n "$psline"; then
+ MODE=modeless
+ # ps_to_pk is set in mktex.opt
+@@ -116,7 +153,9 @@
+ cmd="$ps_to_pk $NAME $DPI"
+ ;;
+ esac
+-else
++fi
++
++if test -z "$cmd"; then
+ # Check that $BDPI and $MODE are consistent; if not, ignore the mode and
+ # hope we can correctly guess it from bdpi. (People like to specify the
+ # resolution on the command line, not the mode so much.)
diff --git a/xc/extras/FreeType/contrib/ttf2pk/subfont.c b/xc/extras/FreeType/contrib/ttf2pk/subfont.c
new file mode 100644
index 000000000..8090e65fd
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/subfont.c
@@ -0,0 +1,264 @@
+/*
+ * subfont.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h> /* for size_t */
+#include <ctype.h>
+#include <string.h>
+
+#include "filesrch.h"
+#include "subfont.h"
+#include "newobj.h"
+#include "errormsg.h"
+
+
+static char *real_sfd_name;
+static FILE *sfd;
+
+
+/*
+ * Initialize subfont functionality. The argument is the subfont
+ * definition file name. If `fatal' is `True', the routine exits
+ * with an error. If `fatal' is `False', a warning message is emitted
+ * and `False' returned if an error occurs; in case of success `True'
+ * will be returned.
+ */
+
+Boolean
+init_sfd(Font *fnt, Boolean fatal)
+{
+ real_sfd_name = TeX_search_sfd_file(&(fnt->sfdname));
+ if (!real_sfd_name)
+ {
+ if (fatal)
+ oops("Cannot find subfont definition file `%s'.", fnt->sfdname);
+ else
+ {
+ warning("Cannot find subfont definition file `%s'.", fnt->sfdname);
+ return False;
+ }
+ }
+
+ sfd = fopen(real_sfd_name, "rt");
+ if (sfd == NULL)
+ {
+ if (fatal)
+ oops("Cannot open subfont definition file `%s'.", fnt->sfdname);
+ else
+ {
+ warning("Cannot open subfont definition file `%s'.", fnt->sfdname);
+ return False;
+ }
+ }
+
+ return True;
+}
+
+
+/*
+ * This function fills the font structure sequentially with subfont
+ * entries; it returns `False' if no more subfont entries are available,
+ * `True' otherwise.
+ *
+ * fnt->subfont_name must be set to NULL before the first call.
+ *
+ * The subset parser was inspired by ttf2bdf.c .
+ */
+
+Boolean
+get_sfd(Font *fnt)
+{
+ long i, offset;
+ long begin, end = -1;
+ char *buffer, *oldbuffer, *bufp, *bufp2, *bufp3;
+
+
+ for (i = 0; i < 256; i++)
+ fnt->sf_code[i] = -1;
+
+again:
+
+ buffer = get_line(sfd);
+ if (!buffer)
+ oops("Error reading subfont definition file `%s'.", real_sfd_name);
+ if (!*buffer)
+ return False;
+
+ oldbuffer = newstring(buffer);
+ bufp = buffer;
+ offset = 0;
+
+ while (*bufp) /* remove comment */
+ {
+ if (*bufp == '#')
+ {
+ bufp++;
+ break;
+ }
+ bufp++;
+ }
+ *(--bufp) = '\0'; /* remove final newline character */
+
+ bufp = buffer;
+
+ while (isspace(*bufp))
+ bufp++;
+
+ if (*bufp == '\0') /* empty line? */
+ {
+ free(buffer);
+ free(oldbuffer);
+ goto again;
+ }
+
+ while (*bufp && !isspace(*bufp)) /* subfont name */
+ bufp++;
+ *(bufp++) = '\0';
+
+ while (isspace(*bufp))
+ bufp++;
+
+ if (*bufp == '\0')
+ oops("Invalid subfont entry in `%s'.", real_sfd_name);
+
+ if (fnt->subfont_name)
+ free(fnt->subfont_name);
+ fnt->subfont_name = newstring(buffer);
+
+ while (1)
+ {
+ bufp3 = bufp;
+
+ begin = strtol(bufp, &bufp2, 0);
+
+ if (bufp == bufp2 || begin < 0 || begin > 0xFFFF)
+ boops(oldbuffer, bufp - buffer,
+ "Invalid subfont range or offset entry.");
+
+ if (*bufp2 == ':') /* offset */
+ {
+ offset = begin;
+ if (offset > 0xFF)
+ boops(oldbuffer, bufp - buffer, "Invalid subfont offset.");
+
+ bufp = bufp2 + 1;
+
+ while (isspace(*bufp))
+ bufp++;
+
+ continue;
+ }
+ else if (*bufp2 == '_') /* range */
+ {
+ bufp = bufp2 + 1;
+ if (!isdigit(*bufp))
+ boops(oldbuffer, bufp - buffer, "Invalid subfont range entry.");
+
+ end = strtol(bufp, &bufp2, 0);
+
+ if (bufp == bufp2 || end < 0 || end > 0xFFFFL)
+ boops(oldbuffer, bufp - buffer, "Invalid subfont range entry.");
+ if (*bufp2 && !isspace(*bufp2))
+ boops(oldbuffer, bufp2 - buffer, "Invalid subfont range entry.");
+ if (end < begin)
+ boops(oldbuffer, bufp - buffer, "End of subfont range too small.");
+ if (offset + (end - begin) > 255)
+ boops(oldbuffer, bufp3 - buffer,
+ "Subfont range too large for current offset (%i).", offset);
+ }
+ else if (isspace(*bufp2) || !*bufp2) /* single value */
+ end = begin;
+ else
+ boops(oldbuffer, bufp2 - buffer, "Invalid subfont range entry.");
+
+ for (i = begin; i <= end; i++)
+ {
+ if (fnt->sf_code[offset] != -1)
+ boops(oldbuffer, bufp3 - buffer, "Overlapping subfont ranges.");
+
+ fnt->sf_code[offset++] = i;
+ }
+
+ bufp = bufp2;
+
+ while (isspace(*bufp))
+ bufp++;
+
+ if (!*bufp)
+ break;
+ }
+
+ free(buffer);
+ free(oldbuffer);
+
+ return True;
+}
+
+
+void
+close_sfd(void)
+{
+ if (sfd)
+ fclose(sfd);
+}
+
+
+/*
+ * We extract the subfont definition file name. The name must
+ * be embedded between two `@' characters. If there is no sfd file,
+ * `sfd_begin' is set to -1.
+ *
+ * The `@' characters will be replaced with null characters.
+ */
+
+void
+handle_sfd(char *s, int *sfd_begin, int *postfix_begin)
+{
+ size_t len;
+ int i;
+ Boolean have_atsign;
+
+
+ have_atsign = False;
+ len = strlen(s);
+ *sfd_begin = -1;
+ *postfix_begin = -1;
+
+ for (i = 0; s[i]; i++)
+ {
+ if (s[i] == '@')
+ {
+ if (have_atsign)
+ {
+ *postfix_begin = i + 1;
+
+ s[i] = '\0';
+ break;
+ }
+ have_atsign = True;
+ *sfd_begin = i + 1;
+
+ s[i] = '\0';
+ }
+ }
+
+ if (*sfd_begin != -1 &&
+ (*postfix_begin == -1 || *postfix_begin < *sfd_begin + 2))
+ oops("Invalid subfont definition file name.");
+
+ if (*postfix_begin > -1)
+ for (i = *postfix_begin; s[i]; i++)
+ if (s[i] == '/' || s[i] == ':' || s[i] == '\\' || s[i] == '@')
+ oops("`/', `:', `\\', and `@' not allowed after second `@'.");
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/subfont.h b/xc/extras/FreeType/contrib/ttf2pk/subfont.h
new file mode 100644
index 000000000..016d47965
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/subfont.h
@@ -0,0 +1,26 @@
+/*
+ * subfont.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef SUBFONT_H
+#define SUBFONT_H
+
+#include "ttf2tfm.h"
+
+
+Boolean init_sfd(Font *fnt, Boolean fatal);
+Boolean get_sfd(Font *fnt);
+void close_sfd(void);
+
+void handle_sfd(char *s, int *sfd_begin, int *postfix_begin);
+
+#endif /* SUBFONT_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/texenc.c b/xc/extras/FreeType/contrib/ttf2pk/texenc.c
new file mode 100644
index 000000000..cbfdca480
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/texenc.c
@@ -0,0 +1,203 @@
+/*
+ * texenc.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdlib.h> /* for definition of NULL */
+
+#include "ttf2tfm.h"
+#include "texenc.h"
+
+
+encoding staticencoding =
+{
+ "TeX text",
+ {"Gamma", "Delta", "Theta", "Lambda",
+ "Xi", "Pi", "Sigma", "Upsilon",
+ "Phi", "Psi", "Omega", "arrowup",
+ "arrowdown", "quotesingle", "exclamdown", "questiondown",
+
+ "dotlessi", "dotlessj", "grave", "acute",
+ "caron", "breve", "macron", "ring",
+ "cedilla", "germandbls", "ae", "oe",
+ "oslash", "AE", "OE", "Oslash",
+
+ "space", "exclam", "quotedbl", "numbersign",
+ "dollar", "percent", "ampersand", "quoteright",
+ "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash",
+
+ "zero", "one", "two", "three",
+ "four", "five", "six", "seven",
+ "eight", "nine", "colon", "semicolon",
+ "less", "equal", "greater", "question",
+
+ "at", "A", "B", "C",
+ "D", "E", "F", "G",
+ "H", "I", "J", "K",
+ "L", "M", "N", "O",
+
+ "P", "Q", "R", "S",
+ "T", "U", "V", "W",
+ "X", "Y", "Z", "bracketleft",
+ "backslash", "bracketright", "circumflex", "underscore",
+
+ "quoteleft", "a", "b", "c",
+ "d", "e", "f", "g",
+ "h", "i", "j", "k",
+ "l", "m", "n", "o",
+
+ "p", "q", "r", "s",
+ "t", "u", "v", "w",
+ "x", "y", "z", "braceleft",
+ "bar", "braceright", "tilde", "dieresis",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ ".notdef", ".notdef", ".notdef", ".notdef",
+ }
+};
+
+
+/*
+ * It's easier to put this in static storage and parse it as we go
+ * than to build the structures ourselves.
+ *
+ * The semicolons in the LIGKERN lines must be left isolated.
+ */
+
+char *staticligkern[] =
+{
+ "% LIGKERN space l =: lslash ; space L =: Lslash ;",
+ "% LIGKERN question quoteleft =: questiondown ;",
+ "% LIGKERN exclam quoteleft =: exclamdown ;",
+ "% LIGKERN hyphen hyphen =: endash ; endash hyphen =: emdash ;",
+ "% LIGKERN quoteleft quoteleft =: quotedblleft ;",
+ "% LIGKERN quoteright quoteright =: quotedblright ;",
+ "% LIGKERN space {} * ; * {} space ; zero {} * ; * {} zero ;",
+ "% LIGKERN one {} * ; * {} one ; two {} * ; * {} two ;",
+ "% LIGKERN three {} * ; * {} three ; four {} * ; * {} four ;",
+ "% LIGKERN five {} * ; * {} five ; six {} * ; * {} six ;",
+ "% LIGKERN seven {} * ; * {} seven ; eight {} * ; * {} eight ;",
+ "% LIGKERN nine {} * ; * {} nine ;",
+
+ /*
+ * Kern accented characters the same way as their base.
+ */
+
+ "% LIGKERN Aacute <> A ; aacute <> a ;",
+ "% LIGKERN Acircumflex <> A ; acircumflex <> a ;",
+ "% LIGKERN Adieresis <> A ; adieresis <> a ;",
+ "% LIGKERN Agrave <> A ; agrave <> a ;",
+ "% LIGKERN Aring <> A ; aring <> a ;",
+ "% LIGKERN Atilde <> A ; atilde <> a ;",
+ "% LIGKERN Ccedilla <> C ; ccedilla <> c ;",
+ "% LIGKERN Eacute <> E ; eacute <> e ;",
+ "% LIGKERN Ecircumflex <> E ; ecircumflex <> e ;",
+ "% LIGKERN Edieresis <> E ; edieresis <> e ;",
+ "% LIGKERN Egrave <> E ; egrave <> e ;",
+ "% LIGKERN Iacute <> I ; iacute <> i ;",
+ "% LIGKERN Icircumflex <> I ; icircumflex <> i ;",
+ "% LIGKERN Idieresis <> I ; idieresis <> i ;",
+ "% LIGKERN Igrave <> I ; igrave <> i ;",
+ "% LIGKERN Ntilde <> N ; ntilde <> n ;",
+ "% LIGKERN Oacute <> O ; oacute <> o ;",
+ "% LIGKERN Ocircumflex <> O ; ocircumflex <> o ;",
+ "% LIGKERN Odieresis <> O ; odieresis <> o ;",
+ "% LIGKERN Ograve <> O ; ograve <> o ;",
+ "% LIGKERN Oslash <> O ; oslash <> o ;",
+ "% LIGKERN Otilde <> O ; otilde <> o ;",
+ "% LIGKERN Scaron <> S ; scaron <> s ;",
+ "% LIGKERN Uacute <> U ; uacute <> u ;",
+ "% LIGKERN Ucircumflex <> U ; ucircumflex <> u ;",
+ "% LIGKERN Udieresis <> U ; udieresis <> u ;",
+ "% LIGKERN Ugrave <> U ; ugrave <> u ;",
+ "% LIGKERN Yacute <> Y ; yacute <> y ;",
+ "% LIGKERN Ydieresis <> Y ; ydieresis <> y ;",
+ "% LIGKERN Zcaron <> Z ; zcaron <> z ;",
+
+ /* lig commands for default ligatures */
+
+ "% LIGKERN f i =: fi ; f l =: fl ; f f =: ff ; ff i =: ffi ;",
+ "% LIGKERN ff l =: ffl ;",
+ NULL
+};
+
+/*
+ * The above layout corresponds to TeX Typewriter Type and is compatible
+ * with TeX Text because the position of ligatures is immaterial.
+ */
+
+
+/*
+ * These are the eight ligature ops, in VPL terms and in METAFONT terms.
+ */
+
+char *vplligops[] =
+{
+ "LIG", "/LIG", "/LIG>", "LIG/", "LIG/>", "/LIG/", "/LIG/>", "/LIG/>>", 0
+};
+
+char *encligops[] =
+{
+ "=:", "|=:", "|=:>", "=:|", "=:|>", "|=:|", "|=:|>", "|=:|>>", 0
+};
+
+
+/*
+ * For TeX we want to compute a character height that works properly
+ * with accents. The following list of accents doesn't need to be
+ * complete.
+ */
+
+/*
+ * We only do this if the xheight has a reasonable value (>50).
+ */
+
+char *accents[] = {"acute", "tilde", "caron", "dieresis", NULL};
+
+char default_codingscheme[] = "Unspecified";
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/texenc.h b/xc/extras/FreeType/contrib/ttf2pk/texenc.h
new file mode 100644
index 000000000..6f4baed73
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/texenc.h
@@ -0,0 +1,28 @@
+/*
+ * texenc.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef TEXENC_H
+#define TEXENC_H
+
+#include "ttf2tfm.h"
+
+
+extern encoding staticencoding;
+extern char *staticligkern[];
+extern char *vplligops[];
+extern char *encligops[];
+extern char *accents[];
+
+extern char default_codingscheme[];
+
+#endif /* TEXENC_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/tfmaux.c b/xc/extras/FreeType/contrib/ttf2pk/tfmaux.c
new file mode 100644
index 000000000..6c0cd8f70
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/tfmaux.c
@@ -0,0 +1,480 @@
+/*
+ * tfmaux.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "ttf2tfm.h"
+#include "newobj.h"
+#include "tfmaux.h"
+#include "errormsg.h"
+
+
+#undef PI
+#define PI 3.14159265358979323846264338327
+
+
+static long nextd; /* smallest value that will give a different mincover */
+
+
+static int lf, lh, nw, nh, nd, ni, nl, nk, ne, np;
+static int bc, ec;
+
+static long *header, *charinfo,
+ *width, *height, *depth,
+ *ligkern, *kerns, *tparam,
+ *italic;
+
+
+static int source[257]; /* utility variables for sorting tfm arrays */
+static int unsort[257];
+
+
+
+/*
+ * The next routine simply scales something.
+ * Input is in TFM units per em. Output is in FIXFACTORths of units
+ * per em. We use 1 em = 1000 TFM units.
+ */
+
+static long
+scale(long what)
+{
+ return ((what / 1000) * FIXFACTOR) +
+ (((what % 1000) * FIXFACTOR) + 500) / 1000;
+}
+
+
+/*
+ * Next we need a routine to reduce the number of distinct dimensions
+ * in a TFM file. Given an array what[0]..what[oldn-1], we want to
+ * group its elements into newn clusters, in such a way that the maximum
+ * difference between elements of a cluster is as small as possible.
+ * Furthermore, what[0]=0, and this value must remain in a cluster by
+ * itself. Data such as `0 4 6 7 9' with newn=3 shows that an iterative
+ * scheme in which 6 is first clustered with 7 will not work. So we
+ * borrow a neat algorithm from METAFONT to find the true optimum.
+ * Memory location what[oldn] is set to 0x7FFFFFFFL for convenience.
+ */
+
+
+/*
+ * Tells how many clusters result, given max difference d.
+ */
+
+static int
+mincover(long *what,
+ register long d)
+{
+ register int m;
+ register long l;
+ register long *p;
+
+
+ nextd = 0x7FFFFFFFL;
+ p = what+1;
+ m = 1;
+
+ while (*p < 0x7FFFFFFFL)
+ {
+ m++;
+ l = *p;
+ while (*++p <= l + d)
+ ;
+ if (*p - l < nextd)
+ nextd = *p - l;
+ }
+ return m;
+}
+
+
+static void
+remap(long *what,
+ int oldn,
+ int newn,
+ int *source,
+ int *unsort)
+{
+ register int i, j;
+ register long d, l;
+
+ what[oldn] = 0x7FFFFFFFL;
+ for (i = oldn-1; i > 0; i--)
+ {
+ d = what[i];
+ for (j = i; what[j+1] < d; j++)
+ {
+ what[j] = what[j+1];
+ source[j] = source[j+1];
+ }
+ what[j] = d;
+ source[j] = i;
+ }
+
+ i = mincover(what, 0L);
+ d = nextd;
+ while (mincover(what, d + d) > newn)
+ d += d;
+ while (mincover(what, d) > newn)
+ d = nextd;
+
+ i = 1;
+ j = 0;
+ while (i < oldn)
+ {
+ j++;
+ l = what[i];
+ unsort[source[i]] = j;
+ while (what[++i] <= l + d)
+ {
+ unsort[source[i]] = j;
+ if (i - j == oldn - newn)
+ d = 0;
+ }
+ what[j] = (l + what[i-1])/2;
+ }
+}
+
+
+void
+write16(register short what,
+ register FILE *out)
+{
+ (void)fputc(what >> 8, out);
+ (void)fputc(what & 0xFF, out);
+}
+
+
+void
+writearr(register long *p,
+ register int n,
+ register FILE *out)
+{
+ while (n)
+ {
+ write16((short)(*p >> 16), out);
+ write16((short)(*p & 65535), out);
+ p++;
+ n--;
+ }
+}
+
+
+void
+writesarr(long *what,
+ int len,
+ FILE *out)
+{
+ register long *p;
+ int i;
+
+
+ p = what;
+ i = len;
+ while (i)
+ {
+ *p = scale(*p);
+ (void)scale(*p); /* need this kludge for some compilers */
+ p++;
+ i--;
+ }
+ writearr(what, len, out);
+}
+
+
+static long *
+makebcpl(register long *p,
+ register char *s,
+ register int n)
+{
+ register long t;
+ register long sc;
+
+
+ if (strlen(s) < n)
+ n = strlen(s);
+ t = ((long)n) << 24;
+ sc = 16;
+
+ while (n > 0)
+ {
+ t |= ((long)(*(unsigned char *)s++)) << sc;
+ sc -= 8;
+ if (sc < 0)
+ {
+ *p++ = t;
+ t = 0;
+ sc = 24;
+ }
+ n--;
+ }
+ if (t)
+ *p++ = t;
+
+ return p;
+}
+
+
+static long
+checksum(ttfinfo **array)
+{
+ int i;
+ unsigned long s1 = 0, s2 = 0;
+ char *p;
+ ttfinfo *ti;
+
+
+ for (i = 0; i < 256; i++)
+ if (NULL != (ti = array[i]))
+ {
+ s1 = ((s1 << 1) ^ (s1 >> 31)) ^ ti->width; /* cyclic left shift */
+ s1 &= 0xFFFFFFFF; /* in case we're on a 64-bit machine */
+
+ for (p = ti->adobename; *p; p++)
+ s2 = (s2 * 3) + *p;
+ }
+
+ s1 = (s1 << 1) ^ s2;
+ return s1;
+}
+
+
+int
+transform(register int x, register int y,
+ float ef, float sl)
+{
+ register double acc;
+
+
+ acc = ef * x + sl * y;
+ return (int)(acc >= 0 ? floor(acc + 0.5) : ceil(acc - 0.5));
+}
+
+
+int
+buildtfm(Font *fnt, int range_only)
+{
+ register int i, j;
+ register ttfinfo *ti;
+ long cksum;
+ double Slant;
+ char buffer[256];
+
+
+ for (i = 0; i <= 0xFF && fnt->inencptrs[i] == NULL; i++)
+ ;
+ bc = i;
+ for (i = 0xFF; i >= 0 && fnt->inencptrs[i] == NULL; i--)
+ ;
+ ec = i;
+
+ if (ec < bc)
+ {
+ if (range_only)
+ return 0;
+ else
+ oops("No TTF characters.");
+ }
+
+ header = (long *)mymalloc(40000L);
+ cksum = checksum(fnt->inencptrs);
+ header[0] = cksum;
+ header[1] = 0xA00000; /* 10pt design size */
+
+ (void)makebcpl(header + 2, fnt->codingscheme, 39);
+ (void)makebcpl(header + 12, fnt->fullname, 19);
+
+ /* 4 bytes are left free for the unused FACE value */
+
+ strncat(buffer, "Created by `", 12);
+ strncat(buffer, fnt->titlebuf, 255 - 12 - 1);
+ strncat(buffer, "'", 1);
+ charinfo = makebcpl(header + 18, buffer, 255);
+ lh = charinfo - header;
+
+ width = charinfo + (ec - bc + 1);
+ width[0] = 0;
+ nw = 1;
+
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ {
+ width[nw] = ti->width;
+ for (j = 1; width[j] != ti->width; j++)
+ ;
+ ti->wptr = j;
+ if (j == nw)
+ nw++;
+ }
+ if (nw > 256)
+ oops("256 chars with different widths.");
+
+ depth = width + nw;
+ depth[0] = 0;
+ nd = 1;
+
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ {
+ depth[nd] = -ti->lly;
+ for (j = 0; depth[j] != -ti->lly; j++)
+ ;
+ ti->dptr = j;
+ if (j == nd)
+ nd++;
+ }
+
+ if (nd > 16)
+ {
+ remap(depth, nd, 16, source, unsort);
+ nd = 16;
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ ti->dptr = unsort[ti->dptr];
+ }
+
+ height = depth + nd;
+ height[0] = 0;
+ nh = 1;
+
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ {
+ height[nh] = ti->ury;
+ for (j = 0; height[j] != ti->ury; j++)
+ ;
+ ti->hptr = j;
+ if (j == nh)
+ nh++;
+ }
+
+ if (nh > 16)
+ {
+ remap(height, nh, 16, source, unsort);
+ nh = 16;
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ ti->hptr = unsort[ti->hptr];
+ }
+
+ italic = height + nh;
+ italic[0] = 0;
+ ni = 1;
+
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ {
+ italic[ni] = ti->urx - ti->width;
+ if (italic[ni] < 0)
+ italic[ni] = 0;
+ for (j = 0; italic[j] != italic[ni]; j++)
+ ;
+ ti->iptr = j;
+ if (j == ni)
+ ni++;
+ }
+
+ if (ni > 64)
+ {
+ remap(italic, ni, 64, source, unsort);
+ ni = 64;
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ ti->iptr = unsort[ti->iptr];
+ }
+
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ charinfo[i - bc] = ((long)(ti->wptr)<<24) +
+ ((long)(ti->hptr)<<20) +
+ ((long)(ti->dptr)<<16) +
+ ((long)(ti->iptr)<<10);
+ else
+ charinfo[i - bc] = 0;
+
+ ligkern = italic + ni;
+ nl = 0; /* ligatures and kerns omitted from raw TeX font */
+ kerns = ligkern + nl;
+ nk = 0;
+
+ Slant = fnt->slant - fnt->efactor * tan(fnt->italicangle * (PI / 180.0));
+
+ tparam = kerns + nk;
+ tparam[0] = (long)(FIXFACTOR * Slant + 0.5);
+ tparam[1] = scale((long)fnt->fontspace);
+ tparam[2] = (fnt->fixedpitch ? 0 : scale((long)(300 * fnt->efactor + 0.5)));
+ tparam[3] = (fnt->fixedpitch ? 0 : scale((long)(100 * fnt->efactor + 0.5)));
+ tparam[4] = scale((long)fnt->xheight);
+ tparam[5] = scale((long)(1000 * fnt->efactor + 0.5));
+ np = 6;
+
+ return 1;
+}
+
+
+void
+writetfm(Font *fnt)
+{
+ FILE *out;
+ char *tfm_name;
+ int len = 0;
+
+
+ if (fnt->tfm_path)
+ len += strlen(fnt->tfm_path);
+ len += strlen(fnt->fullname);
+ len += strlen(fnt->tfm_ext);
+ len++;
+
+ tfm_name = (char *)mymalloc(len);
+ tfm_name[0] = '\0';
+ if (fnt->tfm_path)
+ strcat(tfm_name, fnt->tfm_path);
+ strcat(tfm_name, fnt->fullname);
+ strcat(tfm_name, fnt->tfm_ext);
+
+ if ((out = fopen(tfm_name, "wb")) == NULL)
+ oops("Cannot open tfm file `%s'.", tfm_name);
+
+ free(tfm_name);
+
+
+ lf = 6 + lh + (ec - bc + 1) + nw + nh + nd + ni + nl + nk + ne + np;
+
+ write16(lf, out);
+ write16(lh, out);
+ write16(bc, out);
+ write16(ec, out);
+ write16(nw, out);
+ write16(nh, out);
+ write16(nd, out);
+ write16(ni, out);
+ write16(nl, out);
+ write16(nk, out);
+ write16(ne, out);
+ write16(np, out);
+ writearr(header, lh, out);
+ writearr(charinfo, ec - bc + 1, out);
+ writesarr(width, nw, out);
+ writesarr(height, nh, out);
+ writesarr(depth, nd, out);
+ writesarr(italic, ni, out);
+ writearr(ligkern, nl, out);
+ writesarr(kerns, nk, out);
+ writearr(tparam, np, out);
+
+ free(header);
+ fclose(out);
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/tfmaux.h b/xc/extras/FreeType/contrib/ttf2pk/tfmaux.h
new file mode 100644
index 000000000..957e4683a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/tfmaux.h
@@ -0,0 +1,28 @@
+/*
+ * tfmaux.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef TFMAUX_H
+#define TFMAUX_H
+
+#include "ttf2tfm.h"
+
+
+#define FIXFACTOR (0x100000L) /* 2^{20}, the unit fixnum */
+
+
+int transform(int x, int y, float ef, float sl);
+
+int buildtfm(Font *fnt, int only_range);
+void writetfm(Font *fnt);
+
+#endif /* TFMAUX_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.1 b/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.1
new file mode 100644
index 000000000..5b5d67e2b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.1
@@ -0,0 +1,284 @@
+.\" man page for ttf2pk
+.
+.TH TTF2PK 1 25-Jul-1998 "FreeType version 1.2"
+.SH NAME
+ttf2pk \- convert a TrueType font into TeX's PK format
+.SH SYNOPSIS
+.na
+.nh
+.B ttf2pk
+.RB [ -q ]
+.RB [ -n ]
+.I "\%font-name \%resolution"
+.br
+.B ttf2pk
+.B -t
+.RB [ -q ]
+.I \%font-name
+.br
+.B "ttf2pk --version"
+|
+.B --help
+.ad
+.hy
+.
+.
+.
+.\" ====
+.\" ==== macro definitions
+.\" ====
+.
+.\" here we define \TeX for troff and nroff
+.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP
+.if n .ds TX TeX
+.
+.\" and here the same for \LaTeX
+.if t \{\
+.ie '\*(.T'dvi' \
+.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX
+.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX
+.\}
+.if n .ds LX LaTeX
+.
+.\" \LaTeXe
+.\" note that we need \vareps for TeX instead of \eps which can only be
+.\" accessed with the \N escape sequence (in the Math Italic font)
+.if t \{\
+.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v'
+.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v'
+.\}
+.if n .ds LE LaTeX\ 2e
+.
+.\" a typewriter font
+.if t \{\
+.de C
+\fC\\$1\fP\\$2
+..
+.\}
+.if n \{\
+.de C
+\\$1\\$2
+..
+.\}
+.
+.\" ====
+.\" ==== end of macro definitions
+.\" ====
+.
+.
+.
+.SH DESCRIPTION
+This program converts a TrueType font into a
+.C PK
+file; the created font can then be used with \*(TX
+or \*(LX.
+.PP
+All TrueType fonts to be used must be registered in a configuration
+file called
+.C \%ttfonts.map ;
+it specifies how to handle each font.
+CJKV (Chinese/Japanese/Korean/old Vietnamese) subfonts as created by
+.B ttf2tfm
+are also supported.
+.PP
+.B ttf2pk
+always assumes 10pt as the design size for the written \*(TX
+font.
+.
+.
+.SH PARAMETERS
+.TP
+.B -q
+This optional switch makes
+.B ttf2pk
+quiet.
+It suppresses any informational output except warning and error
+messages.
+.TP
+.B -n
+Use only `\c
+.C \&.pk '
+as the extension instead of `\c
+.C \&. \c
+.RI < \%resolution >\c
+.C pk '
+.TP
+.B -t
+Test for the existence of
+.IR \%font-name .
+Returns 0 on success and prints out the corresponding line in
+.C \%ttfonts.map
+(provided the
+.B -q
+switch isn't set).
+.TP
+.I font-name
+The \*(TX
+name of the font.
+.B ttf2pk
+looks this name up in a configuration file called
+.C \%ttfonts.map
+for further information how to process the font.
+.TP
+.I resolution
+The resolution, given in dots per inch.
+Currently the horizontal resolution is equal to the vertical
+resolution.
+The design size is always assumed to be 10pt.
+.TP
+.B --version
+Shows the current version of
+.B ttf2pk
+and the used file search library (e.g.\ \c
+.BR kpathsea ).
+.TP
+.B --help
+Shows usage information.
+.PP
+Environment variables for file searching are described in the manual page
+of
+.BR ttf2tfm .
+.
+.
+.SH "THE CONFIGURATION FILE"
+.B ttf2pk
+uses, similar to
+.BR dvips ,
+a font definition file called
+.C \%ttfonts.map .
+The parameters specified to
+.B ttf2tfm
+are here preserved\(em\c
+.B ttf2tfm
+writes out to standard output, as the last line, a proper
+configuration entry for
+.C \%ttfonts.map .
+.PP
+As an example, a call to
+.PP
+.in +2m
+.C "ttf2tfm arial -p T1.enc -s 0.25 -P 1 -E 0 arials"
+.PP
+will produce the following line:
+.PP
+.in +2m
+.C "arials arial Slant=0.25 Pid=1 Eid=0 Encoding=T1.enc"
+.PP
+See
+.BR ttf2tfm (1)
+and
+.BR afm2tfm (1)
+of the
+.B dvips
+package for a detailed description of encoding files.
+.PP
+Here a table listing the various
+.B ttf2tfm
+parameters and the corresponding
+.C \%ttfonts.map
+entries:
+.PP
+.in +4m
+.ta 2i
+-s Slant
+.br
+-e Extend
+.br
+-p Encoding
+.br
+-f Fontindex
+.br
+-P Pid
+.br
+-E Eid
+.br
+-n PS=Yes
+.br
+-N PS=Only
+.br
+-R Replacement
+.PP
+Single replacement glyph names given to
+.B ttf2tfm
+with
+.BI -r \ \%old-glyphname\ \%new-glyphname
+are directly specified with
+.IR \%old-glyphname = \%new-glyphname .
+They will be ignored if in subfont mode or if no encoding file is given.
+.PP
+One additional parameter in
+.C \%ttfonts.map
+is unique to
+.BR ttf2pk :
+`Hinting', which can take the values `On' or `Off'.
+Some fonts (e.g.\ the CJK part of
+.C \%cyberbit.ttf )
+are incorrectly rendered if hinting is activated.
+Default is `On' (you can also use `Yes', `No', `1', and `0').
+.PP
+For a description of subfonts (i.e., entries of the form `\c
+.I <namestem>\c
+.C @\c
+.I <sfd-filename>\c
+.C @ ')
+please refer to
+.BR ttf2tfm (1).
+.PP
+The format of
+.C \%ttfonts.map
+is simple.
+Each line defines a font; first comes the \*(TX
+font name, then its TrueType font file name, followed by the
+parameters in any order.
+Case is significant (even for parameter names); the parameters are
+separated from its values by an equal sign, with whitespace possibly
+surrounding it.
+.B ttf2pk
+reads in
+.C \%ttfonts.map
+line by line, continuing until the \*(TX
+font specified on the command line is found, otherwise the programs
+exits with error code\ 2.
+Thus you can use any character invalid in a \*(TX
+font name to start a comment line.
+.PP
+You can use `\\' as the final character of a line to indicate that the
+input is continued on the next line.
+The backslash and the following newline character will be removed.
+.PP
+.B ttf2pk
+will abort if it can't find or read the \*(TX
+font metrics file of the given \*(TX
+font name.
+.
+.
+.SH "RETURN VALUE"
+If the call was successful, 0\ will be returned.
+In case of error, the return value is\ 1.
+Finally, if the font can't be found in
+.C \%ttfonts.map ,
+2\ is returned.
+This simplifies the inclusion of
+.B ttf2pk
+into scripts like
+.B mktexpk
+for automatic font generation.
+.
+.
+.SH "SEE ALSO"
+.BR ttf2tfm (1),
+.BR afm2tfm (1)
+.
+.
+.SH AVAILABILITY
+.B ttf2pk
+is part of the FreeType package, a high quality TrueType rendering
+library.
+.
+.
+.SH AUTHORS
+Werner LEMBERG
+.C <wl@gnu.org>
+.br
+Frederic LOYER
+.C <loyer@ensta.fr>
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.c b/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.c
new file mode 100644
index 000000000..dcbd77975
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.c
@@ -0,0 +1,567 @@
+/*
+ * ttf2pk.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h> /* for size_t */
+#include <string.h>
+#include <math.h>
+#include <ctype.h>
+
+
+#include "ttf2tfm.h"
+#include "newobj.h"
+#include "pklib.h"
+#include "ttfenc.h"
+#include "ttflib.h"
+#include "errormsg.h"
+#include "filesrch.h"
+#include "parse.h"
+#include "subfont.h"
+
+
+char ident[] = "ttf2pk version 1.2";
+char progname[] = "ttf2pk"; /* for error/warning messages */
+
+
+Boolean have_sfd = False;
+Boolean have_pid = False;
+Boolean have_eid = False;
+
+
+/*
+ * Checks for an equal sign surrounded by whitespace.
+ */
+
+static char *
+strip_equal(char *s, char *os, char *p)
+{
+ while (isspace(*p))
+ p++;
+ if (*p != '=')
+ boops(os, p - s, "Missing `='.");
+ p++;
+ while (isspace(*p))
+ p++;
+ return p;
+}
+
+
+#define USAGE "\
+ Convert a TrueType font to TeX's PK format.\n\
+\n\
+-q suppress informational output\n\
+-n only use `.pk' as extension\n\
+-t test for <font> (returns 0 on success)\n\
+--help print this message and exit\n\
+--version print version number and exit\n\
+"
+
+static void
+usage(void)
+{
+ fputs("Usage: ttf2pk [-q] [-n] <font> <dpi>\n", stdout);
+ fputs(" ttf2pk -t [-q] <font>\n", stdout);
+ fputs(USAGE, stdout);
+ exit(0);
+}
+
+
+#define VERSION "\
+Copyright (C) 1997-1998 Frederic Loyer and Werner Lemberg.\n\
+There is NO warranty. You may redistribute this software\n\
+under the terms of the GNU General Public License\n\
+and the gsftopk copyright.\n\
+\n\
+For more information about these matters, see the files\n\
+named COPYING and pklib.c.\n\
+\n\
+Primary authors of ttf2pk: F. Loyer and W. Lemberg.\n\
+\n\
+ttf2pk is partially based on gsftopk from P. Vojta\n\
+and the FreeType project from\n\
+David Turner, Robert Wilhelm, and Werner Lemberg\n\
+"
+
+static void
+version(void)
+{
+ fputs(ident, stdout);
+ fprintf(stdout, " (%s)\n", TeX_search_version());
+ fputs(VERSION, stdout);
+ exit(0);
+}
+
+
+static int
+compare(Font *fnt, char *s, char *key)
+{
+ char c;
+ char *p;
+ char *temp, *temp1;
+ int value;
+ int sfd_begin, postfix_begin;
+
+
+ /*
+ * We isolate the fontname.
+ */
+
+ while (isspace(*s))
+ s++;
+
+ p = s;
+ while (*p && !isspace(*p))
+ p++;
+
+ c = *p;
+ *p = '\0';
+ temp = newstring(s);
+ *p = c;
+
+ /*
+ * We search for a subfont definition file name.
+ */
+
+ handle_sfd(temp, &sfd_begin, &postfix_begin);
+
+ if (sfd_begin == -1)
+ value = strcmp(temp, key);
+ else
+ {
+ size_t len, len1, len2;
+
+
+ /*
+ * The sfd file will be only searched if prefix and postfix match.
+ */
+
+ len = strlen(key);
+ len1 = strlen(temp);
+ len2 = strlen(temp + postfix_begin);
+
+ if (len1 + len2 >= len)
+ value = -1;
+ else if (!strncmp(temp, key, len1) &&
+ !strcmp(temp + postfix_begin, key + (len - len2)))
+ {
+ c = key[len - len2];
+ key[len - len2] = '\0';
+ temp1 = newstring(key + len1);
+ key[len - len2] = c;
+
+ if (fnt->sfdname)
+ free(fnt->sfdname);
+ fnt->sfdname = newstring(temp + sfd_begin);
+
+ /*
+ * If the sfd file can't be opened the search is continued.
+ */
+
+ value = !init_sfd(fnt, False);
+
+ if (!value)
+ {
+ value = -1;
+
+ while (get_sfd(fnt))
+ {
+ if (!strcmp(fnt->subfont_name, temp1))
+ {
+ value = 0; /* success */
+ have_sfd = True;
+ break;
+ }
+ }
+
+ close_sfd();
+ }
+
+ free(temp1);
+ }
+ else
+ value = -1;
+ }
+
+ free(temp);
+
+ return value;
+}
+
+
+int
+main(int argc, char** argv)
+{
+ size_t l;
+ unsigned int i;
+ long index, code;
+ FILE *config_file;
+ char *configline, *oldconfigline, *p, *q;
+ Font font;
+ encoding *enc;
+ long inenc_array[256];
+ char *fontname;
+ size_t fontname_len;
+ char *pk_filename, *tfm_filename, *enc_filename, *cfg_filename;
+ char *real_ttfname, *real_cfg_filename;
+ int dpi = 0, ptsize;
+ Boolean hinting = True;
+ Boolean quiet = False;
+ Boolean no_dpi = False;
+ Boolean testing = False;
+
+
+ TeX_search_init(argv[0], "ttf2pk", "TTF2PK");
+
+ if (argc == 1)
+ oops("Need at least two arguments.\n"
+ "Try `ttf2pk --help' for more information.");
+
+ if (argc == 2)
+ {
+ if (strcmp(argv[1], "--help") == 0)
+ usage();
+ else if (strcmp(argv[1], "--version") == 0)
+ version();
+ }
+
+ while (argv[1][0] == '-')
+ {
+ if (argv[1][1] == 'q')
+ quiet = True;
+ else if (argv[1][1] == 'n')
+ no_dpi = True;
+ else if (argv[1][1] == 't')
+ testing = True;
+ else
+ oops("Unknown option `%s'.\n"
+ "Try `ttf2pk --help' for more information.", argv[1]);
+
+ argv++;
+ argc--;
+ }
+
+ if (testing)
+ {
+ if (argc != 2)
+ oops("Need exactly one parameter for `-t' option.\n"
+ "Try `ttf2pk --help' for more information.");
+ }
+ else if (argc != 3)
+ oops("Need at most two arguments.\n"
+ "Try `ttf2pk --help' for more information.");
+
+ if (!quiet)
+ printf("This is %s\n", ident);
+
+ if (!testing)
+ if ((dpi = atoi(argv[2])) <= 50)
+ oops("dpi value must be larger than 50.");
+
+ fontname = argv[1];
+ fontname_len = strlen(fontname);
+ enc_filename = NULL;
+
+ ptsize = 10;
+
+ init_font_structure(&font);
+
+ cfg_filename = newstring("ttfonts.map");
+ real_cfg_filename = TeX_search_config_file(&cfg_filename);
+ if (!real_cfg_filename)
+ oops("Cannot find file ttfonts.map.");
+
+ config_file = fopen(real_cfg_filename, "rt");
+ if (config_file == NULL)
+ oops("Cannot open file ttfonts.map.");
+
+ do
+ {
+ configline = get_line(config_file);
+ if (!configline)
+ oops("Error while reading ttfonts.map.");
+ if (!*configline)
+ {
+ /*
+ * This is the only error message we suppress if the -q flag
+ * is set, making it possible to call ttf2pk silently.
+ */
+ if (!quiet)
+ fprintf(stdout,
+ "%s: ERROR: Cannot find font %s in ttfonts.map.\n",
+ progname, fontname);
+ exit(2);
+ }
+ } while (compare(&font, configline, fontname));
+
+ fclose(config_file);
+
+ if (testing)
+ {
+ if (!quiet)
+ fprintf(stdout, "%s\n", configline);
+ exit(0);
+ }
+
+ /*
+ * Parse the line from the config file. We split the config line buffer
+ * into substrings according to the given options.
+ */
+
+ l = strlen(configline);
+ if (configline[l - 1] == '\n')
+ configline[l - 1] = '\0'; /* strip newline */
+
+ oldconfigline = newstring(configline);
+
+ p = configline;
+ while (isspace(*p))
+ p++;
+ while (*p && !isspace(*p))
+ p++;
+
+ q = p;
+
+ while (*p && isspace(*p))
+ p++;
+ if (!*p)
+ boops(oldconfigline, q - configline, "TTF file missing.");
+
+ font.ttfname = p;
+
+ while (*p && !isspace(*p))
+ p++;
+ if (*p)
+ *p++ = '\0';
+
+ for (; *p; p++)
+ {
+ if (isspace(*p))
+ continue;
+
+ if (!strncmp(p, "Slant", 5))
+ {
+ p = strip_equal(configline, oldconfigline, p + 5);
+ if (sscanf(p, "%f", &(font.slant)) == 0)
+ boops(oldconfigline, p - configline, "Bad `Slant' parameter.");
+ }
+ else if (!strncmp(p, "Encoding", 8))
+ {
+ if (have_sfd)
+ boops(oldconfigline, p - configline,
+ "No `Encoding' parameter allowed for subfonts.");
+
+ p = strip_equal(configline, oldconfigline, p + 8);
+ if (!*p)
+ boops(oldconfigline, p - configline, "Bad `Encoding' parameter.");
+ enc_filename = p;
+ }
+ else if (!strncmp(p, "Extend", 6))
+ {
+ p = strip_equal(configline, oldconfigline, p + 6);
+ if (sscanf(p, "%f", &(font.efactor)) == 0)
+ boops(oldconfigline, p - configline, "Bad `Extend' parameter.");
+ }
+ else if (!strncmp(p, "Fontindex", 9))
+ {
+ p = strip_equal(configline, oldconfigline, p + 9);
+ if (sscanf(p, "%lu", &(font.fontindex)) < 0)
+ boops(oldconfigline, p - configline, "Bad `Fontindex' parameter.");
+ }
+ else if (!strncmp(p, "Pid", 3))
+ {
+ p = strip_equal(configline, oldconfigline, p + 3);
+ if (sscanf(p, "%hu", &(font.pid)) < 0)
+ boops(oldconfigline, p - configline, "Bad `Pid' parameter.");
+ have_pid = True;
+ }
+ else if (!strncmp(p, "Eid", 3))
+ {
+ p = strip_equal(configline, oldconfigline, p + 3);
+ if (sscanf(p, "%hu", &(font.eid)) < 0)
+ boops(oldconfigline, p - configline, "Bad `Eid' parameter.");
+ have_eid = True;
+ }
+ else if (!strncmp(p, "Hinting", 7))
+ {
+ p = strip_equal(configline, oldconfigline, p + 7);
+ if (p[1] == 'N' || p[1] == 'n' ||
+ p[0] == 'Y' || p[1] == 'y' ||
+ p[0] == '1')
+ hinting = True;
+ else if (p[1] == 'F' || p[1] == 'f' ||
+ p[0] == 'N' || p[1] == 'n' ||
+ p[0] == '0')
+ hinting = False;
+ else
+ boops(oldconfigline, p - configline, "Bad `Hinting' parameter.");
+ }
+ else if (!strncmp(p, "PS", 2))
+ {
+ p = strip_equal(configline, oldconfigline, p + 2);
+ if (p[1] != '\0' &&
+ (p[2] == 'l' || p[2] == 'L'))
+ font.PSnames = Only;
+ else if (p[1] == 'N' || p[1] == 'n' ||
+ p[0] == 'Y' || p[0] == 'y' ||
+ p[0] == '1')
+ font.PSnames = Yes;
+ else if (p[1] == 'F' || p[1] == 'f' ||
+ p[0] == 'N' || p[0] == 'n' ||
+ p[0] == '0')
+ font.PSnames = No;
+ else
+ boops(oldconfigline, p - configline, "Bad `PS' parameter.");
+
+ if (have_sfd)
+ boops(oldconfigline, p - configline,
+ "No `PS' parameter allowed for subfonts.");
+ }
+ else if (!strncmp(p, "Replacement", 11))
+ {
+ p = strip_equal(configline, oldconfigline, p + 11);
+ if (!*p)
+ boops(oldconfigline, p - configline, "Bad `Replacement' parameter.");
+ font.replacementname = p;
+ }
+ else
+ {
+ char *new_name, *old_name;
+ stringlist *sl;
+
+
+ old_name = p;
+ while (*p && !isspace(*p) && *p != '=')
+ p++;
+
+ q = p;
+ p = strip_equal(configline, oldconfigline, p);
+ *q = '\0';
+
+ new_name = p;
+ while (*p && !isspace(*p))
+ p++;
+ if (*p)
+ *p++ = '\0';
+
+ sl = newstringlist();
+ sl->new_name = new_name;
+ sl->old_name = old_name;
+ sl->next = font.replacements;
+ font.replacements = sl;
+
+ p--; /* to make the next while look work */
+ }
+
+ while (*p && !isspace(*p))
+ p++;
+ if (*p)
+ *p = '\0';
+ }
+
+ if (font.PSnames == Only)
+ if (have_pid || have_eid)
+ boops(oldconfigline, 0,
+ "No `Pid' or `Eid' parameters allowed if `PS=Only' is set.");
+
+ font.replacementname = newstring(font.replacementname);
+ get_replacements(&font);
+
+ tfm_filename = newstring(fontname);
+ TFMopen(&tfm_filename);
+
+ pk_filename = mymalloc(fontname_len + 10);
+ if (no_dpi)
+ sprintf(pk_filename, "%s.pk", fontname);
+ else
+ sprintf(pk_filename, "%s.%dpk", fontname, dpi);
+ PKopen(pk_filename, fontname, dpi);
+
+ font.ttfname = newstring(font.ttfname);
+ real_ttfname = TeX_search_ttf_file(&(font.ttfname));
+ if (!real_ttfname)
+ oops("Cannot find `%s'.", font.ttfname);
+ TTFopen(real_ttfname, &font, dpi, ptsize, quiet);
+
+ enc_filename = newstring(enc_filename);
+ enc = readencoding(&enc_filename, &font, True);
+ if (enc)
+ {
+ char *name;
+
+
+ restore_glyph(enc, &font);
+
+ for (i = 0; i <= 0xFF; i++)
+ {
+ name = enc->vec[i];
+ if (!font.PSnames)
+ {
+ code = adobename_to_code(name);
+ if (code < 0 && strcmp(name, ".notdef") != 0)
+ warning("Cannot map character `%s'.", name);
+ inenc_array[i] = code;
+ }
+ else
+ {
+ /* we search the glyph index */
+ index = TTFsearch_PS_name(name);
+ if (index < 0)
+ warning("Cannot map character `%s'.", name);
+ inenc_array[i] = index | 0x10000;
+ }
+ }
+ }
+ else
+ {
+ if (font.replacements)
+ warning("Replacement glyphs will be ignored.");
+
+ if (have_sfd)
+ TTFget_subfont(&font, inenc_array);
+ else
+ /* get the table of glyph names too */
+ enc = TTFget_first_glyphs(&font, inenc_array);
+ }
+
+ for (i = 0; i <= 0xFF; i++)
+ {
+ byte *bitmap;
+ int w, h, hoff, voff;
+
+
+ if ((code = inenc_array[i]) >= 0)
+ {
+ if (!quiet)
+ {
+ printf("Processing glyph %3ld %s index 0x%04x %s\n",
+ (long)i, (code >= 0x10000) ? "glyph" : "code",
+ (unsigned int)(code & 0xFFFF), enc ? enc->vec[i] : "");
+ fflush(stdout);
+ }
+
+ if (TTFprocess(code, &bitmap, &w, &h, &hoff, &voff, hinting, quiet))
+ PKputglyph(i,
+ -hoff, -voff, w - hoff, h - voff,
+ w, h, bitmap);
+ else
+ warning("Cannot render glyph with %s index 0x%x.",
+ (code >= 0x10000) ? "glyph" : "code",
+ (unsigned int)(code & 0xFFFF));
+ }
+ }
+
+ PKclose();
+ exit(0); /* for safety reasons */
+ return 0; /* never reached */
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.doc b/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.doc
new file mode 100644
index 000000000..d7609facd
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttf2pk.doc
@@ -0,0 +1,568 @@
+
+ttf2tfm -- TrueType to TFM converter
+ttf2pk -- TrueType to PK converter
+====================================
+
+These two auxiliary programs make TrueType fonts usable with TeX.
+ttf2tfm extracts the metric and kerning information of a TrueType font
+and converts it into metric files usable by TeX (quite similar to
+afm2tfm which is part of the dvips package). ttf2pk rasterizes the
+glyph outlines of a TrueType font into a bitmap font in PK format.
+
+Since a TrueType font often contains more than 256 glyphs, some means
+are necessary to map a subset of the TrueType glyphs into a TeX font.
+To do this, two mapping tables are needed: the first maps from the
+TrueType font to a raw TeX font (this mapping table is used both by
+ttf2tfm and ttf2pk), and the second maps from the raw TeX font to
+another (virtual) TeX font providing all kerning and ligature
+information needed by TeX.
+
+We somethimes refer to this first map as the `input' or `raw' map, and
+to the second as the `output' or `virtual' map.
+
+This two stage mapping has the advantage that one raw font can be
+accessed with various TeX encodings (e.g. T1 and OT1) via the virtual
+font mechanism, and just one PK file is necessary.
+
+For CJK fonts, a different mechanism is provided (see section "Subfont
+definition files" below).
+
+
+ttf2tfm
+=======
+
+Usage:
+
+ ttf2tfm FILE[.ttf|.ttc] [OPTION]... [FILE[.tfm]]
+
+Options (default values are given in brackets):
+
+-c REAL use REAL for height of small caps made with -V [0.8]
+-e REAL widen (extend) characters by a factor of REAL [1.0]
+-E INT select INT as the TTF encoding ID [1]
+-n use PS names of TrueType font
+-N use only PS names and no cmap
+-O use octal for all character codes in the vpl file
+-p ENCFILE[.enc] read ENCFILE for the TTF->raw TeX mapping
+-P INT select INT as the TTF platform ID [3]
+-q suppress informational output
+-r OLDNAME NEWNAME replace glyph name OLDNAME with NEWNAME
+-R RPLFILE[.rpl] read RPLFILE containing glyph replacement names
+-s REAL oblique (slant) characters by REAL, usually <<1 [0.0]
+-t ENCFILE[.enc] read ENCFILE for the encoding of the vpl file
+-T ENCFILE[.enc] equivalent to -p ENCFILE -t ENCFILE
+-u output only characters from encodings, nothing extra
+-v FILE[.vpl] make a VPL file for conversion to VF
+-V SCFILE[.vpl] like -v, but synthesize smallcaps as lowercase
+--help print this message and exit
+--version print version number and exit
+
+
+The usage is very similar to afm2tfm. Please consult the dvips info
+file for more details on the various parameters. Here we will
+concentrate on the differences between afm2tfm and ttf2tfm.
+
+
+cmaps
+-----
+
+Contrary to Type 1 PostScript fonts (but similar to the new CID
+PostScript font format), most TrueType fonts have more than one native
+mapping table, also called `cmap', which maps the (internal) TTF glyph
+indices to the (external) TTF character codes. Common examples are a
+mapping table to Unicode encoded character positions and the standard
+Macintosh mapping. To specify this TrueType mapping table, use the
+options `-P' and `-E'. With `-P' you specify the platform ID; defined
+values are:
+
+ platform platform ID (pid)
+ ----------------------------------
+ Apple Unicode 0
+ Macintosh 1
+ ISO 2
+ Microsoft 3
+
+The encoding ID depends on the platform. For pid=0, we ignore the
+`-E' parameter (setting it to zero) since the mapping table is always
+Unicode version 2.0. For pid=1, the following table lists the defined
+values:
+
+ platform ID = 1
+ script encoding ID (eid)
+ ---------------------------------
+ Roman 0
+ Japanese 1
+ Chinese 2
+ Korean 3
+ Arabic 4
+ Hebrew 5
+ Greek 6
+ Russian 7
+ Roman Symbol 8
+ Devanagari 9
+ Gurmukhi 10
+ Gujarati 11
+ Oriya 12
+ Bengali 13
+ Tamil 14
+ Telugu 15
+ Kannada 16
+ Malayalam 17
+ Sinhalese 18
+ Burmese 19
+ Khmer 20
+ Thai 21
+ Laotian 22
+ Georgian 23
+ Armenian 24
+ Maldivian 25
+ Tibetan 26
+ Mongolian 27
+ Geez 28
+ Slavic 29
+ Vietnamese 30
+ Sindhi 31
+ Uninterpreted 32
+
+Here are the ISO encoding IDs:
+
+ platform ID = 2
+ encoding encoding ID
+ ----------------------------
+ ASCII 0
+ ISO 10646 1
+ ISO 8859-1 2
+
+And finally, the Microsoft encoding IDs:
+
+ platform ID = 3
+ encoding encoding ID
+ ---------------------------
+ Symbol 0
+ Unicode 2.0 1
+ Shift JIS 2
+ GB 2312 (1980) 3
+ Big 5 4
+ KSC 5601 (Wansung) 5
+ KSC 5601 (Johab) 6
+
+The program will abort if you specify an invalid platform/encoding ID
+pair. Please note that most fonts have at most two or three cmaps,
+usually corresponding to the pid/eid pairs (1,0), (3,0), or (3,1) in
+case of Latin based fonts. Valid Microsoft fonts should have a (3,1)
+mapping table, but some fonts exist (mostly Asian fonts) which have a
+(3,1) cmap not encoded in Unicode. The reason for this strange
+behavior is the fact that some MS Windows versions will reject fonts
+having a non-Unicode cmap (since all non-Unicode Microsoft encoding
+IDs are for Asian specific MS Windows versions).
+
+The `-P' and `-E' options to ttf2tfm must be equally specified for
+ttf2pk; the corresponding parameters in ttfonts.map are `Pid' and
+`Eid', respectively.
+
+The default pid/eid pair is (3,1).
+
+If you use the `-N' switch, all cmaps are ignored, using only the
+PostScript names in the TrueType font. The corresponding option in
+ttfonts.map is `PS=Only'.
+
+If you use the `-n' switch, the default glyph names built into ttf2tfm
+are replaced with the PS glyph names found in the font. In many cases
+this is not what you want because the glyph names in the font are
+often incorrect or non-standard. The corresponding option in
+ttfonts.map `PS=Yes'.
+
+
+input and output encodings
+--------------------------
+
+You must specify the encoding vectors from the TrueType font to the
+raw TeX font and from the raw TeX font to the virtual TeX font exactly
+as with afm2tfm, but you have more possibilities to address the
+character codes. [With `encoding vector' a mapping table with 256
+entries in form of a PostScript vector ist meant; see the file
+T1-WGL4.enc of this package for an example.] With afm2tfm, you must
+access each glyph with its Adobe glyph name, e.g. `/quotedsingle' or
+`/Acircumflex'. This has been extended with ttf2tfm; now you can (and
+sometimes must) access the code points and/or glyphs directly using
+the following syntax for the specifying the character position in
+decimal, octal, or hexadecimal notation: `/.c<decimal-number>',
+`/.c0<octal-number>', or `/.c0x<hexadecimal-number>'. Examples:
+`/.c72', `/.c0646', `/.c0x48'. To access a glyph index directly, use
+the character `g' instead of `c' in the just introduced notation.
+Example: `/.g0x32'.
+
+[Note: The `.cXXX' notation makes no sense if `-N' is used.]
+
+Another possibility is to use the `-r old-glyphname new-glyphname'
+switch to rename a glyph. Example:
+
+ ttf2tfm ... -r .g0xc7 dotlessi -r hungarumlaut dblacute ...
+
+Nevertheless, it is not allowed to use the `.gXXX' or `.cXXX' glyph
+name construct for `new-glyphname'.
+
+Alternatively, you can collect such replacement pairs in a file which
+should have `.rpl' as extension, using the `-R' option. The syntax is
+simple: Each line contains a pair `old-glyphname new-glyphname'
+separated by whitespace (without the quotation marks). The percent
+sign starts a line comment; you can continue a line with a backslash
+as the last character. An example for a replacement file is VPS.rpl
+(to be used in conjunction with ET5.enc for Vietnamese) which is part
+of this package.
+
+The `-r' and `-R' switches are ignored for subfonts or if no encoding
+tables are specified. For ttf2pk, the corresponding option to `-R' is
+`Replacement'. Single replacements are directly given as
+old_glyphname=newglyphname in ttfonts.map.
+
+For pid/eid pairs (1,0) and (3,1), both ttf2tfm and ttf2pk recognize
+built-in default Adobe glyph names; the former follows the names given
+in Appendix E of the book `Inside Macintosh', volume 6, the latter
+uses the names given in the TrueType Specification (WGL4, a Unicode
+subset). Note that Adobe glyph names are not unique and do sometimes
+differ: e.g. many PS fonts have the glyph `mu', whereas this glyph is
+called `mu1' in the WGL4 character set to distinguish it from the real
+Greek letter mu. You can find those mapping tables in the source code
+file ttfenc.c.
+
+On the other hand, the switches `-n' and `-N' make ttf2tfm read in and
+use the PostScript names in the TrueType font itself (stored in the
+`post' table) instead of the default Adobe glyph names.
+
+If you don't select an input encoding, the first 256 glyphs of the
+TrueType font with a valid entry in the selected cmap will be mapped
+to the TeX raw font (without the `-q' option ttf2tfm prints this
+mapping table to standard output), followed by all glyphs not yet
+addressed in the selected cmap. However, some code points for the
+(1,0) pid/eid pair are omitted since they do not represent glyphs
+useful for TeX: 0x00 (null), 0x08 (backspace), 0x09 (horizontal
+tabulation), 0x0d (carriage return), and 0x1d (group separator). The
+`invalid character' with glyph index 0 will be omitted too.
+
+If you select the `-N' switch, the first 256 glyphs of the TrueType
+font with a valid PostScript name will be used in case no input
+encoding is specified. Again, some glyphs are omitted: `.notdef',
+`.null', and `nonmarkingreturn'.
+
+If you don't select an output encoding, ttf2tfm uses the same mapping
+table as afm2tfm would use (you can find it in the source code file
+texenc.c); it corresponds to TeX typewriter text. Unused positions
+(either caused by empty code points in the mapping table or missing
+glyphs in the TrueType font) will be filled (rather arbitrarily) with
+characters present in the input encoding but not specified in the
+output encoding (without the `-q' option ttf2tfm prints the final
+output encoding to standard output). Use the `-u' option if you want
+only glyphs in the virtual font which are defined in the output
+encoding file, and nothing more.
+
+One feature missing in afm2tfm has been added which is needed by the
+LaTeX T1 encoding: ttf2tfm will construct the glyph `Germandbls' (by
+simply concatenating to `S' glyphs) even for normal fonts if possible.
+It appears in the glyph list (written to stdout) as the last item,
+marked with an asterisk. Since this isn't a real glyph it will be
+available only in the virtual font.
+
+For both input and output encoding, an empty code position is
+represented by the glyph name `.notdef'.
+
+In encoding files, you can use `\' as the final character of a line to
+indicate that the input is continued on the next line. The backslash
+and the following newline character will be removed.
+
+ttf2tfm returns 0 on success and 1 on error; warning and error
+messages are written to standard error.
+
+
+ttf2pk
+======
+
+Usage:
+
+ ttf2pk [-q] [-n] FONT DPI
+ ttf2pk -t [-q] FONT
+
+Options:
+
+-q suppresses informational output
+-n only use `.pk' as extension
+-t test for FONT (returns 0 on success)
+--help print this message and exit
+--version print version number and exit
+
+
+The FONT parameter must correspond to an entry in the file ttfonts.map
+(see below for details), otherwise error code 2 is returned -- this
+can be used for scripts like mktexpk to test whether the given font
+name is a (registered) TrueType font.
+
+Another possibility is to use the `-t' switch which will print the
+line of ttfonts.map corresponding to FONT and return 0 on success
+(`-q' suppresses any output).
+
+DPI specifies the intended resolution (we always assume a design size
+of 10pt).
+
+
+ttfonts.map
+-----------
+
+ttf2pk uses, similar to dvips, a font definition file called
+ttfonts.map. The parameters specified to ttf2tfm are here preserved
+-- ttf2tfm writes out to standard output, as the last line, a proper
+configuration entry for ttfonts.map.
+
+As an example, a call to
+
+ ttf2tfm arial -s 0.25 -P 1 -E 0 -r .g0xc7 caron \
+ -p 8r.enc -t T1-WGL4.enc -v arialsx arials
+
+will produce the following line:
+
+ arials arial Slant=0.25 Encoding=8r.enc Pid=1 Eid=0 .g0xc7=caron
+
+The output encoding given with `-t' for the virtual font `arialsx' is
+immaterial to ttf2pk (nevertheless, input encoding files must have the
+same format as with ttf2tfm, and all said above about encoding files
+holds).
+
+Here a table listing the various ttf2tfm parameters and its
+corresponding ttfonts.map entries:
+
+ -s Slant
+ -e Extend
+ -p Encoding
+ -f Fontindex
+ -P Pid
+ -E Eid
+ -n PS=Yes
+ -N PS=Only
+ -R Replacement
+
+Single replacement glyph names given to ttf2tfm with the `-r' switch
+are directly specified with old-glyphname=new-glyphname. For subfonts
+or if no encoding file is given, replacement glyphs are ignored.
+
+One additional parameter in ttfonts.map is unique to ttf2pk:
+`Hinting', which can take the values `On' or `Off'. Some fonts (e.g.
+the CJK part of cyberbit.ttf) are rendered incorrectly if hinting is
+activated. Default is `On' (you can also use `Yes', `No', `1', and
+`0').
+
+The format of ttfonts.map is simple. Each line defines a font; first
+comes the TeX font name, then its TrueType font file name, followed by
+the parameters in any order. Case is significant (even for parameter
+names); the parameters are separated from its values by an equal sign,
+with possible whitespace surrounding it. ttf2pk reads in ttfonts.map
+line by line, continuing until the TeX font specified on the command
+line is found, otherwise the programs exits with error code 2. Thus
+you can use any character invalid in a TeX font name to start a
+comment line.
+
+In both ttfonts.map and encoding files, you can use `\' as the final
+character of a line to indicate that the input is continued on the
+next line. The backslash and the following newline character will be
+removed.
+
+ttf2pk will abort if it can't find and read the TeX font metrics file
+of the given TeX font name.
+
+
+Subfont definition files
+========================
+
+CJK (Chinese/Japanese/Korean) fonts usually contain several thousand
+glyphs; to use them with TeX it is necessary to split such large fonts
+into subfonts. Subfont definition files (usually having the extension
+`.sfd') are a simple means to do this smoothly. A subfont file name
+usually consists of a prefix, a subfont infix, and a postfix (which is
+empty in most cases), e.g.
+
+ ntukai23 -> prefix: ntukai, infix: 23, postfix: (empty)
+
+Here the syntax of a line in an SFD file, describing one subfont:
+
+ <whitespace> <infix> <whitespace> <ranges> <whitespace> `\n'
+
+ <infix> := anything except whitespace. It's best to use only
+ alphanumerical characters.
+ <whitespace> := space, formfeed, carriage return, horizontal and
+ vertical tabs -- no newline characters.
+ <ranges> := <ranges> <whitespace> <codepoint> |
+ <ranges> <whitespace> <range> |
+ <ranges> <whitespace> <offset> <whitespace> <range>
+
+ <codepoint> := <number>
+ <range> := <number> `_' <number>
+ <offset> := <number> `:'
+
+ <number> := hexadecimal (prefix `0x'), decimal, or octal
+ (prefix `0')
+
+A line can be continued on the next line with a backslash ending the
+line. The ranges must not overlap; offsets have to be in the range
+0-255.
+
+Example:
+
+ The line
+
+ 03 10: 0x2349 0x2345_0x2347
+
+ assigns to the code positions 10, 11, 12, and 13 of the subfont
+ having the infix `03' the character codes 0x2349, 0x2345, 0x2346,
+ and 0x2347 respectively.
+
+The SFD files in the distribution are customized for the CJK package
+for LaTeX.
+
+You have to embed the SFD file into the TFM font name (at the place
+where the infix will appear) surrounded by two `@' signs, on the
+command line resp. the ttfonts.map file; both ttf2tfm and ttf2pk
+switch then to subfont mode.
+
+Subfont mode disables the options `-n', `-N', `-p', `-r', `-R', `-t',
+`-T', `-u', `-v', and `-V' for ttf2tfm; similarly, no `Encoding' and
+`Replacement' parameter resp. single replacement glyph names are
+allowed in ttfonts.map.
+
+ttf2tfm will create ALL subfont TFM files specified in the SFD files
+(provided the subfont contains glyphs) in one run.
+
+Example:
+
+ The call
+
+ ttf2tfm ntukai.ttf ntukai@/usr/local/lib/ttf2tfm/Big5@
+
+ will use `/usr/local/lib/ttf2tfm/Big5.sfd', producing the subfont
+ files ntukai01.tfm, ntukai02.tfm etc.
+
+ ttf2pk should be then called on the subfonts directly:
+
+ ttf2pk ntukai01 600
+ ttf2pk ntukai02 600
+ ...
+
+
+Some notes on file searching
+============================
+
+Both ttf2pk and ttf2tfm use either the kpathsea or emtexdir library
+for searching files (the latter will work only on operating systems
+which have an MS-DOSish background, i.e. MS-DOS, OS/2, Windows).
+
+During compilation, you have to define HAVE_KPATHSEA or HAVE_EMTEXDIR.
+
+As a last resort, both programs can be compiled without a search
+library; the searched files must be then in the current directory or
+specified with a path. Default extensions will be appended also (with
+the exception that only `.ttf' is appended and not `.ttc').
+
+
+kpathsea
+--------
+
+Please note that older versions of kpathsea (<3.2) have no special
+means to seach for TrueType fonts and related files, thus we use the
+paths for PostScript related stuff. The actual version of kpathsea is
+displayed on screen if you call either ttf2pk or ttf2tfm with the
+`--version' command line switch.
+
+Here is a table of the file type and the corresponding kpathsea
+variables. TTF2PKINPUTS and TTF2TFMINPUTS are program specific
+environment variables introduced in kpathsea version 3.2:
+
+ .ttf and .ttc TTFONTS
+ ttfonts.map TTF2PKINPUTS
+ .enc TTF2PKINPUTS, TTF2TFMINPUTS
+ .rpl TTF2PKINPUTS, TTF2TFMINPUTS
+ .tfm TFMFONTS
+ .sfd TTF2PKINPUTS, TTF2TFMINPUTS
+
+And here the same for pre-3.2-versions of kpathsea:
+
+ .ttf and .ttc T1FONTS
+ ttfonts.map TEXCONFIG
+ .enc TEXPSHEADERS
+ .rpl TEXPSHEADERS
+ .tfm TFMFONTS
+ .sfd TEXPSHEADERS
+
+Finally, the same for pre-3.0-versions:
+
+ .ttf and .ttc DVIPSHEADERS
+ ttfonts.map TEXCONFIG
+ .enc DVIPSHEADERS
+ .rpl DVIPSHEADERS
+ .tfm TFMFONTS
+ .sfd DVIPSHEADERS
+
+Please consult the info files for kpathsea for details on these
+variables. The decision whether to use the old or the new scheme will
+be done during compilation.
+
+You should set the TEXMFCNF variable to the directory where your
+texmf.cnf configuration file resides.
+
+The default TDS location for the files in the data subdirectory is
+
+ $TEXMF/ttf2tfm
+
+(or $TEXMF/ttf2pk; you should either make a symbolic link
+
+ % ln -s $TEXMF/ttf2tfm $TEXMF/ttf2pk
+
+or set the variable TTF2PKINPUTS to $TEXMF/ttf2tfm for newer kpathsea
+versions)
+
+
+emtexdir
+--------
+
+Here the list of suffixes and its related environment variables to be
+set in autoexec.bat (resp. in config.sys for OS/2):
+
+ .ttf and .ttc TTFONTS
+ ttfonts.map TTFCFG
+ .enc TTFCFG
+ .rpl TTFCFG
+ .tfm TEXTFM
+ .sfd TTFCFG
+
+With other words, all files in the data subdirectory should be moved
+to a place in your emtex tree with TTFCFG pointing to this directory.
+
+If one of the variables isn't set, a warning message is emitted. The
+current directory will always be searched. As usual, one exclamation
+mark appended to a directory path causes subdirectories one level deep
+to be searched, two exclamation marks causes all subdirectories to be
+searched. Example:
+
+ TTFONTS=c:\fonts\truetype!!;d:\myfonts\truetype!
+
+Constructions like `c:\fonts!!\truetype' aren't possible.
+
+
+Problems
+========
+
+Most vptovf implementations allow only 100 bytes for the TFM header
+(the limit is 1024 in the TFM file itself): 8 bytes for checksum and
+design size, 40 bytes for the family name, 20 bytes for the encoding,
+and 4 bytes for a face byte. There remain only 28 bytes for some
+additional information which is used by ttf2tfm for an identification
+string (which is essentially a copy of the command line), and this
+limit is always exceeded.
+
+The optimal solution is to increase the value of `max_header_bytes' in
+the file vptovf.w (and probably pltotf.w) to, say, 400 and recompile
+vptovf (and pltotf). Otherwise you'll get some (harmless) error
+messages like
+
+ This HEADER index is too big for my present table size
+
+which can be safely ignored.
+
+
+--- end of ttf2pk.doc ---
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.1 b/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.1
new file mode 100644
index 000000000..f08a95c3e
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.1
@@ -0,0 +1,1010 @@
+.\" man page for ttf2tfm
+.
+.TH TTF2TFM 1 25-Jul-1998 "FreeType version 1.2"
+.SH NAME
+ttf2tfm \- build TeX metric files from a TrueType font
+.SH SYNOPSIS
+.na
+.nh
+.B ttf2tfm
+.in +\n(.ku
+.sp -1
+.IR ttffile [ .ttf | .ttc ]
+[\c
+.BI -c \ \%caps-height\c
+]
+[\c
+.BI -e \ \%extension-factor\c
+]
+[\c
+.BI -E \ \%encoding-id\^\c
+]
+[\c
+.BI -f \ \%font-index\c
+]
+[\c
+.B -n\c
+]
+[\c
+.B -N\c
+]
+[\c
+.B -O\c
+]
+[\c
+.B -p\ \c
+.IR \%inencfile [ .enc ]\c
+]
+[\c
+.BI -P \ \%platform-id\^\c
+]
+[\c
+.B -q\c
+]
+[\c
+.BI -r \ \%old-glyphname\ \%new-glyphname\c
+]
+[\c
+.B -R\ \c
+.IR \%replacement-file [ .rpl ]\c
+]
+[\c
+.BI -s \ \%slant-factor\c
+]
+[\c
+.B -t\ \c
+.IR \%outencfile [ .enc ]\c
+]
+[\c
+.B -T\ \c
+.IR \%inoutencfile [ .enc ]\c
+]
+[\c
+.B -u\c
+]
+[\c
+.B -v\ \c
+.IR \%vplfile [ .vpl ]\c
+]
+[\c
+.B -V\ \c
+.IR \%scvplfile [ .vpl ]\c
+]
+[\c
+.IR \%tfmfile [ .tfm ]\c
+]
+.br
+.in
+.B "ttf2tfm --version"
+|
+.B --help
+.ad
+.hy
+.
+.
+.
+.\" ====
+.\" ==== macro definitions
+.\" ====
+.
+.\" here we define \TeX for troff and nroff
+.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP
+.if n .ds TX TeX
+.
+.\" and here the same for \LaTeX
+.if t \{\
+.ie '\*(.T'dvi' \
+.ds LX \fRL\h'-0.36m'\v'-0.15v'\s-3A\s0\h'-0.15m'\v'0.15v'\fP\*(TX
+.el .ds LX \fRL\h'-0.36m'\v'-0.22v'\s-2A\s0\h'-0.15m'\v'0.22v'\fP\*(TX
+.\}
+.if n .ds LX LaTeX
+.
+.\" \LaTeXe
+.\" note that we need \vareps for TeX instead of \eps which can only be
+.\" accessed with the \N escape sequence (in the Math Italic font)
+.if t \{\
+.ie '\*(.T'dvi' .ds LE \*(LX\h'0.15m'2\v'0.20v'\f(MI\N'34'\fP\v'-0.20v'
+.el .ds LE \*(LX\h'0.15m'2\v'0.20v'\(*e\v'-0.20v'
+.\}
+.if n .ds LE LaTeX\ 2e
+.
+.\" a typewriter font
+.if t \{\
+.de C
+\fC\\$1\fP\\$2\fC\\$3\fP\\$4
+..
+.\}
+.if n \{\
+.de C
+\\$1\\$2\\$3\\$4
+..
+.\}
+.
+.\" ====
+.\" ==== end of macro definitions
+.\" ====
+.
+.
+.
+.SH DESCRIPTION
+This program extracts the metric and kerning information of a TrueType
+font and converts it into metric files usable by \*(TX
+(quite similar to
+.B afm2tfm
+which is part of the
+.B dvips
+package).
+Please consult the documentation of
+.B afm2tfm
+in the
+.B dvips
+info file for more details on the various parameters (especially
+encoding files).
+Here we concentrate on the differences between
+.B afm2tfm
+and
+.BR ttf2tfm .
+.PP
+Since a TrueType font often contains more than 256\ glyphs, some means
+are necessary to map a subset of the TrueType glyphs into a \*(TX
+font.
+To do this, two mapping tables are needed: the first (called `input' or
+`raw' encoding) maps from the TrueType font to a raw \*(TX
+font (this mapping table is used both by
+.B ttf2tfm
+and
+.BR ttf2pk ),
+and the second (called `output' or `virtual' encoding) maps from the raw
+\*(TX
+font to another (virtual) \*(TX
+font providing all kerning and ligature information needed by \*(TX.
+.PP
+This two stage mapping has the advantage that one raw font can be
+accessed with various \*(TX
+encodings (e.g.\ T1 and OT1) via the virtual font mechanism, and just
+one
+.C PK
+file is necessary.
+.PP
+For CJKV (Chinese/Japanese/Korean/old Vietnamese) fonts, a different
+mechanism is provided (see
+.B "SUBFONT DEFINITION FILES"
+below).
+.
+.
+.SH PARAMETERS
+Most of the command line switch names are the same as in
+.B afm2tfm
+for convenience.
+One or more space characters between an option and its parameter is
+mandatory; options can't be concatenated.
+.TP
+.BI -c \ caps-height
+The height of small caps made with the
+.B -V
+switch.
+Default value of this real number is 0.8.
+Will be ignored in subfont mode.
+.TP
+.BI -e \ extension-factor
+The extension factor to stretch the characters horizontally.
+Default value of this real number is 1.0; if less than 1.0, you get a
+condensed font.
+.TP
+.BI -E \ encoding-id
+The TrueType encoding ID.
+Default value of this integer is\ 1.
+Will be ignored if
+.B -N
+is used.
+.TP
+.BI -f \ font-index
+The font index in a TrueType Collection.
+Default is the first font (index 0).
+Will be ignored for ordinary TrueType fonts.
+[TrueType collections are usually found in some CJK fonts; e.g.\ the first
+font index specifies glyphs and metrics for horizontal writing, and the
+second font index does the same for vertical writing.]
+.TP
+.B -n
+Use PS names of the TrueType font.
+Will be ignored in subfont mode.
+Only glyphs with a valid entry in the selected cmap are used.
+.TP
+.B -N
+Use only PS names of the TrueType font.
+No cmap is used, thus the switches
+.B -E
+and
+.B -P
+have no effect, causing a warning message.
+Will be ignored in subfont mode.
+.TP
+.B -O
+Use octal values for all character codes in the
+.C VPL
+file rather than names; this is useful for symbol or CJK fonts where
+character names such as `A' are meaningless.
+.TP
+.BI -p \ inencfile
+The input encoding file name for the TTF\(->raw\ \*(TX
+mapping.
+This parameter has to be specified in
+.C \%ttfonts.map
+for successive
+.B ttf2pk
+calls.
+Will be ignored in subfont mode.
+.TP
+.BI -P \ platform-id
+The TrueType platform ID.
+Default value of this integer is\ 1.
+Will be ignored if
+.B -N
+is used.
+.TP
+.B -q
+Make
+.B ttf2tfm
+quiet.
+It suppresses any informational output except warning and error
+messages.
+For CJK fonts, the output can get quite large if you don't specify
+this switch.
+.TP
+.BI -r \ old-glyphname\ new-glyphname
+Replaces
+.I \%old-glyphname
+with
+.IR \%new-glyphname .
+This switch is useful if you want to give an unnamed glyph (i.e., a glyph
+which can be represented with `.gXXX' or `.cXXX' only) a name or if you want
+to rename an already existing glyph name.
+You can't use the `.gXXX' or `.cXXX' glyph name constructs for
+.IR \%new-glyphname ;
+multiple occurrences of
+.B -r
+are possible.
+If in subfont mode or if no encoding file is specified, this switch is
+ignored.
+.TP
+.BI -R \ replacement-file
+Use this switch if you have many replacement pairs; they can be collected
+in a file which should have `\c
+.C \&.rpl '
+as extension.
+The syntax used in such replacement files is simple: Each non-empty
+line must contain a pair `\c
+.IR "\%old-glyphname \%new-glyphname" '
+separated by whitespace (without the quotation marks).
+The percent sign starts a line comment; you can continue a line on the
+next line with a backslash as the last character.
+If in subfont mode or if no encoding file is specified, this switch is
+ignored.
+.TP
+.BI -s \ slant-factor
+The oblique factor to slant the font, usually much smaller than\ 1.
+Default of this real number is\ 0.0; if the value is larger than zero,
+the characters slope to the right, otherwise to the left.
+.TP
+.BI -t \ outencfile
+The output encoding file name for the virtual font(s).
+Only characters in the raw \*(TX
+font are used.
+Will be ignored in subfont mode.
+.TP
+.BI -T \ inoutencfile
+This is equivalent to
+.RB ` -p
+.I inoutencfile
+.B -t
+.IR inoutencfile '.
+Will be ignored in subfont mode.
+.TP
+.B -u
+Use only those characters specified in the output encoding, and no
+others.
+By default,
+.B ttf2tfm
+tries to include all characters in the virtual font, even those not
+present in the encoding for the virtual font (it puts them into
+otherwise-unused positions, rather arbitrarily).
+Will be ignored in subfont mode.
+.TP
+.BI -v \ vplfile
+Output a
+.C VPL
+file in addition to the
+.C TFM
+file.
+If no output encoding file is specified,
+.B ttf2tfm
+uses a default font encoding (cmtt10).
+Will be ignored in subfont mode.
+.TP
+.BI -V \ scvplfile
+Same as
+.BR -v ,
+but the virtual font generated is a pseudo small caps font obtained by
+scaling uppercase letters by\ 0.8 (resp. the value specified with
+.BR -c )
+to typeset lowercase.
+This font handles accented letters and retains proper kerning.
+Will be ignored in subfont mode.
+.TP
+.B --version
+Shows the current version of
+.B ttf2tfm
+and the used file search library (e.g.
+.BR kpathsea ).
+.TP
+.B --help
+Shows usage information.
+.PP
+If no
+.C TFM
+file name is given, the name of the TTF file is used, including the
+full path and replacing the extension with `\c
+.C \&.tfm '.
+.
+.
+.SH CMAPS
+Contrary to Type\ 1 PostScript fonts (but similar to the new CID
+PostScript font format), most TrueType fonts have more than one native
+mapping table, also called `cmap', which maps the (internal) TTF glyph
+indices to the (external) TTF character codes.
+Common examples are a mapping table to Unicode encoded character
+positions and the standard Macintosh mapping.
+
+To specify this TrueType mapping table, use the options
+.B -P
+and
+.BR -E .
+With
+.B -P
+you specify the platform ID; defined values are:
+.PP
+.in +4m
+.ta 3iC
+.I "platform platform ID (pid)"
+.sp
+.ta 3iR
+Apple Unicode 0
+.br
+Macintosh 1
+.br
+ISO 2
+.br
+Microsoft 3
+.PP
+The encoding ID depends on the platform.
+For pid=0, we ignore the
+.B -E
+parameter (setting it to zero) since the mapping table is always
+Unicode version\ 2.0.
+For pid=1, the following table lists the defined values:
+.PP
+.in +4m
+.ta 3iC
+.ti -2m
+platform ID = 1
+.sp
+.I "script encoding ID (eid)"
+.sp
+.ta 3iR
+Roman 0
+.br
+Japanese 1
+.br
+Chinese 2
+.br
+Korean 3
+.br
+Arabic 4
+.br
+Hebrew 5
+.br
+Greek 6
+.br
+Russian 7
+.br
+Roman Symbol 8
+.br
+Devanagari 9
+.br
+Gurmukhi 10
+.br
+Gujarati 11
+.br
+Oriya 12
+.br
+Bengali 13
+.br
+Tamil 14
+.br
+Telugu 15
+.br
+Kannada 16
+.br
+Malayalam 17
+.br
+Sinhalese 18
+.br
+Burmese 19
+.br
+Khmer 20
+.br
+Thai 21
+.br
+Laotian 22
+.br
+Georgian 23
+.br
+Armenian 24
+.br
+Maldivian 25
+.br
+Tibetan 26
+.br
+Mongolian 27
+.br
+Geez 28
+.br
+Slavic 29
+.br
+Vietnamese 30
+.br
+Sindhi 31
+.br
+Uninterpreted 32
+.PP
+Here are the ISO encoding IDs:
+.PP
+.in +4m
+.ta 3iC
+.ti -2m
+platform ID = 2
+.sp
+.I "encoding encoding ID (eid)"
+.sp
+.ta 3iR
+ASCII 0
+.br
+ISO 10646 1
+.br
+ISO 8859-1 2
+.PP
+And finally, the Microsoft encoding IDs:
+.PP
+.in +4m
+.ta 3iC
+.ti -2m
+platform ID = 3
+.sp
+.I "encoding encoding ID (eid)"
+.sp
+.ta 3iR
+Symbol 0
+.br
+Unicode 2.0 1
+.br
+Shift JIS 2
+.br
+GB 2312 (1980) 3
+.br
+Big 5 4
+.br
+KSC 5601 (Wansung) 5
+.br
+KSC 5601 (Johab) 6
+.PP
+The program will abort if you specify an invalid platform/encoding ID
+pair.
+Please note that most fonts have at most two or three cmaps, usually
+corresponding to the pid/eid pairs (1,0), (3,0), or (3,1) in case of
+Latin based fonts.
+Valid Microsoft fonts should have a (3,1) mapping table, but some
+fonts exist (mostly Asian fonts) which have a (3,1) cmap not encoded
+in Unicode.
+The reason for this strange behavior is the fact that some MS Windows
+versions will reject fonts having a non-Unicode cmap (since all
+non-Unicode Microsoft encoding IDs are for Asian specific MS Windows
+versions).
+.PP
+The
+.B -P
+and
+.B -E
+options of
+.B ttf2tfm
+must be equally specified for
+.BR ttf2pk ;
+the corresponding parameters in
+.C \%ttfonts.map
+are `Pid' and `Eid', respectively.
+.PP
+The default pid/eid pair is (3,1).
+.PP
+Similarly, an
+.B -f
+option must be specified as `Fontindex' parameter in
+.C \%ttfonts.map .
+.PP
+If you use the
+.B -N
+switch, all cmaps are ignored, using only the PostScript names in the
+TrueType font.
+The corresponding option in
+.C \%ttfonts.map
+is `PS=Only'.
+If you use the
+.B -n
+switch, the default glyph names built into
+.B ttf2tfm
+are replaced with the PS glyph names found in the font.
+In many cases this is not what you want because the glyph names in the
+font are often incorrect or non-standard.
+The corresponding option in
+.C \%ttfonts.map
+is `PS=Yes'.
+.PP
+Single replacement glyphs specified with `\c
+.C -r '
+must be given directly as
+.IR \%old-glyphname = \%new-glyphname ;
+`\c
+.C -R '
+is equivalent to the `Replacement' option.
+.
+.
+.SH INPUT AND OUTPUT ENCODINGS
+You must specify the encoding vectors from the TrueType font to the
+raw \*(TX
+font and from the raw \*(TX
+font to the virtual \*(TX
+font exactly as with
+.BR afm2tfm ,
+but you have more possibilities to address the character codes.
+[With `encoding vector' a mapping table with 256\ entries in form of a
+PostScript vector is meant; see the file
+.C \%T1-WGL4.enc
+of this package for an example.]
+With
+.BR afm2tfm ,
+you must access each glyph with its Adobe glyph name, e.g.\ \c
+\%`/quotedsingle' or \%`/Acircumflex'.
+This has been extended with
+.BR ttf2tfm ;
+now you can (and sometimes must) access the code points and/or glyphs
+directly using the following syntax for the specifying the character
+position in decimal, octal, or hexadecimal notation:
+`/.c\c
+.IR <decimal-number> ',
+`/.c0\c
+.IR <octal-number> ',
+or `/.c0x\c
+.IR <hexadecimal-number> '.
+Examples: \%`/.c72', \%`/.c0646', \%`/.c0x48'.
+To access a glyph index directly, using the character `g' instead of
+`c' in the just introduced notation.
+Example: \%`/.g0x32'.
+[Note: The `.cXXX' notation makes no sense if
+.B -N
+is used.]
+.PP
+For pid/eid pairs (1,0) and (3,1), both
+.B ttf2tfm
+and
+.B ttf2pk
+recognize built-in default Adobe glyph names; the former follows the names
+given in Appendix\ E of the book `Inside Macintosh', volume\ 6, the latter
+uses the names given in the TrueType Specification (WGL4, a Unicode subset).
+Note that Adobe names for a given glyph are often not unique and do
+sometimes differ, e.g., many PS fonts have the glyph `mu', whereas this
+glyph is called `mu1' in the WGL4 character set to distinguish it from the
+real Greek letter mu.
+You can find those mapping tables in the source code file
+.C \%ttfenc.c .
+.PP
+On the other hand, the switches
+.B -n
+and
+.B -N
+makes
+.B ttf2tfm
+read in and use the PostScript names in the TrueType font itself (stored
+in the `post' table) instead of the default Adobe glyph names.
+.PP
+Use the
+.B -r
+switch to remap single glyph names and
+.B -R
+to specify a file containing replacement glyph name pairs.
+.PP
+If you don't select an input encoding, the first 256\ glyphs of the
+TrueType font with a valid entry in the selected cmap will be mapped
+to the \*(TX
+raw font (without the
+.B -q
+option
+.B ttf2tfm
+prints this mapping table to standard output), followed by all glyphs
+not yet addressed in the selected cmap.
+However, some code points for the (1,0) pid/eid pair are omitted since
+they do not represent glyphs useful for \*(TX:
+0x00 (null), 0x08 (backspace), 0x09 (horizontal tabulation), 0x0d
+(carriage return), and 0x1d (group separator).
+The `invalid character' with glyph index\ 0 will be omitted too.
+.PP
+If you select the
+.B -N
+switch, the first 256 glyphs of the TrueType font with a valid PostScript
+name will be used in case no input encoding is specified.
+Again, some glyphs are omitted: `.notdef', `.null', and
+`nonmarkingreturn'.
+.PP
+If you don't select an output encoding,
+.B ttf2tfm
+uses the same mapping table as
+.B afm2tfm
+would use (you can find it in the source code file
+.C \%texenc.c );
+it corresponds to \*(TX
+typewriter text.
+Unused positions (either caused by empty code points in the mapping
+table or missing glyphs in the TrueType font) will be filled (rather
+arbitrarily) with characters present in the input encoding but not
+specified in the output encoding (without the
+.B -q
+option
+.B ttf2tfm
+prints the final output encoding to standard output).
+Use the
+.B -u
+option if you want only glyphs in the virtual font which are defined
+in the output encoding file, and nothing more.
+.PP
+One feature missing in
+.B afm2tfm
+has been added which is needed by the T1 encoding:
+.B ttf2tfm
+will construct the glyph `Germandbls' (by simply concatenating to `S'
+glyphs) even for normal fonts if possible.
+It appears in the glyph list as the last item, marked with an asterisk.
+Since this isn't a real glyph it will be available only in the virtual
+font.
+.PP
+For both input and output encoding, an empty code position is
+represented by the glyph name \%`/.notdef'.
+.PP
+In encoding files, you can use `\\' as the final character of a line to
+indicate that the input is continued on the next line.
+The backslash and the following newline character will be removed.
+.PP
+.
+.
+.SH SUBFONT DEFINITION FILES
+CJKV (Chinese/Japanese/Korean/old Vietnamese) fonts usually contain several
+thousand glyphs; to use them with \*(TX
+it is necessary to split such large fonts into subfonts.
+Subfont definition files (usually having the extension `\c
+.C \&.sfd ')
+are a simple means to do this smoothly.
+A subfont file name usually consists of a prefix, a subfont infix, and
+a postfix (which is empty in most cases), e.g.
+.PP
+.in +2m
+ntukai23 \(-> prefix: ntukai, infix: 23, postfix: (empty)
+.PP
+Here the syntax of a line in an
+.C SFD
+file, describing one subfont:
+.in +2m
+.TP
+.I <whitespace> <infix> <whitespace> <ranges> <whitespace>
+.sp
+.TP
+.IR <infix> \ :=
+anything except whitespace.
+It's best to use only alphanumerical characters.
+.TP
+.IR <whitespace> \ :=
+space, formfeed, carriage return, horizontal and vertical tabs -- no
+newline characters.
+.TP
+.IR <ranges> \ :=
+.IR "<ranges> <whitespace> <codepoint>" \ |
+.br
+.IR "<ranges> <whitespace> <range>" \ |
+.br
+.I <ranges> <whitespace> <offset> <whitespace> <range>
+.TP
+.IR <codepoint> \ :=
+.I <number>
+.br
+.TP
+.IR <range> \ :=
+.IR <number> \ `_' \ <number>
+.br
+.TP
+.IR <offset> \ :=
+.IR <number> \ `:'
+.TP
+.IR <number> \ :=
+hexadecimal (prefix `0x'), decimal, or octal (prefix `0')
+.PP
+A line can be continued on the next line with a backslash ending the line.
+The ranges must not overlap; offsets have to be in the range 0-255.
+.PP
+Example:
+.PP
+.in +2m
+The line
+.PP
+.in +4m
+.C "03 10: 0x2349 0x2345_0x2347"
+.PP
+.in +2m
+assigns to the code positions 10, 11, 12, and\ 13 of the subfont
+having the infix `03' the character codes 0x2349, 0x2345, 0x2346, and
+0x2347 respectively.
+.PP
+The
+.C SFD
+files in the distribution are customized for the CJK package for
+\*(LX.
+.PP
+You have to embed the
+.C SFD
+file into the
+.C TFM
+font name (at the place where the infix will appear) surrounded by two
+`@' signs, on the command line resp.\ the
+.C \%ttfonts.map
+file; both
+.B ttf2tfm
+and
+.B ttf2pk
+switch then to subfont mode.
+.PP
+Subfont mode disables the options
+.BR -n , \ -N , \ -p ,
+.BR -r , \ -R , \ -t ,
+.BR -T , \ -u , \ -v ,
+and
+.B -V
+for
+.BR ttf2tfm ;
+similarly, no `Encoding' or `Replacement' parameter is allowed in
+.C \%ttfonts.map .
+Single replacement glyph names are ignored too.
+.PP
+.B ttf2tfm
+will create all subfont
+.C TFM
+files specified in the
+.C SFD
+files (provided the subfont contains glyphs) in one run.
+.PP
+Example:
+.PP
+.in +2m
+The call
+.PP
+.in +4m
+.C "ttf2tfm ntukai.ttf ntukai@/usr/local/lib/ttf2tfm/Big5@"
+.PP
+.in +2m
+will use
+.C /usr/local/lib/ttf2tfm/Big5.sfd ,
+producing
+.I all
+subfont files
+.C ntukai01.tfm ,
+.C ntukai02.tfm
+etc.
+.
+.
+.SH "RETURN VALUE"
+ttf2tfm returns 0 on success and 1 on error; warning and error
+messages are written to standard error.
+.
+.
+.SH "SOME NOTES ON FILE SEARCHING"
+Both
+.B ttf2pk
+and
+.B ttf2tfm
+use either the
+.B kpathsea
+or
+.B emtexdir
+library for searching files (the latter will work only on operating
+systems which have an MS-DOSish background, i.e. MS-DOS, OS/2, Windows).
+.PP
+As a last resort, both programs can be compiled without a search library;
+the searched files must be then in the current directory or specified with a
+path.
+Default extensions will be appended also (with the exception that only `\c
+.C \&.ttf '
+is appended and not `\c
+.C \&.ttc ').
+.PP
+KPATHSEA
+.PP
+Please note that older versions of
+.B kpathsea
+(<3.2) have no special means to seach for TrueType fonts and related
+files, thus we use the paths for PostScript related stuff.
+The actual version of kpathsea is displayed on screen if you call
+either
+.B ttf2pk
+or
+.B ttf2tfm
+with the
+.B --version
+command line switch.
+.PP
+Here is a table of the file type and the corresponding
+.B kpathsea
+variables.
+.C TTF2PKINPUTS
+and
+.C TTF2TFMINPUTS
+are program specific environment variables introduced in
+.B kpathsea
+version\ 3.2:
+.PP
+.in +4m
+.ta 2i
+.C \&.ttf \ and "\ .ttc TTFONTS"
+.br
+.C "ttfonts.map TTF2PKINPUTS"
+.br
+.C "\&.enc TTF2PKINPUTS, TTF2TFMINPUTS"
+.br
+.C "\&.rpl TTF2PKINPUTS, TTF2TFMINPUTS"
+.br
+.C "\&.tfm TFMFONTS"
+.br
+.C "\&.sfd TTF2PKINPUTS, TTF2TFMINPUTS"
+.PP
+And here the same for pre-3.2-versions of
+.B kpathsea:
+.PP
+.in +4m
+.ta 2i
+.C \&.ttf \ and "\ .ttc T1FONTS"
+.br
+.C "ttfonts.map TEXCONFIG"
+.br
+.C "\&.enc TEXPSHEADERS"
+.br
+.C "\&.rpl TEXPSHEADERS"
+.br
+.C "\&.tfm TFMFONTS"
+.br
+.C "\&.sfd TEXPSHEADERS"
+.PP
+Finally, the same for pre-3.0-versions:
+.PP
+.in +4m
+.ta 2i
+.C \&.ttf \ and "\ .ttc DVIPSHEADERS"
+.br
+.C "ttfonts.map TEXCONFIG"
+.br
+.C "\&.enc DVIPSHEADERS"
+.br
+.C "\&.rpl DVIPSHEADERS"
+.br
+.C "\&.tfm TFMFONTS"
+.br
+.C "\&.sfd DVIPSHEADERS"
+.PP
+Please consult the info files for
+.B kpathsea
+for details on these variables.
+The decision whether to use the old or the new scheme will be done
+during compilation.
+.PP
+You should set the
+.C TEXMFCNF
+variable to the directory where your
+.C texmf.cnf
+configuration file resides.
+.PP
+EMTEXDIR
+.PP
+Here the list of suffixes and its related environment variables to be
+set in
+.C autoexec.bat
+(resp. in
+.C config.sys
+for OS/2):
+.PP
+.in +4m
+.ta 2i
+.C \&.ttf \ and "\ .ttc TTFONTS"
+.br
+.C "ttfonts.map TTFCFG"
+.br
+.C "\&.enc TTFCFG"
+.br
+.C "\&.rpl TTFCFG"
+.br
+.C "\&.tfm TEXTFM"
+.br
+.C "\&.sfd TTFCFG"
+.PP
+If one of the variables isn't set, a warning message is emitted.
+The current directory will always be searched.
+As usual, one exclamation mark appended to a directory path causes
+subdirectories one level deep to be searched, two exclamation marks causes
+all subdirectories to be searched.
+Example:
+.PP
+.in +2m
+.C TTFONTS=c:\\\\fonts\\\\truetype!!;d:\\\\myfonts\\\\truetype!
+.PP
+Constructions like `\c
+.C c:\\\\fonts!!\\\\truetype '
+aren't possible.
+.
+.
+.SH PROBLEMS
+Most
+.B vptovf
+implementations allow only 100\ bytes for the
+.C TFM
+header (the limit is 1024 in the
+.C TFM
+file itself): 8\ bytes for checksum and design size, 40\ bytes for the
+family name, 20\ bytes for the encoding, and 4\ bytes for a face byte.
+There remain only 28\ bytes for some additional information which is used by
+.B ttf2tfm
+for an identification string (which is essentially a copy of the command
+line), and this limit is always exceeded.
+
+The optimal solution is to increase the value of
+.I \%max_header_bytes
+in the file
+.C vptovf.w
+(and probably
+.C pltotf.w
+too) to, say,\ 400
+and recompile
+.B vptovf
+(and
+.BR pltotf ).
+Otherwise you'll get some (harmless) error messages like
+.PP
+.in +2m
+.C "This HEADER index is too big for my present table size"
+.PP
+which can be safely ignored.
+.
+.
+.SH "SEE ALSO"
+.BR ttf2pk (1),
+.BR afm2tfm (1),
+.BR vptovf (1),
+.br
+the info pages for
+.B dvips
+and
+.B kpathsea
+.
+.
+.SH AVAILABILITY
+.B ttf2tfm
+is part of the FreeType package, a high quality TrueType rendering
+library.
+.
+.
+.SH AUTHORS
+Werner LEMBERG
+.C <wl@gnu.org>
+.br
+Frederic LOYER
+.C <loyer@ensta.fr>
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.c b/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.c
new file mode 100644
index 000000000..3a88eda75
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.c
@@ -0,0 +1,839 @@
+/*
+ * ttf2tfm.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>.
+ */
+
+/*
+ * This program converts TTF files to TeX TFM files, and optionally
+ * to TeX VPL files that retain all kerning and ligature information.
+ * Both files make the characters not normally encoded by TeX available
+ * by character codes greater than 0x7F.
+ */
+
+/*
+ * Adapted from afm2tfm by F. Loyer <loyer@ensta.fr>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h> /* for size_t */
+#include <string.h>
+
+#include "ttf2tfm.h"
+#include "newobj.h"
+#include "ttfenc.h"
+#include "ligkern.h"
+#include "texenc.h"
+#include "ttfaux.h"
+#include "tfmaux.h"
+#include "vplaux.h"
+#include "errormsg.h"
+#include "filesrch.h"
+#include "parse.h"
+#include "subfont.h"
+
+
+char ident[] = "ttf2tfm version 1.2";
+char progname[] = "ttf2tfm"; /* for error/warning messages */
+
+/* command line options */
+
+static char makevpl; /* can be 1 or 2 */
+static Boolean pedantic;
+static Boolean quiet;
+static Boolean forceoctal;
+
+
+/*
+ * Re-encode the TTF font.
+ */
+
+static void
+handlereencoding(Font *fnt)
+{
+ int i;
+ ttfinfo *ti;
+ char *p;
+
+
+ if (fnt->inencname)
+ {
+ fnt->inencoding = readencoding(&(fnt->inencname), fnt, True);
+
+ /* reset all pointers in the mapping table */
+ for (i = 0; i <= 0xFF; i++)
+ if (NULL != (ti = fnt->inencptrs[i]))
+ {
+ ti->incode = -1;
+ fnt->inencptrs[i] = NULL;
+ }
+
+ /*
+ * Reencode TTF <--> raw TeX. Only these code points will be used
+ * for the output encoding.
+ */
+
+ for (i = 0; i <= 0xFF; i++)
+ {
+ p = fnt->inencoding->vec[i];
+ if (p && *p)
+ if ((ti = findadobe(p, fnt->charlist)))
+ {
+ if (ti->incode >= 0)
+ {
+ warning("Character `%s' encoded twice in input encoding\n"
+ " (positions %x and %x; the latter is ignored).",
+ p, ti->incode, i);
+ fnt->inencoding->vec[i] = ".notdef";
+ continue;
+ }
+ if (ti->charcode >= 0)
+ {
+ ti->incode = i;
+ fnt->inencptrs[i] = ti;
+ }
+ }
+ else
+ {
+ warning("Cannot find character `%s'\n"
+ " specified in input encoding.", p);
+ }
+ }
+ fnt->codingscheme = fnt->inencoding->name;
+ }
+
+ if (!quiet)
+ {
+ if (fnt->inencname)
+ printf("\nUsing %s as input encoding.\n", fnt->inencname);
+ else
+ {
+ printf(
+ "\nUsing the first 256 glyphs in the following input encoding:\n\n");
+ for (i = 0; i <= 0xFF; i++)
+ {
+ if ((ti = fnt->inencptrs[i]))
+ printf(" 0x%02x %s\n", i, ti->adobename);
+ }
+ printf("\n");
+ }
+ }
+
+ if (fnt->outencname)
+ fnt->outencoding = readencoding(&(fnt->outencname), fnt, False);
+ else
+ fnt->outencoding = readencoding(NULL, fnt, False);
+}
+
+
+static void
+assignchars(Font *fnt)
+{
+ register char **p;
+ register int i, j, k;
+ register ttfinfo *ti;
+ int nextfree = 0x80;
+
+
+ /*
+ * First, we assign all those that match perfectly.
+ */
+
+ for (i = 0, p = fnt->outencoding->vec; i <= 0xFF; i++, p++)
+ if ((ti = findmappedadobe(*p, fnt->inencptrs)))
+ {
+ if (ti->outcode >= 0)
+ fnt->nextout[i] = ti->outcode; /* linked list */
+ ti->outcode = i;
+ fnt->outencptrs[i] = ti;
+ }
+ else if (strcmp(*p, ".notdef") != 0)
+ warning("Cannot map character `%s'\n"
+ " specified in output encoding.", *p);
+
+ if (pedantic)
+ goto end;
+
+ /*
+ * Next, we assign all the others, retaining the TTF code positions,
+ * possibly multiplying assigned characters, unless the output encoding
+ * was precisely specified.
+ */
+
+ for (i = 0; i <= 0xFF; i++)
+ if ((ti = fnt->inencptrs[i]) &&
+ ti->charcode >= 0 && ti->charcode <= 0xFF &&
+ ti->outcode < 0 && fnt->outencptrs[ti->charcode] == NULL)
+ {
+ ti->outcode = ti->charcode;
+ fnt->outencptrs[ti->charcode] = ti;
+ }
+
+ /*
+ * Finally, we map all remaining characters into free locations beginning
+ * with 0x80.
+ */
+
+ for (i = 0; i <= 0xFF; i++)
+ if ((ti = fnt->inencptrs[i]) && ti->outcode < 0)
+ {
+ while (fnt->outencptrs[nextfree])
+ {
+ nextfree = (nextfree + 1) & 0xFF;
+ if (nextfree == 0x80)
+ goto finishup; /* all slots full */
+ }
+ ti->outcode = nextfree;
+ fnt->outencptrs[nextfree] = ti;
+ }
+
+finishup:
+
+ /*
+ * Now, if any of the characters are encoded multiple times, we want
+ * ti->outcode to be the first one assigned, since that is most likely
+ * to be the most important one. So we reverse the above lists.
+ */
+
+ for (i = 0; i <= 0xFF; i++)
+ if ((ti = fnt->inencptrs[i]) && ti->outcode >= 0)
+ {
+ k = -1;
+ while (fnt->nextout[ti->outcode] >= 0)
+ {
+ j = fnt->nextout[ti->outcode];
+ fnt->nextout[ti->outcode] = k;
+ k = ti->outcode;
+ ti->outcode = j;
+ }
+ fnt->nextout[ti->outcode] = k;
+ }
+
+end:
+
+ if (!quiet)
+ {
+ printf("\nUsing the following output encoding:\n\n");
+ for (i = 0; i <= 0xFF; i++)
+ {
+ if ((ti = fnt->outencptrs[i]))
+ printf(" 0x%02x %s\n", i, ti->adobename);
+ }
+ printf("\n");
+ }
+}
+
+
+#define VERSION "\
+Copyright (C) 1997-1998 Frederic Loyer and Werner Lemberg.\n\
+There is NO warranty. You may redistribute this software\n\
+under the terms of the GNU General Public License\n\
+and the Dvips copyright.\n\
+\n\
+For more information about these matters, see the files\n\
+named COPYING and ttf2tfm.c.\n\
+\n\
+Primary authors of ttf2tfm: F. Loyer and W. Lemberg.\n\
+\n\
+ttf2tfm is based on afm2tfm from T. Rokicki\n\
+and the FreeType project from\n\
+David Turner, Robert Wilhelm, and Werner Lemberg.\n\
+"
+
+static void
+version(void)
+{
+ fputs(ident, stdout);
+ fprintf(stdout, " (%s)\n", TeX_search_version());
+ fputs(VERSION, stdout);
+ exit(0);
+}
+
+
+#define USAGE "\
+ Convert a TrueType font table to TeX's font metric format.\n\
+\n\
+-c REAL use REAL for height of small caps made with -V [0.8]\n\
+-e REAL widen (extend) characters by a factor of REAL [1.0]\n\
+-E INT select INT as the TTF encoding ID [1]\n\
+-f INT select INT as the font index in a TTC [0]\n\
+-n use PS names of TrueType font\n\
+-N use only PS names and no cmap\n\
+-O use octal for all character codes in the vpl file\n\
+-p ENCFILE[.enc] read ENCFILE for the TTF->raw TeX mapping\n\
+-P INT select INT as the TTF platform ID [3]\n\
+-q suppress informational output\n\
+-r OLDNAME NEWNAME replace glyph name OLDNAME with NEWNAME\n\
+-R RPLFILE[.rpl] read RPLFILE containing glyph replacement names\n\
+-s REAL oblique (slant) characters by REAL, usually <<1 [0.0]\n\
+-t ENCFILE[.enc] read ENCFILE for the encoding of the vpl file\n\
+-T ENCFILE[.enc] equivalent to -p ENCFILE -t ENCFILE\n\
+-u output only characters from encodings, nothing extra\n\
+-v FILE[.vpl] make a VPL file for conversion to VF\n\
+-V SCFILE[.vpl] like -v, but synthesize smallcaps as lowercase\n\
+--help print this message and exit\n\
+--version print version number and exit\n\
+"
+
+static void
+usage(void)
+{
+ fputs("Usage: ttf2tfm FILE[.ttf|.ttc] [OPTION]... [FILE[.tfm]]\n", stdout);
+ fputs(USAGE, stdout);
+ exit(0);
+}
+
+
+static void
+handle_options(int argc, char *argv[], Font *fnt)
+{
+ register int lastext;
+ register int i;
+ size_t l;
+ int arginc;
+ char *temp;
+ char c;
+ char *vpl_name = NULL;
+ int have_capheight = 0;
+ int have_sfd = 0;
+ int sfd_begin, postfix_begin;
+ int base_name;
+ stringlist* sl;
+
+
+ /* scan first whether the -q switch is set */
+ for (i = 1; i < argc; i++)
+ if (argv[i][0] == '-' && argv[i][1] == 'q')
+ quiet = True;
+
+ if (!quiet)
+ printf("This is %s\n", ident);
+
+#if defined(MSDOS) || defined(OS2) || defined(ATARIST)
+ /* Make VPL file identical to that created under Unix */
+ fnt->titlebuf = (char *)mymalloc(strlen(progname) + strlen(argv[1]) +
+ 1 + 1);
+ sprintf(fnt->titlebuf, "%s %s", progname, argv[1]);
+#else
+ fnt->titlebuf = (char *)mymalloc(strlen(argv[0]) + strlen(argv[1]) +
+ 1 + 1);
+ sprintf(fnt->titlebuf, "%s %s", argv[0], argv[1]);
+#endif
+
+
+ /*
+ * TrueType font name.
+ */
+
+ fnt->ttfname = newstring(argv[1]);
+
+ /*
+ * The other arguments. We delay the final processing of some switches
+ * until the tfm font name has been scanned -- if it contains two `@'s,
+ * many switches are ignored.
+ */
+
+ while (argc > 2 && *argv[2] == '-')
+ {
+ arginc = 2;
+ i = argv[2][1];
+
+ switch (i)
+ {
+ case 'v':
+ makevpl = 1;
+ if (argc <= 3)
+ oops("Missing parameter for -v option.");
+ if (vpl_name)
+ free(vpl_name);
+ vpl_name = newstring(argv[3]);
+ handle_extension(&vpl_name, ".vpl");
+ break;
+
+ case 'V':
+ makevpl = 2;
+ if (argc <= 3)
+ oops("Missing parameter for -V option.");
+ if (vpl_name)
+ free(vpl_name);
+ vpl_name = newstring(argv[3]);
+ handle_extension(&vpl_name, ".vpl");
+ break;
+
+ case 'f':
+ if (argc <= 3)
+ oops("Missing parameter for -f option.");
+ if (sscanf(argv[3], "%lu", &(fnt->fontindex)) == 0)
+ oops("Invalid font index.");
+ fnt->fontindexparam = argv[3];
+ break;
+
+ case 'E':
+ if (argc <= 3)
+ oops("Missing parameter for -E option.");
+ if (sscanf(argv[3], "%hu", &(fnt->eid)) == 0)
+ oops("Invalid encoding ID.");
+ fnt->eidparam = argv[3];
+ break;
+
+ case 'P':
+ if (argc <= 3)
+ oops("Missing parameter for -P option.");
+ if (sscanf(argv[3], "%hu", &(fnt->pid)) == 0)
+ oops("Invalid platform ID.");
+ fnt->pidparam = argv[3];
+ break;
+
+ case 'e':
+ if (argc <= 3)
+ oops("Missing parameter for -e option.");
+ if (sscanf(argv[3], "%f", &(fnt->efactor)) == 0 || fnt->efactor < 0.01)
+ oops("Bad extension factor.");
+ fnt->efactorparam = argv[3];
+ break;
+
+ case 'c':
+ if (argc <= 3)
+ oops("Missing parameter for -c option.");
+ have_capheight = 1;
+ if (sscanf(argv[3], "%f", &(fnt->capheight)) == 0)
+ fnt->capheight = 0;
+ break;
+
+ case 's':
+ if (argc <= 3)
+ oops("Missing parameter for -s option.");
+ if (sscanf(argv[3], "%f", &(fnt->slant)) == 0)
+ oops("Bad slant parameter.");
+ fnt->slantparam = argv[3];
+ break;
+
+ case 'p':
+ if (argc <= 3)
+ oops("Missing parameter for -p option.");
+ if (fnt->inencname)
+ free(fnt->inencname);
+ fnt->inencname = newstring(argv[3]);
+ break;
+
+ case 'T':
+ if (argc <= 3)
+ oops("Missing parameter for -T option.");
+ if (fnt->inencname)
+ free(fnt->inencname);
+ if (fnt->outencname)
+ free(fnt->outencname);
+ fnt->inencname = newstring(argv[3]);
+ fnt->outencname = newstring(argv[3]);
+ break;
+
+ case 't':
+ if (argc <= 3)
+ oops("Missing parameter for -T option.");
+ if (fnt->outencname)
+ free(fnt->outencname);
+ fnt->outencname = newstring(argv[3]);
+ break;
+
+ case 'r':
+ if (argc <= 4)
+ oops("Not enough parameters for -r option.");
+ sl = newstringlist();
+ sl->old_name = newstring(argv[3]);
+ sl->new_name = newstring(argv[4]);
+ sl->single_replacement = True;
+ sl->next = fnt->replacements;
+ fnt->replacements = sl;
+ arginc = 3;
+ break;
+
+ case 'R':
+ if (argc <= 3)
+ oops("Missing parameter for -R option.");
+ if (fnt->replacementname)
+ free(fnt->replacementname);
+ fnt->replacementname = newstring(argv[3]);
+ break;
+
+ case 'O':
+ forceoctal = True;
+ arginc = 1;
+ break;
+
+ case 'n':
+ fnt->PSnames = Yes;
+ arginc = 1;
+ break;
+
+ case 'N':
+ fnt->PSnames = Only;
+ arginc = 1;
+ break;
+
+ case 'u':
+ pedantic = True;
+ arginc = 1;
+ break;
+
+ case 'q':
+ quiet = True;
+ arginc = 1;
+ break;
+
+ default:
+ if (argc <= 3 || argv[3][0] == '-')
+ {
+ warning("Unknown option `%s' will be ignored.\n", argv[2]);
+ arginc = 1;
+ }
+ else
+ warning("Unknown option `%s %s' will be ignored.\n",
+ argv[2], argv[3]);
+ }
+
+ for (i = 0; i < arginc; i++)
+ {
+ l = strlen(fnt->titlebuf);
+ fnt->titlebuf = (char *)myrealloc((void *)fnt->titlebuf,
+ l + strlen(argv[2]) + 1 + 1);
+ sprintf(fnt->titlebuf + strlen(fnt->titlebuf), " %s", argv[2]);
+ argv++;
+ argc--;
+ }
+ }
+
+ /* Read replacement glyph name file */
+
+ get_replacements(fnt);
+
+ if (argc > 3 || (argc == 3 && *argv[2] == '-'))
+ oops("Need at most two non-option arguments.");
+
+ /*
+ * The tfm file name.
+ */
+
+ if (argc == 2)
+ temp = newstring(fnt->ttfname);
+ else
+ {
+ temp = newstring(argv[2]);
+ l = strlen(fnt->titlebuf);
+ fnt->titlebuf = (char *)myrealloc((void *)fnt->titlebuf,
+ l + strlen(argv[2]) + 1 + 1);
+ sprintf(fnt->titlebuf + strlen(fnt->titlebuf), " %s", argv[2]);
+ }
+
+ handle_sfd(temp, &sfd_begin, &postfix_begin);
+
+ if (sfd_begin > -1)
+ {
+ have_sfd = True;
+ i = sfd_begin - 2;
+ }
+ else
+ i = strlen(temp) - 1;
+
+ /*
+ * Now we search the beginning of the name without directory.
+ */
+
+ for (; i >= 0; i--)
+ if (temp[i] == '/' || temp[i] == ':' || temp[i] == '\\')
+ break;
+
+ base_name = i + 1;
+
+ /*
+ * We store the path (with the final directory separator).
+ */
+
+ if (base_name > 0)
+ {
+ c = temp[base_name];
+ temp[base_name] = '\0';
+ fnt->tfm_path = newstring(temp);
+ temp[base_name] = c;
+ }
+
+ if (have_sfd)
+ {
+ /* the prefix and the sfd file name */
+
+ if (temp[base_name])
+ fnt->outname = newstring(temp + base_name);
+
+ fnt->sfdname = newstring(temp + sfd_begin);
+ }
+ else
+ postfix_begin = base_name;
+
+ /*
+ * Get the extension.
+ */
+
+ lastext = -1;
+ for (i = postfix_begin; temp[i]; i++)
+ if (temp[i] == '.')
+ lastext = i;
+
+ if (argc == 2 && lastext >= 0)
+ {
+ temp[lastext] = '\0'; /* remove TTF file extension */
+ lastext = -1;
+ }
+
+ if (lastext == -1)
+ fnt->tfm_ext = newstring(".tfm");
+ else
+ {
+ fnt->tfm_ext = newstring(temp + lastext);
+ temp[lastext] = '\0';
+ }
+
+ if (have_sfd)
+ {
+ if (temp[postfix_begin])
+ fnt->outname_postfix = newstring(temp + postfix_begin);
+ }
+ else
+ {
+ if (temp[base_name])
+ fnt->outname = newstring(temp + base_name);
+ else
+ oops("Invalid tfm file name.");
+ }
+
+
+ /*
+ * Now we can process the remaining parameters.
+ */
+
+ if (have_sfd)
+ {
+ if (makevpl)
+ {
+ warning("Ignoring `-v' and `-V' switches for subfonts.");
+ makevpl = 0;
+ }
+ if (have_capheight)
+ warning("Ignoring `-c' switch for subfonts.");
+ if (fnt->inencname || fnt->outencname)
+ {
+ warning("Ignoring `-p', `-t', and `-T' switches for subfonts.");
+ fnt->inencname = NULL;
+ fnt->outencname = NULL;
+ }
+ if (fnt->PSnames)
+ {
+ warning("Ignoring `-n' or '-N' switch for subfonts.");
+ fnt->PSnames = No;
+ }
+
+ init_sfd(fnt, True);
+ }
+ else
+ {
+ if (have_capheight && fnt->capheight < 0.01)
+ oops("Bad small caps height.");
+
+ if (vpl_name)
+ if ((fnt->vplout = fopen(vpl_name, "wt")) == NULL)
+ oops("Cannot open vpl output file.");
+ }
+
+ if (fnt->PSnames == Only)
+ {
+ if (fnt->pidparam || fnt->eidparam)
+ {
+ warning("Ignoring `-P' and `-E' options if `-N' switch is selected.");
+ fnt->pidparam = NULL;
+ fnt->eidparam = NULL;
+ }
+ }
+
+ if (vpl_name)
+ free(vpl_name);
+ free(temp);
+}
+
+
+/*
+ * This routine prints out the line that needs to be added to ttfonts.map.
+ */
+
+static void
+consttfonts(Font *fnt)
+{
+ if (!quiet)
+ printf("\n");
+ printf("%s", fnt->outname);
+ if (fnt->sfdname)
+ printf("@%s@", fnt->sfdname);
+ if (fnt->outname_postfix)
+ printf("%s", fnt->outname_postfix);
+
+ printf(" %s", fnt->ttfname);
+
+ if (fnt->slantparam || fnt->efactorparam ||
+ fnt->inencname ||
+ fnt->pidparam || fnt->eidparam ||
+ fnt->fontindexparam ||
+ fnt->replacements ||
+ fnt->replacementname ||
+ fnt->PSnames)
+ {
+ if (fnt->slantparam)
+ printf(" Slant=%s", fnt->slantparam);
+ if (fnt->efactorparam)
+ printf(" Extend=%s", fnt->efactorparam);
+ if (fnt->inencname)
+ printf(" Encoding=%s", fnt->inencname);
+ if (fnt->pidparam)
+ printf(" Pid=%s", fnt->pidparam);
+ if (fnt->eidparam)
+ printf(" Eid=%s", fnt->eidparam);
+ if (fnt->fontindexparam)
+ printf(" Fontindex=%s", fnt->fontindexparam);
+ if (fnt->PSnames)
+ printf(" PS=%s", fnt->PSnames == Yes ? "Yes" : "Only");
+ if (fnt->replacementname && fnt->inencoding)
+ printf(" Replacement=%s", fnt->replacementname);
+ if (fnt->replacements && fnt->inencoding)
+ {
+ stringlist *sl;
+
+
+ for (sl = fnt->replacements; sl; sl = sl->next)
+ if (sl->single_replacement)
+ printf(" %s=%s", sl->old_name, sl->new_name);
+ }
+ }
+ printf("\n");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ Font font;
+ ttfinfo *ti;
+
+
+ init_font_structure(&font);
+
+ TeX_search_init(argv[0], "ttf2tfm", "TTF2TFM");
+
+ if (argc == 1)
+ {
+ fputs("ttf2tfm: Need at least one file argument.\n", stderr);
+ fputs("Try `ttf2tfm --help' for more information.\n", stderr);
+ exit(1);
+ }
+ if (argc == 2)
+ {
+ if (strcmp(argv[1], "--help") == 0)
+ usage();
+ else if (strcmp(argv[1], "--version") == 0)
+ version();
+ }
+
+ handle_options(argc, argv, &font);
+
+ if (font.sfdname)
+ {
+ while (get_sfd(&font))
+ {
+ char *temp;
+ int i, start, end, len;
+
+
+ get_tfm_fullname(&font);
+
+ /*
+ * Extract base name of sfd file.
+ */
+
+ temp = newstring(font.sfdname);
+ len = strlen(temp);
+
+ start = 0;
+ for (i = len - 1; i >= 0; i--)
+ if (temp[i] == '/' || temp[i] == ':' || temp[i] == '\\')
+ {
+ start = i + 1;
+ break;
+ }
+
+ end = len;
+ for (i = len - 1; i >= 0; i--)
+ if (temp[i] == '.')
+ {
+ end = i;
+ break;
+ }
+ temp[end] = '\0';
+
+ font.codingscheme = (char *)mymalloc(strlen(temp + start) + 4 + 1);
+ sprintf(font.codingscheme, "CJK-%s", temp + start);
+ free(temp);
+
+ readttf(&font, quiet, True);
+ if (font.replacements)
+ warning("Replacement glyphs will be ignored.");
+
+ if (NULL != (ti = findadobe("space", font.charlist)))
+ font.fontspace = ti->width;
+ else if (NULL != (ti = findadobe(".c0x20", font.charlist)))
+ font.fontspace = ti->width;
+ else
+ font.fontspace = transform(500, 0, font.efactor, font.slant);
+
+ if (buildtfm(&font, True))
+ writetfm(&font);
+ }
+
+ close_sfd();
+ }
+ else
+ {
+ get_tfm_fullname(&font);
+
+ readttf(&font, quiet, False);
+ replace_glyphs(&font);
+
+ if (NULL != (ti = findadobe("space", font.charlist)))
+ font.fontspace = ti->width;
+ else if (NULL != (ti = findadobe(".c0x20", font.charlist)))
+ font.fontspace = ti->width;
+ else
+ font.fontspace = transform(500, 0, font.efactor, font.slant);
+
+ handlereencoding(&font);
+
+ buildtfm(&font, False);
+ writetfm(&font);
+ }
+
+ if (makevpl)
+ {
+ assignchars(&font);
+ if (makevpl > 1)
+ upmap(&font);
+ writevpl(&font, makevpl, forceoctal);
+ fclose(font.vplout);
+ }
+
+ consttfonts(&font);
+
+ exit(0); /* for safety reasons */
+ return 0; /* never reached */
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.h b/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.h
new file mode 100644
index 000000000..b55501780
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttf2tfm.h
@@ -0,0 +1,231 @@
+/*
+ * ttf2tfm.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef TTF2TFM_H
+#define TTF2TFM_H
+
+#include <stdio.h>
+
+
+enum Boolean_
+{
+ False = 0,
+ True = 1
+};
+typedef enum Boolean_ Boolean;
+
+enum PSstate_
+{
+ No = 0,
+ Yes = 1,
+ Only = 2
+};
+typedef enum PSstate_ PSstate;
+
+
+struct _encoding
+{
+ char *name;
+ char *vec[256];
+};
+typedef struct _encoding encoding;
+
+
+/*
+ * This is what we store character data in.
+ */
+
+struct _ttfinfo;
+typedef struct _ttfinfo ttfinfo;
+struct _lig;
+typedef struct _lig lig;
+struct _kern;
+typedef struct _kern kern;
+struct _ttfptr;
+typedef struct _ttfptr ttfptr;
+struct _pcc;
+typedef struct _pcc pcc;
+struct _stringlist;
+typedef struct _stringlist stringlist;
+
+
+
+struct _ttfinfo
+{
+ ttfinfo *next;
+ long charcode; /* the TTF character code (or glyph index */
+ /* if bit 17 is set) */
+ unsigned short glyphindex; /* the TTF glyph number */
+ short incode; /* the code position in the raw TeX font */
+ short outcode; /* the code position in the virtual font */
+ char *adobename;
+
+ short width;
+ short llx, lly, urx, ury;
+
+ lig *ligs;
+ kern *kerns;
+ ttfptr *kern_equivs;
+ Boolean constructed;
+ pcc *pccs; /* we use the composite feature for */
+ /* `germandbls' <--> `SS' only */
+ unsigned char wptr, hptr, dptr, iptr;
+};
+
+
+struct _lig
+{
+ lig *next;
+ char *succ, *sub;
+ short op, boundleft;
+};
+
+
+struct _kern
+{
+ kern *next;
+ char *succ;
+ short delta;
+};
+
+
+struct _ttfptr
+{
+ ttfptr *next;
+ ttfinfo *ch;
+};
+
+
+struct _pcc
+{
+ pcc *next;
+ char *partname;
+ short xoffset, yoffset;
+};
+
+
+struct _stringlist
+{
+ stringlist* next;
+ char *old_name;
+ char *new_name;
+ Boolean single_replacement;
+};
+
+
+struct _Font
+{
+ char *ttfname;
+
+ /*
+ * Full path and extension of the tfm file
+ */
+
+ char *tfm_path;
+ char *tfm_ext;
+
+ /*
+ * The final tfm name is composed of the following three parts.
+ */
+
+ char *outname; /* only namestem without extension */
+ char *subfont_name; /* NULL if not used */
+ char *outname_postfix; /* NULL if not used */
+ char *fullname; /* outname + subfont_name + outname_postfix */
+
+ FILE *vplout;
+ FILE *tfmout;
+
+ /*
+ * The input encoding maps from the TrueType font to the raw TeX font.
+ */
+
+ char *inencname; /* name of input encoding file */
+ encoding *inencoding; /* the input encoding vector */
+ ttfinfo *inencptrs[256]; /* the input mapping table. Will be
+ filled initially with the first
+ 256 characters in the selected
+ cmap of the TrueType font */
+ stringlist *replacements; /* replacements for glyph names given
+ with the -r option on the command
+ line */
+ char *replacementname; /* name of replacement file */
+
+ /*
+ * The output encoding maps from the raw TeX font to the virtual font.
+ */
+
+ char *outencname; /* name of output encoding file */
+ encoding *outencoding; /* the output encoding vector */
+ ttfinfo *outencptrs[256]; /* the output mapping table */
+
+ short nextout[256]; /* for characters encoded multiple times
+ in output */
+
+ Boolean sawligkern; /* there were LIGKERN lines in the
+ output encoding file */
+
+ ttfinfo *charlist; /* a linked list of all valid chars */
+
+ ttfinfo *uppercase[256]; /* needed for small caps fonts */
+ ttfinfo *lowercase[256]; /* ditto */
+
+ short boundarychar; /* the boundary character */
+ char *codingscheme; /* coding scheme for TeX */
+ char *titlebuf;
+
+ /*
+ * The name of the subfont definition file.
+ */
+
+ char *sfdname;
+ long sf_code[256];
+
+ /*
+ * We get the following three values from the TTF's postscript table.
+ */
+
+ short units_per_em;
+ float italicangle;
+ char fixedpitch;
+
+ unsigned long fontindex; /* font number in TTC */
+
+ unsigned short pid; /* the TTF platform ID */
+ unsigned short eid; /* the TTF encoding ID */
+
+ short xheight; /* xheight for TeX */
+ short fontspace; /* font space for TeX */
+
+ /*
+ * These values can be specified on the command line.
+ */
+
+ float efactor; /* to extend the glyphs horizontally */
+ float slant; /* to slant the font */
+ float capheight; /* the height of small caps glyphs */
+ PSstate PSnames; /* we use the PS names in the TTF */
+
+ /*
+ * The command line parameter strings.
+ */
+
+ char *efactorparam;
+ char *slantparam;
+ char *fontindexparam;
+ char *pidparam;
+ char *eidparam;
+};
+typedef struct _Font Font;
+
+#endif /* TEX2TFM_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttfaux.c b/xc/extras/FreeType/contrib/ttf2pk/ttfaux.c
new file mode 100644
index 000000000..3c7b0d14a
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttfaux.c
@@ -0,0 +1,505 @@
+/*
+ * ttfaux.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+#include "freetype.h"
+#include "extend/ftxkern.h" /* we are in the FreeType package tree */
+#include "extend/ftxpost.h"
+
+#include "ttf2tfm.h"
+#include "newobj.h"
+#include "ligkern.h"
+#include "ttfenc.h"
+#include "tfmaux.h"
+#include "errormsg.h"
+#include "ttfaux.h"
+#include "filesrch.h"
+
+
+#define Macintosh_platform 1
+#define Macintosh_encoding 0
+
+#define Microsoft_platform 3
+#define Microsoft_Unicode_encoding 1
+
+
+extern char progname[];
+
+char *real_ttfname;
+
+TT_Engine engine;
+TT_Face face;
+TT_Instance instance;
+TT_Glyph glyph;
+TT_Outline outline;
+TT_CharMap char_map;
+
+TT_Glyph_Metrics metrics;
+TT_Face_Properties properties;
+TT_BBox bbox;
+
+TT_Kerning directory;
+TT_Post post;
+
+
+
+static void
+readttf_kern(Font *fnt)
+{
+ register kern *nk;
+ register ttfinfo *ti;
+ TT_Kern_0_Pair* pairs0;
+ TT_Error error;
+ unsigned int i, j;
+
+
+ if ((error = TT_Get_Kerning_Directory(face, &directory)))
+ oops("Cannot get kerning directory (error code = 0x%x).", error);
+
+ if (directory.nTables == 0)
+ return;
+
+ for (i = 0; i < directory.nTables; i++)
+ {
+ if ((error = TT_Load_Kerning_Table(face, i)))
+ oops("Cannot load kerning table (error code = 0x%x).", error);
+
+ switch (directory.tables->format)
+ {
+ case 0:
+ pairs0 = directory.tables->t.kern0.pairs;
+ for (j = 0; j < directory.tables->t.kern0.nPairs; j++, pairs0++)
+ {
+ ti = findglyph(pairs0->left, fnt->charlist);
+ if (ti == NULL)
+ warning("kern char not found");
+ else
+ {
+ nk = newkern();
+ nk->succ = findglyph(pairs0->right, fnt->charlist)->adobename;
+ nk->delta = transform(pairs0->value * 1000 / fnt->units_per_em, 0,
+ fnt->efactor, fnt->slant);
+ nk->next = ti->kerns;
+ ti->kerns = nk;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ return;
+}
+
+
+void
+readttf(Font *fnt, Boolean quiet, Boolean only_range)
+{
+ TT_Error error;
+ ttfinfo *ti, *Ti;
+ long Num, index;
+ unsigned int i, j;
+ long k, max_k;
+ unsigned short num_cmap;
+ unsigned short cmap_plat, cmap_enc;
+ int index_array[257];
+
+ static Boolean initialized = False;
+
+
+ /*
+ * We allocate a placeholder boundary and the `.notdef' character.
+ */
+
+ if (!only_range)
+ {
+ ti = newchar(fnt);
+ ti->charcode = -1;
+ ti->adobename = ".notdef";
+
+ ti = newchar(fnt);
+ ti->charcode = -1;
+ ti->adobename = "||"; /* boundary character name */
+ }
+
+ /*
+ * Initialize FreeType engine.
+ */
+
+ if (!initialized)
+ {
+ if ((error = TT_Init_FreeType(&engine)))
+ oops("Cannot initialize engine (error code = 0x%x).", error);
+
+ if ((error = TT_Init_Kerning_Extension(engine)))
+ oops("Cannot initialize kerning (error code = 0x%x).", error);
+
+ if (fnt->PSnames)
+ if ((error = TT_Init_Post_Extension(engine)))
+ oops("Cannot initialize PS name support (error code = 0x%x).", error);
+
+ /*
+ * Load face.
+ */
+
+ real_ttfname = TeX_search_ttf_file(&(fnt->ttfname));
+ if (!real_ttfname)
+ oops("Cannot find `%s'.", fnt->ttfname);
+
+ if ((error = TT_Open_Face(engine, real_ttfname, &face)))
+ oops("Cannot open `%s'.", real_ttfname);
+
+ /*
+ * Get face properties and allocate preload arrays.
+ */
+
+ TT_Get_Face_Properties(face, &properties);
+
+ /*
+ * Now we try to open the proper font in a collection.
+ */
+
+ if (fnt->fontindex != 0)
+ {
+ if(properties.num_Faces == 1)
+ {
+ warning("This isn't a TrueType collection.\n"
+ "Parameter `-f' is ignored.");
+ fnt->fontindex = 0;
+ fnt->fontindexparam = NULL;
+ }
+ else
+ {
+ TT_Close_Face(face);
+ if ((error = TT_Open_Collection(engine, real_ttfname,
+ fnt->fontindex, &face)))
+ oops("Cannot open font %lu in TrueType Collection `%s'.",
+ fnt->fontindex, real_ttfname);
+ }
+ }
+
+ /*
+ * Create instance.
+ */
+
+ if ((error = TT_New_Instance(face, &instance)))
+ oops("Cannot create instance for `%s' (error code = 0x%x).",
+ real_ttfname, error);
+
+ /*
+ * We use a dummy glyph size of 10pt.
+ */
+
+ if ((error = TT_Set_Instance_CharSize(instance, 10 * 64)))
+ oops("Cannot set character size (error code = 0x%x).", error);
+
+ /*
+ * Create glyph container.
+ */
+
+ if ((error = TT_New_Glyph(face, &glyph)))
+ oops("Cannot create glyph container (error code = 0x%x).", error);
+
+ fnt->units_per_em = properties.header->Units_Per_EM;
+ fnt->fixedpitch = properties.postscript->isFixedPitch;
+ fnt->italicangle = properties.postscript->italicAngle / 65536.0;
+
+ if (fnt->PSnames != Only)
+ {
+ num_cmap = properties.num_CharMaps;
+ for (i = 0; i < num_cmap; i++)
+ {
+ if ((error = TT_Get_CharMap_ID(face, i, &cmap_plat, &cmap_enc)))
+ oops("Cannot query cmap (error code = 0x%x).", error);
+ if (cmap_plat == fnt->pid && cmap_enc == fnt->eid)
+ break;
+ }
+ if (i == num_cmap)
+ {
+ fprintf(stderr, "%s: ERROR: Invalid platform and/or encoding ID.\n",
+ progname);
+ if (num_cmap == 1)
+ fprintf(stderr, " The only valid PID/EID pair is");
+ else
+ fprintf(stderr, " Valid PID/EID pairs are:\n");
+ for (i = 0; i < num_cmap; i++)
+ {
+ TT_Get_CharMap_ID(face, i, &cmap_plat, &cmap_enc);
+ fprintf(stderr, " (%i,%i)\n", cmap_plat, cmap_enc);
+ }
+ fprintf(stderr, "\n");
+ exit(1);
+ }
+
+ if ((error = TT_Get_CharMap(face, i, &char_map)))
+ oops("Cannot load cmap (error code = 0x%x).", error);
+ }
+
+ if (fnt->PSnames)
+ {
+ if ((error = TT_Load_PS_Names(face, &post)))
+ oops("Cannot load TrueType PS names (error code = 0x%x).", error);
+ }
+ else if (cmap_plat == Microsoft_platform &&
+ cmap_enc == Microsoft_Unicode_encoding)
+ set_encoding_scheme(encUnicode, fnt);
+ else if (cmap_plat == Macintosh_platform &&
+ cmap_enc == Macintosh_encoding)
+ set_encoding_scheme(encMac, fnt);
+ else
+ set_encoding_scheme(encFontSpecific, fnt);
+
+ initialized = True;
+ }
+
+ if (!quiet)
+ {
+ if (only_range)
+ printf("\n\n%s:\n", fnt->fullname);
+ printf("\n");
+ printf("Glyph Code Glyph Name ");
+ printf("Width llx lly urx ury\n");
+ printf("---------------------------------------");
+ printf("---------------------------------\n");
+ }
+
+ /*
+ * We load only glyphs with a valid cmap entry. Nevertheless, for
+ * the default mapping, we use the first 256 glyphs addressed by
+ * ascending code points, followed by glyphs not in the cmap.
+ *
+ * If we compute a range, we take the character codes given in
+ * the fnt->sf_code array.
+ *
+ * If the -N flag is set, no cmap is used at all. Instead, the
+ * first 256 glyphs (with a valid PS name) are used for the default
+ * mapping.
+ */
+
+ if (!only_range)
+ for (i = 0; i < 257; i++)
+ index_array[i] = 0;
+ else
+ for (i = 0; i < 256; i++)
+ fnt->inencptrs[i] = 0;
+
+ j = 0;
+ if (fnt->PSnames == Only)
+ max_k = properties.num_Glyphs - 1;
+ else
+ max_k = only_range ? 0xFF : 0xFFFF;
+
+ for (k = 0; k <= max_k; k++)
+ {
+ char *an;
+
+
+ if (fnt->PSnames != Only)
+ {
+ if (only_range)
+ {
+ index = fnt->sf_code[k];
+ if (index < 0)
+ continue;
+ j = k;
+ }
+ else
+ index = k;
+
+ Num = TT_Char_Index(char_map, index);
+
+ if (Num < 0)
+ oops("Failure on cmap mapping from %s.", fnt->ttfname);
+ if (Num == 0)
+ continue;
+ if (!only_range)
+ if (Num <= 256)
+ index_array[Num] = 1;
+ }
+ else
+ {
+ Num = k;
+ index = 0;
+ }
+
+ error = TT_Load_Glyph(instance, glyph, Num, 0);
+ if (!error)
+ error = TT_Get_Glyph_Metrics(glyph, &metrics);
+ if (!error)
+ error = TT_Get_Glyph_Outline(glyph, &outline);
+ if (!error)
+ error = TT_Get_Outline_BBox(&outline, &bbox); /* we need the non-
+ grid-fitted bbox */
+ if (!error)
+ {
+ if (fnt->PSnames)
+ (void)TT_Get_PS_Name(face, Num, &an);
+ else
+ an = code_to_adobename(index);
+
+ /* ignore characters not usable for typesetting with TeX */
+
+ if (strcmp(an, ".notdef") == 0)
+ continue;
+ if (strcmp(an, ".null") == 0)
+ continue;
+ if (strcmp(an, "nonmarkingreturn") == 0)
+ continue;
+
+ ti = newchar(fnt);
+ ti->charcode = index;
+ ti->glyphindex = Num;
+ ti->adobename = an;
+ ti->llx = bbox.xMin * 1000 / fnt->units_per_em;
+ ti->lly = bbox.yMin * 1000 / fnt->units_per_em;
+ ti->llx = transform(ti->llx, ti->lly, fnt->efactor, fnt->slant);
+ ti->urx = bbox.xMax * 1000 / fnt->units_per_em;
+ ti->ury = bbox.yMax * 1000 / fnt->units_per_em;
+ ti->urx = transform(ti->urx, ti->ury, fnt->efactor, fnt->slant);
+
+ /*
+ * We need to avoid negative heights or depths. They break accents
+ * in math mode, among other things.
+ */
+
+ if (ti->lly > 0)
+ ti->lly = 0;
+ if (ti->ury < 0)
+ ti->ury = 0;
+ ti->width = transform(metrics.advance * 1000 / fnt->units_per_em, 0,
+ fnt->efactor, fnt->slant);
+
+ if (!quiet)
+ printf("%5ld %04lx %-25s %5d % 5d,% 5d -- % 5d,% 5d\n",
+ Num, index, ti->adobename,
+ ti->width,
+ ti->llx, ti->lly, ti->urx, ti->ury);
+
+ if (j < 256)
+ {
+ fnt->inencptrs[j] = ti;
+ ti->incode = j;
+ }
+ j++;
+ }
+ }
+
+
+ /*
+ * Now we load glyphs without a cmap entry, provided some slots are
+ * still free -- we skip this if we have to compute a range or use
+ * PS names.
+ */
+
+ if (!only_range && !fnt->PSnames)
+ {
+ for (i = 1; i <= properties.num_Glyphs; i++)
+ {
+ char *an;
+
+
+ if (index_array[i] == 0)
+ {
+ error = TT_Load_Glyph(instance, glyph, i, 0);
+ if (!error)
+ error = TT_Get_Glyph_Metrics(glyph, &metrics);
+ if (!error)
+ error = TT_Get_Glyph_Outline(glyph, &outline);
+ if (!error)
+ error = TT_Get_Outline_BBox(&outline, &bbox);
+ if (!error)
+ {
+ an = code_to_adobename(i | 0x10000);
+
+ ti = newchar(fnt);
+ ti->charcode = i | 0x10000;
+ ti->glyphindex = i;
+ ti->adobename = an;
+ ti->llx = bbox.xMin * 1000 / fnt->units_per_em;
+ ti->lly = bbox.yMin * 1000 / fnt->units_per_em;
+ ti->llx = transform(ti->llx, ti->lly, fnt->efactor, fnt->slant);
+ ti->urx = bbox.xMax * 1000 / fnt->units_per_em;
+ ti->ury = bbox.yMax * 1000 / fnt->units_per_em;
+ ti->urx = transform(ti->urx, ti->ury, fnt->efactor, fnt->slant);
+
+ if (ti->lly > 0)
+ ti->lly = 0;
+ if (ti->ury < 0)
+ ti->ury = 0;
+ ti->width = transform(metrics.advance * 1000 / fnt->units_per_em, 0,
+ fnt->efactor, fnt->slant);
+
+ if (!quiet)
+ printf("%5d %-25s %5d % 5d,% 5d -- % 5d,% 5d\n",
+ i, ti->adobename,
+ ti->width,
+ ti->llx, ti->lly, ti->urx, ti->ury);
+
+ if (j < 256)
+ {
+ fnt->inencptrs[j] = ti;
+ ti->incode = j;
+ }
+ else
+ break;
+ j++;
+ }
+ }
+ }
+ }
+
+ /* Finally, we construct a `Germandbls' glyph if necessary */
+
+ if (!only_range)
+ {
+ if (NULL == findadobe("Germandbls", fnt->charlist) &&
+ NULL != (Ti = findadobe("S", fnt->charlist)))
+ {
+ pcc *np, *nq;
+
+
+ ti = newchar(fnt);
+ ti->charcode = properties.num_Glyphs | 0x10000;
+ ti->glyphindex = properties.num_Glyphs;
+ ti->adobename = "Germandbls";
+ ti->width = Ti->width << 1;
+ ti->llx = Ti->llx;
+ ti->lly = Ti->lly;
+ ti->urx = Ti->width + Ti->urx;
+ ti->ury = Ti->ury;
+ ti->kerns = Ti->kerns;
+
+ np = newpcc();
+ np->partname = "S";
+ nq = newpcc();
+ nq->partname = "S";
+ nq->xoffset = Ti->width;
+ np->next = nq;
+ ti->pccs = np;
+ ti->constructed = True;
+
+ if (!quiet)
+ printf("* %-25s %5d % 5d,% 5d -- % 5d,% 5d\n",
+ ti->adobename,
+ ti->width,
+ ti->llx, ti->lly, ti->urx, ti->ury);
+ }
+ }
+
+ /* kerning between subfonts isn't available */
+ if (!only_range)
+ readttf_kern(fnt);
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttfaux.h b/xc/extras/FreeType/contrib/ttf2pk/ttfaux.h
new file mode 100644
index 000000000..5d8a45b9f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttfaux.h
@@ -0,0 +1,21 @@
+/*
+ * ttfaux.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef TTFAUX_H
+#define TTFAUX_H
+
+#include "ttf2tfm.h"
+
+void readttf(Font *fnt, Boolean quiet, Boolean only_range);
+
+#endif /* TTFAUX_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttfenc.c b/xc/extras/FreeType/contrib/ttf2pk/ttfenc.c
new file mode 100644
index 000000000..5683e084f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttfenc.c
@@ -0,0 +1,1281 @@
+/*
+ * ttfenc.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "newobj.h"
+#include "ttf2tfm.h"
+#include "ttfenc.h"
+#include "errormsg.h"
+
+EncodingScheme current_encoding_scheme;
+
+struct encoding_table
+{
+ long code;
+ char *adobename;
+};
+
+struct encoding_table unicode_table[] =
+{
+ {-1, ".notdef"},
+
+ {0x0020, "space"},
+ {0x0021, "exclam"},
+ {0x0022, "quotedbl"},
+ {0x0023, "numbersign"},
+ {0x0024, "dollar"},
+ {0x0025, "percent"},
+ {0x0026, "ampersand"},
+ {0x0027, "quotesingle"},
+ {0x0028, "parenleft"},
+ {0x0029, "parenright"},
+ {0x002a, "asterisk"},
+ {0x002b, "plus"},
+ {0x002c, "comma"},
+ {0x002d, "hyphen"}, /* cf "minus" */
+ {0x002e, "period"},
+ {0x002f, "slash"},
+
+ {0x0030, "zero"},
+ {0x0031, "one"},
+ {0x0032, "two"},
+ {0x0033, "three"},
+ {0x0034, "four"},
+ {0x0035, "five"},
+ {0x0036, "six"},
+ {0x0037, "seven"},
+ {0x0038, "eight"},
+ {0x0039, "nine"},
+ {0x003a, "colon"},
+ {0x003b, "semicolon"},
+ {0x003c, "less"},
+ {0x003d, "equal"},
+ {0x003e, "greater"},
+ {0x003f, "question"},
+
+ {0x0040, "at"},
+ {0x0041, "A"},
+ {0x0042, "B"},
+ {0x0043, "C"},
+ {0x0044, "D"},
+ {0x0045, "E"},
+ {0x0046, "F"},
+ {0x0047, "G"},
+ {0x0048, "H"},
+ {0x0049, "I"},
+ {0x004a, "J"},
+ {0x004b, "K"},
+ {0x004c, "L"},
+ {0x004d, "M"},
+ {0x004e, "N"},
+ {0x004f, "O"},
+
+ {0x0050, "P"},
+ {0x0051, "Q"},
+ {0x0052, "R"},
+ {0x0053, "S"},
+ {0x0054, "T"},
+ {0x0055, "U"},
+ {0x0056, "V"},
+ {0x0057, "W"},
+ {0x0058, "X"},
+ {0x0059, "Y"},
+ {0x005a, "Z"},
+ {0x005b, "bracketleft"},
+ {0x005c, "backslash"},
+ {0x005d, "bracketright"},
+ {0x005e, "asciicircum"},
+ {0x005f, "underscore"},
+
+ {0x0060, "grave"},
+ {0x0061, "a"},
+ {0x0062, "b"},
+ {0x0063, "c"},
+ {0x0064, "d"},
+ {0x0065, "e"},
+ {0x0066, "f"},
+ {0x0067, "g"},
+ {0x0068, "h"},
+ {0x0069, "i"},
+ {0x006a, "j"},
+ {0x006b, "k"},
+ {0x006c, "l"},
+ {0x006d, "m"},
+ {0x006e, "n"},
+ {0x006f, "o"},
+
+ {0x0070, "p"},
+ {0x0071, "q"},
+ {0x0072, "r"},
+ {0x0073, "s"},
+ {0x0074, "t"},
+ {0x0075, "u"},
+ {0x0076, "v"},
+ {0x0077, "w"},
+ {0x0078, "x"},
+ {0x0079, "y"},
+ {0x007a, "z"},
+ {0x007b, "braceleft"},
+ {0x007c, "bar"},
+ {0x007d, "braceright"},
+ {0x007e, "asciitilde"},
+
+ {0x00a0, "nbspace"}, /* cf "space" */
+ {0x00a1, "exclamdown"},
+ {0x00a2, "cent"},
+ {0x00a3, "sterling"},
+ {0x00a4, "currency"},
+ {0x00a5, "yen"},
+ {0x00a6, "brokenbar"},
+ {0x00a7, "section"},
+ {0x00a8, "dieresis"},
+ {0x00a9, "copyright"}, /* "copyrightserif" "copyrightsans" */
+ {0x00aa, "ordfeminine"},
+ {0x00ab, "guillemotleft"},
+ {0x00ac, "logicalnot"},
+ {0x00ad, "sfthyphen"}, /* cf "hyphen" */
+ {0x00ae, "registered"}, /* "registeredserif" "registeredsans" */
+ {0x00af, "overscore"},
+
+ {0x00b0, "degree"},
+ {0x00b1, "plusminus"},
+ {0x00b2, "twosuperior"},
+ {0x00b3, "threesuperior"},
+ {0x00b4, "acute"},
+ {0x00b5, "mu1"}, /* "micro" */
+ {0x00b6, "paragraph"},
+ {0x00b7, "middot"}, /* cf "periodcentered" */
+ {0x00b8, "cedilla"},
+ {0x00b9, "onesuperior"},
+ {0x00ba, "ordmasculine"},
+ {0x00bb, "guillemotright"},
+ {0x00bc, "onequarter"},
+ {0x00bd, "onehalf"},
+ {0x00be, "threequarters"},
+ {0x00bf, "questiondown"},
+
+ {0x00c0, "Agrave"},
+ {0x00c1, "Aacute"},
+ {0x00c2, "Acircumflex"},
+ {0x00c3, "Atilde"},
+ {0x00c4, "Adieresis"},
+ {0x00c5, "Aring"},
+ {0x00c6, "AE"},
+ {0x00c7, "Ccedilla"},
+ {0x00c8, "Egrave"},
+ {0x00c9, "Eacute"},
+ {0x00ca, "Ecircumflex"},
+ {0x00cb, "Edieresis"},
+ {0x00cc, "Igrave"},
+ {0x00cd, "Iacute"},
+ {0x00ce, "Icircumflex"},
+ {0x00cf, "Idieresis"},
+
+ {0x00d0, "Eth"},
+ {0x00d1, "Ntilde"},
+ {0x00d2, "Ograve"},
+ {0x00d3, "Oacute"},
+ {0x00d4, "Ocircumflex"},
+ {0x00d5, "Otilde"},
+ {0x00d6, "Odieresis"},
+ {0x00d7, "multiply"},
+ {0x00d8, "Oslash"},
+ {0x00d9, "Ugrave"},
+ {0x00da, "Uacute"},
+ {0x00db, "Ucircumflex"},
+ {0x00dc, "Udieresis"},
+ {0x00dd, "Yacute"},
+ {0x00de, "Thorn"},
+ {0x00df, "germandbls"},
+
+ {0x00e0, "agrave"},
+ {0x00e1, "aacute"},
+ {0x00e2, "acircumflex"},
+ {0x00e3, "atilde"},
+ {0x00e4, "adieresis"},
+ {0x00e5, "aring"},
+ {0x00e6, "ae"},
+ {0x00e7, "ccedilla"},
+ {0x00e8, "egrave"},
+ {0x00e9, "eacute"},
+ {0x00ea, "ecircumflex"},
+ {0x00eb, "edieresis"},
+ {0x00ec, "igrave"},
+ {0x00ed, "iacute"},
+ {0x00ee, "icircumflex"},
+ {0x00ef, "idieresis"},
+
+ {0x00f0, "eth"},
+ {0x00f1, "ntilde"},
+ {0x00f2, "ograve"},
+ {0x00f3, "oacute"},
+ {0x00f4, "ocircumflex"},
+ {0x00f5, "otilde"},
+ {0x00f6, "odieresis"},
+ {0x00f7, "divide"},
+ {0x00f8, "oslash"},
+ {0x00f9, "ugrave"},
+ {0x00fa, "uacute"},
+ {0x00fb, "ucircumflex"},
+ {0x00fc, "udieresis"},
+ {0x00fd, "yacute"},
+ {0x00fe, "thorn"},
+ {0x00ff, "ydieresis"},
+
+ {0x0100, "Amacron"},
+ {0x0101, "amacron"},
+ {0x0102, "Abreve"},
+ {0x0103, "abreve"},
+ {0x0104, "Aogonek"},
+ {0x0105, "aogonek"},
+ {0x0106, "Cacute"},
+ {0x0107, "cacute"},
+ {0x0108, "Ccircumflex"},
+ {0x0109, "ccircumflex"},
+ {0x010a, "Cdot"},
+ {0x010b, "cdot"},
+ {0x010c, "Ccaron"},
+ {0x010d, "ccaron"},
+ {0x010e, "Dcaron"},
+ {0x010f, "dcaron"},
+
+ {0x0110, "Dslash"},
+ {0x0111, "dmacron"},
+ {0x0112, "Emacron"},
+ {0x0113, "emacron"},
+ {0x0114, "Ebreve"},
+ {0x0115, "ebreve"},
+ {0x0116, "Edot"},
+ {0x0117, "edot"},
+ {0x0118, "Eogonek"},
+ {0x0119, "eogonek"},
+ {0x011a, "Ecaron"},
+ {0x011b, "ecaron"},
+ {0x011c, "Gcircumflex"},
+ {0x011d, "gcircumflex"},
+ {0x011e, "Gbreve"},
+ {0x011f, "gbreve"},
+
+ {0x0120, "Gdot"},
+ {0x0121, "gdot"},
+ {0x0122, "Gcedilla"},
+ {0x0123, "gcedilla"},
+ {0x0124, "Hcircumflex"},
+ {0x0125, "hcircumflex"},
+ {0x0126, "Hbar"},
+ {0x0127, "hbar"},
+ {0x0128, "Itilde"},
+ {0x0129, "itilde"},
+ {0x012a, "Imacron"},
+ {0x012b, "imacron"},
+ {0x012c, "Ibreve"},
+ {0x012d, "ibreve"},
+ {0x012e, "Iogonek"},
+ {0x012f, "iogonek"},
+
+ {0x0130, "Idot"},
+ {0x0131, "dotlessi"},
+ {0x0132, "IJ"},
+ {0x0133, "ij"},
+ {0x0134, "Jcircumflex"},
+ {0x0135, "jcircumflex"},
+ {0x0136, "Kcedilla"},
+ {0x0137, "kcedilla"},
+ {0x0138, "kgreenlandic"},
+ {0x0139, "Lacute"},
+ {0x013a, "lacute"},
+ {0x013b, "Lcedilla"},
+ {0x013c, "lcedilla"},
+ {0x013d, "Lcaron"},
+ {0x013e, "lcaron"},
+ {0x013f, "Ldot"},
+
+ {0x0140, "ldot"},
+ {0x0141, "Lslash"},
+ {0x0142, "lslash"},
+ {0x0143, "Nacute"},
+ {0x0144, "nacute"},
+ {0x0145, "Ncedilla"},
+ {0x0146, "ncedilla"},
+ {0x0147, "Ncaron"},
+ {0x0148, "ncaron"},
+ {0x0149, "napostrophe"},
+ {0x014a, "Eng"},
+ {0x014b, "eng"},
+ {0x014c, "Omacron"},
+ {0x014d, "omacron"},
+ {0x014e, "Obreve"},
+ {0x014f, "obreve"},
+
+ {0x0150, "Odblacute"},
+ {0x0151, "odblacute"},
+ {0x0152, "OE"},
+ {0x0153, "oe"},
+ {0x0154, "Racute"},
+ {0x0155, "racute"},
+ {0x0156, "Rcedilla"},
+ {0x0157, "rcedilla"},
+ {0x0158, "Rcaron"},
+ {0x0159, "rcaron"},
+ {0x015a, "Sacute"},
+ {0x015b, "sacute"},
+ {0x015c, "Scircumflex"},
+ {0x015d, "scircumflex"},
+ {0x015e, "Scedilla"},
+ {0x015f, "scedilla"},
+
+ {0x0160, "Scaron"},
+ {0x0161, "scaron"},
+ {0x0162, "Tcedilla"},
+ {0x0163, "tcedilla"},
+ {0x0164, "Tcaron"},
+ {0x0165, "tcaron"},
+ {0x0166, "Tbar"},
+ {0x0167, "tbar"},
+ {0x0168, "Utilde"},
+ {0x0169, "utilde"},
+ {0x016a, "Umacron"},
+ {0x016b, "umacron"},
+ {0x016c, "Ubreve"},
+ {0x016d, "ubreve"},
+ {0x016e, "Uring"},
+ {0x016f, "uring"},
+
+ {0x0170, "Udblacute"},
+ {0x0171, "udblacute"},
+ {0x0172, "Uogonek"},
+ {0x0173, "uogonek"},
+ {0x0174, "Wcircumflex"},
+ {0x0175, "wcircumflex"},
+ {0x0176, "Ycircumflex"},
+ {0x0177, "ycircumflex"},
+ {0x0178, "Ydieresis"},
+ {0x0179, "Zacute"},
+ {0x017a, "zacute"},
+ {0x017b, "Zdot"},
+ {0x017c, "zdot"},
+ {0x017d, "Zcaron"},
+ {0x017e, "zcaron"},
+ {0x017f, "longs"},
+
+ {0x0192, "florin"},
+
+ {0x01fa, "Aringacute"},
+ {0x01fb, "aringacute"},
+ {0x01fc, "AEacute"},
+ {0x01fd, "aeacute"},
+ {0x01fe, "Oslashacute"},
+ {0x01ff, "oslashacute"},
+
+ {0x02c6, "circumflex"},
+ {0x02c7, "caron"},
+ {0x02c9, "macron"}, /* cf "overscore" */
+
+ {0x02d8, "breve"},
+ {0x02d9, "dotaccent"},
+ {0x02da, "ring"},
+ {0x02db, "ogonek"},
+ {0x02dc, "tilde"},
+ {0x02dd, "hungarumlaut"},
+
+ {0x037e, "semicolon"},
+
+ {0x0384, "tonos"},
+ {0x0385, "dieresistonos"},
+ {0x0386, "Alphatonos"},
+ {0x0387, "anoteleia"},
+ {0x0388, "Epsilontonos"},
+ {0x0389, "Etatonos"},
+ {0x038a, "Iotatonos"},
+ {0x038c, "Omicrontonos"},
+ {0x038e, "Upsilontonos"},
+ {0x038f, "Omegatonos"},
+
+ {0x0390, "iotadieresistonos"},
+ {0x0391, "Alpha"},
+ {0x0392, "Beta"},
+ {0x0393, "Gamma"},
+ {0x0394, "Delta"},
+ {0x0395, "Epsilon"},
+ {0x0396, "Zeta"},
+ {0x0397, "Eta"},
+ {0x0398, "Theta"},
+ {0x0399, "Iota"},
+ {0x039a, "Kappa"},
+ {0x039b, "Lambda"},
+ {0x039c, "Mu"},
+ {0x039d, "Nu"},
+ {0x039e, "Xi"},
+ {0x039f, "Omicron"},
+
+ {0x03a0, "Pi"},
+ {0x03a1, "Rho"},
+ {0x03a2, "Sigma"},
+ {0x03a3, "Tau"},
+ {0x03a4, "Upsilon"},
+ {0x03a5, "Phi"},
+ {0x03a6, "Chi"},
+ {0x03a7, "Psi"},
+ {0x03a8, "Omega"}, /* cf "Ohm" */
+ {0x03aa, "Iotadieresis"},
+ {0x03ab, "Upsilondieresis"},
+ {0x03ac, "alphatonos"},
+ {0x03ad, "epsilontonos"},
+ {0x03ae, "etatonos"},
+ {0x03af, "iotatonos"},
+
+ {0x03b0, "upsilondieresistonos"},
+ {0x03b1, "alpha"},
+ {0x03b2, "beta"},
+ {0x03b3, "gamma"},
+ {0x03b4, "delta"},
+ {0x03b5, "epsilon"},
+ {0x03b6, "zeta"},
+ {0x03b7, "eta"},
+ {0x03b8, "theta"},
+ {0x03b9, "iota"},
+ {0x03ba, "kappa"},
+ {0x03bb, "lambda"},
+ {0x03bc, "mu"},
+ {0x03bd, "nu"},
+ {0x03be, "xi"},
+ {0x03bf, "omicron"},
+
+ {0x03c0, "pi"},
+ {0x03c1, "rho"},
+ {0x03c2, "sigma1"},
+ {0x03c3, "sigma"},
+ {0x03c4, "tau"},
+ {0x03c5, "upsilon"},
+ {0x03c6, "phi"},
+ {0x03c7, "chi"},
+ {0x03c8, "psi"},
+ {0x03c9, "omega"},
+ {0x03ca, "iotadieresis"},
+ {0x03cb, "upsilondieresis"},
+ {0x03cc, "omicrontonos"},
+ {0x03cd, "upsilontonos"},
+ {0x03ce, "omegatonos"},
+
+ {0x0401, "afii10023"},
+ {0x0402, "afii10051"},
+ {0x0403, "afii10052"},
+ {0x0404, "afii10053"},
+ {0x0405, "afii10054"},
+ {0x0406, "afii10055"},
+ {0x0407, "afii10056"},
+ {0x0408, "afii10057"},
+ {0x0409, "afii10058"},
+ {0x040a, "afii10059"},
+ {0x040b, "afii10060"},
+ {0x040c, "afii10061"},
+ {0x040e, "afii10062"},
+ {0x040f, "afii10145"},
+
+ {0x0410, "afii10017"},
+ {0x0411, "afii10018"},
+ {0x0412, "afii10019"},
+ {0x0413, "afii10020"},
+ {0x0414, "afii10021"},
+ {0x0415, "afii10022"},
+ {0x0416, "afii10024"},
+ {0x0417, "afii10025"},
+ {0x0418, "afii10026"},
+ {0x0419, "afii10027"},
+ {0x041a, "afii10028"},
+ {0x041b, "afii10029"},
+ {0x041c, "afii10030"},
+ {0x041d, "afii10031"},
+ {0x041e, "afii10032"},
+ {0x041f, "afii10033"},
+
+ {0x0420, "afii10034"},
+ {0x0421, "afii10035"},
+ {0x0422, "afii10036"},
+ {0x0423, "afii10037"},
+ {0x0424, "afii10038"},
+ {0x0425, "afii10039"},
+ {0x0426, "afii10040"},
+ {0x0427, "afii10041"},
+ {0x0428, "afii10042"},
+ {0x0429, "afii10043"},
+ {0x042a, "afii10044"},
+ {0x042b, "afii10045"},
+ {0x042c, "afii10046"},
+ {0x042d, "afii10047"},
+ {0x042e, "afii10048"},
+ {0x042f, "afii10049"},
+
+ {0x0430, "afii10065"},
+ {0x0431, "afii10066"},
+ {0x0432, "afii10067"},
+ {0x0433, "afii10068"},
+ {0x0434, "afii10069"},
+ {0x0435, "afii10070"},
+ {0x0436, "afii10072"},
+ {0x0437, "afii10073"},
+ {0x0438, "afii10074"},
+ {0x0439, "afii10075"},
+ {0x043a, "afii10076"},
+ {0x043b, "afii10077"},
+ {0x043c, "afii10078"},
+ {0x043d, "afii10079"},
+ {0x043e, "afii10080"},
+ {0x043f, "afii10081"},
+
+ {0x0440, "afii10082"},
+ {0x0441, "afii10083"},
+ {0x0442, "afii10084"},
+ {0x0443, "afii10085"},
+ {0x0444, "afii10086"},
+ {0x0445, "afii10087"},
+ {0x0446, "afii10088"},
+ {0x0447, "afii10089"},
+ {0x0448, "afii10090"},
+ {0x0449, "afii10091"},
+ {0x044a, "afii10092"},
+ {0x044b, "afii10093"},
+ {0x044c, "afii10094"},
+ {0x044d, "afii10095"},
+ {0x044e, "afii10096"},
+ {0x044f, "afii10097"},
+
+ {0x0451, "afii10071"},
+ {0x0452, "afii10099"},
+ {0x0453, "afii10100"},
+ {0x0454, "afii10101"},
+ {0x0455, "afii10102"},
+ {0x0456, "afii10103"},
+ {0x0457, "afii10104"},
+ {0x0458, "afii10105"},
+ {0x0459, "afii10106"},
+ {0x045a, "afii10107"},
+ {0x045b, "afii10108"},
+ {0x045c, "afii10109"},
+ {0x045e, "afii10110"},
+ {0x045f, "afii10193"},
+
+ {0x0490, "afii10050"},
+ {0x0491, "afii10098"},
+
+ {0x1e80, "Wgrave"},
+ {0x1e81, "wgrave"},
+ {0x1e82, "Wacute"},
+ {0x1e83, "wacute"},
+ {0x1e84, "Wdieresis"},
+ {0x1e85, "wdieresis"},
+
+ {0x1ef2, "Ygrave"},
+ {0x1ef3, "ygrave"},
+
+ {0x2013, "endash"},
+ {0x2014, "emdash"},
+ {0x2015, "afii00208"}, /* horizontal bar */
+ {0x2017, "underscoredbl"},
+ {0x2018, "quoteleft"},
+ {0x2019, "quoteright"},
+ {0x201a, "quotesinglbase"},
+ {0x201b, "quotereversed"},
+ {0x201c, "quotedblleft"},
+ {0x201d, "quotedblright"},
+ {0x201e, "quotedblbase"},
+
+ {0x2020, "dagger"},
+ {0x2021, "daggerdbl"},
+ {0x2022, "bullet"},
+ {0x2026, "ellipsis"},
+ {0x2030, "perthousand"},
+ {0x2032, "minute"},
+ {0x2033, "second"},
+ {0x2039, "guilsinglleft"},
+ {0x203a, "guilsinglright"},
+ {0x203c, "exclamdbl"},
+ {0x203e, "radicalex"},
+
+ {0x2044, "fraction"}, /* cf U+2215 */
+
+ {0x207f, "nsuperior"},
+
+ {0x20a3, "franc"},
+ {0x20a4, "afii08941"}, /* lira sign */
+ {0x20a7, "peseta"},
+
+ {0x2105, "afii61248"}, /* care of */
+
+ {0x2113, "afii61289"}, /* script small l */
+ {0x2116, "afii61352"}, /* numero sign */
+
+ {0x2122, "trademark"},
+ {0x2126, "Ohm"},
+ {0x212e, "estimated"},
+
+ {0x215b, "oneeighth"},
+ {0x215c, "threeeighths"},
+ {0x215d, "fiveeighths"},
+ {0x215e, "seveneighths"},
+
+ {0x2190, "arrowleft"},
+ {0x2191, "arrowup"},
+ {0x2192, "arrowright"},
+ {0x2193, "arrowdown"},
+ {0x2194, "arrowboth"},
+ {0x2195, "arrowupdn"},
+
+ {0x21a8, "arrowupdnbse"},
+
+ {0x2202, "partialdiff"},
+ {0x2206, "increment"},
+ {0x220f, "product"},
+
+ {0x2211, "summation"},
+ {0x2212, "minus"},
+ {0x2215, "fraction"}, /* cf U+2044 */
+ {0x2219, "periodcentered"},
+ {0x221a, "radical"},
+ {0x221e, "infinity"},
+ {0x221f, "orthogonal"},
+
+ {0x2229, "intersection"},
+ {0x222b, "integral"},
+
+ {0x2248, "approxequal"},
+
+ {0x2260, "notequal"},
+ {0x2261, "equivalence"},
+ {0x2264, "lessequal"},
+ {0x2265, "greaterequal"},
+
+ {0x2302, "house"},
+
+ {0x2310, "revlogicalnot"},
+
+ {0x2320, "integraltp"},
+ {0x2321, "integralbt"},
+
+ {0x2500, "SF100000"},
+ {0x2502, "SF110000"},
+ {0x250c, "SF010000"},
+
+ {0x2510, "SF030000"},
+ {0x2514, "SF020000"},
+ {0x2518, "SF040000"},
+ {0x251c, "SF080000"},
+
+ {0x2524, "SF090000"},
+ {0x252c, "SF060000"},
+
+ {0x2534, "SF070000"},
+ {0x253c, "SF050000"},
+
+ {0x2550, "SF430000"},
+ {0x2551, "SF240000"},
+ {0x2552, "SF510000"},
+ {0x2553, "SF520000"},
+ {0x2554, "SF390000"},
+ {0x2555, "SF220000"},
+ {0x2556, "SF210000"},
+ {0x2557, "SF250000"},
+ {0x2558, "SF500000"},
+ {0x2559, "SF490000"},
+ {0x255a, "SF380000"},
+ {0x255b, "SF280000"},
+ {0x255c, "SF270000"},
+ {0x255d, "SF260000"},
+ {0x255e, "SF360000"},
+ {0x255f, "SF370000"},
+
+ {0x2560, "SF420000"},
+ {0x2561, "SF190000"},
+ {0x2562, "SF200000"},
+ {0x2563, "SF230000"},
+ {0x2564, "SF470000"},
+ {0x2565, "SF480000"},
+ {0x2566, "SF410000"},
+ {0x2567, "SF450000"},
+ {0x2568, "SF460000"},
+ {0x2569, "SF400000"},
+ {0x256a, "SF540000"},
+ {0x256b, "SF530000"},
+ {0x256c, "SF440000"},
+
+ {0x2580, "upblock"},
+ {0x2584, "dnblock"},
+ {0x2588, "block"},
+ {0x258c, "lfblock"},
+
+ {0x2590, "rtblock"},
+ {0x2591, "ltshade"},
+ {0x2592, "shade"},
+ {0x2593, "dkshade"},
+
+ {0x25a0, "filledbox"},
+ {0x25a1, "H22073"},
+ {0x25aa, "H18543"},
+ {0x25ab, "H18551"},
+ {0x25ac, "filledrect"},
+
+ {0x25b2, "triagup"},
+ {0x25ba, "triagrt"},
+ {0x25bc, "triagdn"},
+
+ {0x25c4, "triaglf"},
+ {0x25ca, "lozenge"},
+ {0x25cb, "circle"},
+ {0x25cf, "H18533"},
+
+ {0x25d8, "invbullet"},
+ {0x25d9, "invcircle"},
+
+ {0x25e6, "openbullet"},
+
+ {0x263a, "smileface"},
+ {0x263b, "invsmileface"},
+ {0x263c, "sun"},
+
+ {0x2640, "female"},
+ {0x2642, "male"},
+
+ {0x2660, "spade"},
+ {0x2663, "club"},
+ {0x2665, "heart"},
+ {0x2666, "diamond"},
+ {0x266a, "musicalnote"},
+ {0x266b, "musicalnotedbl"},
+
+ {0xf000, "applelogo"},
+ {0xf001, "fi"},
+ {0xf002, "fl"},
+ {0xf004, "commaaccent"},
+ {0xf005, "undercommaaccent"},
+ {0xfb01, "fi"},
+ {0xfb02, "fl"},
+};
+
+struct encoding_table mac_table[] =
+{
+ {-1, ".notdef"},
+ {0x0000, ".notdef"}, /* null */
+ {0x0008, ".notdef"}, /* backspace */
+ {0x0009, ".notdef"}, /* horizontal tabulation */
+ {0x000d, ".notdef"}, /* carriage return */
+ {0x001d, ".notdef"}, /* group separator */
+ {0x0020, "space"},
+ {0x0021, "exclam"},
+ {0x0022, "quotedbl"},
+ {0x0023, "numbersign"},
+ {0x0024, "dollar"},
+ {0x0025, "percent"},
+ {0x0026, "ampersand"},
+ {0x0027, "quotesingle"},
+ {0x0028, "parenleft"},
+ {0x0029, "parenright"},
+ {0x002a, "asterisk"},
+ {0x002b, "plus"},
+ {0x002c, "comma"},
+ {0x002d, "hyphen"},
+ {0x002e, "period"},
+ {0x002f, "slash"},
+
+ {0x0030, "zero"},
+ {0x0031, "one"},
+ {0x0032, "two"},
+ {0x0033, "three"},
+ {0x0034, "four"},
+ {0x0035, "five"},
+ {0x0036, "six"},
+ {0x0037, "seven"},
+ {0x0038, "eight"},
+ {0x0039, "nine"},
+ {0x003a, "colon"},
+ {0x003b, "semicolon"},
+ {0x003c, "less"},
+ {0x003d, "equal"},
+ {0x003e, "greater"},
+ {0x003f, "question"},
+
+ {0x0040, "at"},
+ {0x0041, "A"},
+ {0x0042, "B"},
+ {0x0043, "C"},
+ {0x0044, "D"},
+ {0x0045, "E"},
+ {0x0046, "F"},
+ {0x0047, "G"},
+ {0x0048, "H"},
+ {0x0049, "I"},
+ {0x004a, "J"},
+ {0x004b, "K"},
+ {0x004c, "L"},
+ {0x004d, "M"},
+ {0x004e, "N"},
+ {0x004f, "O"},
+
+ {0x0050, "P"},
+ {0x0051, "Q"},
+ {0x0052, "R"},
+ {0x0053, "S"},
+ {0x0054, "T"},
+ {0x0055, "U"},
+ {0x0056, "V"},
+ {0x0057, "W"},
+ {0x0058, "X"},
+ {0x0059, "Y"},
+ {0x005a, "Z"},
+ {0x005b, "bracketleft"},
+ {0x005c, "backslash"},
+ {0x005d, "bracketright"},
+ {0x005e, "asciicircum"},
+ {0x005f, "underscore"},
+
+ {0x0060, "grave"},
+ {0x0061, "a"},
+ {0x0062, "b"},
+ {0x0063, "c"},
+ {0x0064, "d"},
+ {0x0065, "e"},
+ {0x0066, "f"},
+ {0x0067, "g"},
+ {0x0068, "h"},
+ {0x0069, "i"},
+ {0x006a, "j"},
+ {0x006b, "k"},
+ {0x006c, "l"},
+ {0x006d, "m"},
+ {0x006e, "n"},
+ {0x006f, "o"},
+
+ {0x0070, "p"},
+ {0x0071, "q"},
+ {0x0072, "r"},
+ {0x0073, "s"},
+ {0x0074, "t"},
+ {0x0075, "u"},
+ {0x0076, "v"},
+ {0x0077, "w"},
+ {0x0078, "x"},
+ {0x0079, "y"},
+ {0x007a, "z"},
+ {0x007b, "braceleft"},
+ {0x007c, "bar"},
+ {0x007d, "braceright"},
+ {0x007e, "asciitilde"},
+
+ {0x0080, "Adieresis"},
+ {0x0081, "Aring"},
+ {0x0082, "Ccedilla"},
+ {0x0083, "Eacute"},
+ {0x0084, "Ntilde"},
+ {0x0085, "Odieresis"},
+ {0x0086, "Udieresis"},
+ {0x0087, "aacute"},
+ {0x0088, "agrave"},
+ {0x0089, "acircumflex"},
+ {0x008a, "adieresis"},
+ {0x008b, "atilde"},
+ {0x008c, "aring"},
+ {0x008d, "ccedilla"},
+ {0x008e, "eacute"},
+ {0x008f, "egrave"},
+
+ {0x0090, "ecircumflex"},
+ {0x0091, "edieresis"},
+ {0x0092, "iacute"},
+ {0x0093, "igrave"},
+ {0x0094, "icircumflex"},
+ {0x0095, "idieresis"},
+ {0x0096, "ntilde"},
+ {0x0097, "oacute"},
+ {0x0098, "ograve"},
+ {0x0099, "ocircumflex"},
+ {0x009a, "odieresis"},
+ {0x009b, "otilde"},
+ {0x009c, "uacute"},
+ {0x009d, "ugrave"},
+ {0x009e, "ucircumflex"},
+ {0x009f, "udieresis"},
+
+ {0x00a0, "dagger"},
+ {0x00a1, "degree"},
+ {0x00a2, "cent"},
+ {0x00a3, "sterling"},
+ {0x00a4, "section"},
+ {0x00a5, "bullet"},
+ {0x00a6, "paragraph"},
+ {0x00a7, "germandbls"},
+ {0x00a8, "registered"},
+ {0x00a9, "copyright"},
+ {0x00aa, "trademark"},
+ {0x00ab, "acute"},
+ {0x00ac, "dieresis"},
+ {0x00ad, "notequal"},
+ {0x00ae, "AE"},
+ {0x00af, "Oslash"},
+
+ {0x00b0, "infinity"},
+ {0x00b1, "plusminus"},
+ {0x00b2, "lessequal"},
+ {0x00b3, "greaterequal"},
+ {0x00b4, "yen"},
+ {0x00b5, "mu"},
+ {0x00b6, "partialdiff"},
+ {0x00b7, "summation"},
+ {0x00b8, "product"},
+ {0x00b9, "pi"},
+ {0x00ba, "integral"},
+ {0x00bb, "ordfeminine"},
+ {0x00bc, "ordmasculine"},
+ {0x00bd, "Omega"},
+ {0x00be, "ae"},
+ {0x00bf, "oslash"},
+
+ {0x00c0, "questiondown"},
+ {0x00c1, "exclamdown"},
+ {0x00c2, "logicalnot"},
+ {0x00c3, "radical"},
+ {0x00c4, "florin"},
+ {0x00c5, "approxequal"},
+ {0x00c6, "Delta"},
+ {0x00c7, "guillemotleft"},
+ {0x00c8, "guillemotright"},
+ {0x00c9, "ellipsis"},
+ {0x00ca, "nbspace"},
+ {0x00cb, "Agrave"},
+ {0x00cc, "Atilde"},
+ {0x00cd, "Otilde"},
+ {0x00ce, "OE"},
+ {0x00cf, "oe"},
+
+ {0x00d0, "endash"},
+ {0x00d1, "emdash"},
+ {0x00d2, "quotedblleft"},
+ {0x00d3, "quotedblright"},
+ {0x00d4, "quoteleft"},
+ {0x00d5, "quoteright"},
+ {0x00d6, "divide"},
+ {0x00d7, "lozenge"},
+ {0x00d8, "ydieresis"},
+ {0x00d9, "Ydieresis"},
+ {0x00da, "fraction"},
+ {0x00db, "currency"},
+ {0x00dc, "guilsinglleft"},
+ {0x00dd, "guilsinglright"},
+ {0x00de, "fi"},
+ {0x00df, "fl"},
+
+ {0x00e0, "daggerdbl"},
+ {0x00e1, "periodcentered"},
+ {0x00e2, "quotesinglbase"},
+ {0x00e3, "quotedblbase"},
+ {0x00e4, "perthousand"},
+ {0x00e5, "Acircumflex"},
+ {0x00e6, "Ecircumflex"},
+ {0x00e7, "Aacute"},
+ {0x00e8, "Edieresis"},
+ {0x00e9, "Egrave"},
+ {0x00ea, "Iacute"},
+ {0x00eb, "Icircumflex"},
+ {0x00ec, "Idieresis"},
+ {0x00ed, "Igrave"},
+ {0x00ee, "Oacute"},
+ {0x00ef, "Ocircumflex"},
+
+ {0x00f0, "apple"},
+ {0x00f1, "Ograve"},
+ {0x00f2, "Uacute"},
+ {0x00f3, "Ucircumflex"},
+ {0x00f4, "Ugrave"},
+ {0x00f5, "dotlessi"},
+ {0x00f6, "circumflex"},
+ {0x00f7, "tilde"},
+ {0x00f8, "macron"},
+ {0x00f9, "breve"},
+ {0x00fa, "dotaccent"},
+ {0x00fb, "ring"},
+ {0x00fc, "cedilla"},
+ {0x00fd, "hungarumlaut"},
+ {0x00fe, "ogonek"},
+ {0x00ff, "caron"},
+};
+
+
+struct encoding_table *current_table;
+size_t current_table_len;
+
+
+void
+set_encoding_scheme(EncodingScheme e, Font *fnt)
+{
+ current_encoding_scheme = e;
+
+ switch (e)
+ {
+ case encUnicode:
+ current_table = unicode_table;
+ current_table_len = sizeof (unicode_table) / sizeof (unicode_table[0]);
+ break;
+
+ case encMac:
+ current_table = mac_table;
+ current_table_len = sizeof (mac_table) / sizeof (mac_table[0]);
+ break;
+
+ case encFontSpecific:
+ break;
+ }
+}
+
+
+/*
+ * We return ".c0x<code point in hexadecimal representation>"
+ * if no name is found.
+ *
+ * We return ".g0x<code point in hexadecimal representation>"
+ * if it's a glyph index (code >= 0x10000).
+ */
+
+char *
+code_to_adobename(long code)
+{
+ unsigned int n, n1 = 0, n2 = current_table_len - 1;
+ char *p;
+
+
+ if (current_encoding_scheme == encFontSpecific)
+ {
+ p = (char *)mymalloc(9);
+ sprintf(p, ".%c0x%x", (code >= 0x10000) ? 'g' : 'c',
+ (unsigned int)(code & 0xFFFF));
+ return p;
+ }
+
+ while (n1 <= n2)
+ {
+ n = (n1 + n2) / 2;
+ if (code < current_table[n].code)
+ n2 = n - 1;
+ else if (code > current_table[n].code)
+ n1 = n + 1;
+ else
+ return current_table[n].adobename;
+ }
+
+ p = (char *)mymalloc(9);
+ sprintf(p, ".%c0x%x", (code >= 0x10000) ? 'g' : 'c',
+ (unsigned int)(code & 0xFFFF));
+ return p;
+}
+
+
+/*
+ * The first of two identical entries will win.
+ */
+
+long
+adobename_to_code(char *s)
+{
+ size_t i;
+ long j;
+ char p;
+
+
+ if (s == NULL)
+ return -1;
+
+ if (current_encoding_scheme == encFontSpecific)
+ {
+ if (*(s++) != '.')
+ return -1;
+
+ p = *(s++);
+ if (!(p == 'c' || p == 'g'))
+ return -1;
+
+ j = strtol(s, &s, 0);
+ if (*s == '\0')
+ return (p == 'g') ? (j | 0x10000) : j;
+ else
+ return -1;
+ }
+
+ for (i = 0; i < current_table_len; i++)
+ {
+ if (strcmp(current_table[i].adobename, s) == 0)
+ return current_table[i].code;
+ }
+
+ if (*(s++) != '.')
+ return -1;
+
+ p = *(s++);
+ if (!(p == 'c' || p == 'g'))
+ return -1;
+
+ j = strtol(s, &s, 0);
+ if (*s == '\0')
+ return (p == 'g') ? (j | 0x10000) : j;
+ else
+ return -1;
+}
+
+
+ttfinfo *
+findglyph(unsigned short g, ttfinfo *p)
+{
+ register ttfinfo *ti;
+
+
+ if (!p)
+ return NULL;
+
+ for (ti = p; ti; ti = ti->next)
+ if (g == ti->glyphindex)
+ return ti;
+
+ return NULL;
+}
+
+
+ttfinfo *
+findadobe(char *p, ttfinfo *ap)
+{
+ register ttfinfo *ti;
+ register long l = -1;
+ register char c = '\0', d = '\0';
+
+
+ if (!p)
+ return NULL;
+
+ if (p[0] == '.' &&
+ (c = p[1]) && (c == 'c' || c == 'g') &&
+ (d = p[2]) && '0' <= d && d <= '9')
+ l = strtol(p + 2, NULL, 0);
+
+ for (ti = ap; ti; ti = ti->next)
+ {
+ if (l >= 0)
+ {
+ if (c == 'c')
+ {
+ if (ti->charcode == l)
+ return ti;
+ }
+ else
+ {
+ if (ti->glyphindex == l)
+ return ti;
+ }
+ }
+ else if (strcmp(p, ti->adobename) == 0)
+ return ti;
+ }
+
+ return NULL;
+}
+
+
+ttfinfo *
+findmappedadobe(char *p, ttfinfo **array)
+{
+ register int i;
+ register ttfinfo *ti;
+ register long l = -1;
+ register char c = '\0', d = '\0';
+
+
+ if (!p)
+ return NULL;
+
+ if (p[0] == '.' &&
+ (c = p[1]) && (c == 'c' || c == 'g') &&
+ (d = p[2]) && '0' <= d && d <= '9')
+ l = strtol(p + 2, NULL, 0);
+
+ for (i = 0; i <= 0xFF; i++)
+ if ((ti = array[i]))
+ {
+ if (l >= 0)
+ {
+ if (c == 'c')
+ {
+ if (ti->charcode == l)
+ return ti;
+ }
+ else
+ {
+ if (ti->glyphindex == l)
+ return ti;
+ }
+ }
+ else if (strcmp(p, ti->adobename) == 0)
+ return ti;
+ }
+
+ return NULL;
+}
+
+
+void
+replace_glyphs(Font *fnt)
+{
+ stringlist *sl, *sl_old;
+ ttfinfo *ti;
+
+
+ for (sl = fnt->replacements, sl_old = NULL; sl; sl_old = sl, sl = sl->next)
+ {
+ if ((ti = findadobe(sl->old_name, fnt->charlist)))
+ ti->adobename = sl->new_name;
+ else
+ {
+ warning("Glyph name `%s' not found.", sl->old_name);
+ warning("Replacement glyph name `%s' thus ignored.", sl->new_name);
+ if (sl_old == NULL)
+ fnt->replacements = sl->next;
+ else
+ sl_old->next = sl->next;
+ }
+ }
+}
+
+
+/* the opposite of replace_glyph() */
+
+void
+restore_glyph(encoding *enc, Font *fnt)
+{
+ stringlist *sl;
+ int i;
+
+
+ for (sl = fnt->replacements; sl; sl = sl->next)
+ {
+ for (i = 0; i <= 0xFF; i++)
+ {
+ if (strcmp(enc->vec[i], sl->new_name) == 0)
+ {
+ enc->vec[i] = sl->old_name;
+ goto success;
+ }
+ }
+ warning("Glyph name `%s' not found in encoding.", sl->new_name);
+ warning("Replacement for glyph name `%s' thus ignored.", sl->old_name);
+
+success:
+ ;
+ }
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttfenc.h b/xc/extras/FreeType/contrib/ttf2pk/ttfenc.h
new file mode 100644
index 000000000..5ff59299b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttfenc.h
@@ -0,0 +1,41 @@
+/*
+ * ttfenc.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef TTFENC_H
+#define TTFENC_H
+
+#include "ttf2tfm.h"
+
+
+enum _EncodingScheme
+{
+ encUnicode,
+ encMac,
+ encFontSpecific
+};
+typedef enum _EncodingScheme EncodingScheme;
+
+
+void set_encoding_scheme(EncodingScheme e, Font *fnt);
+
+char *code_to_adobename(long code);
+long adobename_to_code(char *s);
+
+ttfinfo *findglyph(unsigned short g, ttfinfo *p);
+ttfinfo *findadobe(char *p, ttfinfo *ap);
+ttfinfo *findmappedadobe(char *p, ttfinfo **array);
+
+void replace_glyphs(Font *fnt);
+void restore_glyph(encoding *enc, Font *fnt);
+
+#endif /* TTFENC_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttflib.c b/xc/extras/FreeType/contrib/ttf2pk/ttflib.c
new file mode 100644
index 000000000..363971116
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttflib.c
@@ -0,0 +1,529 @@
+/*
+ * ttflib.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Loyer Frederic <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h> /* libc ANSI */
+#include <ctype.h>
+
+#include "pklib.h" /* for the `byte' type */
+#include "freetype.h"
+#include "ttfenc.h"
+#include "ttflib.h"
+#include "errormsg.h"
+#include "newobj.h"
+#include "ttf2tfm.h"
+
+#include "extend/ftxpost.h"
+
+
+#define Macintosh_platform 1
+#define Macintosh_encoding 0
+#define Microsoft_platform 3
+#define Microsoft_Symbol_encoding 0
+#define Microsoft_Unicode_encoding 1
+
+
+TT_Engine engine;
+TT_Face face;
+TT_Instance instance;
+TT_Glyph glyph;
+TT_CharMap char_map;
+
+TT_Outline outline;
+TT_Glyph_Metrics metrics;
+TT_Face_Properties properties;
+TT_BBox bbox;
+
+TT_Post post;
+
+TT_Raster_Map Bit, Bit2;
+void *Bitp, *Bit2p;
+
+int dpi;
+int ptsize;
+
+int x_offset, y_offset;
+int upem, ppem;
+
+TT_Matrix matrix;
+int apply_matrix;
+
+
+
+static void
+SetRasterArea(int quiet)
+{
+ int temp1_x, temp1_y, temp2_x, temp2_y;
+
+
+ temp1_x = bbox.xMin / 64; /* scaling F16.6 -> int */
+ temp1_y = bbox.yMin / 64;
+ temp2_x = (bbox.xMax + 63) / 64;
+ temp2_y = (bbox.yMax + 63) / 64;
+
+ x_offset = 5 - temp1_x;
+ y_offset = 5 - temp1_y;
+
+ if (!quiet)
+ printf(" off = (%d, %d)", x_offset, y_offset);
+
+#if 0
+ x_offset = y_offset = 0;
+#endif
+
+
+ if (!quiet)
+ printf(" bbox = (%d, %d) <-> (%d, %d)\n",
+ temp1_x, temp1_y, temp2_x, temp2_y);
+
+ Bit.rows = temp2_y - temp1_y + 10;
+ Bit.width = temp2_x - temp1_x + 10;
+
+ Bit.cols = (Bit.width + 7) / 8; /* convert to # of bytes */
+ Bit.flow = TT_Flow_Up;
+ Bit.size = Bit.rows * Bit.cols; /* number of bytes in buffer */
+
+ /*
+ * We allocate one more row to have valid pointers for comparison
+ * purposes in pklib.c, making `gcc -fbounds-checking' happy.
+ */
+
+ if (Bitp)
+ free(Bitp);
+ Bitp = mymalloc(Bit.size + Bit.cols);
+ Bit.bitmap = Bitp;
+
+ Bit2 = Bit;
+
+ if (Bit2p)
+ free(Bit2p);
+ Bit2p = mymalloc(Bit.size + Bit.cols);
+ Bit2.bitmap = Bit2p;
+}
+
+
+static void
+SetMatrix(Font *fnt)
+{
+ TT_Error error;
+
+
+ error = TT_Set_Instance_Transform_Flags(instance, 1, 0);
+
+ matrix.xx = (TT_Fixed)(floor(fnt->efactor * 1024) * (1<<16)/1024);
+ matrix.xy = (TT_Fixed)(floor(fnt->slant * 1024) * (1<<16)/1024);
+ matrix.yx = (TT_Fixed)0;
+ matrix.yy = (TT_Fixed)(1<<16);
+
+ apply_matrix = 1;
+}
+
+
+static void
+FlipBit(void)
+{
+ int y;
+ char *p1, *p2;
+
+ p1 = (char *)Bit.bitmap;
+ p2 = (char *)Bit2.bitmap + Bit2.cols * (Bit2.rows - 1);
+
+ for (y = 0; y < Bit.rows; y++)
+ {
+ memcpy(p2, p1, Bit.cols);
+ p1 += Bit.cols;
+ p2 -= Bit.cols;
+ }
+}
+
+
+#if 0
+
+static void
+Output(TT_Raster_Map Bit)
+{
+ int x;
+ int y;
+ int i;
+
+ char *p, b;
+
+
+ p = Bit.bitmap;
+ printf("====\n");
+
+ for (y = 0; y < Bit.rows; y++)
+ {
+ printf("%3d:", y);
+ for (x = 0; x < Bit.cols; x++)
+ {
+ b = *p++;
+ for(i = 0x80; i; i >>= 1)
+ printf((b & i) ? "x" : ".");
+ }
+ printf("\n");
+ }
+}
+
+#endif /* 0 */
+
+
+void
+TTFopen(char *filename, Font *fnt, int new_dpi, int new_ptsize, Boolean quiet)
+{
+ unsigned short i, num_cmap;
+ unsigned short cmap_plat;
+ unsigned short cmap_enc;
+ TT_Error error;
+
+
+ dpi = new_dpi;
+ ptsize = new_ptsize;
+
+ error = TT_Init_FreeType(&engine);
+ if (error)
+ oops("Cannot initialize FreeType engine (error code = 0x%x).", error);
+
+ if (fnt->PSnames)
+ if ((error = TT_Init_Post_Extension(engine)))
+ oops("Cannot initialize PS name support (error code = 0x%x).", error);
+
+ /*
+ * Load face.
+ */
+
+ error = TT_Open_Face(engine, filename, &face);
+ if (error)
+ oops("Cannot open `%s'.", filename);
+
+ /*
+ * Get face properties and allocate preloaded arrays.
+ */
+
+ TT_Get_Face_Properties(face, &properties);
+
+ /*
+ * Now we try to open the proper font in a collection.
+ */
+
+ if (fnt->fontindex != 0)
+ {
+ if(properties.num_Faces == 1)
+ warning("This isn't a TrueType collection.\n"
+ "Parameter `Fontindex' is ignored.");
+ else
+ {
+ TT_Close_Face(face);
+ if ((error = TT_Open_Collection(engine, filename,
+ fnt->fontindex, &face)))
+ oops("Cannot open font %lu in TrueType Collection `%s'.",
+ fnt->fontindex, filename);
+ }
+ }
+
+ /*
+ * Create instance.
+ */
+
+ error = TT_New_Instance(face, &instance);
+ if (error)
+ oops("Cannot create instance for `%s' (error code = 0x%x).",
+ filename, error);
+
+ error = TT_Set_Instance_Resolutions(instance, dpi, dpi);
+ if (error)
+ oops("Cannot set device resolutions (error code = 0x%x).");
+
+ error = TT_Set_Instance_CharSize(instance, ptsize * 64);
+ if (error)
+ oops("Cannot reset instance (error code = 0x%x).", error);
+
+ upem = properties.header->Units_Per_EM;
+ ppem = (dpi * ptsize + 36) / 72;
+
+ if (!quiet)
+ printf("dpi = %d, ptsize = %d, ppem = %d\n\n", dpi, ptsize, ppem);
+
+ /*
+ * Create glyph container.
+ */
+
+ error = TT_New_Glyph(face, &glyph);
+ if (error)
+ oops("Cannot create glyph container (error code = 0x%x).");
+
+ SetMatrix(fnt);
+
+ if (fnt->PSnames != Only)
+ {
+ num_cmap = properties.num_CharMaps;
+ for (i = 0; i < num_cmap; i++)
+ {
+ error = TT_Get_CharMap_ID(face, i, &cmap_plat, &cmap_enc);
+ if (error)
+ oops("Cannot query cmap (error code = 0x%x).", error);
+
+ if (cmap_plat == fnt->pid && cmap_enc == fnt->eid)
+ break;
+ }
+ if (i == num_cmap)
+ oops("Invalid platform and/or encoding ID.");
+
+ error = TT_Get_CharMap(face, i, &char_map);
+ if (error)
+ oops("Cannot load cmap (error code = 0x%x).", error);
+ }
+
+ if (fnt->PSnames)
+ {
+ if ((error = TT_Load_PS_Names(face, &post)))
+ oops("Cannot load TrueType PS names (error code = 0x%x).", error);
+ }
+ else if (cmap_plat == Microsoft_platform &&
+ cmap_enc == Microsoft_Unicode_encoding)
+ set_encoding_scheme(encUnicode, fnt);
+ else if (cmap_plat == Macintosh_platform &&
+ cmap_enc == Macintosh_encoding)
+ set_encoding_scheme(encMac, fnt);
+ else
+ set_encoding_scheme(encFontSpecific, fnt);
+
+}
+
+
+static TT_Error
+LoadTrueTypeChar(int idx,
+ Boolean hint,
+ Boolean quiet)
+{
+ TT_Error error;
+ int flags;
+
+
+ flags = TTLOAD_SCALE_GLYPH;
+ if (hint)
+ flags |= TTLOAD_HINT_GLYPH;
+
+ error = TT_Load_Glyph(instance, glyph, idx, flags);
+ if (!error && apply_matrix)
+ {
+ TT_Get_Glyph_Outline(glyph, &outline);
+ TT_Transform_Outline(&outline, &matrix);
+ TT_Get_Outline_BBox(&outline, &bbox);
+ SetRasterArea(quiet);
+ }
+ return error;
+}
+
+
+Boolean
+TTFprocess(long Code,
+ byte **bitmap,
+ int *width, int *height,
+ int *hoff, int *voff,
+ Boolean hinting,
+ Boolean quiet)
+{
+ int Num;
+ TT_Error error;
+
+
+ if (!bitmap || !width || !height || !hoff || !voff)
+ oops("Invalid parameter in call to TTFprocess()");
+
+ if (Code >= 0x10000)
+ Num = Code & 0xFFFF;
+ else
+ Num = TT_Char_Index(char_map, Code);
+ if ((error = LoadTrueTypeChar(Num, hinting, quiet)) == TT_Err_Ok)
+ {
+ memset(Bit.bitmap, 0, Bit.size);
+ TT_Get_Glyph_Bitmap(glyph, &Bit, x_offset * 64, y_offset * 64);
+
+ FlipBit();
+ *bitmap = Bit2.bitmap;
+ *width = Bit2.width;
+ *height = Bit2.rows;
+ *hoff = x_offset;
+ *voff = y_offset;
+ /* *voff = Bit2.rows - y_offset; */
+ /* printf("%D %d\n", *hoff, *voff); */
+ /* Output(Bit2); */
+ return True;
+ }
+ else
+ return False;
+}
+
+
+/*
+ * We collect first all glyphs addressed via the cmap. Then we fill the
+ * array up with glyphs not in the cmap.
+ *
+ * If PSnames is set to `Only', we get the first 256 glyphs which have
+ * names different from `.notdef', `.null', and `nonmarkingreturn'.
+ *
+ * For nicer output, we return the glyph names in an encoding array.
+ */
+
+encoding *
+TTFget_first_glyphs(Font *fnt, long *array)
+{
+ unsigned int i, j, Num;
+ unsigned int index_array[257]; /* we ignore glyph index 0 */
+ char *n;
+ encoding *e = (encoding *)mymalloc(sizeof (encoding));
+
+
+ if (!array)
+ oops("Invalid parameter in call to TTFget_first_glyphs()");
+
+ for (i = 0; i < 257; i++)
+ index_array[i] = 0;
+
+ j = 0;
+ if (fnt->PSnames != Only)
+ {
+ for (i = 0; i <= 0xFFFF; i++)
+ {
+ Num = TT_Char_Index(char_map, i);
+ if (Num < 0)
+ oops("cmap mapping failure.");
+ if (Num == 0)
+ continue;
+ if (Num <= 256)
+ index_array[Num] = 1;
+
+ if (fnt->PSnames)
+ (void)TT_Get_PS_Name(face, Num, &n);
+ else
+ n = code_to_adobename(i);
+ if (strcmp(n, ".notdef") == 0)
+ continue;
+ if (strcmp(n, ".null") == 0)
+ continue;
+ if (strcmp(n, "nonmarkingreturn") == 0)
+ continue;
+
+ if (j < 256)
+ {
+ array[j] = i;
+ e->vec[j] = n;
+ }
+ else
+ return e;
+ j++;
+ }
+
+ if (!fnt->PSnames)
+ {
+ for (i = 1; i < properties.num_Glyphs; i++)
+ {
+ if (index_array[i] == 0)
+ {
+ if (j < 256)
+ {
+ array[j] = i | 0x10000;
+ e->vec[j] = code_to_adobename(i | 0x10000);
+ }
+ else
+ return e;
+ j++;
+ }
+ }
+ }
+ }
+ else
+ {
+ for (i = 0; i < properties.num_Glyphs; i++)
+ {
+ char *n;
+
+
+ (void)TT_Get_PS_Name(face, i, &n);
+
+ if (strcmp(n, ".notdef") == 0)
+ continue;
+ if (strcmp(n, ".null") == 0)
+ continue;
+ if (strcmp(n, "nonmarkingreturn") == 0)
+ continue;
+
+ if (j < 256)
+ {
+ array[j] = i | 0x10000;
+ e->vec[j] = n;
+ }
+ else
+ return e;
+ j++;
+ }
+ }
+
+ return NULL; /* never reached */
+}
+
+
+/*
+ * This routine fills `array' with the subfont character codes;
+ * additionally, it tests for valid glyph indices.
+ */
+
+void
+TTFget_subfont(Font *fnt, long *array)
+{
+ int i, j, Num;
+
+
+ if (!fnt || !array)
+ oops("Invalid parameter in call to TTFget_subfont()");
+
+ for (i = 0; i <= 0xFF; i++)
+ {
+ j = fnt->sf_code[i];
+
+ if (j < 0)
+ array[i] = j;
+ else
+ {
+ Num = TT_Char_Index(char_map, j);
+ if (Num < 0)
+ oops("cmap mapping failure.");
+ else
+ array[i] = j;
+ }
+ }
+}
+
+
+long
+TTFsearch_PS_name(char *name)
+{
+ unsigned int i;
+ char *n;
+
+
+ for (i = 0; i < properties.num_Glyphs; i++)
+ {
+ TT_Get_PS_Name(face, i, &n);
+ if (strcmp(name, n) == 0)
+ break;
+ }
+
+ if (i == properties.num_Glyphs)
+ return -1L;
+ else
+ return (long)i;
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/ttflib.h b/xc/extras/FreeType/contrib/ttf2pk/ttflib.h
new file mode 100644
index 000000000..de48a674b
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/ttflib.h
@@ -0,0 +1,31 @@
+/*
+ * ttflib.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef TTFLIB_H
+#define TTFLIB_H
+
+#include "pklib.h" /* for the `byte' type */
+
+void TTFopen(char *filename, Font *fnt, int new_dpi, int new_ptsize,
+ Boolean quiet);
+
+Boolean TTFprocess(long Code, byte **bitmap,
+ int *width, int *height, int *hoff, int *voff,
+ Boolean hinting, Boolean quiet);
+
+encoding *TTFget_first_glyphs(Font *fnt, long *array);
+void TTFget_subfont(Font *fnt, long *array);
+
+long TTFsearch_PS_name(char *name);
+
+#endif /* TTFLIB_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/vplaux.c b/xc/extras/FreeType/contrib/ttf2pk/vplaux.c
new file mode 100644
index 000000000..9b727a1d0
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/vplaux.c
@@ -0,0 +1,584 @@
+/*
+ * vplaux.c
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "ttf2tfm.h"
+#include "newobj.h"
+#include "ttfenc.h"
+#include "texenc.h"
+#include "tfmaux.h"
+#include "vplaux.h"
+#include "errormsg.h"
+#include "case.h"
+
+
+#undef PI
+#define PI 3.14159265358979323846264338327
+
+
+#define vout(s) fprintf(out, s)
+
+#define voutln(str) {fprintf(out, "%s\n", str); vlevout(level);}
+#define voutln2(f, s) {fprintf(out, f, s); vlevnlout(level);}
+#define voutln3(f, a, b) {fprintf(out, f, a, b); vlevnlout(level);}
+#define voutln4(f, a, b, c) {fprintf(out, f, a, b, c); vlevnlout(level);}
+
+
+static char vcharbuf[6];
+static char vnamebuf[100];
+
+/* the depth of parenthesis nesting in VPL file being written */
+static int level;
+
+
+static FILE *out;
+
+
+static void
+vlevout(register int l)
+{
+ while (l--)
+ vout(" ");
+}
+
+
+static void
+vlevnlout(int level)
+{
+ vout("\n");
+ vlevout(level);
+}
+
+
+static void
+vleft(int *levelp)
+{
+ (*levelp)++;
+ vout("(");
+}
+
+
+static void
+vright(int *levelp)
+{
+ (*levelp)--;
+ voutln(")");
+}
+
+
+static char *
+vchar(int c,
+ char *buf,
+ Boolean forceoctal)
+{
+ if (forceoctal == 0 && isalnum(c))
+ (void)sprintf(buf, "C %c", c);
+ else
+ (void)sprintf(buf, "O %o", (unsigned)c);
+ return buf;
+}
+
+
+static char *
+vname(int c,
+ char *buf,
+ ttfinfo **array,
+ Boolean forceoctal)
+{
+ if (!forceoctal && isalnum(c))
+ buf[0] = '\0';
+ else
+ sprintf(buf, " (comment %s)", array[c]->adobename);
+ return buf;
+}
+
+
+static int
+texheight(register ttfinfo *ti,
+ ttfinfo *ac,
+ int xh)
+{
+ register char **p;
+ register ttfinfo *aci, *acci;
+ char buffer[200];
+
+
+ if (xh <= 50 || *(ti->adobename + 1))
+ return ti->ury; /* that was the simple case */
+
+ for (p = accents; *p; p++) /* otherwise we look for accented letters. */
+ /* We even check glyphs not in any encoding */
+ if (NULL != (aci = findadobe(*p, ac)))
+ {
+ strcpy(buffer, ti->adobename);
+ strcat(buffer, *p);
+ if (NULL != (acci = findadobe(buffer, ac)))
+ return acci->ury - aci->ury + xh;
+ }
+ return ti->ury;
+}
+
+
+/*
+ * Compute uppercase mapping, when making a small caps font.
+ */
+
+void
+upmap(Font *fnt)
+{
+ register ttfinfo *ti, *Ti;
+ register char *p, *q;
+ register pcc *np, *nq;
+ int i, j;
+ char lwr[50];
+
+
+ for (Ti = fnt->charlist; Ti; Ti = Ti->next)
+ {
+ p = Ti->adobename;
+ if (isupper(*p))
+ {
+ q = lwr;
+ for (; *p; p++)
+ *q++ = tolower(*p);
+ *q = '\0';
+
+ if (NULL != (ti = findmappedadobe(lwr, fnt->inencptrs)))
+ {
+ for (i = ti->outcode; i >= 0; i = fnt->nextout[i])
+ fnt->uppercase[i] = Ti;
+ for (i = Ti->outcode; i >= 0; i = fnt->nextout[i])
+ fnt->lowercase[i] = ti;
+ }
+ }
+ }
+
+ /*
+ * Note that, contrary to the normal true/false conventions,
+ * uppercase[i] is NULL and lowercase[i] is non-NULL when `i' is the
+ * ASCII code of an uppercase letter; and vice versa for lowercase
+ * letters.
+ */
+
+ if (NULL != (ti = findmappedadobe("germandbls", fnt->inencptrs)))
+ if (NULL != (Ti = findmappedadobe("S", fnt->inencptrs)))
+ /* we also construct SS */
+ {
+ for (i = ti->outcode; i >= 0; i = fnt->nextout[i])
+ fnt->uppercase[i] = ti;
+ ti->incode = -1;
+ ti->width = Ti->width << 1;
+ ti->llx = Ti->llx;
+ ti->lly = Ti->lly;
+ ti->urx = Ti->width + Ti->urx;
+ ti->ury = Ti->ury;
+ ti->kerns = Ti->kerns;
+
+ np = newpcc();
+ np->partname = "S";
+ nq = newpcc();
+ nq->partname = "S";
+ nq->xoffset = Ti->width;
+ np->next = nq;
+ ti->pccs = np;
+ ti->constructed = True;
+ }
+
+ for (i = 0; casetable[i].upper; i++)
+ {
+ if ((ti = findmappedadobe(casetable[i].lower, fnt->inencptrs)))
+ for (j = ti->outcode; j >= 0; j = fnt->nextout[j])
+ fnt->uppercase[j] = findmappedadobe(casetable[i].upper,
+ fnt->inencptrs);
+ }
+}
+
+/*
+ * The logic above seems to work well enough, but it leaves useless
+ * characters like `fi' and `fl' in the font if they were present
+ * initially, and it omits characters like `dotlessj' if they are
+ * absent initially.
+ */
+
+
+void
+writevpl(Font *fnt, char makevpl, Boolean forceoctal)
+{
+ register int i, j, k;
+ register ttfinfo *ti;
+ register lig *nlig;
+ register kern *nkern;
+ register pcc *npcc;
+ ttfinfo *asucc, *asub, *api;
+ ttfptr *kern_eq;
+ int xoff, yoff, ht;
+ int bc, ec;
+ char buf[200];
+ char header[256];
+ Boolean unlabeled;
+ float Slant;
+
+
+ out = fnt->vplout;
+
+ header[0] = '\0';
+ strncat(header, "Created by `", 12);
+ strncat(header, fnt->titlebuf, 255 - 12 - 1);
+ strncat(header, "'", 1);
+
+ voutln2("(VTITLE %s)", header);
+ voutln("(COMMENT Please change VTITLE if you edit this file)");
+ (void)sprintf(buf, "TeX-%s%s%s%s",
+ fnt->fullname,
+ (fnt->efactor == 1.0 ? "" : "-E"),
+ (fnt->slant == 0.0 ? "" : "-S"),
+ (makevpl == 1 ? "" : "-CSC"));
+
+ if (strlen(buf) > 19) /* too long, will retain first 9 and last 10 chars */
+ {
+ register char *p, *q;
+
+
+ for (p = &buf[9], q = &buf[strlen(buf)-10]; p < &buf[19];
+ p++, q++)
+ *p = *q;
+ buf[19] = '\0';
+ }
+ voutln2("(FAMILY %s)", buf);
+
+ {
+ char tbuf[300];
+ char *base_encoding = fnt->codingscheme;
+
+
+ if (strcmp(fnt->outencoding->name, base_encoding) == 0)
+ sprintf(tbuf, "%s", fnt->outencoding->name);
+ else
+ sprintf(tbuf, "%s + %s", base_encoding, fnt->outencoding->name);
+
+ if (strlen(tbuf) > 39)
+ {
+ warning("Coding scheme too long; shortening to 39 characters");
+ tbuf[39] = '\0';
+ }
+ voutln2("(CODINGSCHEME %s)", tbuf);
+ }
+
+ {
+ long t, sc;
+ char *s;
+ int n, pos;
+
+
+ s = header;
+ n = strlen(s);
+ t = ((long)n) << 24;
+ sc = 16;
+ pos = 18;
+
+ while (n > 0)
+ {
+ t |= ((long)(*(unsigned char *)s++)) << sc;
+ sc -= 8;
+ if (sc < 0)
+ {
+ voutln3("(HEADER D %d O %lo)", pos, t);
+ t = 0;
+ sc = 24;
+ pos++;
+ }
+ n--;
+ }
+ if (t)
+ voutln3("(HEADER D %d O %lo)", pos, t);
+ }
+
+ voutln("(DESIGNSIZE R 10.0)");
+ voutln("(DESIGNUNITS R 1000)");
+ voutln("(COMMENT DESIGNSIZE (1 em) IS IN POINTS)");
+ voutln("(COMMENT OTHER DIMENSIONS ARE MULTIPLES OF DESIGNSIZE/1000)");
+
+#if 0
+ /* Let vptovf compute the checksum. */
+ voutln2("(CHECKSUM O %lo)", cksum ^ 0xFFFFFFFF);
+#endif
+
+ if (fnt->boundarychar >= 0)
+ voutln2("(BOUNDARYCHAR O %lo)", (unsigned long)fnt->boundarychar);
+
+ vleft(&level);
+ voutln("FONTDIMEN");
+
+ Slant = fnt->slant - fnt->efactor * tan(fnt->italicangle * (PI / 180.0));
+
+ if (Slant)
+ voutln2("(SLANT R %f)", Slant);
+ voutln2("(SPACE D %d)", fnt->fontspace);
+ if (!fnt->fixedpitch)
+ {
+ voutln2("(STRETCH D %d)", transform(200, 0, fnt->efactor, fnt->slant));
+ voutln2("(SHRINK D %d)", transform(100, 0, fnt->efactor, fnt->slant));
+ }
+ voutln2("(XHEIGHT D %d)", fnt->xheight);
+ voutln2("(QUAD D %d)", transform(1000, 0, fnt->efactor, fnt->slant));
+ voutln2("(EXTRASPACE D %d)",
+ fnt->fixedpitch ? fnt->fontspace :
+ transform(111, 0, fnt->efactor, fnt->slant));
+ vright(&level);
+
+ vleft(&level);
+ voutln("MAPFONT D 0");
+ voutln2("(FONTNAME %s)", fnt->fullname);
+#if 0
+ voutln2("(FONTCHECKSUM O %lo)", (unsigned long)cksum);
+#endif
+ vright(&level);
+
+ if (makevpl > 1)
+ {
+ vleft(&level);
+ voutln("MAPFONT D 1");
+ voutln2("(FONTNAME %s)", fnt->fullname);
+ voutln2("(FONTAT D %d)", (int)(1000.0 * fnt->capheight + 0.5));
+#if 0
+ voutln2("(FONTCHECKSUM O %lo)", (unsigned long)cksum);
+#endif
+ vright(&level);
+ }
+
+ for (i = 0; i <= 0xFF && fnt->outencptrs[i] == NULL; i++)
+ ;
+ bc = i;
+ for (i = 0xFF; i >= 0 && fnt->outencptrs[i] == NULL; i--)
+ ;
+ ec = i;
+
+ vleft(&level);
+ voutln("LIGTABLE");
+ ti = findadobe("||", fnt->charlist);
+ unlabeled = True;
+ for (nlig = ti->ligs; nlig; nlig = nlig->next)
+ if (NULL != (asucc = findmappedadobe(nlig->succ, fnt->inencptrs)))
+ {
+ if (NULL != (asub = findmappedadobe(nlig->sub, fnt->inencptrs)))
+ if (asucc->outcode >= 0)
+ if (asub->outcode >= 0)
+ {
+ if (unlabeled)
+ {
+ voutln("(LABEL BOUNDARYCHAR)");
+ unlabeled = False;
+ }
+ for (j = asucc->outcode; j >= 0; j = fnt->nextout[j])
+ voutln4("(%s %s O %o)", vplligops[nlig->op],
+ vchar(j, vcharbuf, forceoctal),
+ (unsigned)asub->outcode);
+ }
+ }
+ if (!unlabeled)
+ voutln("(STOP)");
+
+ for (i = bc; i <= ec; i++)
+ if ((ti = fnt->outencptrs[i]) && ti->outcode == i)
+ {
+ unlabeled = True;
+ if (fnt->uppercase[i] == NULL)
+ /* omit ligatures from smallcap lowercase */
+ for (nlig = ti->ligs; nlig; nlig = nlig->next)
+ if (NULL != (asucc = findmappedadobe(nlig->succ, fnt->inencptrs)))
+ if (NULL != (asub = findmappedadobe(nlig->sub, fnt->inencptrs)))
+ if (asucc->outcode >= 0)
+ if (asub->outcode >= 0)
+ {
+ if (unlabeled)
+ {
+ for (j = ti->outcode; j >= 0; j = fnt->nextout[j])
+ voutln3("(LABEL %s)%s",
+ vchar(j, vcharbuf, forceoctal),
+ vname(j, vnamebuf,
+ fnt->outencptrs, forceoctal));
+ unlabeled = False;
+ }
+ for (j = asucc->outcode; j >= 0; j = fnt->nextout[j])
+ {
+ voutln4("(%s %s O %o)", vplligops[nlig->op],
+ vchar(j, vcharbuf, forceoctal),
+ (unsigned)asub->outcode);
+ if (nlig->boundleft)
+ break;
+ }
+ }
+
+ for (nkern = (fnt->uppercase[i] ? fnt->uppercase[i]->kerns : ti->kerns);
+ nkern; nkern=nkern->next)
+ if (NULL != (asucc = findmappedadobe(nkern->succ, fnt->inencptrs)))
+ for (j = asucc->outcode; j >= 0; j = fnt->nextout[j])
+ {
+ if (fnt->uppercase[j] == NULL)
+ {
+ if (unlabeled)
+ {
+ for (k = ti->outcode; k >= 0; k = fnt->nextout[k])
+ voutln3("(LABEL %s)%s",
+ vchar(k, vcharbuf, forceoctal),
+ vname(k, vnamebuf, fnt->outencptrs, forceoctal));
+ unlabeled = False;
+ }
+
+ /*
+ * If other characters have the same kerns as this
+ * one, output the label here. This makes the TFM
+ * file much smaller than if we output all the
+ * kerns again under a different label.
+ */
+
+ for (kern_eq = ti->kern_equivs; kern_eq;
+ kern_eq = kern_eq->next)
+ {
+ k = kern_eq->ch->outcode;
+ if (k >= 0 && k <= 0xFF)
+ voutln3("(LABEL %s)%s",
+ vchar(k, vcharbuf, forceoctal),
+ vname(k, vnamebuf, fnt->outencptrs, forceoctal));
+ }
+ ti->kern_equivs = NULL; /* Only output those labels once. */
+
+ if (fnt->uppercase[i])
+ {
+ if (fnt->lowercase[j])
+ {
+ for (k = fnt->lowercase[j]->outcode; k >= 0;
+ k = fnt->nextout[k])
+ voutln4("(KRN %s R %.1f)%s",
+ vchar(k, vcharbuf, forceoctal),
+ fnt->capheight * nkern->delta,
+ vname(k, vnamebuf, fnt->outencptrs, forceoctal));
+ }
+ else
+ voutln4("(KRN %s R %.1f)%s",
+ vchar(j, vcharbuf, forceoctal),
+ fnt->capheight * nkern->delta,
+ vname(j, vnamebuf, fnt->outencptrs, forceoctal));
+ }
+ else
+ {
+ voutln4("(KRN %s R %d)%s",
+ vchar(j, vcharbuf, forceoctal),
+ nkern->delta,
+ vname(j, vnamebuf, fnt->outencptrs, forceoctal));
+ if (fnt->lowercase[j])
+ for (k = fnt->lowercase[j]->outcode; k >= 0;
+ k = fnt->nextout[k])
+ voutln4("(KRN %s R %.1f)%s",
+ vchar(k, vcharbuf, forceoctal),
+ fnt->capheight * nkern->delta,
+ vname(k, vnamebuf, fnt->outencptrs, forceoctal));
+ }
+ }
+ }
+ if (!unlabeled)
+ voutln("(STOP)");
+ }
+ vright(&level);
+
+ for (i = bc; i <= ec; i++)
+ if (NULL != (ti = fnt->outencptrs[i]))
+ {
+ vleft(&level);
+ fprintf(out, "CHARACTER %s%s\n ",
+ vchar(i, vcharbuf, forceoctal),
+ vname(i, vnamebuf, fnt->outencptrs, forceoctal));
+
+ if (fnt->uppercase[i])
+ {
+ ti = fnt->uppercase[i];
+ voutln2("(CHARWD R %.1f)", fnt->capheight * (ti->width));
+ if (0 != (ht = texheight(ti, fnt->charlist, fnt->xheight)))
+ voutln2("(CHARHT R %.1f)", fnt->capheight * ht);
+ if (ti->lly)
+ voutln2("(CHARDP R %.1f)", -fnt->capheight * ti->lly);
+ if (ti->urx > ti->width)
+ voutln2("(CHARIC R %.1f)", fnt->capheight * (ti->urx - ti->width));
+ }
+ else
+ {
+ voutln2("(CHARWD R %d)", ti->width);
+ if (0 != (ht = texheight(ti, fnt->charlist, fnt->xheight)))
+ voutln2("(CHARHT R %d)", ht);
+ if (ti->lly)
+ voutln2("(CHARDP R %d)", -ti->lly);
+ if (ti->urx > ti->width)
+ voutln2("(CHARIC R %d)", ti->urx - ti->width);
+ }
+
+ if (ti->incode != i || fnt->uppercase[i] || ti->constructed)
+ {
+ vleft(&level);
+ voutln("MAP");
+ if (fnt->uppercase[i])
+ voutln("(SELECTFONT D 1)");
+
+ if (ti->pccs && (ti->incode < 0 || ti->constructed))
+ {
+ xoff = 0;
+ yoff = 0;
+
+ for (npcc = ti->pccs; npcc; npcc = npcc->next)
+ if (NULL != (api = findmappedadobe(npcc->partname,
+ fnt->inencptrs)))
+ if (api->outcode >= 0)
+ {
+ if (npcc->xoffset != xoff)
+ {
+ if (fnt->uppercase[i])
+ {
+ voutln2("(MOVERIGHT R %.1f)",
+ fnt->capheight * (npcc->xoffset - xoff));
+ }
+ else
+ voutln2("(MOVERIGHT R %d)", npcc->xoffset - xoff);
+
+ xoff = npcc->xoffset;
+ }
+
+ if (npcc->yoffset != yoff)
+ {
+ if (fnt->uppercase[i])
+ {
+ voutln2("(MOVEUP R %.1f)",
+ fnt->capheight * (npcc->yoffset - yoff));
+ }
+ else
+ voutln2("(MOVEUP R %d)", npcc->yoffset - yoff);
+
+ yoff = npcc->yoffset;
+ }
+
+ voutln2("(SETCHAR O %o)", (unsigned)api->incode);
+ xoff += fnt->outencptrs[api->outcode]->width;
+ }
+ }
+ else
+ voutln2("(SETCHAR O %o)", (unsigned)ti->incode);
+ vright(&level);
+ }
+ vright(&level);
+ }
+
+ if (level)
+ oops("I forgot to match the parentheses.");
+}
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttf2pk/vplaux.h b/xc/extras/FreeType/contrib/ttf2pk/vplaux.h
new file mode 100644
index 000000000..bea21af96
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttf2pk/vplaux.h
@@ -0,0 +1,23 @@
+/*
+ * vplaux.h
+ *
+ * This file is part of the ttf2pk package.
+ *
+ * Copyright 1997-1998 by
+ * Frederic Loyer <loyer@ensta.fr>
+ * Werner Lemberg <wl@gnu.org>
+ */
+
+#ifndef VPLAUX_H
+#define VPLAUX_H
+
+#include "ttf2tfm.h"
+
+
+void writevpl(Font *fnt, char makevpl, Boolean forceoctal);
+void upmap(Font *fnt);
+
+#endif /* VPLAUX_H */
+
+
+/* end */
diff --git a/xc/extras/FreeType/contrib/ttfbanner/Makefile b/xc/extras/FreeType/contrib/ttfbanner/Makefile
new file mode 100644
index 000000000..b1eb1dcdc
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttfbanner/Makefile
@@ -0,0 +1,9 @@
+# Makefile for ttfbanner
+
+all: ttfbanner
+
+ttfbanner: ttfbanner.o
+ cc -O -o ttfbanner ttfbanner.o -lttf
+
+ttfbanner.o: ttfbanner.c
+ cc -O -c ttfbanner.c \ No newline at end of file
diff --git a/xc/extras/FreeType/contrib/ttfbanner/README b/xc/extras/FreeType/contrib/ttfbanner/README
new file mode 100644
index 000000000..0cd0f9e40
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttfbanner/README
@@ -0,0 +1,38 @@
+ttfbanner -- make posters using a TrueType font
+
+Installation
+************
+
+Just compile the file `ttfbanner.c' and link it with FreeType.
+FreeType can be found in
+
+ <URL:http://www.freetype.org/>
+
+A sample Makefile is provided.
+
+
+Usage
+*****
+
+Just typing `ttfbanner' will provide you with some summary usage
+instructions.
+
+
+Limitations
+***********
+
+The program will not do any kerning. Incorrect UTF8 strings will not
+always be detected.
+
+
+Copying
+*******
+
+This software is provided with no warranty whatsoever. You may do
+whatever you wish with it as long as you don't ask me to maintain it.
+
+
+Author
+******
+
+Juliusz Chroboczek <jec@dcs.ed.ac.uk>
diff --git a/xc/extras/FreeType/contrib/ttfbanner/ttfbanner.c b/xc/extras/FreeType/contrib/ttfbanner/ttfbanner.c
new file mode 100644
index 000000000..c05bd36a0
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttfbanner/ttfbanner.c
@@ -0,0 +1,317 @@
+/* This code was written by Juliusz Chroboczek <jec@dcs.ed.ac.uk>. */
+/* It comes with no warranty whatsoever. */
+/* Feel free to use it as long as you don't ask me to maintain it. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <malloc.h>
+#include <string.h>
+#include "freetype.h"
+#include "ttfbanner.h"
+
+#define MAXIMIZE(x,xval) if((x)<(xval)) {x=(xval);}
+#define MINIMIZE(x,xval) if((x)>(xval)) {x=(xval);}
+
+void
+usage()
+{
+ fprintf(stderr, "Usage: ttfbanner [options] font.ttf string\n");
+ fprintf(stderr, " where options include:\n");
+ fprintf(stderr, " -e encoding: specify the encoding of the string (L1, L2 or UTF8, default L1)\n");
+ fprintf(stderr, " -p pointsize: specify the point size to use (default 14)\n");
+ fprintf(stderr, " -r resolution: specify x and y resolutions (default 72dpi)\n");
+ fprintf(stderr, " -x resolution: specify x resolution\n");
+ fprintf(stderr, " -y resolution: specify y resolution\n");
+ exit(2);
+}
+
+int
+main(int argc, char **argv)
+{
+ extern char *optarg;
+ extern int optind;
+ int c;
+
+ unsigned short *unicodeString;
+ enum {L1, L2, UTF8} encoding=L1;
+ double pointsize=14.0;
+ int xr=72, yr=72;
+
+ TT_Raster_Map *raster;
+
+ while((c=getopt(argc, argv, "s:e:p:r:x:y:"))!=EOF) {
+ switch(c) {
+ case 'e':
+ if(!strcmp(optarg,"L1"))
+ encoding=L1;
+ else if(!strcmp(optarg, "L2"))
+ encoding=L2;
+ else if(!strcmp(optarg, "UTF8"))
+ encoding=UTF8;
+ else {
+ fprintf(stderr, "Unknown encoding %s; defaulting to L1\n");
+ encoding=L1;
+ }
+ break;
+ case 'p':
+ pointsize=atof(optarg);
+ break;
+ case 'r':
+ xr=yr=atoi(optarg);
+ break;
+ case 'x':
+ xr=atoi(optarg);
+ break;
+ case 'y':
+ yr=atoi(optarg);
+ break;
+ default:
+ usage();
+ }
+ }
+
+ if(argc-optind!=2)
+ usage();
+
+ if(encoding==L1)
+ unicodeString=l1toUnicode(argv[optind+1]);
+ else if(encoding==L2)
+ unicodeString=l2toUnicode(argv[optind+1]);
+ else if(encoding==UTF8)
+ unicodeString=UTF8toUnicode(argv[optind+1]);
+ else
+ Error("This cannot happen");
+
+ raster=makeBitmap(unicodeString, argv[optind],
+ pointsize, xr, yr);
+ writeBanner(raster);
+
+ return 0;
+}
+
+TT_Raster_Map *
+makeBitmap(unsigned short *unicodeString,
+ char *ttf, double charsize, int xr, int yr)
+{
+ int error;
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+ TT_Glyph_Metrics metrics;
+ TT_Raster_Map *raster;
+ TT_CharMap cmap;
+
+ long xMin, xMax, yMin, yMax;
+ int xpos, ypos, xoffset, yoffset;
+ unsigned short *p;
+ int first;
+ short index;
+
+ if(error=TT_Init_FreeType(&engine))
+ FTError("Coudn't initialise FreeType engine", error);
+ if(error=TT_Open_Face(engine, ttf, &face))
+ FTError("Coudn't open font file", error);
+ if(error=TT_New_Instance(face, &instance))
+ FTError("Couldn't create new instance", error);
+ if(error=TT_Set_Instance_Resolutions(instance, xr, yr))
+ FTError("Couldn't set resolutions", error);
+ if(error=TT_Set_Instance_CharSize(instance, (TT_F26Dot6)(charsize*64.0)))
+ FTError("Coudn't set point size", error);
+ if(error=TT_New_Glyph(face, &glyph))
+ FTError("Coudn't create glyph", error);
+
+ if(error=find_unicode_cmap(face, &cmap))
+ Error("Couldn't find suitable Cmap");
+
+ /* Compute size */
+ xMin=yMin= 100000l;
+ xMax=yMax= -100000l;
+ for(p=unicodeString, first=1, xpos=0; (*p)!=0xFFFF; p++, first=0) {
+ index=TT_Char_Index(cmap, *p);
+ if(error=TT_Load_Glyph(instance, glyph, index, TTLOAD_DEFAULT))
+ FTError("Couldn't load glyph", error);
+ if(error=TT_Get_Glyph_Metrics(glyph, &metrics))
+ FTError("Couldn't get glyph metrics", error);
+
+ if(first)
+ xMin=metrics.bbox.xMin;
+ xMax=xpos*64+metrics.bbox.xMax;
+ xpos+=(metrics.advance+32)/64;
+
+ MAXIMIZE(yMax, metrics.bbox.yMax);
+ MINIMIZE(yMin, metrics.bbox.yMin);
+ }
+
+ xoffset=-(xMin-63)/64;
+ yoffset=-(yMin-63)/64;
+
+ if((raster=malloc(sizeof(TT_Raster_Map)))==NULL)
+ Error("Couldn't allocate raster structure");
+ raster->rows=(yMax+63)/64+yoffset;
+ raster->width=(xMax+63)/64+xoffset;
+ raster->cols=(raster->width+7)/8;
+ raster->flow=TT_Flow_Down;
+ if((raster->bitmap=calloc(raster->cols, raster->rows))==NULL)
+ Error("Couldn't allocate bitmap");
+ raster->size=((long)raster->rows*raster->cols);
+
+
+ for(p=unicodeString, xpos=xoffset; *p!=0xFFFF; p++) {
+ index=TT_Char_Index(cmap, *p);
+ if(error=TT_Load_Glyph(instance, glyph, index, TTLOAD_DEFAULT))
+ FTError("Couldn't load glyph", error);
+ if(error=TT_Get_Glyph_Metrics(glyph, &metrics))
+ FTError("Couldn't get glyph metrics", error);
+
+ if(error=TT_Get_Glyph_Bitmap(glyph, raster, xpos*64, yoffset*64))
+ FTError("Couldn't typeset glyph", error);
+ xpos+=(metrics.advance+32)/64;
+ }
+
+ return raster;
+}
+
+int
+find_unicode_cmap(TT_Face face, TT_CharMap *cmap)
+{
+ int i,n;
+ unsigned short p,e;
+
+ n=TT_Get_CharMap_Count(face);
+ for(i=0; i<n; i++) {
+ if(!TT_Get_CharMap_ID(face, i, &p, &e))
+ if(p==3 && e==1 || p==0 || p==2 && e==1)
+ if(!TT_Get_CharMap(face, i, cmap))
+ return 0;
+ }
+ return 1;
+}
+
+void
+writeBanner(TT_Raster_Map *raster)
+{
+ int i;
+
+ for(i=0; i<raster->rows; i++) {
+ int j;
+ for(j=0; j<raster->width; j++) {
+ if(((((unsigned char*)raster->bitmap)+i*raster->cols)[j/8]&(1<<(7-j%8)))
+ != 0)
+ putchar('*');
+ else
+ putchar(' ');
+ }
+ putchar('\n');
+ }
+}
+
+unsigned short *
+l1toUnicode(char *string)
+{
+ unsigned short *r;
+ int n,i;
+
+ n=strlen(string);
+ if((r=malloc(sizeof(unsigned short)*(n+1)))==NULL)
+ Error("Couldn't allocate string");
+
+ for(i=0; i<n; i++)
+ r[i]=string[i]&0xFF;
+
+ r[n]=0xFFFF;
+ return r;
+}
+
+static unsigned short iso8859_2_tophalf[]=
+{ 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7,
+ 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
+ 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7,
+ 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9};
+
+unsigned short *
+l2toUnicode(char *string)
+{
+ unsigned short *r;
+ int n,i;
+
+ n=strlen(string);
+ if((r=malloc(sizeof(unsigned short)*(n+1)))==NULL)
+ Error("Couldn't allocate string");
+
+ for(i=0; i<n; i++) {
+ if((string[i]&0xFF)<0xA0)
+ r[i]=string[i]&0xFF;
+ else
+ r[i]=iso8859_2_tophalf[(string[i]&0xFF)-0xA0];
+ }
+
+ r[n]=0xFFFF;
+ return r;
+}
+
+static int
+UTF8toUnicodeInternal(unsigned short *dest, char *src)
+{
+ unsigned short *d;
+ char *s;
+ int i;
+
+ /* Assumes correct input and no characters outside the BMP. */
+
+ for(i=0, d=dest, s=src; *s; i++) {
+ if((s[0]&0x80)==0) {
+ if(dest) *d=s[0];
+ s++;
+ } else if((s[0]&0x20)==0) {
+ if(dest) *d=(s[0]&0x1F)<<6 | (s[1]&0x3F);
+ s+=2;
+ } else if((s[0]&0x10)==0) {
+ if(dest) *d=(s[0]&0x0F)<<12 | (s[1]&0x3F)<<6 | (s[2]&0x3F);
+ s+=3;
+ } else
+ Error("Incorrect UTF-8");
+ if(dest)
+ d++;
+ }
+ return i;
+}
+
+unsigned short *
+UTF8toUnicode(char *string)
+{
+ int n;
+ unsigned short *r;
+
+ n=UTF8toUnicodeInternal(NULL, string);
+
+ if((r=malloc(sizeof(unsigned short)*(n+1)))==NULL)
+ Error("Couldn't allocate string");
+
+ UTF8toUnicodeInternal(r, string);
+ r[n]=0xFFFF;
+ return r;
+}
+
+void
+FTError(char *string, TT_Error error)
+{
+ fprintf(stderr, "FreeType error: %s: %d\n", string, error);
+ exit(2);
+}
+
+void
+Error(char *string)
+{
+ fprintf(stderr, "Error: %s\n", string);
+ exit(2);
+}
+
diff --git a/xc/extras/FreeType/contrib/ttfbanner/ttfbanner.h b/xc/extras/FreeType/contrib/ttfbanner/ttfbanner.h
new file mode 100644
index 000000000..5a5300e6f
--- /dev/null
+++ b/xc/extras/FreeType/contrib/ttfbanner/ttfbanner.h
@@ -0,0 +1,9 @@
+TT_Raster_Map *makeBitmap(unsigned short*, char*, double, int, int);
+void writeBanner(TT_Raster_Map *);
+void FTError(char*, TT_Error);
+void Error(char*);
+int find_unicode_cmap(TT_Face, TT_CharMap*);
+unsigned short *l1toUnicode(char *);
+unsigned short *l2toUnicode(char *);
+unsigned short *UTF8toUnicode(char *);
+void usage(void);
diff --git a/xc/extras/FreeType/docs/FAQ b/xc/extras/FreeType/docs/FAQ
new file mode 100644
index 000000000..c679171cf
--- /dev/null
+++ b/xc/extras/FreeType/docs/FAQ
@@ -0,0 +1,814 @@
+ FreeType User FAQ
+
+--------------------------------------------------------------------
+
+
+ Table of contents
+
+
+1. How do I compile the test programs?
+
+2. What are the test programs?
+
+3. How do I use them?
+
+4. How do I only compile the FreeType library?
+
+5. The library compiles fine on my system, unfortunately it seems
+ the test programs won't. What can I do?
+
+6. What is FreeType, and what is it not?
+
+7. Can FreeType be ported to other platforms?
+
+8. My TrueType font only works on a Mac/in Windows. Will I be able
+ to use it with FreeType?
+
+9. What are the most common character mappings?
+
+10. How do I render text with FreeType?
+
+11. How do I render rotated/slanted text with FreeType?
+
+12. How do I compute a glyph bitmap's dimensions?
+
+13. Why is text rendering so slow? Does FreeType cache glyphs?
+
+14. Do you always render the same glyphs as Windows or the Mac?
+
+15. The program "ftlint" reports errors with one of my fonts, though
+ it works perfectly under Windows. What does this mean?
+
+16. What does the "fttimer" test program benchmarks?
+
+17. Is it possible to perform styling (like oblique, italic, bold,
+ underline, etc.) with FreeType?
+
+18. When does glyph hinting takes place? Is it when the glyph is
+ loaded, or when it is converted to a bitmap/pixmap?
+
+19. Which is the best, caching outlines or bitmaps?
+
+20. Can I open OpenType and/or TrueType GX fonts with FreeType?
+
+21. How can I access additional TrueType tables that FreeType
+ doesn't support?
+
+22. When will I be able to use FreeType to display TrueType fonts in
+ X11, Wine, or OS/2, or even other systems?
+
+23. What does the "free" in FreeType really means?
+
+24. Does FreeType support threads? Is it re-entrant?
+
+25. Does FreeType support "foreign languages"?
+
+26. I'm using fractional char sizes, but the glyphs stay at
+ the same integer size. Why?
+
+27. Hinting doesn't work at very small sizes. Why?
+
+--------------------------------------------------------------------
+
+1. How do I compile the test programs?
+
+ Detailed compilation steps are given in the "freetype/HOWTO.txt"
+ file, as well as system and compiler specific hints in the
+ "freetype/howto" directory. What follows is a _very_ simple
+ guide:
+
+ For Unix:
+
+ Do the following on the prompt while in the base directory of
+ the FreeType package:
+
+ % ./configure
+ % make
+ % make install
+
+ This will build and install the library (static and shared, if
+ supported) together with the test programs. Say `./configure
+ --help' to see the available configuring options.
+
+ This should work with any ANSI C compiler.
+
+ For other platforms:
+
+ Go to the 'test' directory. Look at one of the makefiles
+ located in the 'arch/<system>' directory, and use the
+ appropriate makefile from there.
+
+ For example:
+
+ make -f arch/msdos/makefile.gcc (DJGPP or emx)
+ wmake -f arch\msdos\makefile.wat (Watcom DOS)
+ nmake -f arch\os2\makefile.icc (Visual Age OS/2)
+ make -f arch/amigaos/makefile.gcc (GCC Amiga)
+
+ This will compile both the library and the test programs.
+
+
+--------------------------------------------------------------------
+
+2. What are the test programs?
+
+ The test programs are simple sources that "show off" the FreeType
+ library. They're located in the 'test' directory. They make use
+ of a small graphics sub-system which is able to display bitmaps
+ and pixmaps on a variety of platforms through the use of
+ system-specific 'drivers'.
+
+ The test programs are:
+
+ ftdump: A simple TTF information dumper. Also prints the
+ memory used by each opened font file with FreeType.
+ Doesn't use the graphics sub-system.
+
+ ftlint: A simple TrueType bytecode verifier. It simply hints
+ all glyphs of one or more font files at a given size
+ and reports errors. Doesn't use the graphics
+ sub-system.
+
+ ftview: A simple font viewer. Displays all glyphs in a font
+ file in a window.
+
+ ftstring: Renders a simple string to the screen. Demonstrates
+ how to produce text with FreeType.
+
+ fttimer: A simple benchmark, used to profile the scan-line
+ conversion routines (and only them). Supports also
+ display.
+
+ ftstrpnm: A version of 'ftstring' which saves a bit/pixmap to a
+ PNM file rather than to the screen. No graphics
+ sub-system needed.
+
+ ftzoom: A simple glyph viewer, useful to view, zoom and rotate
+ individual glyphs in a font file.
+
+ NOTE: The file 'ftdebug.c' isn't part of the test suite. It is
+ used only by the developers team to debug the engine at a
+ higher level. It won't work with a standard library
+ compile.
+
+
+ The tiny graphics subsystem is defined in the following files:
+
+ gmain.h/gmain.c: The subsystem's main body/interface.
+
+ gevents.h: The definition of events defined for the
+ subsystem
+
+ gdriver.h: The generic interface of all system-specific
+ drivers.
+
+ In addition to several files in the 'test/arch/<system>'
+ directories, like:
+
+ test/arch/msdos/gfs_dos.c Full-Screen DOS driver
+ test/arch/os2/gpm_os2.c PM (Windowed) OS/2 driver
+ test/arch/unix/gwin_x11.c X11 Windowed driver
+
+ etc.
+
+
+--------------------------------------------------------------------
+
+3. How do I use them?
+
+ The following keyboard mapping has been chosen for all test
+ programs. It's not fancy, but at least works on all platforms
+ easily:
+
+ x : fine counter-clockwise rotation (ftzoom only)
+ c : fine clockwise rotation (ftzoom only)
+
+ v : fast counter-clockwise rotation (ftzoom only)
+ b : fast clockwise rotation (ftzoom only)
+
+ h : toggle hinting on/off
+ [default is on]
+
+ + : fast scale up
+ - : fast scale down
+
+ u : fine scale up
+ j : fine scale down
+
+ l : go to next glyph
+ k : go to previous glyph
+
+ o : go to tenth next glyph
+ i : go to tenth previous glyph
+
+ 9 : go to hundredth next glyph (useful for large fonts)
+ 0 : go to hundredth previous glyph
+
+ ( : go to 1000th next glyph (useful for Unicode and CJK fonts)
+ ) : go to 1000th previous glyph
+
+ { : go to 10000th next glyph
+ } : go to 10000th previous glyph
+
+ ESC :
+ q : exit
+
+
+--------------------------------------------------------------------
+
+4. How do I only compile the FreeType library?
+
+ For Unix:
+
+ Do a `configure' run as described in section 1. Then change to
+ the lib subdirectory and say `make' and `make install'.
+
+ For other platforms:
+
+ Go to the 'lib' directory. Look at one of the makefiles located
+ in the 'arch/<system>' directory, and use it from 'lib'.
+
+ For example:
+
+ make -f arch/msdos/makefile.gcc (DJGPP or emx)
+ wmake -f=arch\msdos\makefile.wat (Watcom DOS)
+ nmake -f arch\os2\makefile.icc (Visual Age OS/2)
+ make -f arch/amigaos/makefile.gcc (GCC Amiga)
+
+ The library is pure ANSI C and doesn't depend on any
+ system-specific package. You need not gcc to compile it.
+
+
+--------------------------------------------------------------------
+
+5. The library compiles fine on my system, unfortunately it seems
+ the test programs won't. What can I do?
+
+ As said before, the test programs rely on a small graphics
+ sub-system to display the bitmaps and pixmaps produced by the
+ library. The following systems are currently supported:
+
+ DOS Full-Screen
+ Amiga Full-Screen Note that the windowed graphics
+ Amiga Windowed driver are very 'basic', they do
+ OS/2 Full-Screen not provide menus, dialog boxes,
+ OS/2 Windowed etc. Rather, they provide one
+ X11 Windowed windowed bitmap/pixmap and translate
+ events to the ones defined in
+ "test/gevents".
+
+ If you want to add support to your system (like Windows), you
+ should write a new graphics driver. To do that, read the file
+ "test/gdriver.h" which contains the driver generic interface, then
+ browse the drivers that are already provided.
+
+ The graphics drivers are located in the "test/arch/<system>"
+ directories. They're not part of the library proper.
+
+ IMPORTANT NOTE:
+
+ You can also directly link the library to your own application and
+ render glyphs directly into your own bitmaps with very few
+ efforts.
+
+
+--------------------------------------------------------------------
+
+6. What is FreeType, and what is it not?
+
+ FreeType is a rather low-level font engine. It has been designed
+ primarly to be the basis of several font servers, for very
+ different systems which all have their own metrics and graphics
+ models. This means that it focuses on the following points:
+
+ - opening and loading font files in memory.
+
+ - giving access to most important font properties and TrueType
+ tables.
+
+ - providing a simple way to translate system-specific character
+ codes into glyph indexes, according to the TrueType "cmap"
+ specification.
+
+ - loading and rendering _individual_ glyphs, as nicely as possible
+ (either in outlines, bitmaps or pixmaps), and performing
+ excellent hinting.
+
+ It isn't a high-level text rendering library, and many tasks will
+ have to be performed by higher level layers like:
+
+ - glyph caching (outlines and/or maps)
+ - text rendering
+ - justification, kerning
+ - font mapping
+ - rotated/slanted text
+
+ However, its API provides many functions that ease these
+ operations considerably:
+
+ - Glyph outlines can be copied and transformed easily with the
+ API, then rendered to bitmaps or pixmaps with FreeType's
+ scan-line converter, which is very fast.
+
+ - The glyph loader places the outlines in order to ease the
+ process of text rendering. See the documentation file named
+ "glyphs" or 'ftstring's source for more details.
+
+ - The engine gives you access to several TrueType tables that can
+ be processed by your application to provide more powerful
+ rendering (i.e. kerning).
+
+ - It is possible, and rather simple, to write separately
+ compilable extensions to the engine to access other TrueType
+ tables that are not supported by the engine in this release.
+ This can be handy if one wants to access data in TrueType GX or
+ OpenType fonts (as these formats comply to the TrueType "sfnt"
+ file storage format, they can be opened by the FreeType engine
+ as a normal TrueType file).
+
+
+--------------------------------------------------------------------
+
+7. Can FreeType be ported to other platforms?
+
+ FreeType is written in pure ANSI C and should compile well on all
+ 16, 32 and 64 bits processors. Note, however, that the 16-bit
+ port requires a large memory model, as some tables found in
+ TrueType programs could exceed 64kByte (this is really true for
+ CJK and Unicode fonts. Nearly all others should work fine with
+ it).
+
+ It doesn't support some very exotic platforms though, like a
+ 32-bits only processor (where the only word size is 32-bits, even
+ for chars and shorts). However, nothing prevents you to test it
+ by yourself...
+
+ The memory management and file access routines have been gathered
+ in two components, namely "ttmemory" and "ttfile", which can be
+ specialized for a specific system. Their standard version, found
+ in the "lib" directory, uses simply the ANSI libc. However,
+ examples are given of alternative file components for OS/2 and
+ Unix in:
+
+ lib/arch/os2/ttfile.c
+ (accessing the low-level OS/2 file API directly)
+
+ lib/arch/unix/ttmmap.c
+ (using memory-mapped files for improved access)
+
+ You would certainly need to rewrite these components if you intend
+ to use FreeType in an embedded system.
+
+
+--------------------------------------------------------------------
+
+8. My TrueType font only works on a Mac/in Windows. Will I be able
+ to use it with FreeType?
+
+ Short Answer: YES, but be cautious!
+
+ If you've read section 9 or 25, you know that a font file might
+ have different charMaps entries, used to translate character codes
+ to glyph indexes. The problem of most "system-specific" TrueType
+ fonts (sigh) is that they only contain one single mapping, like
+ Apple Roman, or Windows Glyph List, making it usable only on the
+ platform it was "designed" for.
+
+ The test program "ftdump" can be used to display the character
+ encodings supported in a font file. Most fonts come with Apple
+ Roman and Windows Unicode.
+
+ FreeType can use every charmap found in a font file, so it's up to
+ your application to choose the one that fits its task the best.
+ If you use a font which only provides an Apple Roman charcode,
+ you'll probably have a hard time rendering Unicode strings without
+ an additional translation.
+
+ Note that the tool 'ttf_edit' can actually add missing cmaps to a
+ TrueType font file. More info on this can be found at:
+
+ http://idt.net/~truetex
+
+
+--------------------------------------------------------------------
+
+9. What are the most common character mappings?
+
+ If you don't want to read the TrueType specification, here is some
+ information about the most used char maps. Each map is designed
+ by a "platform ID", followed by a platform-specific "encoding ID":
+
+ Examples:
+
+ 0, 0 : Apple Unicode
+ 1, 0 : Apple Roman
+ 3, 0 : Windows Symbol
+ 3, 1 : Windows Unicode
+
+ Windows and Apple Unicode charmaps differ only in internal storage
+ layout. Both can be used transparently with FreeType.
+
+ Many fonts come also with both Apple Roman and Windows Unicode.
+
+
+--------------------------------------------------------------------
+
+10. How do I render text with FreeType?
+
+ This is explained with great detail in the documentation file
+ called "glyphs", available in both text and HTML (including
+ schematics).
+
+ Text rendering isn't difficult. One can also look at the code for
+ "ftstring" to see how it is done.
+
+
+--------------------------------------------------------------------
+
+11. How do I render rotated/slanted text with FreeType?
+
+ It is possible to transform the outlines returned by the glyph
+ loader, hence producing rotated or slanted text. Please read the
+ "glyphs" documentation file, which explains this in great detail,
+ as well as some other important things.
+
+
+--------------------------------------------------------------------
+
+12. How do I compute a glyph bitmap's dimensions?
+
+ You should grid-fit its bounding box, then compute its width and
+ height. This is explained in the "bitmaps.txt" documentation
+ file.
+
+
+--------------------------------------------------------------------
+
+13. Why is text rendering so slow?
+ Does FreeType cache glyphs?
+
+ The FreeType engine doesn't cache anything, be it outlines or
+ bitmaps. Hence, a program that renders text by calling the glyph
+ loader on each letter is slow.
+
+ Because caching cannot be performed in both an _easy_ and
+ _portable_ way it is left to the application. Moreover, some
+ graphics systems already provide some sort of caching, and it's
+ better to take advantage of it rather than re-implementing it.
+
+ The hows and when of caching are explained in the "glyphs"
+ documentation file. The "bitmaps" doc file is also a good source
+ of information if you intend to render individual glyph bitmaps.
+
+
+--------------------------------------------------------------------
+
+14. Do you always render the same glyphs as Windows or the Mac?
+
+ Short answer: No for rare cases.
+
+ There are a lot of technical details, too numerous and lengthy to
+ be put here, that prevents the FreeType library from matching 100%
+ the glyphs produced by the Windows or Macintosh rasterizers.
+
+ This engine is a clean-room implementation, and most of the
+ reasons why its development took so much time is the largely
+ deficient TrueType specification published by Apple and Microsoft.
+ A number of key technical aspects are missing, and we found many
+ "undocumented" features in the TrueType bytecode, after several
+ months of testing and trying. We are now very satisfied with the
+ current quality, though still try to improve it.
+
+ The glyph metrics (bearings and advances) also match significantly
+ those computed by Windows, or found in the TrueType pre-calc
+ tables.
+
+ As hinting glyphs also makes use of several rounding operations,
+ we'll be unable to provide a perfect clone unless we implement the
+ exact same computations _and_ rounding errors -- this is highly
+ unlikely...
+
+
+--------------------------------------------------------------------
+
+15. The program "ftlint" reports errors with one of my fonts, though
+ it works perfectly under Windows. What does this mean?
+
+ Associated to each glyph is a small "program", written in a
+ specific bytecode, which is in charge of hinting the glyph's
+ outline to make it perfect on screen as on paper. Some of these
+ programs can be broken (e.g. access invalid areas of memory,
+ perform a divide by zero, etc.), and these are the errors that are
+ reported by "ftlint".
+
+ They can also mean a bug in the TrueType bytecode interpreter (or
+ more likely an "undocumented" feature we haven't discovered yet),
+ but should now be extremely rare.
+
+ Surprisingly, even largely distributed fonts can contain broken
+ glyph programs. For example:
+
+ - antqua.ttf, glyph 163: (MS Office 4.2)
+
+ The program tries to access point number 0x127, which is too
+ much.
+
+ - timesbs, arialbs, courbs: (MS Office International)
+
+ The back-slanted versions of the MS core fonts produce stack
+ overflows in many glyphs, and other oddities. It seems their
+ "maximum profile" table is invalid.
+
+ - a ton of "free" fonts, apparently designed with mediocre tools.
+
+ It seems the Windows TrueType engine doesn't check its arguments
+ often, and let all overflows run, possibly writing to critical
+ portions of memory. Please, don't ask us what this could do to
+ NT 4 :-)
+
+ The FreeType engine performs checks on every opcode. We cannot
+ guarantee that it's bullet proof, of course, but it seems to work
+ well and catch font bugs accordingly.
+
+ We also have artificially "enlarged" some allocated tables to make
+ the engine work with the back-slanted fonts without compromising
+ security, but it's clearly a hack we would have preferred to
+ avoid!
+
+
+--------------------------------------------------------------------
+
+16. What does the "fttimer" test program benchmarks?
+
+ This test program is only dedicated to profiling FreeType's
+ scan-line converter, the component, also called "rasterizer", in
+ charge of converting a vectorial outline into a bitmap, or a
+ pixmap.
+
+ It simply loads all glyphs of a font file (by slices of 512 at
+ once), then converts them. Only the conversion is actually
+ benchmarked.
+
+ The glyphs are rendered at size 400pt at a resolution of 96dpi
+ (this is about 500 pixels high!). As you'll see by running
+ 'fttimer', the rasterizer is very fast.
+
+
+--------------------------------------------------------------------
+
+17. Is it possible to perform styling (like oblique, italic, bold,
+ underline, etc.) with FreeType?
+
+ Actually, these refer to very different things:
+
+ - Italic and Bold styles usually mean many variations from the
+ 'Regular' font. This is why you normally need a proper font
+ file for each of these. For example, the MS core font Times
+ comes in the following TrueType files:
+
+ TIMES.TTF Times New Roman Regular
+ TIMESI.TTF Times New Roman Italic
+ TIMESB.TTF Times New Roman Bold
+ TIMESBI.TTF Times New Roman Bold Italic
+ (sometimes named TIMESZ.TTF)
+
+ With FreeType, you simply need the required font file to use it.
+
+ - Oblique style refers to a transformation that is applied to a
+ regular font in order to make it 'slanted', likes italics do.
+ However, an italic font very frequently contains small but
+ important variations that cannot be produced by this method and
+ make the font more appealing.
+
+ Slanting can easily be done with a transformation under
+ FreeType, with the exact same process as rendering rotated text.
+ Please read the "glyphs" documentation file where it is
+ explained in details.
+
+ Usually, Windows or the Macintosh produce oblique versions of a
+ regular font when the corresponding italic TrueType file isn't
+ available. They also stretch horizontally regular fonts when
+ the bold one isn't available. All of this can be done with
+ trivial transformations.
+
+ - Underlining and stroking, are not really part of the glyphs.
+ They're simply lines that are printed on the glyph after it has
+ been rendered. Each TrueType file provides, in its OS/2 table,
+ which is accessible through the face object properties in
+ FreeType, several values that define the position and width of
+ those lines, in notional font units.
+
+ If you want to use them, you'll have to scale these values to
+ your current instance/point size, then draw the lines yourself.
+
+
+--------------------------------------------------------------------
+
+18. When does glyph hinting takes place? Is it when the glyph is
+ loaded, or when it is converted to a bitmap/pixmap?
+
+ The glyph loader returns fitted outlines by default (it can be
+ asked to return a non-fitted one, or simply the original outline
+ in notional coordinates too).
+
+ This is important to have a glyph's correct metrics, even if it is
+ not to be rendered immediately, like when caching outlines for
+ rotated text.
+
+
+--------------------------------------------------------------------
+
+19. Which is the best, caching outlines or bitmaps?
+
+ It depends on your application, and what it does with text.
+
+ Usually, if all you need is render some simple text at specific
+ point sizes, then simply cache the bitmaps or pixmaps.
+
+ However, if you want to do more advanced things, like rotated
+ text, which require sub-pixel placement to look good, you should
+ then only cache the outlines, and transform/place them as needed
+ before sending them to the scan-line converter.
+
+ It's always possible to produce a bitmap from an outline, and the
+ scan-converter is very fast. It's up to you then...
+
+
+--------------------------------------------------------------------
+
+20. Can I open OpenType and/or TrueType GX fonts with FreeType?
+
+ TrueType GX fonts are normal TrueType fonts with enhanced tables
+ and capabilities. They can always be opened by a normal TrueType
+ engine (like Windows, the Mac or FreeType), but their improved
+ features won't be available.
+
+ On the contrary, OpenType fonts may vary. While some may contain
+ legal TrueType glyphs, an "otf" file may only contain glyphs
+ encoded in the Type 2 format. You won't be able to produce any
+ glyphs from such a font file without a dedicated font engine (like
+ the ones promised in NT 5 and Java 2D).
+
+ FreeType is a TrueType glyph engine, and doesn't support Type 2
+ fonts. Supporting them would require a very different philosophy
+ and a different core engine (even though they could share an API).
+
+ Note that you can write extensions to the engine to access
+ supplemental tables defined in these formats (see next question).
+
+
+--------------------------------------------------------------------
+
+21. How can I access additional TrueType tables that FreeType
+ doesn't support?
+
+ You have the ability to write an "engine extension". This is a
+ separately compilable component which can enhance the base
+ library's functionalities, without recompiling it. Some example
+ extensions are provided in the "lib/extend" directory.
+
+ You'll need of course to know the TrueType specification
+ precisely, as well as some of the conventions used to access
+ tables and manage memory. Read the documentation files for more
+ details, or contact the developers at:
+
+ freetype-devel@lists.lrz-muenchen.de
+
+
+--------------------------------------------------------------------
+
+22. When will I be able to use FreeType to display TrueType fonts in
+ X11, Wine or OS/2, or even other systems?
+
+ Actually, an OS/2 replacement for TRUETYPE.DLL based on FreeType
+ has been released on its second beta concurrently to this package.
+ Thanks go to Michal Mecasek (mike@mendelu.cz) for his excellent
+ work!
+
+ There is also an X11 beta font server, called xfstt, which seems
+ to work relatively well.
+
+ All information about these servers is available at the FreeType
+ homepage (www.freetype.org).
+
+ Note that you can also use the xfstt engine for X11 (available at
+ SunSite). It isn't based on FreeType, but later versions seem to
+ work rather well too.
+
+ Don't hesitate to contact us if you plan to use or port the engine
+ to exotic platforms, we're always interested in helping out.
+
+
+--------------------------------------------------------------------
+
+23. What does the "free" in FreeType really means?
+
+ The previous releases of FreeType (alphas and beta) were placed
+ under the LGPL. FreeType 1.0, and later releases, are placed in
+ an alternate license, inspired from the BSD, Artistic and IJG's
+ (Independent JPEG Group) ones. In short:
+
+ - You're encouraged to use and distribute this program in all
+ kinds of products, including commercial ones.
+
+ - You don't have to pay us anything for it (royalty-free).
+
+ - You may not pretend you wrote it, or part of it that you may use
+ in one of your product, and state clearly that you use the
+ FreeType code if you distribute products based on it, or parts
+ of it (credits clause).
+
+ - This source code is provided AS IS, with no warranty whatsoever,
+ and we cannot promise support for it.
+
+ The exact and legal terms are in the file "license.txt".
+ Enjoy ;-)
+
+
+--------------------------------------------------------------------
+
+24. Does FreeType support threads? Is it re-entrant?
+
+ Short answer: IN BETA NOW
+
+ We have changed some code for FreeType 1.1 in order to support
+ multi-threaded environments. However, these have not been tested
+ yet. Apparently, the thread-safe and reentrant builds now work
+ well perfectly once compiled; however, no serious concurrency
+ testing has been performed (of course, a serious lock analysis was
+ done in order to modify the source).
+
+ Right now, the mutex management functions are all gathered in the
+ component "ttmutex", which shall be specialized for your own
+ system when a thread build will be necessary.
+
+
+--------------------------------------------------------------------
+
+25. Does FreeType support "foreign languages"?
+
+ Short Answer: YES, it does!
+
+ From a TrueType font file point of view, there are several parts
+ to the file, one of them being the 'glyphs', i.e. picture
+ representation of the symbols.
+
+ Another part is the mapping table, also called "charMap".
+
+ For example, glyph #1 could be letter "A", and glyph #2 could be
+ letter "Z". Glyphs can be stored in any order in a font file.
+
+ The mapping tables contains at least one char-map entry. For
+ example, you could have an ASCII-map that maps 0x41 to glyph #1,
+ and 0x5A to glyph #2, etc. FreeType provides a "charMap" object
+ class to access and use this information easily.
+
+ There are several character encodings recognized and defined by
+ the TrueType specification, like Latin-1, Unicode, Apple Scripts,
+ WGL, etc., but a font file might only contain one or two of them.
+
+ When using a more 'exotic' character encoding, like EBCDIC (this
+ is IBM mainframe stuff!), you would need to translate it to one of
+ the available formats (or to add a charmap table to the font).
+ Cf. section 8.
+
+
+--------------------------------------------------------------------
+
+26. I'm using fractional char sizes, but the glyphs stay at the same
+ integer size. Why?
+
+ Because hinting only works well with integer pixel sizes. There
+ is a flag that can be set in a TrueType font file to force integer
+ pixel size scaling, even if you ask for fractional sizes with an
+ API like TT_Set_Instance_CharSize(). Needless to say, nearly all
+ fonts have the flag set. So this is normal.
+
+ Also, notice that when giving a charsize in fractional points,
+ this will be converted to integer pixels with the formula:
+
+ pixel_size = char_size * y_resolution / 72
+
+ For example, using a resolution of 96 dpi, we would have:
+
+ 9.5 pts => 12.666 pixels => 13 pixels
+ 10.0 pts => 13.333 pixels => 13 pixels, i.e. same size
+ 10.5 pts => 14 pixels => 14 pixels
+ 11.0 pts => 14.666 pixels => 15 pixels
+ 11.5 pts => 15.333 pixels => 15 pixels, i.e. same size
+
+ If you want to control the exact size in pixels of your glyphs,
+ simply use a resolution of 72 dpi, where char_size = pixel_size.
+
+
+--------------------------------------------------------------------
+
+27. Hinting doesn't work at very small sizes. Why?
+
+ This is normal. There are very good technical reasons why hinting
+ doesn't work well at sizes under 7 ppem,. usually meaning the
+ appearance of ugly spikes and glyph distorsions. This is why the
+ engine disables hinting by default at so low sizes.
+
+
+--- end of FAQ ---
diff --git a/xc/extras/FreeType/docs/TODO b/xc/extras/FreeType/docs/TODO
new file mode 100644
index 000000000..2fb498d60
--- /dev/null
+++ b/xc/extras/FreeType/docs/TODO
@@ -0,0 +1,37 @@
+Handle fonts with an improperly set isFixedFlag, e.g. introduce a
+TT_LOAD_IGNORE_ADVANCE_WIDTH flag.
+
+Clear up various PostScript glyph names in ftxpost.c:
+ Omega vs. Ohm
+ Delta vs. increment
+ macron vs. overscore
+ my vs. mu1
+ periodcentered vs. middot
+How should we handle such ambiguities?
+
+Some tables aren't mandatory for Apple fonts, most notably the OS/2 table.
+The source should be modified accordingly.
+
+Adaption of FreeType for non-ANSI compilers (wow, I'm heretic :-)
+
+Please check the consistency of the DEBUG and DEBUG_* macros together with
+the documentation. It seems that DEBUG is no longer used but still in the
+code...
+
+I think that the ARM*' macros are useless right now (and probably outdated).
+They should be removed completely. Maybe we should `protect' the other
+#include <xxx.h> lines with `HAVE_XXX_H' too for better portability. Then
+all header files could be included in `ttconfig.h' (for the library) resp.
+in a (currently non-existing) config file for the test programs.
+
+In ttobjc.c, line 1379: having `1' here looks like an error (comparing
+with the code before and after, `-1' is expected). Please add a note
+why there is `1'.
+
+More 16bit stuff to support _cdecl etc. Maybe something like this should be
+added:
+
+ LOCAL_FUNC
+ TT_Error
+ LOCAL_SCHEME
+ Cache_Create( PEngine_Instance engine, ... )
diff --git a/xc/extras/FreeType/docs/apiref.txt b/xc/extras/FreeType/docs/apiref.txt
new file mode 100644
index 000000000..efef9667f
--- /dev/null
+++ b/xc/extras/FreeType/docs/apiref.txt
@@ -0,0 +1,1807 @@
+ The FreeType Engine
+
+ Core Library Reference
+
+
+ -----------------------------------
+
+
+ Table of Contents:
+
+ Introduction
+
+ I. Types
+
+ II. Functions
+
+ III. Error codes
+
+
+ --------------------
+
+
+Introduction:
+
+ This reference presents the types, functions and error codes
+ defined in the high-level API header file "freetype.h". Note that
+ all symbols defined in this file are prefixed by "TT_", to avoid
+ name conflicts with other packages at link time.
+
+ Some of its parts are also dedicated to the extension that comes
+ by default with this distribution of the library, which is kerning
+ support.
+
+----------------------------------------------------------------------------
+
+I. Types:
+
+ Here is the list of all the types defined in the core FreeType
+ API. Their exact definition can be found in the file "freetype.h"
+ which should be included by every client application.
+
+
+ TT_Bool
+
+ Can be either TRUE or FALSE.
+
+ ..................................................................
+
+ TT_Fixed
+
+ A signed 16.16 fixed float value used to specify transform
+ coefficients and other important data.
+
+ ..................................................................
+
+ TT_FWord
+
+ A signed 16 bits value used to express a distance measured in
+ the font's original EM units. These are also called 'FUnits' in
+ the TrueType specification.
+
+ ..................................................................
+
+ TT_UFWord
+
+ Unsigned FWord.
+
+ ..................................................................
+
+ TT_String
+ TT_Char
+ TT_Byte
+
+ These types represent various 8 bits integer types (for strings,
+ signed, and unsigned values, respectively).
+
+ ..................................................................
+
+ TT_Short
+ TT_UShort
+ TT_Long
+ TT_ULong
+
+ These four types are aliases for 16 bits integer (signed and
+ unsigned) and 32 bits one (signed and unsigned).
+
+ ..................................................................
+
+ TT_F2Dot14
+
+ A 2.14 fixed float integer used for unary vectors and some
+ scaling coefficients. Their layout is:
+
+ s : 1 -- sign bit
+ m : 1 -- mantissa bit
+ f : 14 -- unsigned fractional value
+
+ where 's:m' is the 2-bit signed integer value to which the
+ always positive fractional part 'f' should be added.
+
+ ..................................................................
+
+ TT_F26Dot6
+
+ The 26.6 fixed float format used to define fractional pixel
+ coordinates. Here, 1 unit = 1/64 pixel.
+
+ ..................................................................
+
+ TT_Pos
+
+ This type is used to store point coordinates, either in
+ fractional pixels (26.6 fixed floats) or in EM units (simple
+ integers).
+
+ The meaning of the value depends on the context. For example,
+ all distances relative to a scaled glyph are expressed in
+ fractional pixels (including bearings, advances, etc). However,
+ the same distances are in notional font units when the glyph was
+ loaded unscaled.
+
+ ..................................................................
+
+ TT_UnitVector
+
+ A simple structure used to store a unit vector. The vector's
+ coordinates are expressed in fixed float format (2.14).
+
+ struct
+ {
+ TT_F2Dot14 x;
+ TT_F2Dot14 y;
+ }
+
+ ..................................................................
+
+ TT_Vector
+
+ A simple structure used to store a single vector. Its
+ coordinates are expressed in fixed float format (26.6).
+
+ struct
+ {
+ TT_Pos x;
+ TT_Pos y;
+ }
+
+ ..................................................................
+
+ TT_Matrix
+
+ A simple structure used to store a single 2x2 matrix. Its
+ coefficients are expressed in 16.16 fixed float format. This
+ matrix is used to perform linear transformations on the glyph
+ outline, such as slanting or rotation.
+
+ struct
+ {
+ TT_Fixed xx, xy;
+ TT_Fixed yx, yy;
+ };
+
+ The computation performed is:
+
+ x' = xx * x + xy * y
+ y' = yx * x + yy * y
+
+ ..................................................................
+
+ TT_BBox
+
+ A simple type to hold a glyph's bbox. Used by the
+ TT_Get_Outline_BBox() API.
+
+ struct
+ {
+ TT_Pos xMin, yMin;
+ TT_Pos xMax, yMax;
+ }
+
+ ..................................................................
+
+ TT_Outline
+
+ Outlines are now full-class citizens, with their own API.
+
+ This structure is used to describe a vectorial glyph
+ representation to the rasterizer. It is made of several fields
+ described below. Note however that:
+
+ ***** THIS STRUCTURE MAY CHANGE IN THE FUTURE. We thus
+ ***** encourage you to use the outlines APIs described below to
+ ***** process your outlines, i.e. create/copy/translate/
+ ***** transform them as well as rendering bitmaps and pixmaps.
+
+ ***** THE STRUCTURE CHANGED BETWEEN 1.0 and 1.1!
+
+ Now that you've been warned, the fields are:
+
+ - An array of points:
+
+ The 'n_points' field gives the number of points in the
+ outline, while their coordinates are found in the single
+ vector array 'points'. The 'flag' array holds for each point
+ a flag indicating its type.
+
+ Currently, only the first bit (bit 0, the least significant
+ bit) of each byte is meaningful to the rasterizer. When set,
+ it indicates that the point is _on_ the curve. When not set,
+ the point is said to be _off_ the curve. It's then a Bezier
+ control point.
+
+ For more information about point states, read the TrueType
+ specification or the scan-line documentation "raster.txt".
+
+ - An array of contours' end-point indexes:
+
+ The 'n_contours' field gives the number of contours, while the
+ 'contours' array holds the indexes of each contour's last
+ point. Note that the first contour always begin at point 0.
+
+ Hence, contours[0] holds the index of the last point of the
+ first contour. The second contour starting at point number
+ 'contours[0]+1' and ending a point number 'contours[1]'.
+
+ ** IMPORTANT NOTE: **
+ *********************
+
+ The last table entry _must_ always give the total number of
+ points used to draw the contours, i.e.:
+
+ contours[n_contours-1] == n_points
+
+ If this value is bigger than 'n_points' when calling the
+ scan-line converter, the component will immediately return
+ an error (TT_Err_Too_Many_Points). If the value is smaller,
+ only the points contained in the described contours will be
+ used in the conversion process.
+
+ - An owner field:
+
+ This flag should **NEVER** be changed by the user. It
+ indicates whether the pointer fields own the arrays they refer
+ to (when the flag is set), or if they simply alias them (flag
+ unset).
+
+ - A high precision flag:
+
+ When this boolean is set (i.e. not zero), the scan-line
+ converter uses a higher precision to compute segment and
+ Bezier coordinates (more precisely, it uses 1/1024 precision,
+ instead of the normal 1/64). This is of course slower but can
+ be important for glyphs rendered at small sizes.
+
+ - A second pass flag:
+
+ When this boolean is set, the scan-line converter performs a
+ second sweep on the bitmap/pixmap detect vertical drop-out
+ controls. Only horizontal drop-outs are detected in the first
+ pass. This is slower, but important for glyphs rendered at
+ small sizes.
+
+ - A dropout mode:
+
+ Used to specify the method to apply for drop-out control (also
+ called 'continuity testing' in other environments). The mode
+ value must be one of the values defined by the TrueType
+ specification.
+
+ The recent modes 4 and 5 introduced in the newest TrueType
+ specification (Version 1.6) are fully supported.
+
+ An invalid value (i.e., other than 0, 1, 2, 4, or 5) is taken
+ as no dropout control (equivalent to mode 0).
+
+ NOTE 1:
+
+ The outline returned by TT_Get_Glyph_Outline() only alias the
+ data that is part of a glyph container (see below). However,
+ it is possible to create and process your own outlines with
+ the newest API functions TT_New_Outline(), TT_Done_Outline(),
+ TT_Copy_Outline(), TT_Translate_Outline(), etc.
+
+ TT_Done_Outline() will only discard an outline's array if it
+ owns them.
+
+ NOTE 2:
+
+ The outlines created by TT_New_Outline() are _not_ released by
+ the engine on TT_Done_FreeType(), they must be discarded
+ explicitly by the user who has created them!
+
+ NOTE 3:
+
+ The glyph loader sets the fields 'high_precision',
+ 'dropout_mode' and 'second_pass' automatically.
+
+ NOTE 4:
+
+ This structure was called TT_Glyph_Outline in beta versions of
+ FreeType.
+
+ ..................................................................
+
+ TT_Glyph_Metrics
+
+ A structure used to return simple glyph metrics. These values
+ are expressed in fractional pixels (26.6 format) if scaling was
+ active, and in FUnits otherwise.
+
+ The main idea was to accomodate vertical text layouts by getting
+ rid of the two explicit "leftSideBearing" and "advanceWidth"
+ names.
+
+ Though the library only processes horizontal metrics for the
+ moment, the fields meaning vary with the text layout:
+
+ bearingX: also known as the "left side bearing". This value
+ gives the horizontal distance from the pen position
+ to the glyph's bbox xmin.
+
+ bearingY: also known as the "top side bearing", this is the
+ vertical distance from the baseline to the glyph's
+ bbox ymax.
+
+ struct
+ {
+ TT_BBox bbox; /* the glyph's bbox */
+
+ TT_Pos bearingX; /* left-side bearing */
+ TT_Pos bearingY; /* top-side bearing */
+
+ TT_Pos advance; /* advance width or height */
+ };
+
+ ** IMPORTANT NOTE **
+
+ Because of the convention used by the TrueType engine, the
+ outlines generated at glyph-load time are all placed so that
+ the pen is at position (0,0). This means that you don't need
+ to increase the pen position by "bearingX" and/or "bearingY"
+ before writing a glyph. Text output can be performed with
+ simple lines like:
+
+ for (glyphs in text)
+ {
+ TT_Load_Glyph( ... );
+ TT_Get_Glyph_Outline( glyph, &outline );
+ TT_Translate_Outline( outline,
+ cur_pos_x * 64, cur_pos_y * 64 );
+
+ TT_Get_Outline_Bitmap( outline, bitmap );
+ /* blit bitmap to surface */
+
+ cur_pos_x += (metrics.advance + 32) / 64
+ }
+
+ See the file 'test/ftstring.c' for concrete examples.
+
+ NOTE 2:
+
+ This structure has changed from the beta version of FreeType.
+
+ ..................................................................
+
+ TT_Big_Glyph_Metrics
+
+ This structure, though still unused, will be used to return a
+ same glyph's metrics in both horizontal and vertical layouts.
+
+ struct
+ {
+ TT_BBox bbox; /* the glyph's bbox */
+
+ TT_Pos horiBearingX; /* horizontal left-side bearing */
+ TT_Pos horiBearingY; /* horizontal top-side bearing */
+
+ TT_Pos vertBearingX; /* vertical left-side bearing */
+ TT_Pos vertBearingY; /* vertical top-side bearing */
+
+ TT_Pos horiAdvance; /* horizontal advance */
+ TT_Pos vertAdvance; /* vertical advance */
+ }
+
+ ..................................................................
+
+ TT_Instance_Metrics
+
+ A structure used to return instance (point size) metrics.
+
+ struct
+ {
+ int pointSize;
+ /* point size in points (1 point = 1/72 inch) */
+
+ TT_UShort x_ppem; /* horizontal pixels per EM square */
+ TT_UShort y_ppem; /* vertical pixels per EM square */
+
+ TT_Fixed x_scale; /* 16.16 scale for EM -> frac pixels */
+ TT_Fixed y_scale; /* 16.16 scale for EM -> frac pixels */
+
+ TT_UShort x_resolution; /* device hor. res. in dpi */
+ TT_UShort y_resolution; /* device vert. res. in dpi */
+ };
+
+ The fields 'x_scale' and 'y_scale' can be used by clients to
+ convert from notional units to fractional pixels, e.g.:
+
+ frac_distance = (em_distance * x_scale) / 0x10000;
+
+ ..................................................................
+
+ TT_Raster_Map
+
+ This structure is used to describe a target bitmap (or pixmap)
+ to the scan-line converter. It _must_ be set up by the client
+ application.
+
+ - The 'rows' field contains the total number of rows in the
+ bitmap
+
+ - The 'width' field gives the number of pixels per row (a bit or
+ a byte, depending on the map's nature).
+
+ - The 'cols' field gives the number of columns, i.e., bytes,
+ taken by each row in the map buffer.
+
+ ** IMPORTANT **: the 'cols' field must be a multiple of 4 for
+ pixmaps!
+
+ Typically, its value should be '(width+7)/8' for bitmaps, and
+ '(width+3) & -4' for pixmaps.
+
+ - The 'flow' field gives the map's vertical orientation.
+
+ For example, if the first bytes of the bitmap buffer pertain
+ to its upper row, the flow is said to be going 'down', and the
+ field should take the value 'TT_Flow_Down'. If these bytes
+ pertain to its lowest row, the flow is going 'up', and the
+ value is 'TT_Flow_Up'.
+
+ As an example, the PC video modes use a 'down' flow, where the
+ first VRAM byte corresponds to the upper and leftmost corner
+ of the screen.
+
+ - The 'bitmap' field is a typeless pointer to the map's buffer.
+
+ - The 'size' field contains the buffer's size in bytes. It is
+ usually computed as follows:
+
+ size = rows * cols;
+
+ NOTE 1:
+
+ For bitmaps, the leftmost-pixel is related to the highest
+ (i.e. most significant) bit of its byte. There is currently
+ no support for the opposite convention found in some systems.
+
+ (It can be easily added if you really need it, just ask the
+ development team.)
+
+ struct
+ {
+ int rows; /* number of rows */
+ int cols; /* number of columns (bytes) per row */
+ int width; /* number of pixels per line */
+ int flow; /* bitmap orientation */
+
+ void* bitmap; /* bit/pixmap buffer */
+ long size; /* bit/pixmap size in bytes */
+ } TT_Raster_Map;
+
+
+ NOTE 2:
+
+ The functions TT_Get_Outline_Bitmap() or TT_Get_Glyph_Bitmap()
+ are used to render bitmaps into a TT_Raster_Map. The
+ convention used is 0 for the background, and 1 for the
+ foreground. The glyph is simply 'or-ed' to the bitmap buffer.
+
+ NOTE 3:
+
+ The functions TT_Get_Outline_Pixmap() and
+ TT_Get_Glyph_Pixmap() are used to render pixmaps into a
+ TT_Raster_Map. Note that pixels are drawn in spans of 4
+ successive bytes, when needed. This means that you must
+ ALWAYS pass a clean pixmap buffer to these functions.
+ Otherwise, garbage could accumulate!
+
+ ..................................................................
+
+ TT_Header
+
+ This structure is used to hold the font's header. Its layout
+ and meaning are defined in the TrueType specification, in the
+ 'head' section.
+
+ ..................................................................
+
+ TT_Horizontal_Header
+
+ This structure is used to hold the font's horizontal header.
+ Its layout and meaning are defined in the TrueType
+ specification, in the 'hhead' section.
+
+ ..................................................................
+
+ TT_OS2
+
+ This structure is used to hold the font's OS/2 table. Its
+ layout and meaning are defined in the TrueType specification, in
+ the 'OS/2' section.
+
+ ..................................................................
+
+ TT_Postscript
+
+ This structure is used to hold the font's PostScript table. Its
+ layout and meaning are defined in the TrueType specification, in
+ the 'post' section.
+
+ ..................................................................
+
+ TT_Face_Properties
+
+ This structure is used to return an opened face's properties.
+ These are:
+
+ - The total number of glyphs in the font, given by the field
+ 'num_Glyphs'.
+
+ - The maximum number of points for the font's glyphs. This
+ value is used to allocate the points tables of a glyph
+ container's outline. It can be fairly large (like 256 points
+ for Roman fonts).
+
+ - The maximum number of contours for the font's glyphs. This
+ value is used to allocate the contours tables of a glyph
+ container's outline. It can be fairly large (over 16, even in
+ Roman fonts).
+
+ - The number of character mappings and name records within the
+ font. These values can still be retrieved through the APIs
+ TT_Get_CharMapCount() and TT_Get_Num_Names(), though these
+ have been _seriously_ deprecated.
+
+ - The number of associated faces. This number is always 1 for a
+ normal TrueType font file. However, when the face object was
+ opened from a TrueType collection, it contains the total
+ number of embedded fonts.
+
+ - Pointers to the face's header, horizontal header, OS/2, and
+ PostScript tables.
+
+ struct
+ {
+ TT_UShort num_Glyphs; /* number of glyphs in face */
+ TT_UShort max_Points; /* max. numb. of points in a glyph */
+ TT_Short max_Contours;
+ /* maximum number of contours in a glyph */
+
+ TT_ULong num_Faces;
+ /* 1 for normal TrueType files, and the */
+ /* number of embedded faces for TT */
+ /* collections */
+
+ TT_Header* header; /* TrueType header table */
+ TT_Horizontal_Header* horizontal;
+ /* TrueType horizontal header */
+ TT_Vertical_Header* vertical;
+ /* TrueType vertical header */
+ TT_OS2* os2; /* TrueType OS/2 table */
+ TT_Postscript* postscript;
+ /* TrueType PostScript table */
+ } TT_Face_Properties;
+
+ - Note that the "vertical" field is set to NULL when the font
+ file does not contain any vertical metrics.
+
+ ..................................................................
+
+ TT_Stream
+
+ This handle type defines a stream used to access a font file's
+ data. A client application should never deal with streams
+ directly, but some engine extensions may later need it to
+ support more advanced features like font embedding.
+
+ ..................................................................
+
+ TT_Face
+
+ This type defines a handle used to reference a face object. The
+ objects are never accessed directly by a client application; it
+ can only obtain handles to new objects, and use them to query
+ specific information or processes.
+
+ See also:
+
+ TT_Open_Face(), TT_Open_Collection(), TT_Close_Face(),
+ TT_Get_Face_Properties(), etc.
+
+ ..................................................................
+
+ TT_Instance
+
+ This type defines a handle used to reference an instance object
+ (also called a 'pointsize' in other type engines). An instance
+ is always created from a valid face object, and is destroyed
+ with it by the engine.
+
+ See also:
+
+ TT_New_Instance(), TT_Close_Instance(),
+ TT_Set_Instance_Pointsize(), TT_Set_Instance_Resolutions(),
+ etc.
+
+ ..................................................................
+
+ TT_Glyph
+
+ This type defines a handle used to reference a glyph container
+ object. A glyph container is an object owning tables sized to
+ the font's maximum profile to hold any glyph of a given font
+ file.
+
+ It contains an outline, some metrics, as well as some data
+ related to the way it should be processed by the scan-line
+ converter.
+
+ Note that a glyph container doesn't contain any bitmap nor
+ pixmap!
+
+ See also:
+
+ TT_New_Glyph(), TT_Close_Glyph(), TT_Get_Glyph_Metrics(),
+ TT_New_Outline(), TT_Get_Glyph_Outline(),
+ TT_Get_Glyph_Bitmap(), TT_Get_Glyph_Pixmap()
+
+ ..................................................................
+
+ TT_Error
+
+ This is the type of all error codes returned by the API. Nearly
+ all functions return an error code, set to 0 in case of success.
+
+ A list of all error codes is given in section III.
+
+ ..................................................................
+
+ TT_Engine
+
+ For the sake of re-entrancy, which isn't supported fully by the
+ engine, it is possible to distinguish 'engines' to separate
+ several running instances of the library. For example, it could
+ be used as a DLL shared by several client applications.
+
+ Each client program must begin by creating its own engine,
+ through a call to TT_Init_FreeType(). The engine must also be
+ passed as the first argument of the following functions:
+
+ TT_Open_Face()
+ TT_Open_Collection()
+ TT_Set_Raster_Palette()
+ TT_Get_Outline_Bitmap()
+ TT_Get_Outline_Pixmap()
+ TT_Done_FreeType()
+
+ Note that any FreeType object pertains to one single engine
+ (there is no sharing). Closing an engine with TT_Done_FreeType()
+ will delete all the objects that have been allocated within its
+ instance.
+
+ ..................................................................
+
+ This distribution comes with an extension used to support access
+ to a font's kerning information. The extension's types and API
+ are defined in the file "ftxkern.h"
+
+--------------------------------------------------------------------
+--------------------------------------------------------------------
+
+
+
+II. Functions:
+
+ Here is a list of the core library's API.
+
+ NOTE:
+
+ A function's default result is an error code of type TT_Error; a
+ list of error codes is given in section III below.
+
+ Some functions return other types, in which case the result type
+ is written with its description.
+
+ ..................................................................
+
+ TT_Init_FreeType( TT_Engine* engine );
+
+ Creates and initializes a new engine. Returns a handle to the
+ engine in the '*engine' variable.
+
+ This call must be performed before any other function of
+ FreeType is invoked. The engine handle must be passed to the
+ following functions:
+
+ TT_Open_Face()
+ TT_Open_Collection()
+ TT_Set_Raster_Palette()
+ TT_Done_FreeType()
+
+ ..................................................................
+
+ TT_Done_FreeType( TT_Engine engine );
+
+ Finalizes and destroys an engine. This call destroys _all_
+ objects that were previously created and used with the engine.
+
+ ..................................................................
+
+ TT_Open_Face( TT_Engine engine,
+ TT_Text* fontPathName,
+ TT_face* face );
+
+ This call opens a font file, located by 'fontPathName', and
+ returns a handle to the newly corresponding face object in the
+ handle '*face'. The object is part of the 'engine' instance.
+
+ Example:
+
+ error = TT_Open_Face( engine, "c:\ttf\wingding.ttf", &face );
+ if ( error )
+ fprintf( stderr, "could not open face\n" );
+
+ NOTE 1:
+
+ The font file can be a TrueType collection; in this case, the
+ engine will always open the first embedded font found in the
+ file.
+
+ NOTE 2:
+
+ 'TT_Text' is usually defined as 'char' by a typedef
+ declaration. It may be a 16bit quantity (or even wider) for
+ some operating systems; see ttconfig.h for details.
+
+ ..................................................................
+
+ TT_Open_Collection( TT_Engine engine,
+ TT_Text* collectionPathName,
+ TT_ULong fontIndex,
+ TT_Face* face );
+
+ This call opens one of the font files found in a TrueType
+ collection. The file is selected through the 'fontIndex'
+ argument. The first file has index 0.
+
+ Note that to know a collection's number of embedded fonts,
+ you'll have to:
+
+ 1 - open the first collection font with TT_Open_Face().
+
+ 2 - query the face's properties through
+ TT_Get_Face_Properties().
+
+ The number of embedded faces is then 'properties->num_Faces'.
+
+ Example:
+
+ TT_Face face;
+ TT_Face_Properties properties;
+
+ error = TT_Open_Face( engine, "c:\ttf\sample.ttc", &face );
+ if ( error ) { ...error .. }
+ /* Open first embedded collection font */
+
+ error = TT_Get_Face_Properties( face, &properties );
+ if ( error ) { ...error .. }
+ /* Get face metrics */
+
+ printf( "There are %d fonts in this collection\n",
+ properties->num_Faces );
+
+ TT_Close_Face( face );
+
+ error = TT_Open_Collection( engine, "c:\ttf\sample.ttc", 1,
+ &face );
+ if ( error ) { ...error .. }
+ /* Open second font in collection */
+
+ NOTE 1:
+
+ If the file isn't a collection, 'fontIndex' must be zero.
+ Otherwise, an error will be produced.
+
+ NOTE 2:
+
+ 'TT_Text' is usually defined as 'char' by a typedef
+ declaration. It may be a 16bit quantity (or even wider) for
+ some operating systems; see ttconfig.h for details.
+
+ ..................................................................
+
+ TT_Set_Raster_Palette( TT_Engine engine,
+ char* palette );
+
+ Sets the gray-level palette for an engine. The palette is used
+ to create pixmaps through the TT_Get_Glyph_Pixmap() function.
+ It is an array of five bytes, following the convention:
+
+ palette[0] = background (white)
+ palette[1] = light
+ palette[2] = medium
+ palette[3] = dark
+ palette[4] = foreground (black)
+
+ ..................................................................
+
+ TT_Get_Face_Properties( TT_Face face,
+ TT_Face_Properties* properties );
+
+ Returns the 'face' object's '*properties'. This structure
+ contains various data, like the total number of glyphs and
+ pointers to some mandatory TrueType tables.
+
+ (See the definition of TT_Face_Properties in section I.)
+
+ ..................................................................
+
+ TT_Set_Face_Pointer( TT_Face face,
+ void* data );
+
+ For convenience purposes, each face object has a "generic"
+ pointer which value is unused by the engine, but that can be set
+ freely by client applications through this function.
+
+ Do what you want with it; it's here to give you a chance to link
+ a face object to your own structures and data.
+
+ ..................................................................
+
+ void* TT_Get_Face_Pointer( TT_Face face );
+ ^^^^
+ Returns a face object's generic pointer. See
+ TT_Set_Face_Pointer() above.
+
+ ..................................................................
+
+ TT_Flush_Face( TT_Face face );
+
+ Closes a given face object's file handler or descriptor. This
+ is useful to save system resources if your application opens
+ dozens or even hundreds of fonts. The face object is still
+ valid, and its file will be re-opened automatically on the next
+ request which requires disk access.
+
+ ..................................................................
+
+ TT_Close_Face( TT_Face face );
+
+ Closes a given 'face' object. This function will also destroy
+ all the face's child instances. The face's glyphs won't be
+ destroyed, however.
+
+ ..................................................................
+
+ TT_New_Instance( TT_Face face,
+ TT_Instance* instance );
+
+ Creates a new instance object related to the 'face' object. A
+ handle to the newly created instance is returned in 'instance'.
+
+ The default instance resolution is 96dpi in both vertical and
+ horizontal direction; the default point size is 10pt.
+
+ ..................................................................
+
+ TT_Set_Instance_Resolutions( TT_Instance instance,
+ TT_UShort xResolution,
+ TT_UShort yResolution );
+
+ Sets the target device resolutions for a given instance. The
+ values are expressed in dots per inch (dpi). A value of 96dpi
+ is typical for an SVGA display, 72dpi for a Macintosh one, and
+ 300 to 6000dpi for printers. Default value (before a call to
+ this function) is 96dpi.
+
+ ..................................................................
+
+ TT_Set_Instance_CharSize( TT_Instance instance,
+ TT_F26Dot6 charsize );
+
+ Sets the point size for a given instance. The size is expressed
+ in fractional (26.6) 'points', where 1 point = 1/72 inch. The
+ default value is 10pt (before a call to this function).
+
+ For example, to use a char size of 10pt, call the function with:
+
+ TT_Set_Instance_CharSize( instance, 10 * 64 );
+
+ Fractional char sizes are thus possible.
+
+ ..................................................................
+
+ TT_Set_Instance_CharSizes( TT_Instance instance,
+ TT_F26Dot6 charWidth,
+ TT_F26Dot6 charHeight );
+
+ Sets an instance's glyph width and height independently in
+ fractional (26.6) points. Similar to Set_Instance_CharSize()
+ with the exception that the horizontal and vertical glyph
+ dimensions can differ.
+
+ ..................................................................
+
+ TT_Set_Pixel_Sizes( TT_Instance instance,
+ TT_UShort pixelWidth,
+ TT_UShort pixelHeight,
+ TT_F26Dot6 pointSize );
+
+ This function can be used to specify directly the pixel sizes
+ and point size of a given instance, independently of device
+ resolutions. This is not the recommended way to do it, but can
+ be used for debugging or simplicity in some special cases.
+
+ Note that you _must_ provide a point size!
+
+ ..................................................................
+
+ TT_Set_Instance_Transform_Flags( TT_Instance instance,
+ TT_Bool rotated,
+ TT_Bool stretched );
+
+ Sets the transform flags for a given instance. These flags are
+ passed to the interpreter each time a glyph is loaded within the
+ instance. Their role is to notify the glyph hinting mechanism
+ that the resulting glyph will be transformed in a special way.
+ Setting one of these flags to true usually disables hinting,
+ though this behaviour varies with each font file.
+
+ NOTE:
+
+ The glyph loader doesn't perform the rotation or the
+ stretching itself; this must be done explicitly by the client
+ application. Use the function TT_Transform_Outline() for that
+ purpose.
+
+ ..................................................................
+
+ TT_Get_Instance_Metrics( TT_Instance instance,
+ TT_Instance_Metrics* imetrics );
+
+ This call returns a given instance's current metrics. They are
+ returned in the 'imetrics' structure, which contains, among
+ other things, the current point size, ppem, and device
+ resolution (horizontal and vertical).
+
+ ..................................................................
+
+ TT_Set_Instance_Pointer( TT_Instance instance,
+ void* data );
+
+ For convenience purposes, each instance object has a "generic"
+ pointer which value is unused by the engine, but that can be set
+ freely by client applications through this function.
+
+ Do what you want with it, it's here to give you a chance to link
+ a face object to your own structures and data.
+
+ ..................................................................
+
+ void* TT_Get_Instance_Pointer( TT_Instance instance )
+ ^^^^
+
+ This function returns an instance object's generic pointer set
+ through TT_Set_Instance_Pointer().
+
+ ..................................................................
+
+ TT_Done_Instance( TT_Instance instance );
+
+ Closes a given instance object, destroying its associated data.
+ Note that this is performed automatically when a face is closed
+ on all its child instances. However, explicit deallocation can
+ help in freeing the memory used by the application earlier.
+
+ ..................................................................
+
+ TT_New_Glyph( TT_Face face,
+ TT_Glyph* glyph );
+
+ Creates a new glyph container for the glyphs of the font
+ described by the 'face' handle. A pointer to the container is
+ returned in 'glyph'. The face is said to be the glyph's parent.
+
+ NOTE:
+
+ A glyph is destroyed with its parent face object. However, it
+ is possible to delete it explicitly with TT_Done_Glyph().
+
+ ..................................................................
+
+ TT_Done_Glyph( TT_Glyph glyph );
+
+ Discards a glyph container. This is also done automatically for
+ all glyphs when closing its parent face object.
+
+ ..................................................................
+
+ TT_Load_Glyph( TT_Instance instance,
+ TT_Glyph glyph,
+ TT_UShort glyphIndex,
+ TT_UShort loadFlags );
+
+ Loads and processes (scales and/or hints) a glyph at a given
+ 'instance' into the 'glyph' container.
+
+ Note that 'glyph' and 'instance' must have the _same_ parent
+ face object, or an error message will be returned.
+
+ 'glyph_index' is the glyph's index as found in the TrueType
+ file. It is _not_ a character code (see the charmap functions
+ below).
+
+ 'load_flags' is an integer that specifies which operations are
+ to be performed on the loaded glyph. The following values/bits
+ are used:
+
+ TTLOAD_SCALE_GLYPH
+
+ Indicates that the glyph must be scaled to the instance's
+ resolution. The pixel coordinates returned in the glyph
+ outline structure (see below) are then expressed in
+ fractional pixels represented in the 26.6 fixed point
+ floating format defined by Apple as 'F26Dot6'.
+
+ If scaling is disabled, the coordinates returned in the
+ outline structure are integer font units, also called
+ 'FUnits' by the TrueType specification.
+
+ TTLOAD_HINT_GLYPH
+
+ This flag is only valid when scaling is on. It informs the
+ loader that the glyph must be hinted (i.e., grid-fitted for
+ optimal display). Note that hinting will occur only if the
+ instance's transformations and metrics allow it (for
+ example, most font programs disable hinting automatically in
+ case of rotation or stretching).
+
+ When loading a hinted glyph, the metrics computed by the
+ loader, including the bounding box, will also be
+ grid-fitted.
+
+ NOTE:
+
+ You can also use the constant TTLOAD_DEFAULT, which is simply
+ the union of TTLOAD_SCALE_GLYPH and TTLOAD_HINT_GLYPH for most
+ 'typical' loads.
+
+ ..................................................................
+
+ TT_Get_Glyph_Outline( TT_Glyph glyph,
+ TT_Outline* outline );
+
+ This call returns the glyph's 'outline'. This is a simple
+ structure which contains pointers to the data used to describe
+ an outline to the rasterizer. See the definition of
+ TT_Outline in section I.
+
+ ..................................................................
+
+ TT_Get_Glyph_Metrics( TT_Glyph glyph,
+ TT_Glyph_Metrics* metrics );
+
+ Extracts the glyph's metrics and copy them to the '*metrics'
+ structure. Its format is described in section I.
+
+ When the glyph has been loaded without scaling, the values are
+ expressed in FUnits (integers relative to the original font grid
+ called the EM Square).
+
+ When the glyph has been loaded _with_ scaling, which is the
+ default, the values are expressed in fractional pixels in the
+ 26.6 fixed point float format called F26Dot6 (where 1 unit =
+ 1/64th of a pixel).
+
+ When the glyph has been loaded with hinting, the metrics are
+ also grid-fitted, including the bounding box. To get the
+ un-fitted bbox, just call TT_Get_Outline_BBox() on the glyph's
+ outline.
+
+ NOTE:
+
+ BBox fitting occurs according to the following scheme:
+
+ #define FLOOR( x ) ( (x) & -64 )
+ #define CEILING( x ) ( ( (x) + 63 ) & -64 )
+
+ xMin = FLOOR( xMin );
+ yMin = FLOOR( yMin );
+ xMax = CEILING( xMax );
+ yMax = CEILING( yMax );
+
+ This means that the outline's width and height in pixels can be
+ computed simply from the fitted bbox, as:
+
+ (xMax-xMin)/64 and (yMax-yMin)/64
+
+ ..................................................................
+
+ TT_Get_Glyph_Bitmap( TT_Glyph glyph,
+ TT_Raster_Map* bitmap,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset );
+
+ This call converts the vectorial glyph representation contained
+ in the object handled by 'glyph' into a bitmap.
+
+ The target bitmap is described by the 'bitmap' pointer.
+ Clipping will be done if necessary. You can also specify an
+ offset to be applied before the scan-line conversion; 'xOffset'
+ and 'yOffset' must be expressed in fractional pixels (where 1
+ unit = 1/64th pixel).
+
+ NOTE 1:
+
+ Choosing non integer pixel offsets, i.e., values of 'xOffset'
+ and 'yOffset' that are not multiples of 64, will ruin the
+ hinting performed by the interpreter, and result in bad
+ rendering at small sizes.
+
+ NOTE 2:
+
+ The glyph's point coordinates must be scaled before calling
+ this function. Never call this function with a glyph that
+ were loaded with no scaling!
+
+ ..................................................................
+
+ TT_Get_Glyph_Pixmap( TT_Glyph glyph,
+ TT_Raster_Map* pixmap,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset );
+
+ This call converts the vectorial glyph representation contained
+ in the object handled by 'glyph' into a pixmap (i.e., an
+ 8-bit/pixel map). The result is an anti-aliased version of the
+ glyph (a.k.a. font-smoothing).
+
+ The target pixmap is described by the 'pixmap' pointer. Note
+ that its width _must_ be a multiple of 4. For a pixmap
+ definition and description, see Section I.
+
+ As with TT_Get_Glyph_Bitmap(), you can specify offsets to be
+ applied before the rendering ('xOffset' and 'yOffset' must be
+ expressed in fractional pixel coordinates).
+
+ NOTE 1:
+
+ You don't need to supply a temporary bitmap for the
+ anti-aliaser. The rasterizer uses its own scheme to optimize
+ memory uses.
+
+ NOTE 2:
+
+ The glyph's point coordinates must be scaled before calling
+ this function. This means that you should never call it with
+ a glyph which has been loaded without scaling!
+
+ NOTE 3:
+
+ The pixmap passed to this function should always be EMPTY
+ before the call. If not, garbage will accumulate!
+
+ ..................................................................
+
+ TT_New_Outline( TT_UShort numPoints,
+ TT_UShort numContours,
+ TT_Outline* outline );
+
+ Creates a new outline object. This function creates the arrays
+ necessary to hold 'numPoints' points and 'numContours' contours,
+ and set 'outline's pointers to them.
+
+ The new outline owns the arrays, and they will be destroyed with
+ it through TT_Done_Outline().
+
+ NOTE 1:
+
+ Outlines created with this function are called "user"
+ outlines, in contrast with the outlines returned by
+ TT_Get_Glyph_Outline(), which fields refer to the data
+ contained within a glyph object (i.e., these outlines do not
+ own the arrays they refer to).
+
+ NOTE 2:
+
+ User outlines aren't tracked by the engine, which means
+ they're not destroyed by a TT_Done_FreeType(). You have to
+ explicitly discard them through TT_Done_Outline() to avoid
+ memory leaks.
+
+ ..................................................................
+
+ TT_Done_Outline( TT_Outline* outline );
+
+ Deletes an outline's data. Note that you need not destroy the
+ outlines returned by TT_Get_Glyph_Outline(), only those created
+ by TT_New_Outline().
+
+ ..................................................................
+
+ TT_Copy_Outline( TT_Outline* source,
+ TT_Outline* target );
+
+ Copies the content of the 'source' outline into the content of
+ the 'target' outline. The two outlines must have been created
+ with the same dimensions (num_points and num_contours),
+ otherwise this function will return an error code.
+
+ ..................................................................
+
+ TT_Transform_Outline( TT_Glyph_Outline* outline,
+ TT_Matrix* matrix );
+
+ Applies a simple transformation matrix on a given outline. This
+ will multiply each point coordinate vector by a 2x2 matrix,
+ which coefficients are written in the 16.16 fixed float format.
+
+ Rotation can be performed with this function.
+
+ NOTE:
+
+ This function takes an outline, and not a glyph handle, as a
+ parameter. This 'feature' lets you apply transformations on
+ your own copies of glyphs.
+
+ ..................................................................
+
+ TT_Translate_Outline( TT_Glyph_Outline* outline,
+ TT_Pos xOffset,
+ TT_Pos yOffset );
+
+ Applies a simple translation on a given outline.
+
+ NOTE:
+
+ This function takes an outline, and not a glyph handle, as a
+ parameter. This 'feature' lets you apply translation to your
+ own copies of glyphs.
+
+ ..................................................................
+
+ TT_Get_Outline_Bitmap( TT_Outline* outline,
+ TT_Raster_Map* bitmap );
+
+ Renders an outline into a bitmap. The latter must be setup by
+ the user before the call (i.e., it is not created by this
+ function, instead it must be provided by the user).
+
+ ..................................................................
+
+ TT_Get_Outline_Pixmap( TT_Outline* outline,
+ TT_Raster_Map* pixmap );
+
+ Renders an outline into a pixmap. The latter must be setup by
+ the user before the call (i.e., it is not created by this
+ function, instead it must be provided by the user).
+
+ NOTE:
+
+ The pixmap passed to this function must always be EMPTY before
+ the call. Otherwise, garbage may accumulate!
+
+ ..................................................................
+
+ TT_Get_Outline_BBox( TT_Outline* outline,
+ TT_BBox* bbox );
+
+ Returns an outline's bounding box in the 'bbox' structure. Note
+ that the returned coordinates are not grid fitted!
+
+ NOTE:
+
+ The current release of FreeType (1.0) does compute the bounding
+ box for the outline's control points, and not the "exact" box
+ based on Bezier arcs extrema. Hence, the bbox returned by this
+ function may be slightly larger than necessary if the glyph
+ doesn't have control points at its extrema, or if it has been
+ rotated.
+
+ ..................................................................
+
+ void TT_Transform_Vector( TT_Pos* x,
+ ^^^^ TT_Pos* y,
+ TT_Matrix* matrix );
+
+ Applies a 2x2 matrix to a vector.
+
+ ..................................................................
+
+ TT_Matrix_Multiply( TT_Matrix* a,
+ TT_Matrix* b );
+
+ Multiplies one matrix with another -- it will compute
+ b := a * b.
+
+ ..................................................................
+
+ TT_Matrix_Invert( TT_Matrix* matrix );
+
+ Inverts a matrix. In case of failure, returns the error code
+ TT_Err_Divide_By_Zero if the matrix cannot be inverted.
+
+ ..................................................................
+
+ int TT_Get_CharMapCount( TT_Face face );
+ ^^^
+
+ Gets the number of character mappings present in the TrueType
+ file described by the 'face' handle. Returns -1 if the handle
+ is invalid.
+
+ IMPORTANT NOTE: ********
+
+ This function is deprecated. Get the number of character maps
+ from the `num_CharMaps' field in the structure returned by
+ TT_Get_Face_Property() instead.
+
+ ..................................................................
+
+ TT_Get_CharMap_ID( TT_Face face,
+ TT_UShort charmapIndex,
+ TT_UShort* platformID,
+ TT_UShort* encodingID );
+
+ Returns the platform ID and platform-specific encoding ID for
+ the charmap numbered 'charmapIndex' in the 'face' object. The
+ total number of character mapping tables is returned by the
+ TT_Get_CharMap_Count() function described above.
+
+ ..................................................................
+
+ TT_Get_CharMap( TT_Face face,
+ TT_UShort charmapIndex,
+ TT_CharMap* charMap );
+
+ Returns a handle for the character map number 'charmapIndex' of
+ 'face'. The handle is placed in '*charMap' and can be used
+ later for fast lookup with the TT_Char_Index() API.
+
+ Charmap objects are automatically destroyed when their face
+ object is destroyed.
+
+ ..................................................................
+
+ TT_UShort TT_Char_Index( TT_CharMap charMap,
+ ^^^^^^^^^ TT_UShort charCode );
+
+ Applies a charMap to translate a charCode into a glyph index
+ that can be used to load and address a glyph in the TrueType
+ file. In case of error, the undefined glyph (0) is returned.
+
+ The charmap handle can be obtained with TT_Get_CharMap().
+
+ ..................................................................
+
+ int TT_Get_Name_Count( TT_Face face );
+
+ Gets the number of name strings found in a face's name table.
+ This function will return -1 if the face handle is invalid.
+
+ IMPORTANT NOTE: ********
+
+ This function is deprecated. Get the number of name strings
+ from the `num_Names' field in the structure returned by
+ TT_Get_Face_Property() instead.
+
+ ..................................................................
+
+ TT_Get_Name_ID( TT_Face face,
+ TT_UShort nameIndex,
+ TT_UShort* platformID,
+ TT_UShort* encodingID,
+ TT_UShort* languageID,
+ TT_UShort* nameID );
+
+ Returns the ID of a given name string, indexed by the number
+ 'nameIndex' in a given face. The name index ranges from 0 to
+ the value returned by TT_Get_Name_Count() minus one.
+
+ Each string has a platformID, encodingID, languageID and nameID,
+ as defined by the TrueType specification.
+
+ The platformID is typically in the 0..3 range. Some font files
+ have unusual name table entries; these can be detected from
+ their platformID which is larger than 3.
+
+ ..................................................................
+
+ TT_Get_Name_String( TT_Face face,
+ TT_UShort nameIndex,
+ TT_String** stringPtr,
+ TT_UShort* length );
+
+ Returns a name string's address and length. Note that an
+ invalid name table entry always returns NULL for 'stringPtr' and
+ a zero length.
+
+ NOTE:
+
+ The string belongs to the face object and should not be
+ written to or freed by the client application.
+
+ ..................................................................
+
+ TT_Init_Kerning_Extension( TT_Engine engine );
+
+ Initializes the kerning extension for a given engine. This must
+ be called just after the engine creation, and before any face
+ object allocation. Example:
+
+ TT_Init_FreeType( &engine );
+ TT_Init_Kerning_Extension( engine );
+
+ ..................................................................
+
+ TT_Get_Kerning_Directory( TT_Face face,
+ TT_Kerning* directory );
+
+ Queries the kerning directory found in a face object. If no
+ kerning table is found in the TrueType file, the error
+ TT_Err_Table_Is_Missing will be returned.
+
+ You can access the subtables through the pointers of the
+ directory. However, by default, the directory is only loaded
+ when a face object is created. You must load the subtables that
+ interest you with a call to TT_Load_Kerning_Table().
+
+ The layout of all kerning structures is defined in the file
+ "lib/extend/apikern.h". Both formats (0 and 2) are exposed by
+ this API.
+
+ NOTE:
+
+ This function must be called after the kerning extension were
+ initialized.
+
+ ..................................................................
+
+ TT_Get_Font_Data( TT_face face,
+ TT_Long tag,
+ TT_Long offset,
+ void* buffer,
+ TT_Long* length );
+
+ Gets font or table data. Similar to the GetFontData() API of
+ the Windows world. You can use the macro MAKE_TT_TAG() to
+ generate TrueType table tags from character descriptions, like
+
+ MAKE_TT_TAG( 'e','b','l','c' )
+
+ ..................................................................
+
+ TT_Load_Kerning_Table( TT_Face face,
+ TT_UShort kernIndex );
+
+ Loads the kerning subtable number 'kern_index' into memory. The
+ subtable can be accessed through the pointers provided by the
+ kerning directory, obtained from a call to
+ TT_Get_Kerning_Directory().
+
+ Note that the interpretation of the kerning data is left to the
+ client application. Read the TrueType specification for more
+ information on kerning encoding.
+
+ NOTE:
+
+ This function must be called after the kerning extension were
+ initialized.
+
+ ..................................................................
+
+ TT_Init_Post_Extension( TT_Engine engine );
+
+ Initializes the PostScript name extension to load the PostScript
+ glyph names given in the 'post' table. This must be called just
+ after creation of the engine, and before any face object
+ allocation. See description of TT_Get_PS_Name() for an example.
+
+ ..................................................................
+
+ TT_Load_PS_Names( TT_Face face,
+ TT_Post* post );
+
+ Loads the PostScript glyph names into memory. This must be done
+ before TT_Get_PS_Name() is called. In case of error, either
+ TT_Err_Invalid_Post_Table or TT_Err_Invalid_Post_Table_Format is
+ returned. See description of TT_Get_PS_Name() for an example.
+
+ ..................................................................
+
+ TT_Get_PS_Name( TT_Face face,
+ TT_UShort index,
+ TT_String** PSname );
+
+ Get the PostScript glyph name for a given glyph index. A
+ pointer to the name is returned in 'PSname'. Example:
+
+ ...
+ TT_Post post;
+ char* PSname;
+
+ ...
+ TT_Init_Post_Extension( engine );
+ TT_Load_PS_Names( face, &post );
+
+ ...
+ TT_Get_PS_Name( face, index, &PSname );
+
+
+ NOTE:
+
+ You must not alter the PostScript glyph name string returned
+ by PSname.
+
+
+--------------------------------------------------------------------
+--------------------------------------------------------------------
+
+
+III. Error Messages:
+
+ Most functions return an error code, typed to TT_Error. A return
+ value of zero indicates no error. The error values are defined in
+ the file 'freetype.h'.
+
+
+ Error Unprefixed Error
+ Code Macro Name Description
+ ------------------------------------------------------------------
+
+ 0x0000 Ok Successful function call.
+ Always 0!
+
+ ----------------- high-level API error codes ---------------------
+
+ The following error codes are returned by the high-level API to
+ indicate an invalid client request.
+
+ 0x0001 Invalid_Face_Handle An invalid face object handle was
+ passed to an API function.
+
+ 0x0002 Invalid_Instance_Handle An invalid instance object handle
+ was passed to an API function.
+
+ 0x0003 Invalid_Glyph_Handle An invalid glyph container handle
+ was passed to an API function.
+
+ 0x0004 Invalid_CharMap_Handle An invalid charmap handle was
+ passed to an API function.
+
+ 0x0005 Invalid_Result_Address An output parameter (a result)
+ was given a NULL address in an
+ API call.
+
+ 0x0006 Invalid_Glyph_Index An invalid glyph index was passed
+ to one API function.
+
+ 0x0007 Invalid_Argument An invalid argument was passed to
+ one API function. Usually, this
+ means a simple out-of-bounds
+ error.
+
+ 0x0008 Could_Not_Open_File The pathname passed doesn't point
+ to an existing or accessible
+ file.
+
+ 0x0009 File_Is_Not_Collection Returned by TT_Open_Collection
+ when trying to open a file which
+ isn't a collection.
+
+ 0x000A Table_Missing A mandatory TrueType table is
+ missing from the font file.
+ Denotes a broken font file.
+
+ 0x000B Invalid_Horiz_Metrics The font's HMTX table is broken.
+ Denotes a broken font.
+
+ 0x000C Invalid_CharMap_Format A font's charmap entry has an
+ invalid format. Some other
+ entries may be valid though.
+
+ 0x000D Invalid_PPem Invalid PPem values specified,
+ i.e. you're accessing a scaled
+ glyph without having called
+ TT_Set_Instance_CharSize() or
+ TT_Set_Instance_PixelSizes().
+
+ 0x0010 Invalid_File_Format The file isn't a TrueType font or
+ collection.
+
+ 0x0020 Invalid_Engine An invalid engine handle was
+ passed to one of the API
+ functions.
+
+ 0x0021 Too_Many_Extensions The client application is trying
+ to initialise too many
+ extensions. The default max
+ extensions number is 8.
+
+ 0x0022 Extensions_Unsupported This build of the engine doesn't
+ support extensions
+
+ 0x0023 Invalid_Extension_Id This error indicates that the
+ client application is trying to
+ use an extension that has not
+ been initialized yet.
+
+ 0x0080 Max_Profile_Missing The max profile table is missing
+ from the font file.
+ => broken font file
+
+ 0x0081 Header_Table_Missing The font header table is missing
+ from the font file.
+ => broken font file
+
+ 0x0082 Horiz_Header_Missing The horizontal header is missing.
+
+ 0x0083 Locations_Missing The locations table is missing.
+
+ 0x0084 Name_Table_Missing The name table is missing.
+
+ 0x0085 CMap_Table_Missing The character encoding tables are
+ missing.
+
+ 0x0086 Hmtx_Table_Missing The Hmtx table is missing.
+
+ 0x0087 OS2_Table_Missing The OS/2 table is missing.
+
+ 0x0088 Post_Table_Missing The PostScript table is missing.
+
+ ----------------- memory component error codes -------------------
+
+ 0x0100 Out_Of_Memory An operation couldn't be
+ performed due to memory
+ exhaustion.
+
+ ----------------- file component error codes ---------------------
+
+ 0x0200 Invalid_File_Offset Trying to seek to an invalid
+ portion of the font file.
+ Denotes a broken file.
+
+ 0x0201 Invalid_File_Read Trying to read an invalid portion
+ of the font file. Denotes a
+ broken file.
+
+ 0x0202 Invalid_Frame_Access Trying to frame an invalid
+ portion of the font file.
+ Denotes a broken file.
+
+ ----------------- glyph loader error codes -----------------------
+
+ These errors are produced by the glyph loader. They denote an
+ invalid glyph record within the font file.
+
+ 0x0300 Too_Many_Points The glyph has too many points to
+ be valid for its font file.
+
+ 0x0301 Too_Many_Contours The glyph has too many contours
+ to be valid for its font file.
+
+ 0x0302 Invalid_Composite_Glyph A composite glyph's description
+ is broken.
+
+ 0x0303 Too_Many_Ins The glyph has too many
+ instructions to be valid for its
+ font file.
+
+ ----------------- byte-code interpreter error codes --------------
+
+ These error codes are produced by the TrueType byte-code
+ interpreter. They usually indicate a broken font file or a broken
+ glyph within a font.
+
+ 0x0400 Invalid_Opcode Found an invalid opcode in a
+ TrueType byte-code stream.
+
+ 0x0401 Too_Few_Arguments An opcode was invoked with too
+ few arguments on the stack.
+
+ 0x0402 Stack_Overflow The interpreter's stack has been
+ filled up and operations can't
+ continue.
+
+ 0x0403 Code_Overflow The byte-code stream runs out of
+ its valid bounds.
+
+ 0x0404 Bad_Argument A function received an invalid
+ argument.
+
+ 0x0405 Divide_By_Zero A division by 0 operation was
+ queried by the interpreter
+ program.
+
+ 0x0406 Storage_Overflow The program tried to access data
+ outside of its storage area.
+
+ 0x0407 Cvt_Overflow The program tried to access data
+ outside of its control value
+ table.
+
+ 0x0408 Invalid_Reference The program tried to reference an
+ invalid point, zone or contour.
+
+ 0x0409 Invalid_Distance The program tried to use an
+ invalid distance.
+
+ 0x040A Interpolate_Twilight The program tried to interpolate
+ twilight points.
+
+ 0x040B Debug_Opcode The now invalid 'debug' opcode
+ was found in the byte-code
+ stream.
+
+ 0x040C ENDF_In_Exec_Stream A misplaced ENDF was encountered
+ in the byte-code stream.
+
+ 0x040D Out_Of_CodeRanges The program tried to allocate too
+ much code ranges (this is really
+ an engine internal error that
+ should never happen).
+
+ 0x040E Nested_DEFS Nested function definitions
+ encountered.
+
+ 0x040F Invalid_CodeRange The program tried to access an
+ invalid code range.
+
+ 0x0410 Invalid_Displacement The program tried to use an
+ invalid displacement.
+
+ 0x0411 Execution_Too_Long In order to get rid of "poison"
+ fonts, the interpreter produces
+ this error when more than a
+ million opcodes have been
+ interpreted in a single glyph
+ program. This detects infinite
+ loops softly.
+
+ ----------------- internal failure error codes -------------------
+
+ These error codes are produced if an incoherent library state has
+ been detected. All of these reflect a severe bug in the engine
+ (or a severe memory corruption due to massive overwrites by your
+ application into the library's data)!
+
+ If you do encounter a font that makes one of the test programs
+ produce such an error, please report it!
+
+ 0x0500 Nested_Frame_Access
+ 0x0501 Invalid_Cache_List
+ 0x0502 Could_Not_Find_Context
+ 0x0503 Unlisted_Object
+
+ ----------------- scan-line converter error codes ----------------
+
+ These error codes are produced by the raster component. They
+ indicate that an outline structure was incoherently set up, or
+ that you're trying to render a horribly complex glyph.
+
+ They should be _extremely_ rare, however.
+
+ 0x0600 Raster_Pool_Overflow Render pool overflow. This should
+ never happen in this release.
+
+ 0x0601 Raster_Negative_Height A negative height was produced.
+
+ 0x0602 Raster_Invalid_Value The outline data wasn't set
+ properly. Check that:
+ points >= endContours[contours]
+
+ 0x0603 Raster_Not_Initialized You did not call
+ TT_Init_FreeType()!
+
+ ----------------- engine extensions error codes ------------------
+
+ The engine's extensions also provide their own error codes, within
+ their own group:
+
+ 0x0A00 Invalid_Kerning_Table_Format
+ A kerning subtable format was
+ found invalid in this font.
+
+ 0x0A01 Invalid_Kerning_Table A kerning table contains illegal
+ glyph indices.
+
+ 0x0B00 Invalid_Post_Table_Format
+ The post table format specified
+ in the font is invalid.
+
+ 0x0B01 Invalid_Post_Table The post table contains illegal
+ entries.
+
+--- end of apiref.txt ---
diff --git a/xc/extras/FreeType/docs/bitmaps.txt b/xc/extras/FreeType/docs/bitmaps.txt
new file mode 100644
index 000000000..d7bbd55b2
--- /dev/null
+++ b/xc/extras/FreeType/docs/bitmaps.txt
@@ -0,0 +1,761 @@
+
+ Bitmap and Pixmap generation with FreeType
+
+ v 1.0 - D. Turner - 21/5/1998
+
+
+--------------------------------------------------------------------
+
+ Table Of Contents
+
+
+ Introduction
+
+ I. The raster component
+
+ II. Bitmap & pixmap descriptors
+
+ III. Rendering an outline
+
+ IV. Anti-aliasing palette and other concerns
+
+ Conclusion
+
+
+--------------------------------------------------------------------
+
+Intoduction:
+
+ This document describes the steps that are needed to render a
+ glyph outline into a bitmap or a pixmap with the FreeType library.
+ It contains several important details needed to generate bitmaps
+ correctly in all situations, including when an outline has been
+ transformed or translated.
+
+
+I. The raster component:
+
+ In FreeType, the component in charge of performing bitmap and
+ pixmap rendering is called the "raster". Generation is performed
+ through traditional process called "scan-line conversion", but
+ exhibits certain properties:
+
+ - The raster doesn't allocate bitmaps:
+
+ In fact, it is only able to render an outline into an existing
+ bitmap or pixmap, which is passed to one of its rendering
+ functions. This means that the target bitmap/pixmap must be set
+ up correctly by the caller to achieve desired results. Setting
+ up bitmap and pixmap descriptors is explained in section II.
+
+
+ - It is able to render anti-aliased pixmaps directly:
+
+ This is unlike other graphics packages, which render to a
+ "large" bitmap which is then filtered down. Putting the
+ anti-aliasing logic within the raster improves performance and
+ reduces memory usage, as well as let the use of better
+ algorithms which couldn't work in a "two-phase" process.
+
+
+ The raster is located in the "ttraster.h" and "ttraster.c" files
+ (or "ttraster.pas" for the Pascal one).
+
+ The format of outlines isn't important for most developers and
+ won't be discussed here. However, a few conventions must be
+ explained regarding the vector outlines:
+
+
+ 1. Units:
+
+ All point coordinates within an outline are stored in 32-bits
+ fractional pixel values, using the 26.6 fixed float format (which
+ uses 26 bits for the integer part, and 6 bits for the fractional
+ ones). The following table gives some examples of real versus
+ 26.6 coordinates:
+
+ -----------------------------------------
+ real real coord 26.6 coord
+ coord. * 2^6
+ -----------------------------------------
+ 0 0*64 = 0.0 0
+ 2.4 2.4*64 = 153.6 154
+ 3 3*64 = 192.0 192
+ -1.7 -1.7*64 = -108.8 -109
+
+ As you can see, conversion is relatively simple.
+
+ In order to differentiate coordinates expressed in real or 26.6
+ systems, we'll use in the following lines brackets ('[' and ']')
+ for real coordinates, and simple parentheses ('(' and ')') for
+ 26.6 ones so that
+
+ [1.0,2.5] equals (64,160)
+
+ [0,0] equals (0,0)
+
+ [-2,3] equals (-128,192)
+
+
+ 2. Orientation:
+
+ The raster uses the traditional convention of an X axis oriented
+ from left to right, and of an Y one oriented from bottom to top.
+
+ ^ Y
+ |
+ |
+ |
+ -*-----> X
+ |
+
+ You've probably already used it at school when doing math :-)
+
+ Though the orientation of bitmap lines has an opposite direction
+ on nearly all graphics systems, the former convention is the
+ _right_ one when it comes to vector graphics. The reason is
+ simply that for managing angles and vector cross-products
+ resp. orientations in complex algorithms, a single convention,
+ used in math as well as computing alike solves many headaches.
+
+ And due to education, most people expect a 45 degrees angle to
+ be in the top right quadrant, at coordinate (1,1).
+
+
+ 3. Pixels and the grid:
+
+ In a vector outline, a point is immaterial and has no size or
+ width, just like in usual geometry. A "pixel" is an element of
+ a computer image called a "map" (like a bitmap or a pixmap).
+
+ The FreeType raster follows the convention defined by the
+ TrueType specification regarding pixel placement:
+
+ - The map can be seen as a 'grid' placed in the vector plane.
+ The grid lines are set on integer real coordinates (i.e., on
+ multiples of 64 in 26.6 ones).
+
+ Each pixel is one "cell" of the grid, and can be 'lit' with
+ any color. Hence, each pixel has a width and a height of
+ [1.0] units, (i.e., 64 fixed float units).
+
+ ^ Y
+ |
+ | The pixel grid with two
+ | points (not pixels!)
+ +-----+-----+-----+-----+-----+ at coordinates [0,0]
+ | | | | | | and [2,2].
+ | | | | | |
+ | | | | |[2,2]|
+ +-----+-----+-----+-----@-----+ The pixels are the
+ | | |11111|22222| | grid's cells, and this
+ | | |11111|22222| | example show the four
+ | | |11111|22222| | pixels enclosed within
+ +-----+-----+-----+-----+-----+ the rectangle delimited
+ | | |33333|44444| | by these two points.
+ | | |33333|44444| |
+ | | |33333|44444| |
+ --+-----+-----@-----+-----+-----+----> X
+ | | |[0,0]| | |
+ | | | | | | Note that the numbering
+ | | | | | | of pixels isn't
+ +-----+-----+-----+-----+-----+ meaningful here, it's
+ | | | | | | only used to ditinguish
+ | | | | | | them.
+ | | | | | |
+ +-----+-----+-----+-----+-----+
+ |
+ |
+
+ - The "center" of each pixel is always located on a
+ 'half-integer' coordinate, i.e., at -1.5, -0.5, 0.5, 1.5, etc.
+
+ - When drawing a shape, the raster only "lits" a pixel when its
+ center is placed _within_ the shape. This is important
+ because an outline point may not be necessarily be on a grid
+ line.
+
+ - When a pixel center falls on the shape, the pixel is lit too.
+
+ For example, the following graphics show the "lit" pixels
+ corresponding to the rectangle enclosed by the points:
+
+ [-0.2, 0] and [2.4, 2.7]
+
+
+ ^ Y As one can see, the
+ | newest pixels "1"
+ | and "2" are now lit,
+ | because their
+ +-----+-----+-----+-----+--[2.4,2.7] centers are located
+ | | |11111|22222| @ | at coordinates
+ | . | . |11.11|22.22| . | [0.5,2.5] and
+ | | |11111|22222| | [1.5,2.5],
+ +-----+-----+-----+-----+-----+ respectively.
+ | | |33333|44444| |
+ | . | . |33.33|44.44| . | Note that pixel
+ | | |33333|44444| | centers are
+ +-----+-----+-----+-----+-----+ represented with a
+ | | |55555|66666| | dot in the graphics.
+ | . | . |55.55|66.66| . |
+ | | |55555|66666| |
+ --+-----+----@+-----+-----+-----+----> X
+ | | [-0.2,0] | | |
+ | . | . | . | . | . |
+ | | | | | | Note also that pixel
+ +-----+-----+-----+-----+-----+ numbering is still
+ | | | | | | meaningless there.
+ | . | . | . | . | . |
+ | | | | | |
+ +-----+-----+-----+-----+-----+
+ |
+ |
+
+
+ 4. Drop-out control:
+
+ Sometimes, a stroke is too thin to even contain a single pixel
+ center. This results in "lost continuity" in the resulting
+ bitmap, i.e., some unpleasant 'holes' or 'breaks' in the
+ rendered shape, which are called a "drop-out".
+
+ Because a glyph representation uses curves (Bezier arcs), this
+ case is not easily controllable during the 'hinting' of glyph
+ outlines by the font driver, which means that the raster must be
+ able to correct these 'artefacts'.
+
+ This processing is called "drop-out control", and can be
+ performed among several modes, defined by the TrueType
+ specification, and which details do not belong to this paper.
+ However, the important idea is that, in _some_ cases, a pixel
+ may be lit, even if its center isn't part of the shape.
+
+ This case is relatively rare, but is mentioned because it has
+ consequences of the rendering of maps. More precisely, in the
+ way an outline's extent is computed (see below).
+
+
+--------------------------------------------------------------------
+
+II. Bitmap and pixmap descriptors:
+
+ The Freetype raster only supports bitmaps and 8-bit pixmaps. In
+ order to render an outline, a map descriptor must be sent to its
+ rendering functions, along with a vectorial outline.
+
+
+ 1. Bitmap properties:
+
+ This section explains how to set up a bitmap descriptor, and how
+ vector coordinates in the outline plane relate to pixel
+ positions within the bitmap buffer.
+
+ A bitmap's "raw data" is made of a simple bit buffer, where each
+ bit corresponds to a monochrome pixel. For the sake of
+ simplicity, the FreeType raster uses the following conventions
+ to store bitmaps in a buffer:
+
+ - The value 0 is used for "unlit" pixels, usually the
+ "background" when rendering text. Hence 1 is used for "lit".
+
+ - Lines are padded to 8-bits, i.e., bytes. A bitmap row thus
+ takes an integral number of bytes in its buffer. No further
+ alignment is required.
+
+ (Some systems compress bitmaps by _not_ padding bit rows to
+ byte boundaries. It is not possible to render in such a
+ bitmap buffer with FreeType.)
+
+ - In a bitmap buffer byte, the left-most pixel is represented by
+ the most significant bit (i.e., 0x80).
+
+ The opposite convention is not supported by the FreeType
+ raster, though it may eventually be implemented too if this
+ ever comes useful (ask the developers -- for now, nobody did.
+
+ - Increasing offsets within a row correspond to right-most
+ positions in the bitmap (i.e., byte 1 contains the 8
+ bits/pixels that are located on the right of the 8 bits/pixels
+ of byte 0).
+
+ - A bitmap can be oriented in two ways:
+
+ o When increasing row addresses within the buffer correspond
+ to lower vertical lines, the bitmap is said to go "down".
+ This is, for example, the case of nearly all video RAMs.
+
+ o When increasing row addresses within the buffer correspond
+ to higher vertical lines, the bitmap is said to go "up".
+ This is the case, for example, of OS/2 bitmaps.
+
+ The 'direction' of a bitmap is called "flow" to avoid any
+ confusion. In all cases, the raster ALWAYS matches the vector
+ coordinate (0,0) with the lower-left corner of the
+ *lower-left* pixel in the bitmap.
+
+ The following graphics illustrate these ideas:
+
+
+
+ Y ^
+ | A "down-flow" bitmap.
+ +--+--+--+--+--+--+--+--+ On the left is each
+ | | | | | | | | | row's number and its
+ 0: 0 | | | | | | | | | offset in the bitmap
+ +--+--+--+--+--+--+--+--+ bitmap buffer (where
+ | | | | | | | | | "w" is the width, in
+ 1: w | | | | | | | | | bytes, of a single
+ +--+--+--+--+--+--+--+--+ bitmap row). Note
+ | | | | | | | | | that the origin is
+ 2: 2*w | | | | | | | | | located at the lower
+ +--+--+--+--+--+--+--+--+ left, i.e., near the
+ | | | | | | | | | leftmost bit of the
+ 3: 3*w | | | | | | | | | last bitmap row.
+ -@--+--+--+--+--+--+--+-----> X
+ |[0,0]
+
+
+
+ Y ^
+ | An "up-flow" bitmap.
+ +--+--+--+--+--+--+--+--+ On the left is each
+ | | | | | | | | | row's number and its
+ 3: 3*w | | | | | | | | | offset in the bitmap
+ +--+--+--+--+--+--+--+--+ buffer (where "w" is
+ | | | | | | | | | the width, in bytes,
+ 2: 2*w | | | | | | | | | of a single bitmap
+ +--+--+--+--+--+--+--+--+ row). Note that the
+ | | | | | | | | | origin is located at
+ 1: w | | | | | | | | | the lower left, i.e.,
+ +--+--+--+--+--+--+--+--+ near the first bit in
+ | | | | | | | | | the buffer.
+ 0: 0 | | | | | | | | | The first buffer bit
+ -@--+--+--+--+--+--+--+-----> X corresponds to the
+ |[0,0] rectangle [0,0]-[1,1]
+ in the vector plane.
+
+
+ 2. Bitmap descriptors:
+
+ Now that you understand all these details, a bitmap can be
+ described to the raster engine through a map, which structure
+ must be set up by client application:
+
+ struct TT_Raster_Map_
+ {
+ int rows; /* number of rows */
+ int cols; /* number of columns (bytes) per row */
+ int width; /* number of pixels per line */
+ int flow; /* bitmap orientation */
+
+ void* bitmap; /* bit/pixmap buffer */
+ long size; /* bit/pixmap size in bytes */
+ };
+ typedef struct TT_Raster_Map_ TT_Raster_Map;
+
+ where the fields stand for:
+
+ rows:
+ Simply the number of rows within the bitmap buffer.
+
+ cols:
+ The number of columns, i.e., bytes per row within the
+ buffer. It corresponds to the 'w' value used in the above
+ graphics.
+
+ width:
+ The number of pixels (i.e., bits) per row in the buffer.
+ The raster always clip its rendering to the bit width
+ specified in this field, even if the "cols" fields
+ corresponds to a larger width.
+
+ flow:
+ The bitmap flow. Use the constants TT_Flow_Up and
+ TT_Flow_Down exclusively for this field.
+
+ bitmap:
+ A typeless pointer to the bit buffer.
+
+ size:
+ The total size of the bit buffer in bytes. This is not used
+ directly by the raster, so applications can use it.
+
+ Note that the "cols" field should always be bigger than the
+ value of "width" multiplied by 8. The rasterizer clips the
+ generated bitmap to the 'width' first bits in a row.
+
+ Note also that it is perfectly possible to create, for example,
+ a Windows or X11 bitmap through a normal system-specific API,
+ then create a TT_Raster_Map that describes it to the raster. It
+ is thus possible to draw directly into such OS specific
+ structures.
+
+
+ IMPORTANT: *****************************************************
+
+ When rendering a bitmap, the raster always OR-es the shape on
+ the target bitmap. It is thus possible to draw several shapes
+ into a single surface which successive calls to the render
+ functions.
+
+ ****************************************************************
+
+
+ 3. Pixmap properties:
+
+ The raster only supports 8-bit pixmaps, where one pixel is
+ represented by a single byte. They must conform to the
+ following rules:
+
+ - A 5-entries palette is used to generate an outline's pixmap in
+ the buffer. They correspond to:
+
+ palette[0] -> background
+ palette[1] -> "light"
+ palette[2] -> "medium"
+ palette[3] -> "dark"
+ palette[4] -> foreground
+
+ where the terms "light", "medium" and "dark" correspond to
+ intermediate values between the first (background) and last
+ (foreground) entry.
+
+ The upcoming FreeType 2.0 will feature an additional
+ anti-aliasing logic with a 17-entries palette.
+
+ - Lines are padded to 32 bits, i.e., 4 bytes. A pixmap row thus
+ takes a multiple of 4 bytes in its buffer.
+
+ - Increasing offsets within a row correspond to right-most
+ positions in the bitmap (i.e., byte/pixel 1 is to the right of
+ byte/pixel 0).
+
+ - A pixmap can be oriented in two ways, following the same rules
+ than a bitmap regarding its flow.
+
+
+ IMPORTANT: *****************************************************
+
+ In order to improve performance when rendering large outlines
+ with anti-aliasing, the raster draws pixels in runs of 4-bytes
+ ONLY when at least one of their "colour" isn't 0 (background).
+
+ This means that you should ALWAYS CLEAR the pixmap buffer before
+ calling the rendering function, you may otherwise experience
+ ugly artefacts, which are "rest" of the previous rendering!
+
+ In general, it is not possible to do colour compositing with the
+ FreeType raster (compositing is when you want to superpose a
+ transparent coloured layer on top of an image). This is mainly
+ due to the fact that:
+
+ - There are too many pixel formats to support.
+
+ - There is not a single portable way to do it anyway.
+
+ - It really is a graphics processing question, not one that
+ should be solved by a text rendering engine.
+
+ ****************************************************************
+
+
+ 4. Pixmap descriptors:
+
+ Pixmaps use the same descriptor structure as bitmaps, with a few
+ difference in interpretation:
+
+ - The "cols" field is used to indicate the number of _bytes_ in
+ a pixmap row. It must thus be a multiple of 4!
+
+ - The raster clips the outline to the first "width" pixels/width
+ within each buffer row.
+
+ As usual, it should be possible to use a system-specific pixmap
+ and render directly into it, as long as you set up a descriptor
+ for it.
+
+
+-------------------------------------------------------------------------
+
+III. Rendering an outline:
+
+ Now that you understand how the rasterizer sees the target bitmaps
+ and pixmaps it renders to, this section will explain how the
+ rendering eventually happen.
+
+
+ 1. Outline coordinates and extents:
+
+ Let's first consider the case where we're rendering text
+ directly into a huge single bitmap. To do that, we simply
+ translate each glyph outline before calling the raster. Here
+ the roadmap:
+
+ - Vectorial coordinates [0,0] are mapped to the lower left
+ "corner" (in the grid) of the lower left pixel in the bitmap
+ (whatever its flow is).
+
+ - When the glyph loader returns an outline, the latter is placed
+ so that the coordinate [0,0] correspond to the current cursor
+ position.
+
+ This means that:
+
+ - If we use our own cursor (cx,cy) within the bitmap during text
+ rendering, we must translate the outline to its position
+ before rendering it, e.g. with
+
+ TT_Translate_Outline( outline, cx, cy )
+
+ (and the cursor position must be incremented after rendering
+ each glyph).
+
+ - Before translation (i.e., when it is returned by the glyph
+ loader), the glyph outline doesn't necessarily lies on any of
+ the coordinate axes, nor is it limited to the first quadrant
+ (i.e., x>0 and y>0 is not true in general).
+
+ Its extent can be computed with the function
+ TT_Get_Outline_BBox(), which returns the minimum and maximum
+ values of its X and Y point coordinates (in 26.6 format, of
+ course).
+
+
+ 2. Computing an outline's dimensions in pixels:
+
+ In many cases, however, it is much better to render individual
+ glyph bitmaps, then cache them with appropriate metrics in order
+ to much more quickly render text at a given point size.
+
+ To be able to render the smallest possible bitmap, the exact
+ outline's extent dimensions in pixel are required. Again a
+ roadmap:
+
+ - Get the outline's bounding box in vector coordinates:
+
+ Simply call the TT_Get_Outline_BBox() function, which will
+ return the values of xMin, yMin, xMax and yMax in vector
+ (i.e., fractional) coordinates.
+
+ - Grid-fit the bounding box:
+
+ Because of the way pixels are lit in the bitmaps relative to
+ the position of their "centers" within the shape (see section
+ I.), it is necessary to align the values of xMin, xMax, yMin
+ and yMax to the pixel grid, in order to compute the width and
+ height of the resulting bitmap. This can be done with:
+
+ xMin = FLOOR ( xMin ); with FLOOR(x) == (x & -64)
+ xMax = CEILING( xMax ); CEILING(x) == ((x+63) & -64)
+ yMin = FLOOR ( yMin );
+ yMax = CEILING( yMax );
+
+ The extents in pixels can then be simply computed as:
+
+ pixel_width = (xMax - xMin) / 64;
+ pixel_height = (yMax - yMin) / 64;
+
+ Note that because of drop-out control, and because the
+ bounding box computed currently includes all Bezier control
+ points from the outline, the bitmap may be slightly larger
+ than necessary in some cases.
+
+ Some improvements are planned for FreeType 2.0; for now, you
+ should consider that finding the "exact" bitmap bounding box
+ requires to scan the "borders" by hand to detect null columns
+ or rows. However, the values are right in most cases.
+
+ NOTE: It seems that in some *rare* cases, which relate to
+ weird drop-out control situations, the above dimensions
+ are not enough to store all bits from the outline (there
+ are one of more bits "cut" on the edge).
+
+ This being hard to study (it only appears in very poorly
+ hinted fonts), we leave this problem for FreeType 2.0.
+
+ - Create/setup a bitmap with the computed dimensions. DON'T
+ FORGET TO CLEAR ITS BUFFER TOO!
+
+ - Translate the outline to stick it within the bitmap space.
+ This is done easily by translating it by (-xMin,-yMin),
+ where you should ALWAYS USE THE GRID-FITTED VALUES computed
+ above for xMin and yMin:
+
+ TT_Translate_Outline( outline, -xMin, -yMin );
+
+
+ IMPORTANT: *************************************************
+
+ For technical reasons, you should never translate a HINTED
+ outline by a non-integer vector (i.e., a vector which
+ coordinates aren't multiples of 64)! This would CERTAINLY
+ completely RUIN the delicate HINTING of the glyph, and will
+ result probably in pure GARBAGE at small point sizes.
+
+ Of course, if you're not interested in hinting, like when
+ displaying rotated text, you can ignore this rule and
+ translate to any position freely.
+
+ ************************************************************
+
+
+ - Render the bitmap (or pixmap).
+
+ DON'T FORGET TO STORE THE GRID-FITTED xMin and yMin WITH THE
+ BITMAP! This will allow you later to place it correctly
+ relative to your cursor position.
+
+
+ Here's some example pseudo code:
+
+ {
+ ... load the glyph ...
+
+ TT_Outline outline;
+ TT_BBox bbox;
+ TT_Raster_Map bitmap;
+
+
+ /* get the outline */
+ TT_Get_Glyph_Outline( glyph, &outline );
+
+ /* compute its extent */
+ TT_Get_Outline_BBox( &outline, &bbox );
+
+ /* Grid-fit it */
+ bbox.xMin &= -64;
+ bbox.xMax = ( bbox.xMax + 63 ) & -64;
+ bbox.yMin &= -64;
+ bbox.yMax = ( bbox.yMax + 63 ) & -64;
+
+ /* compute pixel dimensions */
+ width = (bbox.xMax - bbox.xMin) / 64;
+ height = (bbox.yMax - bbox.yMin) / 64;
+
+ /* set up bitmap */
+ bitmap.rows = height;
+ bitmap.width = width;
+ bitmap.cols = (width + 7) & -8;
+ bitmap.size = bitmap.rows * bitmap.cols;
+ bitmap.buffer = malloc( bitmap.size );
+ if (!bitmap.buffer)
+ return error_memory...
+
+ /* clear the bitmap buffer !! */
+ memset( bitmap.buffer, 0, bitmap.size );
+
+ /* translate outline */
+ TT_Translate_Outline( &outline, -bbox.xMin, -bbox.yMin );
+
+ /* render it within the bitmap */
+ TT_Get_Outline_Bitmap( engine, &outline, &bitmap );
+
+ /* We're done; don't forget to save bbox.xMin and */
+ /* bbox.yMin to adjust the bitmap position when */
+ /* rendering text with it */
+
+ ...
+ }
+
+
+ 3. The case of transformed/rotated glyphs:
+
+ You may want to apply a transformation other than a translation
+ to your glyph outlines before rendering them. For example, a
+ simple slant to synthetize italics, or a slight rotation.
+
+ In all cases, it is possible to render individual glyph bitmaps.
+ Just make sure to follow the same process, AFTER you have
+ transformed you outline!
+
+ DON'T FORGET THAT YOU NEED TO RE-COMPUTE THE BBOX TO GET THE
+ CORRECT PIXEL DIMENSIONS AFTER A TRANSFORMATION.
+
+
+--------------------------------------------------------------------
+
+IV. Anti-aliasing palette and other concerns:
+
+ When rendering pixmaps, using the TT_Get_Outline_Pixmap() or
+ TT_Get_Glyph_Pixmap() functions, the raster uses a 5-entries
+ palette of 8-bit "colors".
+
+ By default, this palette is set to ( 0, 1, 2, 3, 4 ), but one can
+ change it to suit its needs with TT_Set_Raster_Palette().
+
+ While in bitmap mode, it simply OR-es the pixel values to the
+ target bitmap that has been passed to TT_Get_Outline_Bitmap().
+
+ For pixmaps it simply writes directly the palette entries
+ corresponding to the "color" of the "lit" pixels it has computed.
+ This means that it is NOT POSSIBLE to render text in a single
+ pixmap with multiple calls to TT_Get_Outline_Pixmaps() within the
+ same target!
+
+ The reason is that "gray" pixels of two distinct outlines are not
+ 'added' when they overlap (the operation called 'compositing'), as
+ it could be expected by applications.
+
+ The following graphic shows this effect when rendering two
+ overlapping anti-aliased shapes:
+
+
+ *** ***
+ .** .**
+ ** **. **. **
+ .*. .*.. .*..*.
+ .*. + .*. = ---> ..*.
+ .*. ** | .*. **
+ ** | **
+ **. | **.
+ *** | ***
+ |
+
+ missing black pixel after second
+ rendering...
+
+
+ There is no simple way to perform a composition within the raster.
+ This would not be portable, moreover it would be extremely slow if
+ it's too general. This operation is thus left to client
+ applications, which can use their own system-specific API for
+ transparently blitting the glyph pixmaps into a surface to form
+ text.
+
+ NOTE:
+
+ If your system doesn't support transparent/alpha blits, you can
+ still have a look at the source file "freetype/test/display.c".
+ It uses a large pixmap, with a special palette trick to render all
+ text quickly, then convert all of it to "real" colors for display.
+
+
+--------------------------------------------------------------------
+
+Conclusion:
+
+ We've seen how the FreeType raster sees bitmaps through
+ descriptors, as well as the mapping existing between the vector
+ coordinate space and the pixel position space.
+
+ You should now be able to render outlines into bitmaps and pixmaps
+ while applying transformations as translation, slanting, or
+ rotation. Don't forget a few rules, however:
+
+ - Always clear the bitmap/pixmap buffer before rendering (unless
+ you want to render several glyphs in a single _bitmap_, which
+ won't work on a pixmap).
+
+ - A pixmap "cols" field, i.e., the size in bytes of each rows,
+ must be a multiple of 4.
+
+ - Never translate a hinted outline by a non-integer vector if you
+ want to preserve the hints (i.e., the vector's coordinates must
+ be multiples of 64).
+
+ - Finally, don't expect the raster to composite transparent
+ "grays" for you in a single target pixmap through multiple
+ calls.
+
+
+--- end of bitmaps.txt ---
diff --git a/xc/extras/FreeType/docs/changes.txt b/xc/extras/FreeType/docs/changes.txt
new file mode 100644
index 000000000..fbf41787a
--- /dev/null
+++ b/xc/extras/FreeType/docs/changes.txt
@@ -0,0 +1,343 @@
+What's new?
+===========
+
+The Future: FreeType 2.0
+------------------------
+
+FreeType 1.1 is released to fix some bugs found in 1.0, as well as
+enhance the engine's features.
+
+However, the FreeType distribution is going through a major
+re-design and will extend its capabilities from a TrueType-specific
+font driver to a higher-level text rendering library, which should
+hopefully be independent of font file formats.
+
+We're aimed at a portable, efficient and lightweight system. We
+want a _single_ API to be used on all systems. Our first try will
+be released soon as FreeType 2.0 (or maybe 1.99).
+
+Changes between FreeType 1.1 and 1.2:
+-------------------------------------
+
+Mostly bug fixes and build fixes.
+
+Changes between FreeType 1.0 and 1.1:
+-------------------------------------
+
+There were various changes since the 1.0 release. Here they are
+summarized:
+
+- "Added vertical layout support"
+
+ The engine now loads the vertical header and metrics when
+ available and makes them visible through the new 'vertical' field
+ of the face properties (it is set to NULL when no vertical data
+ was found in the font file).
+
+ The glyph loader now loads all metrics (horizontal and vertical),
+ but still returns the horizontal ones only with the API
+ TT_Get_Glyph_Metrics(). However, TT_Get_Glyph_Bit_Metrics() has
+ been added to extract them from a glyph container.
+
+- "Serialisation of coordinates arrays in TT_Outline"
+
+ As announced in the previous API reference, the structure of
+ TT_Outline changed slightly, as well as the naming of its fields.
+ The points are now stored in a single array of TT_Vector, instead
+ of two parallel arrays (one for the Xs, the other for the Ys).
+
+- "New API TT_Get_Face_Metrics()"
+
+ Useful to access un-scaled metrics like left side bearings,
+ advance widths, top side bearings and advance height, for a given
+ range of glyphs.
+
+- "New extension ftxcmap.c"
+
+ Used by some applications to enumerate and parse the charmap
+ tables in an easier way.
+
+- "New extension ftxpost.c"
+
+ With this extension you can access the PostScript glyph names
+ given in the 'post' table.
+
+- "New extension ftxwidth.c"
+
+ This extension is used to parse the 'glyf' table to extract the
+ bounding boxes of a given range of glyphs. This is much faster
+ than loading individual glyphs.
+
+- "Engine is now THREAD-SAFE and REENTRANT"
+
+ However, the implementation of ttmutex must be refined for your
+ system -- the default one is a dummy and doesn't do anything!
+ Beware! THIS IS STILL IN BETA.
+
+ The thread-safe and reentrant builds now compile and seem to run
+ well when used with a single thread. Some efforts have been spent
+ to check the coherency of the lock contentions within the engine,
+ but we haven't tested multi-threading heavily.
+
+- "Large internal re-organisation"
+
+ Too technical to explain shortly, but results in a much better
+ memory footprint and smaller code, especially when opening
+ multiple faces.
+
+- "Fixes/enhancements to the interpreter"
+
+ The infamous Monotype.com bug (a new free font released by
+ Microsoft Typography a few days after the FreeType 1.0 release!)
+ is fixed, of course, as well as few other little and unpleasant
+ artifacts...
+
+ The interpreter was also seriously re-organized to allow the use
+ of a very large "switch" statement, instead of a jump table, which
+ results in smaller and faster code on some systems (depending of
+ the compiler too). Users of the library can experiment with the
+ TT_CONFIG_OPTION_INTERPRETER_SWITCH configuration macro to test
+ this.
+
+- "Single object compilation mode"
+
+ The core engine can now be compiled into a single object file.
+ This allows optimizing compilers to do more global optimizations,
+ and get rid of many of the 'intermediate' internal symbols used to
+ link internal engine components together.
+
+ The engine now takes only 48kByte of stripped Intel object code!
+
+- "Dll compilation mode"
+
+ In order to allow the compilation of the library as a DLL, the
+ keyword EXPORT has been added as a prefix to all high-level API
+ functions found in "freetype.h". Define it to the value you need
+ before '#include "freetype.h"' when building the DLL (if undefined
+ it will default to nothing within this header file).
+
+ (Apparently, this is only useful on Win32, maybe on OS/2.)
+
+
+- "Renamed configuration macros"
+
+ These were renamed to forms of TT_CONFIG_OPTION_XXXXX_YYYYY.
+ They're located in ttconfig.h and can be defined/undefined
+ manually by developers who want to tune the compilation of the
+ engine:
+
+ TT_CONFIG_OPTION_EXTEND_ENGINE
+
+ Allows extensions to be linked with the single object engine.
+ If you don't need any of them, you may save one or more
+ Kilobytes by undefining it.
+
+
+ TT_CONFIG_OPTION_GRAY_SCALING
+
+ Allows the compilation of the gray-scaling (font smoothing)
+ code in ttraster. If undefined, some APIs won't be available:
+
+ TT_Set_Raster_Palette(),
+ TT_Get_Glyph_Pixmap(),
+ TT_Get_Outline_Pixmap()
+
+
+ TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+ Uses a large 'switch' statement in the bytecode intepreter
+ instead of a constant call-table. Depending on your processor
+ and compiler, this can lead to significant reduction of code
+ size and/or increase of performance.
+
+
+ TT_CONFIG_OPTION_THREAD_SAFE
+
+ When defined, a thread-safe version of the engine is built. A
+ thread-safe version is a bit bigger, probably not slower, than
+ a non-threaded build. ATTENTION: You must redefine the file
+ "lib/ttmutex.c" for your own platform to get it to work
+ correctly.
+
+
+ Some more options may come in the future...
+
+- "New APIs TT_MulDiv() and TT_MulFix()"
+
+ To help you compute 'a*b/c' with 64-bit intermediate precision, or
+ 'a*b/0x10000' with the same one...
+
+ These are not necessarily the fastest functions but they're
+ clearly portable and overflow-safe. Your runtime/compiler may
+ provide better replacements, though...
+
+
+====================================================================
+
+
+Changes between FreeType Beta and 1.0:
+--------------------------------------
+
+There were a number of changes since the public beta:
+
+
+I. Bug fixes
+
+ The following bugs have been fixed in this release:
+
+ - "Incorrect advance width and left side bearings"
+
+ The glyph loader has been re-designed to match the values found
+ in the pre-calc tables...
+
+ - "Problems when opening multiple fonts"
+
+ Fixed. A stupid bug in the i/o component.
+
+ - "Problems with some Georgian fonts"
+
+ Fixed. Discovered some new undocumented opcodes behaviour...
+
+ - "Buglets in the test programs which made them return invalid
+ error codes"
+
+ Fixed.
+
+ - "Memory leaks when trying to open broken some font files"
+
+ Fixed. Waiting for more broken fonts to test...
+
+ - "Non-square resolutions don't work or display correctly"
+
+ They now work very well!
+
+ - "The scan-line converter, while in font-smoothing mode, doesn't
+ perform horizontal drop-out control"
+
+ This wasn't really bug, but the feature has been correctly
+ added.
+
+
+The remaining "features" persist, as they're not essential yet:
+
+ - The "rotated" and "stretched" flags do not work (glyph loading
+ will then return errors). However, it is still possible to
+ rotate or transform any outline without setting these flags.
+
+ - We always use drop-out mode number 2, as some of the values
+ returned by some "cvt programs" seem invalid for now...
+
+
+Note also that an "event hook/callback" has been introduced in this
+release, but is still under alpha (not even beta; it is commented
+ouy currently). You should not rely on this...
+
+
+II. Code changes:
+
+
+ 1. API Changes:
+
+ A few API changes were necessary in order to support important
+ features, or future improvements which will come in later
+ releases.
+
+ - TT_Set_Instance_Resolution() was renamed to
+ TT_Set_Instance_Resolutions().
+
+ - TT_Set_Instance_PointSize() has disappeared. Instead, the
+ following APIs have been defined:
+
+ TT_Set_Instance_CharSize()
+ TT_Set_Instance_CharSizes()
+ TT_Set_Instance_PixelSizes()
+
+ - The TT_Engine class has been introduced. It models one
+ instance of the library, and is used to allow re-entrancy and
+ shared library code. The functions which now depend on a
+ TT_Engine parameter are:
+
+ TT_Init_FreeType()
+ TT_Done_FreeType()
+ TT_Open_Face()
+ TT_Open_Collection()
+ TT_Set_Raster_Palette()
+ TT_Get_Outline_Bitmap()
+ TT_Get_Outline_Pixmap()
+
+ Note that there is _no_ sharing of objects between distincts
+ engines.
+
+ - Each face and instance object have an inside pointer which use
+ is reserved to client application. Several functions are
+ defined to set and read it:
+
+ TT_Set_Face_Pointer() / TT_Get_Face_Pointer()
+ TT_Set_Instance_Pointer() / TT_Get_Instance_Pointer()
+
+ - TT_Apply_Outline_Matrix() has been renamed to
+ TT_Transform_Outline().
+ TT_Apply_Outline_Translation() has been renamed to
+ TT_Translate_Outline()
+ TT_Apply_Vector_Matrix() has been renamed to
+ TT_Transform_Vector()
+
+ all for the sake of clarity.
+
+
+ 2. Structural changes:
+
+ Some structures have evolved.
+
+ - The instance metrics have now two new fields which are
+ "x_scale" and "y_scale". Each one is a scaling factor,
+ expressed in the 16.16 fixed float format (TT_Fixed), used to
+ convert one distance expressed in font units into the same
+ distance in fractional (26.6) pixels.
+
+ - A new structure TT_BBox has been defined to describe an
+ outline's bounding box.
+
+ - The outlines are now full-class citizen. It is possible to
+ create new outlines, copy, clone, transform, translate and
+ render them through specific methods of the TT_Outline class
+ (previously called TT_Glyph_Outline). Read the API reference
+ for a complete listing.
+
+ - The glyph metrics have a new structure: they contain a TT_BBox
+ field, a TT_Outline field, as well as three metrics values,
+ which are "bearingX", "bearingY" and "advance". Read the file
+ "glyphs.txt" for more information about their definitions and
+ uses.
+
+
+ 3. Small but IMPORTANT changes:
+
+ - The "max_Faces" field of a face's properties has disappeared.
+ It is replaced by "num_Faces" which gives the total number of
+ fonts embedded in a collection (the previous field gave the
+ total minus one).
+
+ - TT_Load_Glyph() now returns correctly placed outlines, and
+ computes advance widths which match the pre-calc values in the
+ "hdmx" table in nearly all cases.
+
+ - TT_Get_Glyph_Metrics() returns grid-fitted metrics for hinted
+ glyphs (i.e., loaded with the TTLOAD_HINT_GLYPH, or
+ TTLOAD_DEFAULT, flags) This includes the bounding box. To get
+ the exact bounding box of a hinted glyph, you should extract
+ its outline, then call TT_Get_Outline_BBox().
+
+ - Some improvements in the glyph loader, which improves
+ drastically the placement of glyphs (especially composite
+ ones) which previously caused trouble for some fonts
+ (e.g. goudy.ttf).
+
+ - Several minor improvements in the interpreter to improve
+ rendering and bounds checking...
+
+ - Up-to-date Pascal source code, with output equivalent to the C
+ tree...
+
+
+--- END ---
diff --git a/xc/extras/FreeType/docs/convntns.txt b/xc/extras/FreeType/docs/convntns.txt
new file mode 100644
index 000000000..85fc2e344
--- /dev/null
+++ b/xc/extras/FreeType/docs/convntns.txt
@@ -0,0 +1,958 @@
+ Conventions and Design in the FreeType library
+
+
+TOC
+
+Introduction
+
+I. Style and Formatting
+
+ 1. Naming
+ 2. Declarations & Statements
+ 3. Blocks
+ 4. Macros
+
+II. Design conventions
+
+ 1. Modularity and Components Layout
+ 2. Configuration and Debugging
+
+III. Usage conventions
+
+ 1. Error handling
+ 2. Font File I/O
+ 3. Memory management (due to change soon).
+ 4. Support for threaded environments.
+ 5. Object Management
+
+Introduction:
+
+This text introduces the many conventions used within the FreeType
+library. Please read it before trying any modifications or extensions
+of the source code.
+
+I. Style and Formatting:
+
+The following coding rules are extremely important to keep the
+library's source code homogeneous. Keep in mind the following points :
+
+ - "Humans read source code, not machines" (Donald Knuth)
+
+ The library source code should be as readable as possible, even by
+ non C experts. By readable, two things are meant: first, the
+ source code should be pleasant to the eye, with sufficient
+ whitespace and newlines, to not look like a boring stack of
+ characters stuck to each other. Second, the source should be
+ _expressive_ enough about its goals. This convention contains
+ rules that can help the source focus on its purpose, not on a
+ particular implementation.
+
+
+ - "Paper is the _ultimate_ debugger" (Myself)
+
+ There is nothing like sheets of paper (and a large floor) to help
+ you understand the design of a library you're new to, or to debug
+ it. The formatting style presented here is targeted at printing.
+ For example, it is more than highly recommended to never produce a
+ source line that is wider than 78 columns. More on this below.
+
+
+1. Naming:
+
+ a. Components:
+
+ A unit of the library is called a 'component'. Each component has
+ at least an interface, and often a body. The library comes in two
+ language flavors, C and Pascal. A C component is defined by two
+ files, one '.h' header and one '.c' body, while a Pascal component
+ is contained in a single '.pas' file.
+
+ All component source file names begin with the 'tt' prefix, with
+ the exception of the 'FreeType' component. For example, the file
+ component is implemented by the files 'ttfile.h', 'ttfile.c' and
+ 'ttfile.pas'. Only lowercase letters should be used, following the
+ 8+3 naming convention to allow compilation under DOS.
+
+ In the C version, a single component can have multiple bodies. For
+ example, 'ttfile.c' provides stream i/o through standard ANSI libc
+ calls, while 'ttfile2.c' implements the same thing using one Unix
+ memory-mapping API.
+
+ The FreeType component is an interface-only component.
+
+
+ b. Long and expressive labels:
+
+ Never hesitate to use long labels for your types, variables, etc.!
+ Except maybe for things like very trivial types, the longest is the
+ best, as it increases the source's _expressiveness_. Never forget
+ that the role of a label is to express the 'function' of the entity
+ it represents, not its implementation!
+
+ NOTE: Hungarian notation is NOT expressive, as it sticks the
+ 'type' of a variable to its name. A label like 'usFoo'
+ rarely tells the use of the variable it represents.
+
+ And the state of a variable (global, static, dynamic)
+ isn't helpful anymore.
+
+ Avoid Hungarian Notation like the *plague*!
+
+
+ When forging a name with several nouns (e.g."number-of-points"), use
+ an uppercase letter for the first word of each one, like:
+
+ numberOfPoints
+
+ you are also welcomed to introduce underscores '_' in your labels,
+ especially when sticking large nouns together, as it 'airs' the code
+ greatly. E.g.:
+
+ 'numberOfPoints' or 'number_Of_Points'
+
+ 'IncredibleFunction' or 'Incredible_Function'
+
+ And finally, always put a capital letter after an underscore, except
+ in variable labels that are all lowercase:
+
+ 'number_of_points' is OK for a variable (_all_ lowercase label)
+
+ 'incredible_function' is NOT for a function!
+ ^ ^
+
+ 'Microsoft_windows' is a *shame*!
+ ^ ^
+
+ 'Microsoft_Windows' isn't really better, but at least its a correct
+ ^ ^ function label within this convention ;-)
+
+ c. Types:
+
+ All types that are defined for use by FreeType client applications
+ are defined in the FreeType component. All types defined there have
+ a label beginning in 'TT_'. For examples:
+
+ TT_Face, TT_F26Dot6, etc.
+
+ However, the library uses a lot more of internal types that are
+ defined in the Types, Tables, and Objs components ('tttypes' &
+ 'tttables' files).
+
+ By convention, all internal types, except the simplest ones like
+ integers, have their name beginning with a capital 'T', like in
+ 'TFoo'. Note that the first letter of 'foo' is also capitalized.
+ The corresponding pointer type uses a capital 'P' instead, i.e.
+ (TFoo*) is simply named 'PFoo'. Examples:
+
+ typedef struct _TTableDir
+ {
+ TT_Fixed version; /* should be 0x10000 */
+ UShort numTables; /* Tables number */
+
+ UShort searchRange; /* These parameters are only used */
+ UShort entrySelector; /* for a dichotomy search in the */
+ UShort rangeShift; /* directory. We ignore them. */
+ } TTableDir;
+
+ typedef TTableDir* PTableDir;
+
+ Note that we _always_ define a typedef for structures. The original
+ struct label starts with '_T'.
+
+ This convention is a famous one from the Pascal world.
+
+
+ Try to use C or Pascal types to the very least! Rely on internally
+ defined equivalent types instead. For example, not all compilers
+ agree on the sign of 'char', the size of 'int' is platform-specific,
+ etc.
+
+ There are equivalents to the most common types in the types
+ components, like 'Short', 'UShort', etc. Using the internal types
+ will guarantee that you won't need to replace every occurence of
+ 'short' or wathever when compiling on a weird platform or with a
+ weird compiler, and there are many more than you could think of...
+
+ d. Functions:
+
+ The name of a function should always begin with a capital letter, as
+ lowercase first letters are reserved for variables. The name of a
+ function should be, again, _expressive_! Never hesitate to put long
+ function names in your code: it will make the code much more
+ readable.
+
+ Expressive doesn't necessarily imply long though; for instance,
+ reading shorts from the file stream is performed using the following
+ functions defined in the File component:
+
+ Get_Byte Get_Short, Get_UShort, Get_Long, etc.
+
+ Which is somewhat more readable than:
+
+ cget, sget, usget, lget, etc.
+
+ e. Variables:
+
+ Variable names should always begin with a lowercase letter.
+ Lowercase first letters are reserved for variables in this
+ convention, as it has been already explained above. You're still
+ welcome to use long and expressive variable names.
+
+ Something like 'numP' can express a number of pixels, porks,
+ pancakes, and much more... Something like 'num_points' won't.
+
+ Today, we're still using short variable labels in some parts of
+ the library. We're working on removing them however...
+
+ As a side note, a field name is a variable name too. There are
+ exceptions to the first-lowercase-letter rule, but these are only
+ related to fields within the structure defined by the TrueType
+ specification (well, at least it _should_ be that way).
+
+
+2. Declarations & Statements:
+
+ a. Columning:
+
+ Try to align declarations and assignments in columns, when it proves
+ logical. For example (taken from ttraster.c):
+
+ struct _TProfile
+ {
+ Int flow; /* Profile orientation : Asc/Descending */
+ Int height; /* profile's height in scanlines */
+ Int start; /* profile's start scanline */
+ ULong offset; /* offset of profile's data in render pool */
+ PProfile link; /* link to next profile */
+ Int index; /* index of profile's entry in trace table */
+ Int count_lines; /* count of lines having to be drawn */
+ Int start_line; /* lines to be rendered before this profile */
+ PTraceRec trace; /* pointer to profile's current trace table */
+ };
+
+ instead of
+
+ struct _TProfile {
+ Int flow; /* Profile orientation : Asc/Descending */
+ Int height; /* profile's height in scanlines */
+ Int start; /* profile's start scanline */
+ ULong offset; /* offset of profile's data in render pool */
+ PProfile link; /* link to next profile */
+ Int index; /* index of profile's entry in trace table */
+ Int count_lines; /* count of lines having to be drawn */
+ Int start_line; /* lines to be rendered before this profile */
+ PTraceRec trace; /* pointer to profile's current trace table */
+ };
+
+ This comes from the fact that you're more interested by the field
+ and its function than by its type.
+
+ Or:
+
+ x = i + 1;
+ y += j;
+ min = 100;
+
+ instead of
+
+ x=i+1;
+ y+=j;
+ min=100;
+
+ And don't hesitate to separate blocks of declarations with newlines
+ to "distinguish" logical sections.
+
+ E.g., taken from an old source file, in the declarations of the CMap
+ loader:
+
+ long n, num_SH;
+ unsigned short u;
+ long off;
+ unsigned short l;
+ long num_Seg;
+ unsigned short* glArray;
+ long table_start;
+ int limit, i;
+
+ TCMapDir cmap_dir;
+ TCMapDirEntry entry_;
+ PCMapTable Plcmt;
+ PCMap2SubHeader Plcmsub;
+ PCMap4 Plcm4;
+ PCMap4Segment segments;
+
+ instead of
+
+ long n, num_SH;
+ unsigned short u;
+ long off;
+ unsigned short l;
+ long num_Seg;
+ unsigned short *glArray;
+ long table_start;
+ int limit, i;
+ TCMapDir cmap_dir;
+ TCMapDirEntry entry_;
+ PCMapTable Plcmt;
+ PCMap2SubHeader Plcmsub;
+ PCMap4 Plcm4;
+ PCMap4Segment segments;
+
+
+ b. Aliases and the 'with' clause:
+
+ The Pascal language comes with a very handy 'with' clause that is
+ often used when dealing with the fields of a same record. The
+ following Pascal source extract
+
+ with table[incredibly_long_index] do
+ begin
+ x := some_x;
+ y := some_y;
+ z := wathever_the_hell;
+ end;
+
+ is usually translated to:
+
+ table[incredibly_long_index].x = some_x;
+ table[incredibly_long_index].y = some_y;
+ table[incredibly_long_index].z = wathever_the_hell;
+
+ When a lot of fields are involved, it is usually helpful to define
+ an 'alias' for the record, like in:
+
+ alias = table + incredibly_long_index;
+
+ alias->x = some_x;
+ alias->y = some_y;
+ alias->z = wathever_the_hell;
+
+ which gives a clearer source code, and eases the compiler's
+ optimization work.
+
+ Though the use of aliases is currently not fixed in the current
+ library source, it is useful to follow one of these rules:
+
+ - avoid an alias with a stupid, or cryptic name, something like:
+
+ TFooRecord tfr;
+ ....
+ [lots of lines snipped]
+ ....
+
+ tfr = weird_table + weird_index;
+
+ ...
+
+ tfr->num = n;
+
+ it doesn't really help to guess what 'tfr' stands for several lines
+ after its declaration, even if it's an extreme contraction of one
+ particular type.
+
+ something like 'cur_record' or 'alias_cmap' is better. The current
+ source also uses a prefix of 'Pl' for such aliases (like Pointer to
+ Local alias), but this use is _not_ encouraged. If you want to use
+ prefixes, use 'loc_', 'cur_' or 'al_' at the very least, with a
+ descriptive name following.
+
+ Or simply use a local variable with a semi-expressive name:
+
+ {
+ THorizontalHeader hheader;
+ TVerticalHeader vheader;
+
+ hheader = instance->fontRes->horizontalHeader;
+ vheader = instance->fontRes->verticalHeader;
+
+ hheader->foo = bar;
+ vheader->foo = bar2;
+ ...
+ }
+
+ which is much better than:
+
+ {
+ THorizontalHeader Plhhead;
+ TVerticalHeader Plvhead;
+
+ Plhhead = instance->fontRes->horizontalHeader;
+ Plvhead = instance->fontRes->verticalHeader;
+
+ Plhhead->foo = bar;
+ Plvhead->foo = bar2;
+ ...
+ }
+
+
+3. Blocks:
+
+ Block separation is done with '{' and '}'. We do not use the K&R
+ convention which becomes only useful with an extensive use of tabs.
+ The '{' and its corresponding '}' should always be on the same
+ column. It makes it easier to separate a block from the rest of the
+ source, and it helps your _brain_ associates the accolades easily
+ (ask any Lisp programmer on the topic!).
+
+ Use 2 spaces for the next indentation level.
+
+ Never use tabs in your code, their widths may vary with editors and
+ systems.
+
+ Example:
+
+ if (condition_test) {
+ waow mamma;
+ I'm doing K&R format;
+ just like the Linux kernel;
+ } else {
+ This test failed poorly;
+ }
+
+ is _OUT_!
+
+
+ if (condition_test)
+ {
+ This code isn't stuck to the condition;
+ read it on paper, you'll find it more;
+ pleasant to the eye;
+ }
+ else
+ {
+ Of course, this is a matter of taste;
+ That's just the way it is in this convention;
+ and you should follow it to be homogenous with;
+ the rest of the FreeType code;
+ }
+
+ is _IN_!
+
+
+4. Macros:
+
+ Macros should be made of uppercase letters. When a macro label is
+ forged from several words, it is possible to only uppercasify the
+ first word, using an underscore to separate the nouns. This is used
+ in ttload.c, ttgload.c and ttfile.c with macros like :
+
+ ACCESS_Frame, GET_UShort, CUR_Stream
+
+ The role of the macros used throughout the engine is explained later
+ in this document.
+
+
+II. Design Conventions:
+
+1. Modularity and Components Layout:
+
+ The FreeType engine has been designed with portability in mind.
+ This implies the ability to compile and run it on a great variety
+ of systems and weird environments, unlike many packages where the
+ word strictly means 'run on a bunch of Unix-like systems'. We
+ have thus decided to stick to the following restrictions :
+
+ - The C version is written in ANSI C. The Pascal version compiles
+ and run under Turbo Pascal 5.0 and compatible compilers..
+
+ - The library, when compiled with gcc, doesn't produce any warning
+ with the '-ansi -pedantic' flags. Other compilers with better
+ checks may produce ANSI warnings that we'd be happy to now
+ about.
+
+ ( NOTE : It can of course be compiled by an 'average' C
+ compiler, and even by a C++ one.. )
+
+ - It only requires in its simplest form an ANSI libc to compile,
+ and no utilities other than a C pre-processor, compiler and
+ linker.
+
+ - It is written in a modular fashion. Each module is called a
+ 'component' and is made of two files in the C version ( an
+ interface '.h' and body '.c' ) and one file in the Pascal one.
+
+ - The very low-level components can be easily replaced by
+ system-specific ones that do not rely on the standard libc.
+ These components deal mainly with i/o, memory and mutex
+ operations.
+
+ - A client application must only include one interface file, named
+ 'freetype.h' or 'freetype.pas' to use the engine. All other
+ components should never be used or accessed by client
+ applications, and their name always begin with a 'tt' prefix :
+
+ ttmemory, ttobjs, ttinterp, ttapi, etc ..
+
+ - All configuration options are gathered in two files. One
+ contains the processor and OS specific configuration options,
+ while the other treats options that may be enabled or disabled
+ by the developper to test specific features ( like assertions,
+ debugging, etc .. ).
+
+
+ IMPORTANT NOTES :
+
+ These restrictions only apply to the core engine. The package
+ that comes with it contains several test programs sources that
+ are much less portable, even if they present a modular model
+ inspired from the engine's layout.
+
+ The components currently found in the 'c/lib' directory are :
+
+ -------- high-level interface -------------------
+
+ freetype.h high-level API, to be used by client applications
+
+ ttapi.c implementation of the api found in 'freetype.h'
+
+ -------- configuration --------------------------
+
+ ttconfig.h engine configuration options. These are commented
+ and switched by hand by the developper. See
+ section 2 below for more info.
+
+ ft-conf.h included by ttconfig.h, this file isn't part of the
+ 'c/lib' directory, but depends on the target
+ environment. See section 2 blow for more info.
+
+ ------- definitions -----------------------------
+
+ tttypes.h the engine's internal types definitions
+ tttables.h the TrueType tables definitions, per se the Specs
+ tttags.h the TrueType table tags definitions
+ tterror.h/c the error and debugging component
+
+ ttdebug.h/c only used by the debugger, should not be linked into
+ a release build.
+
+ ttcalc.h/c math component used to perform some computations
+ with an intermediate 64-bit precision.
+
+ ------- replaceable components --------------------
+
+ ttmemory.h/c memory component. This version uses the ANSI libc
+ but can be replaced easily by your own version.
+
+ ttfile.h/c stream i/o component. This version uses the ANSI
+ libc but can be replaced easily by your own
+ version. Compiled only if file memomry-mapping
+ isn't available on your system.
+
+ ttfile2.h/c Unix-specific file memory-mapping version of the
+ file component. It won't be compiled on other
+ systems. Usually results in much faster file
+ access (about 2x on my SCSI P166)
+
+ ttmutex.h/c generic mutex component. This version is dummy and
+ should only be used for a single-thread build. You
+ _need_ to replace this component's body with your
+ own implementation to be able to build a threaded
+ version of the engine.
+
+ ------- data management --------------------------
+
+ ttengine.h the engine instance record definition, root of
+ all engine data.
+
+ ttlists.h/c generic lists manager
+ ttcache.h/c generic cache manager
+
+ ttobjs.h/c the engine's object definitions and implementations
+ contains structure, constructors, destructors and
+ methods for the following objects :
+
+ face, instance, glyph, execution_context
+
+ ttload.h/c the TrueType tables loader.
+
+ ttgload.h/c the glyph loader. A component in itself, due to
+ the task's complexity..
+
+ ttindex.h/c the character mapping to glyph index conversion
+ routines. Implements functions defined in
+ 'freetype.h'
+
+ ttinterp.h/c the TrueType instructions interpreter. Probably the
+ nicest source in this engine. Apparently, many
+ have failed to produce a comparable one due to the
+ very poorly written specification !! It took me
+ three months of my spare time to get it working
+ correctly !! :-)
+
+ ttraster.h/c the engine's second best piece. This is the
+ scan-line converter. Performs gray-level rendering
+ (a.k.a. font-smoothing) as well as dropout-control.
+
+2. Configuration and Debugging :
+
+ As stated above, configuration depends on two files :
+
+ The environment configuration file : 'ft-conf.h'
+
+ This file contains the definitions of many configuration options
+ that are processor and OS-dependent. On Unix systems, this file
+ is generated automatically by the 'configure' script that comes
+ with the released package.
+
+ On other environments, it is located on one of the architecture
+ directories found in 'c/arch' (e.g. 'c/arch/os2/ft-conf.h').
+
+ The path to this file should be passed to the compiler when
+ compiling _each_ component. ( typically with an -I option ).
+
+ The engine configuration file : 'ttconfig.h'
+
+ This file contains many configuration options that the
+ developper can turn on or off to experiment some 'features' of
+ the engine that are not part of its 'simplest' form. The
+ options are commented.
+
+
+ Note that the makefiles are compiler-specific..
+
+
+ It is possible to enable the dumping of debugging information
+ by compiling the components with the DEBUG configuration constant.
+
+ The effect of this flag will be, for the following components :
+
+ ttload dumps information to stderr about the tables loaded
+
+ ttgload dumps information to stderr about the loaded glyph
+
+ ttmemory compile a version of the component which includes a
+ very simple memory block tracking scheme. This will
+ dump the number of leaked blocks when the engine is
+ closed ( i.e. when calling TT_FreeType_Done )
+
+ ttinterp will include an on-line simple text-mode debugger
+ which will be called whenever you hint a glyph.
+
+
+
+ If you want to port the engine to another environment, you will
+ need to :
+
+ - write a new 'ft-conf.h' for it. Just copy one of those available
+ and change the flags accordingly (they're all commented).
+
+ - replace the memory, file and mutex component with yours,
+ presenting the same interface and behaviour.
+
+ - Eventually add some code in ttapi.c to initialize system-specific
+ data with the engine.
+
+
+
+
+III. Usage conventions:
+
+
+1. Error Handling:
+
+ Error handling has been refined to allow reentrant builds of the
+ library, available only in the C version. We thus have now two
+ different conventions :
+
+ In Pascal :
+
+ A global error variable is used to report errors when they are
+ detected. All functions return a boolean that indicates success
+ or failure of the call. When an error occurs within a given
+ function, the latter must set the error variable and return false
+ (which means failure).
+
+ It is then possible to make several calls in a single 'if'
+ statement like in :
+
+ if not Perform_Action_1( parms_of_1 ) or
+ not Perform_Action_2( parms_of_2 ) or
+ not Perform_Action_3( parms_of_3 ) then goto Fail;
+
+ where execution will jump to the 'Fail' label whenever an error
+ occurs in the sequence of actions invoked in the condition.
+
+
+ In C :
+
+ global errors are forbidden in re-entrant builds. Each function
+ thus returns directly an error code. A return value of 0 means
+ that no error occured, while any other value indicates a failure
+ of any kind.
+
+ This convention is more constraining than the one used in the
+ Pascal source. The above Pascal statement should be translated
+ into the following C fragment :
+
+ rc = Perform_Action_1( parms_of_1 );
+ if (rc)
+ goto Fail;
+
+ rc = Perform_Action_2( parms_of_2 );
+ if (rc)
+ goto Fail;
+
+ rc = Perform_Action_3( parms_of_3 );
+ if (rc)
+ goto Fail;
+
+ which, while being equivalent, isn't as pleasantly readable.
+
+ One 'simple' way to match the original fragment would be to
+ write :
+
+ if ( (rc = Perform_Action_1( parms_of_1 )) ||
+ (rc = Perform_Action_2( parms_of_2 )) ||
+ (rc = Perform_Action_3( parms_of_3 )) )
+ goto Fail;
+
+ which is better but uses assignements within expressions, which
+ are always delicate to manipulate in C (the risk of writing '=='
+ exists, and would go unnoticed by a compilers). Moreover, the
+ assignements are a bit redundant, and don't express much things
+ about the actions performed (they only speak of the error
+ management issue).
+
+ That is why some macros have been defined for the mostly used
+ functions. Most of them relate to very low-level routines that
+ are called very often ( i/o, mutex and memory mainly ). Each
+ macro produces an implicit assignement to a variable called
+ 'error', and can be used instead as a simple function call. Eg :
+
+ if ( PERFORM_Action_1( parms_of_1 ) ||
+ PERFORM_Action_2( parms_of_2 ) ||
+ PERFORM_Action_3( parms_of_3 ) )
+ goto Fail;
+
+ with
+
+ #define PERFORM_Action_1(parms_1) (error = Perform_Action_1(parms_1))
+ #define PERFORM_Action_2(parms_1) (error = Perform_Action_2(parms_1))
+ #define PERFORM_Action_3(parms_1) (error = Perform_Action_3(parms_1))
+
+ defined at the beginning of the file.
+
+ There, the developper only needs to define a local 'error' variable
+ and use the macros directly in its code, without caring about the
+ actual error handling performed. Examples of such uses can be
+ found in 'ttload.c' and 'ttgload.c'. Moreover, the structure of
+ the source files remain very similar, even though the error
+ handling is very different.
+
+ This convention is very close to the use of exceptions in
+ languages like C++, Pascal, Java, etc.. where the developper
+ focuses on the actions to perform, and not every little error
+ checking..
+
+
+2. Font File I/O:
+
+ a. Streams:
+
+ The engine uses 'streams' to access the font files. A stream is a
+ structure defined in the File component containing information
+ used to access files through a system-specific i/o library.
+
+ The current implementation of the File component uses the ANSI libc
+ i/o functions. However, for the sake of embedding in light systems
+ and independence of a complete libc, it is possible to re-implement
+ the component for a specific system or OS, letting it use system
+ calls.
+
+ A stream is of type 'TStream' defined in the TTObjs interface.
+ The type is (void*) but actually points to a structure defined
+ within the File component.
+
+ A stream is created, managed and closed through the interface of
+ the File component. Several implementations of the same
+ component can co-exist, each taking advantage of specific system
+ features (the'ttfile2.c' uses memory-mapped files for instance)
+ as long as it respects the interface.
+
+ b. Frames:
+
+ TrueType is tied to the big-endian format, which implies that
+ reading shorts or longs from the font file may need conversions
+ depending on the target processor. To be able to easily detect
+ read errors and allow simple conversion calls or macros, the
+ engine is able to access a font file using 'frames'.
+
+ A frame is simply a sequence of successive bytes taken from the
+ input file at the current position. A frame is pre-loaded in
+ memory by a 'TT_Access_Frame' call of the File component.
+
+ It is then possible to read all sizes of data through the Get_xxx
+ functions, like Get_Byte, Get_Short, Get_UShort, etc.
+
+ When all important data is read, the frame can be released by a
+ call to 'TT_Forget_Frame'.
+
+ The benefits of frames are various:
+
+ Consider these two approaches at extracting values:
+
+ if ( (error = Read_Short( &var1 )) ||
+ (error = Read_Long ( &var2 )) ||
+ (error = Read_Long ( &var3 )) ||
+ (error = Read_Short( &var4 )) )
+
+ return FAILURE;
+
+ and
+
+ if ( (error = TT_Access_Frame( 16L )) ) /* Read 16 next bytes */
+ return error; /* The Frame could not be read */
+
+ var1 = Get_Short(); /* extract values from the frame */
+ var2 = Get_Long();
+ var3 = Get_Long();
+ var4 = Get_Short();
+
+ TT_Forget_Frame(); /* release the frame */
+
+ In the first case, there are four error assignements with
+ four checks of the file read. This increases un-necessarily
+ the size of the generated code. Moreover, you must be sure
+ that var1 and var4 are short variables, and var2/var3 long
+ ones, if you want to avoid bugs and/or compiler warnings.
+
+ In the second case, you perform only one check for the read, and
+ exit immediately on failure. Then the values are extracted from
+ the frame, as the result of function calls. This means that you
+ can use automatic type conversion; there is no problem if var1
+ and var4 are longs, unlike previously.
+
+ On big-endian machines, the Get_xxx functions could also be
+ simple macros that merely peek the values directly from the
+ frame, which speeds and simplifies the generated code!
+
+ And finally, frames are ideal when you're using memory-mapped
+ files, as the frame is not really 'pre-loaded' and never uses any
+ 'heap' space.
+
+ IMPORTANT You CANNOT nest several frame accesses. There is
+ only one available at a time for a specific
+ instance.
+
+ It is also the programmer's responsablity to never
+ extract more data than was pre-loaded in the frame!
+ (But you usually know how many values you want to
+ extract from the file before doing so).
+
+
+3. Memory Management:
+
+ The library now uses a component which interface looks like a lot
+ malloc/free. It defines only two functions :
+
+
+ * Alloc
+
+ To be used like malloc, except that it returns an error code, not
+ an address. Its arguments are the size of the requested block
+ and the address of the target pointer to the 'fresh' block. An
+ error code is returned in case of failure (and this will also set
+ the target pointer to NULL), 0 in case success.
+
+ Alloc should always respect the following rules :
+
+ - requesting a block of size 0 should set the target pointer to
+ NULL and return no error code (i.e. return 0)
+
+ - the returned block is always zeroed. This is an important
+ assumption of other parts of the library.
+
+ If you wish to replace the memory component with your own, please
+ respect this behaviour, or your engine won't work correctly.
+
+
+ * Free
+
+ As you may have already guessed, Free is Alloc's counterpart. It
+ takes as argument the _target pointer's address_ !! You should
+ _never_ pass the block's address directly, i.e. the pointer, to
+ Free.
+
+ Free should always respect the following rules :
+
+ - calling it with a NULL argument, or the address of a NULL
+ pointer is valid, and should return success.
+
+ - the pointer is always set to NULL after the block's
+ deallocation. This is also an important assumption of many
+ other parts of the library.
+
+ If you wish to replace the memory component with your own, please
+ respect this behaviour, or your engine won't work correctly.
+
+
+ As the pointers addresses needed as arguments are typed 'void**',
+ the component's interface also provides in the C version some
+ macros to help use them more easily, these are :
+
+ MEM_Alloc a version of Alloc that casts the argument pointer
+ to (void**)
+
+ ALLOC same as MEM_Alloc, but with an assignement to a
+ variable called 'error'. See 'error handling'
+ above for more info on this.
+
+ FREE a version of Free that casts the argument pointer
+ to (void**). There is currently no error handling
+ by with this macro.
+
+ MEM_Set an alias for 'memset', which can be easily changed
+ to anything else if you wish to use a different
+ memory manager than the functions provided by the
+ ANSI libc
+
+ MEM_Copy an alias of 'memcpy' or 'bcopy' used to move blocks
+ of memory. You may change it to something
+ different if you wish to use something else that
+ your standard libc
+
+
+4. Support for threaded environments:
+
+ Support for threaded environments have been added to the C
+ sources, and only to these. It is now theorically possible to
+ build three distinct versions of the library :
+
+ single-thread build :
+
+ The default build. This one doesn't known about different
+ threads. Hence, no code is generated to perform coherent data
+ sharing and locking.
+
+ thread-safe build :
+
+ With this build, several threads can use the library at the
+ same time. However, some key components can only be used by
+ one single thread at a time, and use a mutex to synchronize
+ access to their functions. They are mainly the file, raster
+ and interpreter components.
+
+ re-entrant build :
+
+ A re-entrant version is able to perform certain actions in
+ parallel that a thread-safe one cannot. This includes
+ accessing file(s) in parallel, interpreting different
+ instruction streams in parallel, or even scan-line converting
+ distinct glyphs at the same time.
+
+ Note that most of the latest changes in the engine are making the
+ distinction between the thread-safe and re-entrant builds thinner
+ than ever. The only remaining problem being the raster component.
+
+ ***** RELEASE NOTE *********************************************
+
+ Note also that the threaded build is not operational if you read
+ this with FreeType 1.0.
+
+ ****************************************************************
+
+ There is a ttmutex component that presents a generic interface to
+ mutex operations. It should be re-implemented for each platform.
+
+
+
diff --git a/xc/extras/FreeType/docs/credits b/xc/extras/FreeType/docs/credits
new file mode 100644
index 000000000..2a47fefa9
--- /dev/null
+++ b/xc/extras/FreeType/docs/credits
@@ -0,0 +1,46 @@
+
+NOTE: This list is far from being complete. Please mail, if you want
+ to be included.
+
+
+David TURNER (turner@enst.fr)
+
+ Main engine design and coding. Pascal source maintainer.
+
+
+Robert WILHELM (robert@physiol.med.tu-muenchen.de)
+
+ Web, FTP and CVS wizard & administrator. C source maintainer.
+ Incredible bug and spell fixer!
+
+
+Werner LEMBERG (wl@gnu.org)
+
+ Internationalization and CJK guru. ttf2pk author.
+
+
+Mark LEISHER (mleisher@crl.nmsu.edu)
+
+ Internationalization. X11 font server prototype author.
+ ttf2bdf author.
+
+
+Pavel KANKOVSKY (peak@kerberos.troja.mff.cuni.cz)
+
+ Logo, Internationalization, humor, and remarkable bug hunter!
+
+
+Erwin DIETERICH (erwin.dieterich.ed@bayer-ag.de)
+
+ *real* internationalization :-) Author of the ftxerr18 and gettext
+ support.
+
+
+Michal NECASEK (mike@mendelu.cz)
+
+ Author and maintainer of the OS/2 font driver based on FreeType.
+
+.....
+
+
+and the many that I'm forgetting there and deserve at least one line :-)
diff --git a/xc/extras/FreeType/docs/errstr.txt b/xc/extras/FreeType/docs/errstr.txt
new file mode 100644
index 000000000..c27dc474b
--- /dev/null
+++ b/xc/extras/FreeType/docs/errstr.txt
@@ -0,0 +1,73 @@
+Using ftxerr18
+==============
+
+21. 1. 1998
+Erwin Dieterich
+
+
+If you don't like error messages containing error codes like this:
+
+ test> ftlint 24 furiosot.ttf
+ furiosot.ttf: Could not find or open file.
+ Error code = 0x0087.
+
+and prefer something more informative, like this:
+
+ test> ftlint 24 furiosot.ttf
+ furiosot.ttf: Could not find or open file.
+ FreeType error message: OS/2 table missing.
+
+then read on. This information could be helpful to you. If you
+don't care, you can read on anyway.
+
+The core engine of FreeType has defined about 50 different error
+codes. Nearly all FreeType functions are able to return an
+intelligible error code in case something goes wrong. If you can't
+memorize the error codes, you can look them up in apiref.txt.
+However, if you are writing a program that is intended for "normal"
+users (e.g. a font lister) you should give those users more than
+just an integer or hex number. Ftxerr18 (located in lib/extend)
+offers the possibility to translate a FreeType error code into a
+string describing the error with one function call. Ftxerr18 is
+fully internationalized on Unix computers. So if your environment
+variables are set accordingly, ftxerr18 can return error strings in
+your language (assuming it is supported). See i18n.txt on how to
+use national language support (NLS), on the languages that are
+supported now, and on how to disable NLS. IF NLS is disabled,
+ftxerr18 contains no operating system specific components.
+
+Ftxerr18 offers only one function:
+
+ char* TT_ErrToString18( int error )
+
+It returns a pointer to a string describing the error that occurred.
+A simple example on how to use ftxerr18, extending the code given in
+apiref.txt on TT_Open_Face():
+
+ error = TT_Open_Face( engine, "/var/fonts/wingding.ttf", &face );
+ if ( error )
+ {
+ fprintf( stderr, "Could not open face.\n" );
+ fprintf( stderr, "Reason: %s\n", TT_ErrToString18( error ) );
+ }
+
+Note that in this example no NLS has been used for the strings.
+With NLS the code would be written as:
+
+ error = TT_Open_Face( engine, "/var/fonts/wingding.ttf", &face );
+ if ( error )
+ {
+ fprintf( stderr, gettext ("Could not open face.\n" ) );
+ fprintf( stderr, gettext( "Reason: %s\n" ),
+ TT_ErrToString18( error ) );
+ }
+
+See i18n.txt for more information on NLS.
+
+If you have any questions or comments regarding this short
+introduction to an even shorter function, feel free to email me at
+
+ Erwin.Dieterich.ED@Bayer-AG.de
+
+
+--- END ---
diff --git a/xc/extras/FreeType/docs/freetype.lsm b/xc/extras/FreeType/docs/freetype.lsm
new file mode 100644
index 000000000..1d550cc94
--- /dev/null
+++ b/xc/extras/FreeType/docs/freetype.lsm
@@ -0,0 +1,16 @@
+Begin3
+Title: freetype
+Version: 1.1
+Entered-date: 01MAY98
+Description: truetype font rasterizer
+Keywords: font truetype rasterizer
+Author: David Turner <turner@enst.fr>,
+ Werner Lemberg <wl@gnu.org>
+ Robert Wilhelm <robert@physiol.med.tu-muenchen.de>
+Maintained-by: Robert Wilhelm <robert@physiol.med.tu-muenchen.de>
+Primary-site: ftp://sunsite.unc.edu/pub/Linux/X11/fonts/
+Alternate-site:
+Original-site: ftp://ftp.freetype.org/pub/freetype
+Platforms: Linux, OS/2, MSDOS, Amiga OS, Unix
+Copying-policy: BSD
+End
diff --git a/xc/extras/FreeType/docs/glyphs.htm b/xc/extras/FreeType/docs/glyphs.htm
new file mode 100644
index 000000000..49634174a
--- /dev/null
+++ b/xc/extras/FreeType/docs/glyphs.htm
@@ -0,0 +1,1253 @@
+<html>
+<head>
+<title>An introduction to glyphs</title>
+<META name="description"
+ content="Glyphs in the FreeType engine">
+<META name="keywords"
+ content="FreeType TrueType library engine glyphs baseline bearing bounding box">
+</head>
+
+<body bgcolor="white">
+
+<center>
+ <font size="+2">Glyph Hell<p>
+
+ <font size="+1">An introduction to glyphs, as used and defined in
+ the FreeType engine:<p>
+
+ <font size="-1">version 1.0 (html version)<p>
+
+ David Turner - 14 Jan 98<p>
+</center>
+
+<hr><p>
+
+<font size="+2">Introduction:<p>
+
+<font size="+0">This article discusses in great detail the definition
+of glyph metrics, per se the TrueType specification, and the way they
+are managed and used by the FreeType engine. This information is
+crucial when it comes to rendering text strings, either in a
+conventional (i.e. roman) layout, or with vertical or right-to-left
+ones. Some aspects like glyph rotation and transformation are
+explained too.<p>
+
+Comments and corrections are highly welcomed, and can be sent to
+the <a href="mailto:freetype-devel@lists.lrz-muenchen.de">
+FreeType developers list</a>.<p>
+
+<hr><p>
+
+
+<font size="+2">I. An overview of font files<p>
+
+<font size="+0">In TrueType, a single font file is used to contain
+information related to classification, modeling and rendering of text
+using a given typeface. This data is located in various independent
+"tables", which can be sorted in four simple classes, as described
+below:<p>
+
+<ul>
+
+ <li><b><font size="+1">Face Data:</font></b><p>
+
+ We call <i>face data</i>, the amount of information related to a
+ given typeface, independently of any <i>particular</i> scaling,
+ transformation and/or glyph index. This usually means some
+ typeface-global metrics and attributes, like family and styles,
+ PANOSE number, typographic ascenders and descenders, as well as
+ some very TT-specific items like the font 'programs' found in the
+ <i>fpgm</i> and <i>prep</i> tables, the <i>gasp</i> table,
+ character mappings, etc.<p>
+
+ In FreeType, a <i>face object</i> is used to model a font file's
+ face data.<p>
+
+ <li><b><font size="+1">Instance Data:</font></b><p>
+
+ We call <i>instance</i> a given pointsize/transformation, at a
+ given device resolution (e.g. 8pt at 96x96 dpi, or 12pt at
+ 300x600 dpi, etc). Some tables found in the font files are used
+ to produce instance-specific data, like the <i>cvt</i> table, or
+ the <i>prep</i> program. Though they're often part of the face
+ data, their processing results in information called <i>instance
+ data</i>.<p>
+
+ In FreeType, it is modeled through an <i>instance object</i>,
+ which is always created from an existing face object.<p>
+
+ <li><b><font size="+1">Glyph Data:</font></b><p>
+
+ We call <i>glyph data</i> the piece of information related to
+ specific glyphs. This includes the following things that are
+ described in more details in the next sections:<p>
+
+ <ul>
+
+ <li>the glyph's vectorial representation, also called its
+ <i>outline</i>.<p>
+
+ <li>various metrics, like the glyph's <i>bounding box</i>, its
+ <i>bearings</i> and <i>advance</i> values.<p>
+
+ <li>TrueType specifies a specific instruction <i>bytecode</i>,
+ used to associate each glyph with a small <i>program</i>,
+ called the <i>glyph code</i>. Its purpose is to grid-fit the
+ outline to any target instance, in order to produce excellent
+ output at "small" pixel sizes.
+
+ </ul><p>
+
+ The FreeType engine doesn't map each glyph to a single structure,
+ as this would waste memory for no good reason. Rather, a
+ <i>glyph object</i> is a <i>container</i>, created from any
+ active face, which can be used to load and/or process any font
+ glyph at any instance (or even no instance at all). Of course,
+ the glyph properties (outline, metrics, bitmaps, etc.) can be
+ extracted independently from an object once it has been loaded or
+ processed.<p>
+
+ <li><b><font size="+1">Text and Layout Data:</font></b><p>
+
+ Finally, there is a last class of data that doesn't really fit in
+ all others, and that can be called <i>text</i> data. It
+ comprises information related to the grouping of glyphs together
+ to form text. Simple examples are the <i>kerning</i> table,
+ which controls the spacing between adjacent glyphs, as well as
+ some of the extensions introduced in <i>OpenType</i> and
+ <i>GX</i> like <i>glyph substitution</i> (ligatures), <i>baseline
+ management</i>, <i>justification,</i> etc.<p>
+
+ This article focuses on the basic TrueType tables, and hence,
+ will only talk about kerning, as FreeType doesn't support
+ OpenType nor GX (yet).
+
+</ul><p>
+
+<hr><p>
+
+
+<font size="+2">II. Glyph Outlines:<p>
+
+<font size="+0">TrueType is a scalable font format: it is thus
+possible to render glyphs at any scale, and under any affine
+transform, from a single source representation. However, simply
+scaling vectorial shapes exhibits at small sizes (where "small"
+refers here to anything smaller than at least 150 pixels) a
+collection of un-harmonious artifacts, like widths and/or heights
+degradations.<p>
+
+Because of this, the format also provides a complete programming
+language used to design small programs associated to each glyph.
+Their role is to align the point positions on the pixel grid after
+the scaling. This operation is hence called "grid-fitting", or
+even "hinting".<p>
+
+<ol>
+
+ <li><font size="+1">Vectorial representation</font><p>
+
+ The source format of outlines is a collection of closed paths
+ called "contours". Each contour delimits an outer or inner
+ region of the glyph, and can be made of either line segments
+ and/or second-order beziers (also called "conic beziers" or
+ "quadratics").<p>
+
+ It is described internally as a series of successive points,
+ with each point having an associated flag indicating whether it
+ is "on" or "off" the curve. These rules are applied to
+ decompose the contour:<p>
+
+ <ul>
+
+ <li>two successive "on" points indicate a line segment
+ joining them.<p>
+
+ <li>one "off" point amidst two "on" points indicates a conic
+ bezier, the "off" point being the control point, and the "on"
+ ones the start and end points.<p>
+
+ <li>finally, two successive "off" points forces the
+ rasterizer to create (only during bitmap rendering) a virtual
+ "on" point amidst them, at their exact middle. This greatly
+ facilitates the definition of successive Bezier arcs.
+
+ </ul><p>
+
+<pre>
+ * # on
+ * off
+ __---__
+ #-__ _-- -_
+ --__ _- -
+ --__ # \
+ --__ #
+ -#
+ Two "on" points
+ Two "on" points and one "off" point
+ between them
+
+
+
+ *
+ # __ Two "on" points with two "off"
+ \ - - points between them. The point
+ \ / \ marked '0' is the middle of the
+ - 0 \ "off" points, and is a 'virtual'
+ -_ _- # "on" point where the curve passes.
+ -- It does not appear in the point
+ list.
+ *
+</pre>
+
+ <img src="image/emsquare.gif" align="right" width=333 height=274>
+
+ Each glyph's original outline points are located on a grid of
+ indivisible units. The points are stored in the font file as
+ 16-bit integer grid coordinates, with the grid origin's being
+ at (0,0); they thus range from -16384 to 16383.<p>
+
+ In creating the glyph outlines, a type designer uses an
+ imaginary square called the "EM square". Typically, the EM
+ square encloses the capital "M" and most other letters of a
+ typical roman alphabet. The square's size, i.e., the number of
+ grid units on its sides, is very important for two reasons:<p>
+
+ <ul>
+
+ <li>it is the reference used to scale the outlines to a given
+ instance. For example, a size of 12pt at 300x300dpi
+ corresponds to 12*300/72 = 50 pixels. This is the size the
+ EM square would appear on the output device if it was
+ rendered directly. In other words, scaling from grid units
+ to pixels uses the formula:<p>
+
+ <center>
+ <font size="+1">
+ pixel_size = point_size * resolution / 72
+ </font>
+ </center><p>
+
+ <center>
+ <font size="+1">
+ pixel_coordinate = grid_coordinate * pixel_size / EM_size
+ </font>
+ </center><p>
+
+ <li>the greater the EM size is, the larger resolution the
+ designer can use when digitizing outlines. For example, in
+ the extreme example of an EM size of 4 units, there are only
+ 25 point positions available within the EM square which is
+ clearly not enough. Typical TrueType fonts use an EM size of
+ 2048 units (note: with Type 1 PostScript fonts, the EM size
+ is fixed to 1000 grid units. However, point coordinates can
+ be expressed in floating values).
+
+ </ul><p>
+
+ Note that glyphs can freely extend beyond the EM square if the
+ font designer wants this. The EM is used as a convenience, and
+ is a valuable convenience from traditional typography.<p>
+
+ <center>
+ grid units are very often called "font units" or "EM units".
+ </center><p>
+
+ <i><font size="+1">IMPORTANT NOTE:</font></i><p>
+
+ Under FreeType, <i>scaled</i> pixel positions are all expressed
+ in the 26.6 fixed float format (made of a 26-bit integer
+ mantissa, and a 6-bit fractional part). In other words, all
+ coordinates are multiplied by 64. The grid lines along the
+ integer pixel positions, are multiples of 64, like (0,0),
+ (64,0), (0,64), (128,128), etc., while the pixel centers lie at
+ middle coordinates (32 modulo 64) like (32,32), (96,32),
+ etc.<p>
+
+ <li><font size="+1">Hinting and Bitmap rendering</font><p>
+
+ As said before, simply scaling outlines to a specific instance
+ always creates undesirable artifacts, like stems of different
+ widths or heights in letters like "E" or "H". Proper glyph
+ rendering needs that the scaled points are aligned along the
+ pixel grid (hence the name "grid-fitting"), and that important
+ widths and heights are respected throughout the whole font (for
+ example, it is very often desirable that the "I" and the "T"
+ have their central vertical line of the same pixel width).<p>
+
+ Type 1 PostScript font files include with each glyph a small
+ series of distances called "hints", which are later used by the
+ type manager to try grid-fitting the outlines as cleverly as
+ possible. In one hand, it has the consequence that upgrading
+ your font engine can enhance the visual aspects of all fonts of
+ your system; on the other hand, the quality of even the best
+ version of Adobe's Type Manager isn't always very pleasing at
+ small sizes (notwithstanding font smoothing).<p>
+
+ TrueType takes a radically different approach: each glyph has
+ an associated "program", designed in a specific geometrical
+ language, which is used to align explicitly each outline point
+ to the pixel grid, preserving important distances and metrics.
+ A stack-based low-level bytecode is used to store it in the
+ font file, and is interpreted later when rendering the scaled
+ glyphs.<p>
+
+ This means that even very complex glyphs can be rendered
+ perfectly at very small sizes, as long as the corresponding
+ glyph code is designed correctly. Moreover, a glyph can lose
+ some of its details, like serifs, at small sizes to become more
+ readable, because the bytecode provides interesting
+ features.<p>
+
+ However, this also have the sad implication that an
+ ill-designed glyph code will always render junk, whatever the
+ font engine's version, and that it's very difficult to produce
+ quality glyph code. There are about 200 TrueType opcodes, and
+ no known "high-level language" for it. Most type artists
+ aren't programmers at all and the only tools able to produce
+ quality code from vectorial representation have been
+ distributed to only a few font foundries, while tools available
+ to the public, e.g. Fontographer, are usually expensive though
+ generating average to mediocre glyph code.<p>
+
+ All this explains why an enormous number of broken or ugly
+ "free" fonts have appeared on the TrueType scene, and that this
+ format is now mistakenly thought as "crap" by many people.
+ Funnily, these are often the same who stare at the "beauty" of
+ the classic "Times New Roman" and "Arial/Helvetica" at 8
+ points.<p>
+
+ Once a glyph's code has been executed, the scan-line converter
+ converts the fitted outline into a bitmap (or a pixmap with
+ font-smoothing).
+
+</ol><p>
+
+
+<hr><p>
+
+<font size="+2">III. Glyph metrics</font><p>
+
+<ol>
+
+ <li><font size="+1">Baseline, Pens and Layouts:</font><p>
+
+ The baseline is an imaginary line that is used to "guide"
+ glyphs when rendering text. It can be horizontal (e.g. roman,
+ cyrillic,arabic, etc.) or vertical (e.g. chinese, japanese,
+ korean, etc). Moreover, to render text, a virtual point,
+ located on the baseline, called the "pen position", is used to
+ locate glyphs.<p>
+
+ Each layout uses a different convention for glyph placement:<p>
+
+ <ul>
+
+ <li>with horizontal layout, glyphs simply "rest" on the
+ baseline. Text is rendered by incrementing the pen position,
+ either to the right or to the left.<p>
+
+ <center>
+ <img src="image/baseline.gif" width=458 height=179><p>
+ </center>
+
+ the distance between two successive pen positions is
+ glyph-specific and is called the "advance width". Note that
+ its value is _always_ positive, even for right-to-left
+ oriented alphabets, like arabic. This introduces some
+ differences in the way text is rendered.
+
+ <hr>
+ IMPORTANT NOTE:<p>
+
+ the pen position is always placed on the baseline in
+ TrueType, unlike the convention used by some graphics
+ systems, like Windows, to always put the pen above the line,
+ at the ascender's position.
+ <hr><p>
+
+ with a vertical layout, glyphs are centered around the baseline:<p>
+
+ <center>
+ <img src="image/baselin2.gif" width=162 height=275>
+ </center>
+
+ </ul><p>
+
+ <li><font size="+1">Typographic metrics and bounding boxes:</font><p>
+
+ A various number of face metrics are defined for all glyphs in
+ a given font. Three of them have a rather curious status in
+ the TrueType specification; they only apply to horizontal
+ layouts:<p>
+
+ <ul>
+
+ <li>the ascent:<p>
+
+ this is the distance from the baseline to the highest/upper
+ grid coordinate used to place an outline point. It is a
+ positive value, due to the grid's orientation with the Y
+ axis upwards.<p>
+
+ <li>the descent:<p>
+
+ the distance from the baseline to the lowest grid
+ coordinate used to place an outline point. This is a
+ negative value, due to the grid's orientation.<p>
+
+ <li>the linegap:<p>
+
+ the distance that must be placed between two lines of text.
+ The baseline-to-baseline distance should be computed as:<p>
+
+ <center>
+ "ascent - descent + linegap"
+ </center><p>
+
+ if you use the typographic values.
+
+ </ul><p>
+
+ The problem with these metrics is that they appear three times
+ in a single font file, each version having a slightly different
+ meaning:<p>
+
+ <ol>
+
+ <li>the font's horizontal header provides the ascent, descent
+ and linegap fields, which are used to express the designer's
+ intents, rather than the real values that may be computed
+ from all glyphs in the outline. These are used by the
+ Macintosh font engine to perform font mapping (i.e. font
+ substitution).<p>
+
+ <li>the OS/2 table provides the <i>usWinAscent</i> and
+ <i>usWinDescent</i> fields. These values are computed for
+ glyphs of the Windows ANSI charset only, which means that
+ they're wrong for any other glyph. Note that
+ <i>usWinDescent</i> is always positive (i.e. looks like
+ "-descent")<p>
+
+ <li>the OS/2 table provides the <i>typoAscender</i>,
+ <i>typoDescender</i> and <i>typoLinegap</i> values, which
+ hopefully concern the whole font file. These are the correct
+ system-independent values!
+
+ </ol><p>
+
+ All metrics are expressed in font units. If you want to use
+ any of the two first versions of these metrics, the TrueType
+ specification contains some considerations and computing tips
+ that might help you.<p>
+
+ Other, simpler metrics are:<p>
+
+ <ul>
+
+ <li>the glyph's bounding box, also called "bbox":<p>
+
+ this is an imaginary box that encloses any glyph as tightly
+ as possible. It is represented by four fields, namely
+ <i>xMin</i>, <i>yMin</i>, <i>xMax</i>, and <i>yMax</i>,
+ that can be computed for any outline. Their values can be
+ in font units (if measured in the original outline) or in
+ 26.6 pixel units (when measured on scaled outlines).<p>
+
+ Note that if it wasn't for grid-fitting, you wouldn't need
+ to know a box's complete values, but only its dimensions to
+ know how big is a glyph outline/bitmap. However, correct
+ rendering of hinted glyphs needs the preservation of
+ important grid alignment on each glyph
+ translation/placement on the baseline. which is why
+ FreeType returns always the complete glyph outline.<p>
+
+ Note also that the font's header contains a global font
+ bbox in font units which should enclose all glyphs in a
+ font. This can be used to pre-compute the maximum
+ dimensions of any glyph at a given instance.<p>
+
+ <li>the internal leading:<p>
+
+ this concept comes directly from the world of traditional
+ typography. It represents the amount of space within the
+ "leading" which is reserved for glyph features that lay
+ outside of the EM square (like accentuation). It usually
+ can be computed as:<p>
+
+ <center>
+ internal leading = ascent - descent - EM_size
+ </center><p>
+
+ <li>the external leading:<p>
+
+ this is another name for the line gap.
+
+ </ul><p>
+
+ <li><font size="+1">Bearings and Advances:</font><p>
+
+ Each glyph has also distances called "bearings" and "advances".
+ Their definition is constant, but their values depend on the
+ layout, as the same glyph can be used to render text either
+ horizontally or vertically:<p>
+
+ <ol>
+ <li>the left side bearing: a.k.a. <i>bearingX</i><p>
+
+ this is the horizontal distance from the current pen
+ position to the glyph's left bbox edge. It is positive for
+ horizontal layouts, and most generally negative for
+ vertical one.<p>
+
+ <li>the top side bearing: a.k.a. <i>bearingY</i><p>
+
+ this is the vertical distance from the baseline to the top
+ of the glyph's bbox. It is usually positive for horizontal
+ layouts, and negative for vertical ones<p>
+
+ <li>the advance width: a.k.a. <i>advanceX</i><p>
+
+ is the horizontal distance the pen position must be
+ incremented (for left-to-right writing) or decremented (for
+ right-to-left writing) by after each glyph is rendered when
+ processing text. It is always positive for horizontal
+ layouts, and null for vertical ones.<p>
+
+ <li>the advance height: a.k.a. <i>advanceY</i><p>
+
+ is the vertical distance the pen position must be
+ decremented by after each glyph is rendered. It is always
+ null for horizontal layouts, and positive for vertical
+ layouts.<p>
+
+ <li>the glyph width:<p>
+
+ this is simply the glyph's horizontal extent. More simply
+ it is (bbox.xMax-bbox.xMin) for unscaled font coordinates.
+ For scaled glyphs, its computation requests specific care,
+ described in the grid-fitting chapter below.<p>
+
+ <li>the glyph height:<p>
+
+ this is simply the glyph's vertical extent. More simply,
+ it is (bbox.yMax-bbox.yMin) for unscaled font coordinates.
+ For scaled glyphs, its computation requests specific care,
+ described in the grid-fitting chapter below.<p>
+
+ <li>the right side bearing:<p>
+
+ is only used for horizontal layouts to describe the
+ distance from the bbox's right edge to the advance width.
+ It is in most cases a non-negative number. The FreeType
+ doesn't provide this metric directly, as it isn't really
+ part of the TrueType specification. It can be computed
+ simply as:<p>
+
+ <center>
+ advance_width - left_side_bearing - (xMax-xMin)
+ </center>
+
+ </ol><p>
+
+ <center>
+ <img src="image/metrics.gif" width=388 height=253><p>
+
+ <img src="image/metrics2.gif" width=294 height=278>
+ </center><p>
+
+ Finally, if you're used to Windows and OS/2 "ABC widths", the
+ following relations apply:
+
+<pre>
+ A = left side bearing
+ B = width
+ C = right side bearing
+
+ A+B+C = advance width
+</pre>
+
+ <li><font size="+1">The effects of Grid-fitting:</font><p>
+
+ All these metrics are stored in font units in the font file.
+ They must be scaled and grid-fitted properly to be used at a
+ specific instance. This implies several things:<p>
+
+ <ul>
+
+ <li>first, a glyph program not only aligns the outline along
+ the grid pixel, it also processes the left side bearing and
+ the advance width. Other grid-fitted metrics are usually
+ available in optional TrueType tables, if you need them.<p>
+
+ <li>a glyph program may decide to extend or stretch any of
+ these two metrics if it feels a need for it. This means that
+ you cannot assume that the fitted metrics are simply equal to
+ the scaled one plus or minus a liberal distance < 1 pixel
+ (i.e., under 64 fractional pixel units). For example, it is
+ often necessary to stretch the letter "m" horizontally at
+ small pixel sizes to make all feet visible, while the same
+ glyph can be perfectly "square" at larger sizes.<p>
+
+ <li>querying the fitted metrics of all glyphs at a given
+ instance is very slow, as it needs to load and process each
+ glyph independently. For this reasons, some optional
+ TrueType tables are defined in the specification, containing
+ pre-computed metrics for specific instances (the most
+ commonly used, like 8, 9, 10, 11, 12 and 14 points at 96 dpi,
+ for example). These tables aren't always present in a
+ TrueType font.<p>
+
+ If you don't need the exact fitted value, it's much faster to
+ query the metrics in font units, then scale them to the
+ instance's dimensions.
+
+ </ul><p>
+
+ <hr>
+ <i><font size="+1">IMPORTANT NOTE:</font></i><p>
+
+ Another very important consequence of grid-fitting is the fact
+ that moving a fitted outline by a non-integer pixel distance
+ will simply ruin the hinter's work, as alignments won't be
+ preserved. The translated glyph will then look "ugly" when
+ converted to a bitmap!<p>
+
+ In other words, each time you want to translate a fitted glyph
+ outline, you must take care of only using integer pixel
+ distances (the x and y offsets must be multiples of 64, which
+ equals to 1.0 in the 26.6 fixed float format).
+
+ If you don't care about grid-fitting (typically when rendering
+ rotated text), you can use any offset you want and use
+ sub-pixel glyph placement.
+ <hr><p>
+
+ </ol>
+
+<hr><p>
+
+
+<font size="+2">IV. Text processing<p>
+
+<font size="+0">This section demonstrates how to use the concepts
+previously defined to render text, whatever the layout you use.<p>
+
+<ol>
+
+ <li><font size="+1"><li>Writing simple text strings:</font><p>
+
+ We'll start by generating a simple string with a roman
+ alphabet. The layout is thus horizontal, left to right.<p>
+
+ For now, we'll assume all glyphs are rendered in a single
+ target bitmap. The case of generating individual glyph
+ bitmaps, then placing them on demand on a device is presented
+ in a later chapter of this section (see below).<p>
+
+ Rendering the string needs to place each glyph on the baseline;
+ this process looks like:<p>
+
+ <ol>
+
+ <li>place the pen to the cursor position. The pen is always
+ located on the baseline. These coordinates must be
+ grid-fitted (i.e., multiples of 64)!<p>
+
+<pre>
+ pen_x = cursor_x;
+ pen_y = cursor_y;
+</pre>
+
+ <li>load the glyph outline and its metrics. Using the flag
+ TTLOAD_DEFAULT will scale and hint the glyph:
+
+<pre>
+ TT_Load_Glyph( instance,
+ glyph,
+ glyph_index,
+ TTLOAD_DEFAULT );
+
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+ TT_Get_Glyph_Outline( glyph, &outline );
+</pre>
+
+ <li>The loader always places the glyph outline relative to
+ the imaginary pen position (0,0). You thus simply need to
+ translate the outline by the vector:
+
+<pre>
+ ( pen_x, pen_y )
+</pre>
+
+ to place it on its correct position, you can use the call
+
+<pre>
+ TT_Translate_Outline( outline, pen_x, pen_y );
+</pre>
+
+ <li>render the outline in the target bitmap, the glyph will
+ be surimposed on it with a binary "or" (FreeType never
+ creates glyph bitmaps by itself, it simply renders glyphs in
+ the arrays you pass to it. See the API reference for a
+ complete description of bitmaps and pixmaps).
+
+<pre>
+ TT_Get_Outline_Bitmap( outline, &target_bitmap );
+</pre>
+
+ <hr>
+ <i><font size="+1">IMPORTANT NOTE:</font></i><p>
+
+ If you don't want to access the outline in your code, you can
+ also use the API TT_Get_Glyph_Bitmap() which works the same
+ as the previous lines:
+
+<pre>
+ TT_Get_Glyph_Outline( glyph, &outline );
+ TT_Translate_Outline( outline, x_offset, y_offset );
+ TT_Get_Outline_Bitmap( outline, &target_bitmap );
+ TT_Translate_Outline( outline, -x_offset, -y_offset );
+</pre>
+
+ being equivalent to:
+
+<pre>
+ TT_Get_Glyph_Bitmap( glyph,
+ x_offset,
+ y_offset,
+ &target_bitmap );
+</pre>
+
+ <hr><p>
+
+ <li>now advance the pen to its next position. The advance
+ is always grid-fitted when the glyph was hinted:<p>
+
+<pre>
+ pen_x += metrics.advance;
+</pre>
+
+ the advance being grid-fitted, the pen position remains
+ aligned on the grid.<p>
+
+ <li>start over on item 2 until string completion. That's it!
+
+ </ol><p>
+
+ <li><font size="+1">Writing right-to-left and vertical text:</font><p>
+
+ Generating strings for different layouts is very similar. Here
+ are the most important differences:<p>
+
+ <ul>
+
+ <li>For right-to-left text (like Arabic):<p>
+
+ the main difference here is that, as the advance width and
+ left side bearings are oriented against the flow of text,
+ the pen position must be <i>decremented</i> by the advance
+ width, <i>before</i> placing and rendering the glyph.
+ Other than that, the rest is strictly similar.<p>
+
+ <li>for vertical text (like Chinese or Japanese):<p>
+
+ in this case, the baseline is vertical, which means that
+ the pen position must be shifted in the vertical direction.
+ You need the vertical glyph metrics to do that.<p>
+
+ <hr>
+ There is no way to do that now with FreeType. However, it
+ will be probably implemented with the help of an additional
+ glyph property. For example, calling a function like:
+
+<pre>
+ TT_Set_Glyph_Layout( glyph, TT_LAYOUT_VERTICAL );
+</pre>
+
+ will force the function TT_Get_Glyph_Metrics() to place the
+ vertical glyph metrics in the <i>bearingX</i>,
+ <i>bearingY</i> and <i>advance</i> metrics fields, instead
+ of the default horizontal ones. Another function will be
+ probably provided to return all glyph metrics at once
+ (horizontal and vertical).
+ <hr><p>
+
+ Once you get these, the rest of the process is very
+ similar. The glyph outline is placed relative to an
+ imaginary origin of (0,0), and you should translate it to
+ the pen position before rendering it.<p>
+
+ The big difference is that you must decrement pen_y, rather
+ than increment pen_x (this is for the TrueType convention
+ of Y oriented upwards).
+
+<pre>
+ pen_y -= metrics.advance;
+</pre>
+
+ </ul><p>
+
+ <li><font size="+1">Generating individual glyph bitmaps and using
+ them to render text:</font><p>
+
+ Loading each glyph when rendering text is slow, and it's much
+ more efficient to render each one in a standalone bitmap to
+ place it in a cache. Text can then be rendered fast by
+ applying simple blit operations on the target device.<p>
+
+ To be able to render text correctly with the bitmaps, you
+ must record and associate with them its fitted bearings and
+ advances. Hence the following process:<p>
+
+ <ol>
+
+ <li>Generate the bitmaps:<p>
+
+ <ul>
+
+ <li>load the glyph and get its metrics
+
+<pre>
+ TT_Load_Glyph( instance,
+ glyph,
+ glyph_index,
+ TTLOAD_DEFAULT );
+
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+</pre>
+
+ the bbox is always fitted when calling
+ TT_Get_Glyph_Metrics() on a hinted glyph. You can then
+ easily compute the glyph's dimension in pixels as:
+
+<pre>
+ width = (bbox.xMax - bbox.xMin) / 64;
+ height = (bbox.yMax - bbox.yMin) / 64;
+</pre>
+
+ NOTE 1:<br>
+ the fitted boudning box always contains all the dropouts
+ that may be produced by the scan-line converter. These
+ width and height are thus valid for all kinds of
+ glyphs).<p>
+
+ NOTE 2:<br>
+ If you want to compute the dimensions of a rotated
+ outline's bitmap, compute its bounding box with
+ TT_Get_Outline_BBox(), then grid-fit the bbox manually:
+
+<pre>
+ #define FLOOR(x) ((x) & -64)
+ #define CEILING(x) (((x)+63) & -64)
+
+ xMin = FLOOR(xMin);
+ yMin = FLOOR(yMin);
+ yMin = CEILING(xMax);
+ yMax = CEILING(yMax);
+</pre>
+
+ then compute width and height as above.<p>
+
+ <li>create a bitmap of the given dimension, e.g.:
+
+<pre>
+ bitmap.width = width;
+ bitmap.cols = (width+7) & -8;
+ bitmap.rows = height;
+ bitmap.flow = TT_Flow_Up;
+ bitmap.size = bitmap.cols * bitmap.rows;
+ bitmap.buffer = malloc( bitmap.size );
+</pre>
+
+ <li>render the glyph into the bitmap.<p>
+
+ Don't forget to shift it by (-xMin, -yMin) to fit it in the
+ bitmap:
+
+<pre>
+ /* Note that the offsets must be grid-fitted to */
+ /* preserve hinting! */
+ TT_Get_Glyph_Bitmap( glyph,
+ &bitmap,
+ -bbox.xMin,
+ -bbox.yMin );
+</pre>
+
+ </ul>
+
+ <li>Store the bitmap with the following values:
+
+<pre>
+ bearingX / 64 = left side bearing in pixels
+ advance / 64 = advance width/height in pixels
+</pre>
+
+ When you cache is set up, you can them render text using a
+ scheme similar to the ones describe in 1. and 2., with the
+ exception that now, pen positions and metrics are expressed
+ in pixel values. Et voila!
+
+<pre>
+ pen_x = cursor_x;
+ pen_y = cursor_y;
+
+ while ( glyph_to_render )
+ {
+ access_cache( glyph_index, metrics, bitmap );
+
+ blit bitmap to position
+ ( pen_x + bearingX,
+ pen_y (+ bearingY depending on orientation ) );
+
+ pen_x += advance;
+ }
+</pre>
+
+ </ol>
+
+ <li><font size="+1">Device-independent text rendering:</font><p>
+
+ The previous rendering processes all aligned glyphs on the
+ baseline according to metrics fitted for the display's
+ distance. In some cases, the display isn't the final output,
+ and placing the glyphs in a device-independent way is more
+ important than anything.<p>
+
+ A typical case is a word processor which displays text as it
+ should appear on paper when printed. As you've probably
+ noticed, the glyphs aren't always spaced uniformly on the
+ screen as you type them, sometimes the space between an "m" and
+ a "t" is too small, some other it is too large, etc.<p>
+
+ These differences are simply due to the fact that the word
+ processor aligns glyphs in an device-independent way, using
+ original metrics in font units to do it, then scale them as it
+ can to display text on screen, usually at a very smaller
+ resolution than your printer's one.<p>
+
+ Device-independence is a crucial part of document portability,
+ and it is very saddening to see that most professional word
+ processors don't do it correctly. For example, MS Word uses
+ the fitted metrics of the printer's resolution, rather than the
+ originals in font units.<p>
+
+ This is great to get sure that your text prints very well on
+ your printer, but it also implies that someone printing the
+ exact same document on a device with different output
+ resolutions (e.g. bubble-jet vs. laser printers) may encounter
+ trouble:<p>
+
+ As the differences in advances accumulate on one line, they can
+ sum to the width of one or more glyphs in extreme cases, which
+ is enough to "overflow" the automatic justification. This may
+ add additional lines of printed text, or even remove some.
+ Moreover, supplemental lines can produce unexpected page breaks
+ and "blank" pages. This can be extremely painful when working
+ with large documents, as this "feature" may require you to
+ redesign completely your formatting to re-print it.<p>
+
+ In conclusion, if you want portable document rendering, never
+ hesitate to use and apply device-independent terms! For
+ example, a simple way to produce text would be:<p>
+
+ <ol>
+
+ <li>get a scale to convert from your device-independent units
+ to 26.6 pixels<p>
+
+ <li>get another scale to convert from original font units to
+ device-independent units<p>
+
+ <li>perform pen placement and advances in device-independent
+ units<p>
+
+ <li>to render each glyph, compute the pen's rounded position,
+ as well as the rounded glyph left side bearing, both
+ expressed in 26.6 pixels (don't use the fitted metrics). You
+ will then be able to place the glyph and/or blit its bitmap.
+
+ </ol><p>
+
+ <li><font size="+1">Kerning glyphs:</font><p>
+
+ An interesting effect that most people appreciate is "kerning".
+ It consists in modifying the spacing between two successive
+ glyphs according to their outlines. For example, a "T" and a
+ "y" can be easily moved closer, as the top of the "y" fits
+ nicely under the "T"'s upper right bar.<p>
+
+ To perform kerning, the TrueType specification provides a
+ specific table (its tag being "kern"), with several storage
+ formats. This section doesn't explain how to access this
+ information; however, you can have a look at the standard
+ extension called "ttkern.h" which comes with FreeType.<p>
+
+ The "kerning distance" between two glyphs is a value expressed
+ in font units which indicate whether their outline can be moved
+ together or apart when one follows the other. The distance
+ isn't reflexive, which means that the kerning for the glyph
+ pair ("T","y") isn't the same as the one for ("y","T").<p>
+
+ The value is positive when the glyphs must be moved apart, and
+ negative when they must be moved closer. You can implement
+ kerning simply by adding its scaled and rounded value to the
+ advance width when moving the pen position. For example:
+
+<pre>
+ #define ROUND(x) ((x+32) & -64)
+
+ pen_x += metrics.advance + ROUND( scaled_kerning );
+</pre>
+
+ <li><font size="+1">Rotated and stretched/slanted text:</font><p>
+
+ In order to produce rotated glyphs with FreeType, one must
+ understand a few things:<p>
+
+ <ul>
+
+ <li>The engine doesn't apply specific transformations to the
+ glyphs it loads and processes (other than the simpler
+ resolution-base scaling and grid-fitting). If you want to
+ rotate glyphs, you will have to load their outline, then
+ apply the geometric transformations that please you (a number
+ of APIs are there to help you to do it easily).<p>
+
+ <li>Even if the glyph loader hints "straight" glyphs, it is
+ possible to inform the font and glyph programs that you're
+ going to later transform the resultant outlines. Two flags
+ can be passed to the bytecode interpreter:<p>
+
+ <ul>
+
+ <li>the "rotated" flag indicates that you're going to
+ rotate the glyphs in a non-trivial direction (i.e., on
+ neither of the two coordinate axis). You're advised not to
+ set it when writing 90 degrees-rotated text for example.<p>
+
+ <li>the "stretched" flag indicates that you're going to apply
+ a transform that will distort distances. While rotations
+ and symmetries keep distances constants, slanting and
+ stretching do modify them.
+
+ </ul>
+
+ </ul><p>
+
+ These flags can be interpreted by the glyph code to toggle
+ certain processings which vary from one font to the other.
+ However, most of the TrueType fonts that were tested with
+ FreeType, if not all of them, simply change the dropout-mode
+ when any of these flags is set, and/or disable hinting when
+ rotation is detected. We advise you to never set these flags,
+ even when rotating text. For what it's worth, hinted rotated
+ text is no uglier than un-hinted one.<p>
+
+ You can use the function TT_Set_Instance_Transform_Flags() to
+ set them. Then, rendering can be done with the following
+ calls:
+
+<pre>
+ /* set the flags */
+ TT_Set_Instance_Transforms( instance,
+ rotated,
+ stretched );
+
+ /* load a given glyph */
+ TT_Get_Glyph_Outline( instance,
+ glyph,
+ index,
+ TTLOAD_DEFAULT );
+
+ /* access its outline */
+ TT_Get_Glyph_Outline( instance, &outline );
+
+ /* in order to transform it */
+ TT_Transform_Outline( outline, &matrix );
+ /* and/or */
+ TT_Translate_Outline( outline,
+ x_offset, y_offset );
+
+ /* to render it */
+ TT_Get_Outline_Bitmap( outline, &bitmap );
+</pre>
+
+ Here is an example, assuming that the following variables
+
+<pre>
+ TT_Matrix matrix; /* 2x2 matrix */
+ TT_Pos x_off, y_off; /* corrective offsets */
+</pre>
+
+ define a transformation that can be correctly applied to a
+ glyph outline which have been previously placed relative to the
+ imaginary point position (0,0) with bearings preserved.
+ Rendering text can now be done as follows:<p>
+
+ <ol>
+
+ <li>initialize the pen position; when rotating, it is
+ extremely well advised to use sub-pixel placement as you
+ don't care about hinting.
+
+<pre>
+ pen_x = cursor_x;
+ pen_y = cursor_y;
+</pre>
+
+ <li>transform the glyph as needed, then translate it to the
+ current pen position:
+
+<pre>
+ TT_Transform_Outline( outline, &matrix );
+ TT_Translate_Outline( outline,
+ pen_x + x_off,
+ pen_y + y_off );
+</pre>
+
+ (Note that the transformation offsets have been included in
+ the translation.)<p>
+
+ <li>render the bitmap, as it has now been placed correctly.<p>
+
+ <li>to change the pen position, transform the vector
+ (0,advance) with your matrix, and add it:
+
+<pre>
+ vec_x = metrics.advance;
+ vec_y = 0;
+ TT_Transform_Vector( &vec_x, &vec_y, &matrix );
+ pen_x += vec_x;
+ pen_y += vec_y;
+</pre>
+
+ <li>start over at 2. until completion.
+
+ </ol><p>
+
+ <hr>
+ <i><font size="+1">IMPORTANT NOTE:</font></i><p>
+
+ Do not grid-fit the pen position before rendering your glyph
+ when rendering rotated text. If you do, your transformed
+ baseline won't be preserved on each glyph, and the text will
+ look like it's "hopping" randomly. This is particularly
+ visible at small sizes.<p>
+
+ Sub-pixel precision placement is <i>very</i> important for clean
+ rotated text.
+ <hr><p>
+
+ <li><font size="+1">Font-smoothing, a.k.a. gray-levels
+ rendering</font><p>
+
+ The FreeType engine's scan-line converter (the component also
+ called the "rasterizer") is able to convert a vectorial glyph
+ outline into either a normal bitmap, or an 8-bit pixmap (a.k.a.
+ "colored bitmaps" on some systems). This last feature is
+ called "gray-level rendering" or "font-smoothing", because it
+ uses a user-supplied palette to produce anti-aliased versions
+ of the glyphs.<p>
+
+ Its principle is to render a bitmap which is twice as large
+ than the target pixmap, then simply filter it using a 2x2
+ sommation.<p>
+
+ <hr>
+ <i><font size="+1">NOTE:</font></i><p>
+
+ FreeType's scan-line converter doesn't use or need an
+ intermediate double bitmap. Rather, filtering is performed in
+ a single pass, during the sweep (see the file raster.txt for
+ more information about it).
+ <hr><p>
+
+ You'll notice that, as with Win95, FreeType's raster only grays
+ those parts of the glyph which need it, i.e., diagonals and
+ curves, while keeping horizontal and vertical stems straight
+ "black". This improves greatly the legibility of text, while
+ avoiding the "blurry" look anti-aliased fonts typically have
+ with Adobe's Type Manager or Acrobat.<p>
+
+ There are thus five available gray-levels, ranging from 0 to 4,
+ where level 0 and level 4 are the background and foreground
+ colors, respectively, and where levels 1, 2, 3 are
+ intermediate. For example, to render black text on a white
+ background, one can use a palette like:<p>
+
+ <ul>
+
+ palette[0] = white (background) <br>
+ palette[1] = light gray <br>
+ palette[2] = medium gray <br>
+ palette[3] = dark gray <br>
+ palette[4] = black (foreground) <br>
+
+ </ul><p>
+
+ To set the engine's gray-level palette, simply use the API
+ TT_Set_Raster_Palette() after initialization. It expects an
+ array of 5 chars which will be used to render the pixmaps.<p>
+
+ Note that the raster doesn't create bitmaps or pixmaps.
+ Rather, it simply renders glyphs in the arrays you pass to it.
+ The generated glyph bitmaps are simply "or"-ed to the target
+ (with 0 being the background as a convention); in the case of
+ pixmaps, pixels are simply written to the buffer, in spans of
+ four aligned bytes.<p>
+
+ <hr>
+ <i><font size="+1">NOTE:</font></i><p>
+
+ The raster isn't able to superpose "transparent" glyphs on the
+ target pixmap. This means that you should always call the APIs
+ TT_Get_Glyph_Pixmap() and TT_Get_Outline_Pixmap() with an empty
+ map, and perform the superposition yourself.<p>
+
+ This can be more or less tricky, depending on the palette
+ you're using and your target graphics resolution. One of the
+ components found in the test directory, called "display.c" has
+ large comments on the way it implements it for the test
+ programs. You're encouraged to read the test programs sources
+ to understand how one can take advantage of font smoothing.<p>
+
+ Pixmap surimposition is too system-specific a feature to be
+ part of the FreeType engine. Moreover, not everybody needs it!
+ <hr><p>
+
+ Finally, the question of sur-imposing anti-aliased colored text
+ on any texture being even more tricky, it is left as an
+ exercise to the reader ;-) If this topic really interests you,
+ the freetype mailing list may host some helpful enthusiasts
+ ready to answer your questions. Who knows :-)<p>
+
+ <li><font size="+1">Other interesting text processes:</font><p>
+
+ <ul>
+
+ <li>Glyph substitution:<p>
+
+ Substitution is used to replace one glyph by another when
+ some specific condition is met in the text string. Its
+ most common examples are ligatures (like replacing the "f"
+ followed by "i" by the single glyph "fi" when available in
+ the font), as well as positional selection as performed in
+ the arabic script (for those not aware of this, each letter
+ of the arabic alphabet can be written differently according
+ to its position on words: starting, ending, intermediate or
+ isolated).<p>
+
+ The base TrueType format doesn't define any table for glyph
+ substitution. However, both GX and OpenType provide
+ (incompatible) extensions to perform it. Of course, it
+ isn't supported by the engine, but an extension could be
+ easily written to access the required tables.<p>
+
+ <li>Justification:<p>
+
+ </ul>
+
+</ol>
+
+To be continued...
diff --git a/xc/extras/FreeType/docs/glyphs.txt b/xc/extras/FreeType/docs/glyphs.txt
new file mode 100644
index 000000000..4dec72357
--- /dev/null
+++ b/xc/extras/FreeType/docs/glyphs.txt
@@ -0,0 +1,1002 @@
+
+ Glyph Hell
+
+ An introduction to glyphs, as used and defined in the FreeType engine:
+
+ version 1.0 (html version)
+
+ David Turner - 14 Jan 98
+
+ ------------------------------------------------------------------------
+
+Introduction:
+
+This article discusses in great detail the definition of glyph metrics, per
+se the TrueType specification, and the way they are managed and used by the
+FreeType engine. This information is crucial when it comes to rendering text
+strings, either in a conventional (i.e. roman) layout, or with vertical or
+right-to-left ones. Some aspects like glyph rotation and transformation are
+explained too.
+
+Comments and corrections are highly welcomed, and can be sent to the
+FreeType developers list.
+
+ ------------------------------------------------------------------------
+
+I. An overview of font files
+
+In TrueType, a single font file is used to contain information related to
+classification, modeling and rendering of text using a given typeface. This
+data is located in various independent "tables", which can be sorted in four
+simple classes, as described below:
+
+ * Face Data:
+
+ We call face data, the amount of information related to a given
+ typeface, independently of any particular scaling, transformation
+ and/or glyph index. This usually means some typeface-global metrics and
+ attributes, like family and styles, PANOSE number, typographic
+ ascenders and descenders, as well as some very TT-specific items like
+ the font 'programs' found in the fpgm and prep tables, the gasp table,
+ character mappings, etc.
+
+ In FreeType, a face object is used to model a font file's face data.
+
+ * Instance Data:
+
+ We call instance a given pointsize/transformation, at a given device
+ resolution (e.g. 8pt at 96x96 dpi, or 12pt at 300x600 dpi, etc). Some
+ tables found in the font files are used to produce instance-specific
+ data, like the cvt table, or the prep program. Though they're often
+ part of the face data, their processing results in information called
+ instance data.
+
+ In FreeType, it is modeled through an instance object, which is always
+ created from an existing face object.
+
+ * Glyph Data:
+
+ We call glyph data the piece of information related to specific glyphs.
+ This includes the following things that are described in more details
+ in the next sections:
+
+ o the glyph's vectorial representation, also called its outline.
+
+ o various metrics, like the glyph's bounding box, its bearings and
+ advance values.
+
+ o TrueType specifies a specific instruction bytecode, used to
+ associate each glyph with a small program, called the glyph code.
+ Its purpose is to grid-fit the outline to any target instance, in
+ order to produce excellent output at "small" pixel sizes.
+
+ The FreeType engine doesn't map each glyph to a single structure, as
+ this would waste memory for no good reason. Rather, a glyph object is a
+ container, created from any active face, which can be used to load
+ and/or process any font glyph at any instance (or even no instance at
+ all). Of course, the glyph properties (outline, metrics, bitmaps, etc.)
+ can be extracted independently from an object once it has been loaded
+ or processed.
+
+ * Text and Layout Data:
+
+ Finally, there is a last class of data that doesn't really fit in all
+ others, and that can be called text data. It comprises information
+ related to the grouping of glyphs together to form text. Simple
+ examples are the kerning table, which controls the spacing between
+ adjacent glyphs, as well as some of the extensions introduced in
+ OpenType and GX like glyph substitution (ligatures), baseline
+ management, justification, etc.
+
+ This article focuses on the basic TrueType tables, and hence, will only
+ talk about kerning, as FreeType doesn't support OpenType nor GX (yet).
+
+ ------------------------------------------------------------------------
+
+II. Glyph Outlines:
+
+TrueType is a scalable font format: it is thus possible to render glyphs at
+any scale, and under any affine transform, from a single source
+representation. However, simply scaling vectorial shapes exhibits at small
+sizes (where "small" refers here to anything smaller than at least 150
+pixels) a collection of un-harmonious artifacts, like widths and/or heights
+degradations.
+
+Because of this, the format also provides a complete programming language
+used to design small programs associated to each glyph. Their role is to
+align the point positions on the pixel grid after the scaling. This
+operation is hence called "grid-fitting", or even "hinting".
+
+ 1. Vectorial representation
+
+ The source format of outlines is a collection of closed paths called
+ "contours". Each contour delimits an outer or inner region of the
+ glyph, and can be made of either line segments and/or second-order
+ beziers (also called "conic beziers" or "quadratics").
+
+ It is described internally as a series of successive points, with each
+ point having an associated flag indicating whether it is "on" or "off"
+ the curve. These rules are applied to decompose the contour:
+
+ o two successive "on" points indicate a line segment joining them.
+
+ o one "off" point amidst two "on" points indicates a conic bezier,
+ the "off" point being the control point, and the "on" ones the
+ start and end points.
+
+ o finally, two successive "off" points forces the rasterizer to
+ create (only during bitmap rendering) a virtual "on" point amidst
+ them, at their exact middle. This greatly facilitates the
+ definition of successive Bezier arcs.
+
+ * # on
+ * off
+ __---__
+ #-__ _-- -_
+ --__ _- -
+ --__ # \
+ --__ #
+ -#
+ Two "on" points
+ Two "on" points and one "off" point
+ between them
+
+ *
+ # __ Two "on" points with two "off"
+ \ - - points between them. The point
+ \ / \ marked '0' is the middle of the
+ - 0 \ "off" points, and is a 'virtual'
+ -_ _- # "on" point where the curve passes.
+ -- It does not appear in the point
+ list.
+ *
+
+ Each glyph's original outline points are located on a grid of
+ indivisible units. The points are stored in the font file as
+ 16-bit integer grid coordinates, with the grid origin's being at (0,0);
+ they thus range from -16384 to 16383.
+
+ In creating the glyph outlines, a type designer uses an imaginary
+ square called the "EM square". Typically, the EM square encloses the
+ capital "M" and most other letters of a typical roman alphabet. The
+ square's size, i.e., the number of grid units on its sides, is very
+ important for two reasons:
+
+ o it is the reference used to scale the outlines to a given
+ instance. For example, a size of 12pt at 300x300dpi corresponds to
+ 12*300/72 = 50 pixels. This is the size the EM square would appear
+ on the output device if it was rendered directly. In other words,
+ scaling from grid units to pixels uses the formula:
+
+ pixel_size = point_size * resolution / 72
+
+ pixel_coordinate = grid_coordinate * pixel_size / EM_size
+
+ o the greater the EM size is, the larger resolution the designer can
+ use when digitizing outlines. For example, in the extreme example
+ of an EM size of 4 units, there are only 25 point positions
+ available within the EM square which is clearly not enough.
+ Typical TrueType fonts use an EM size of 2048 units (note: with
+ Type 1 PostScript fonts, the EM size is fixed to 1000 grid units.
+ However, point coordinates can be expressed in floating values).
+
+ Note that glyphs can freely extend beyond the EM square if the font
+ designer wants this. The EM is used as a convenience, and is a valuable
+ convenience from traditional typography.
+
+ grid units are very often called "font units" or "EM units".
+
+ IMPORTANT NOTE:
+
+ Under FreeType, scaled pixel positions are all expressed in the 26.6
+ fixed float format (made of a 26-bit integer mantissa, and a 6-bit
+ fractional part). In other words, all coordinates are multiplied by 64.
+ The grid lines along the integer pixel positions, are multiples of 64,
+ like (0,0), (64,0), (0,64), (128,128), etc., while the pixel centers
+ lie at middle coordinates (32 modulo 64) like (32,32), (96,32), etc.
+
+ 2. Hinting and Bitmap rendering
+
+ As said before, simply scaling outlines to a specific instance always
+ creates undesirable artifacts, like stems of different widths or
+ heights in letters like "E" or "H". Proper glyph rendering needs that
+ the scaled points are aligned along the pixel grid (hence the name
+ "grid-fitting"), and that important widths and heights are respected
+ throughout the whole font (for example, it is very often desirable that
+ the "I" and the "T" have their central vertical line of the same pixel
+ width).
+
+ Type 1 PostScript font files include with each glyph a small series of
+ distances called "hints", which are later used by the type manager to
+ try grid-fitting the outlines as cleverly as possible. In one hand, it
+ has the consequence that upgrading your font engine can enhance the
+ visual aspects of all fonts of your system; on the other hand, the
+ quality of even the best version of Adobe's Type Manager isn't always
+ very pleasing at small sizes (notwithstanding font smoothing).
+
+ TrueType takes a radically different approach: each glyph has an
+ associated "program", designed in a specific geometrical language,
+ which is used to align explicitly each outline point to the pixel grid,
+ preserving important distances and metrics. A stack-based low-level
+ bytecode is used to store it in the font file, and is interpreted later
+ when rendering the scaled glyphs.
+
+ This means that even very complex glyphs can be rendered perfectly at
+ very small sizes, as long as the corresponding glyph code is designed
+ correctly. Moreover, a glyph can lose some of its details, like serifs,
+ at small sizes to become more readable, because the bytecode provides
+ interesting features.
+
+ However, this also have the sad implication that an ill-designed glyph
+ code will always render junk, whatever the font engine's version, and
+ that it's very difficult to produce quality glyph code. There are about
+ 200 TrueType opcodes, and no known "high-level language" for it. Most
+ type artists aren't programmers at all and the only tools able to
+ produce quality code from vectorial representation have been
+ distributed to only a few font foundries, while tools available to the
+ public, e.g. Fontographer, are usually expensive though generating
+ average to mediocre glyph code.
+
+ All this explains why an enormous number of broken or ugly "free" fonts
+ have appeared on the TrueType scene, and that this format is now
+ mistakenly thought as "crap" by many people. Funnily, these are often
+ the same who stare at the "beauty" of the classic "Times New Roman" and
+ "Arial/Helvetica" at 8 points.
+
+ Once a glyph's code has been executed, the scan-line converter converts
+ the fitted outline into a bitmap (or a pixmap with font-smoothing).
+
+ ------------------------------------------------------------------------
+
+III. Glyph metrics
+
+ 1. Baseline, Pens and Layouts:
+
+ The baseline is an imaginary line that is used to "guide" glyphs when
+ rendering text. It can be horizontal (e.g. roman, cyrillic,arabic,
+ etc.) or vertical (e.g. chinese, japanese, korean, etc). Moreover, to
+ render text, a virtual point, located on the baseline, called the "pen
+ position", is used to locate glyphs.
+
+ Each layout uses a different convention for glyph placement:
+
+ o with horizontal layout, glyphs simply "rest" on the baseline. Text
+ is rendered by incrementing the pen position, either to the right
+ or to the left.
+
+ [Image]
+
+ the distance between two successive pen positions is
+ glyph-specific and is called the "advance width". Note that its
+ value is _always_ positive, even for right-to-left oriented
+ alphabets, like arabic. This introduces some differences in the
+ way text is rendered.
+ ------------------------------------------------------------------
+ IMPORTANT NOTE:
+
+ the pen position is always placed on the baseline in TrueType,
+ unlike the convention used by some graphics systems, like Windows,
+ to always put the pen above the line, at the ascender's position.
+ ------------------------------------------------------------------
+
+ with a vertical layout, glyphs are centered around the baseline:
+
+ [Image]
+
+ 2. Typographic metrics and bounding boxes:
+
+ A various number of face metrics are defined for all glyphs in a given
+ font. Three of them have a rather curious status in the TrueType
+ specification; they only apply to horizontal layouts:
+
+ o the ascent:
+
+ this is the distance from the baseline to the highest/upper grid
+ coordinate used to place an outline point. It is a positive value,
+ due to the grid's orientation with the Y axis upwards.
+
+ o the descent:
+
+ the distance from the baseline to the lowest grid coordinate used
+ to place an outline point. This is a negative value, due to the
+ grid's orientation.
+
+ o the linegap:
+
+ the distance that must be placed between two lines of text. The
+ baseline-to-baseline distance should be computed as:
+
+ "ascent - descent + linegap"
+
+ if you use the typographic values.
+
+ The problem with these metrics is that they appear three times in a
+ single font file, each version having a slightly different meaning:
+
+ 1. the font's horizontal header provides the ascent, descent and
+ linegap fields, which are used to express the designer's intents,
+ rather than the real values that may be computed from all glyphs
+ in the outline. These are used by the Macintosh font engine to
+ perform font mapping (i.e. font substitution).
+
+ 2. the OS/2 table provides the usWinAscent and usWinDescent fields.
+ These values are computed for glyphs of the Windows ANSI charset
+ only, which means that they're wrong for any other glyph. Note
+ that usWinDescent is always positive (i.e. looks like "-descent")
+
+ 3. the OS/2 table provides the typoAscender, typoDescender and
+ typoLinegap values, which hopefully concern the whole font file.
+ These are the correct system-independent values!
+
+ All metrics are expressed in font units. If you want to use any of the
+ two first versions of these metrics, the TrueType specification
+ contains some considerations and computing tips that might help you.
+
+ Other, simpler metrics are:
+
+ o the glyph's bounding box, also called "bbox":
+
+ this is an imaginary box that encloses any glyph as tightly as
+ possible. It is represented by four fields, namely xMin, yMin,
+ xMax, and yMax, that can be computed for any outline. Their values
+ can be in font units (if measured in the original outline) or in
+ 26.6 pixel units (when measured on scaled outlines).
+
+ Note that if it wasn't for grid-fitting, you wouldn't need to know
+ a box's complete values, but only its dimensions to know how big
+ is a glyph outline/bitmap. However, correct rendering of hinted
+ glyphs needs the preservation of important grid alignment on each
+ glyph translation/placement on the baseline. which is why FreeType
+ returns always the complete glyph outline.
+
+ Note also that the font's header contains a global font bbox in
+ font units which should enclose all glyphs in a font. This can be
+ used to pre-compute the maximum dimensions of any glyph at a given
+ instance.
+
+ o the internal leading:
+
+ this concept comes directly from the world of traditional
+ typography. It represents the amount of space within the "leading"
+ which is reserved for glyph features that lay outside of the EM
+ square (like accentuation). It usually can be computed as:
+
+ internal leading = ascent - descent - EM_size
+
+ o the external leading:
+
+ this is another name for the line gap.
+
+ 3. Bearings and Advances:
+
+ Each glyph has also distances called "bearings" and "advances". Their
+ definition is constant, but their values depend on the layout, as the
+ same glyph can be used to render text either horizontally or
+ vertically:
+
+ 1. the left side bearing: a.k.a. bearingX
+
+ this is the horizontal distance from the current pen position to
+ the glyph's left bbox edge. It is positive for horizontal layouts,
+ and most generally negative for vertical one.
+
+ 2. the top side bearing: a.k.a. bearingY
+
+ this is the vertical distance from the baseline to the top of the
+ glyph's bbox. It is usually positive for horizontal layouts, and
+ negative for vertical ones
+
+ 3. the advance width: a.k.a. advanceX
+
+ is the horizontal distance the pen position must be incremented
+ (for left-to-right writing) or decremented (for right-to-left
+ writing) by after each glyph is rendered when processing text. It
+ is always positive for horizontal layouts, and null for vertical
+ ones.
+
+ 4. the advance height: a.k.a. advanceY
+
+ is the vertical distance the pen position must be decremented by
+ after each glyph is rendered. It is always null for horizontal
+ layouts, and positive for vertical layouts.
+
+ 5. the glyph width:
+
+ this is simply the glyph's horizontal extent. More simply it is
+ (bbox.xMax-bbox.xMin) for unscaled font coordinates. For scaled
+ glyphs, its computation requests specific care, described in the
+ grid-fitting chapter below.
+
+ 6. the glyph height:
+
+ this is simply the glyph's vertical extent. More simply, it is
+ (bbox.yMax-bbox.yMin) for unscaled font coordinates. For scaled
+ glyphs, its computation requests specific care, described in the
+ grid-fitting chapter below.
+
+ 7. the right side bearing:
+
+ is only used for horizontal layouts to describe the distance from
+ the bbox's right edge to the advance width. It is in most cases a
+ non-negative number. The FreeType doesn't provide this metric
+ directly, as it isn't really part of the TrueType specification.
+ It can be computed simply as:
+
+ advance_width - left_side_bearing - (xMax-xMin)
+
+ [Image]
+
+ [Image]
+
+ Finally, if you're used to Windows and OS/2 "ABC widths", the following
+ relations apply:
+
+ A = left side bearing
+ B = width
+ C = right side bearing
+
+ A+B+C = advance width
+
+ 4. The effects of Grid-fitting:
+
+ All these metrics are stored in font units in the font file. They must
+ be scaled and grid-fitted properly to be used at a specific instance.
+ This implies several things:
+
+ o first, a glyph program not only aligns the outline along the grid
+ pixel, it also processes the left side bearing and the advance
+ width. Other grid-fitted metrics are usually available in optional
+ TrueType tables, if you need them.
+
+ o a glyph program may decide to extend or stretch any of these two
+ metrics if it feels a need for it. This means that you cannot
+ assume that the fitted metrics are simply equal to the scaled one
+ plus or minus a liberal distance < 1 pixel (i.e., under 64
+ fractional pixel units). For example, it is often necessary to
+ stretch the letter "m" horizontally at small pixel sizes to make
+ all feet visible, while the same glyph can be perfectly "square"
+ at larger sizes.
+
+ o querying the fitted metrics of all glyphs at a given instance is
+ very slow, as it needs to load and process each glyph
+ independently. For this reasons, some optional TrueType tables are
+ defined in the specification, containing pre-computed metrics for
+ specific instances (the most commonly used, like 8, 9, 10, 11, 12
+ and 14 points at 96 dpi, for example). These tables aren't always
+ present in a TrueType font.
+
+ If you don't need the exact fitted value, it's much faster to
+ query the metrics in font units, then scale them to the instance's
+ dimensions.
+
+ -----------------------------------------------------------------------
+ IMPORTANT NOTE:
+
+ Another very important consequence of grid-fitting is the fact that
+ moving a fitted outline by a non-integer pixel distance will simply
+ ruin the hinter's work, as alignments won't be preserved. The
+ translated glyph will then look "ugly" when converted to a bitmap!
+
+ In other words, each time you want to translate a fitted glyph outline,
+ you must take care of only using integer pixel distances (the x and y
+ offsets must be multiples of 64, which equals to 1.0 in the 26.6 fixed
+ float format). If you don't care about grid-fitting (typically when
+ rendering rotated text), you can use any offset you want and use
+ sub-pixel glyph placement.
+ -----------------------------------------------------------------------
+
+ ------------------------------------------------------------------------
+
+IV. Text processing
+
+This section demonstrates how to use the concepts previously defined to
+render text, whatever the layout you use.
+
+ 1.
+ 2. Writing simple text strings:
+
+ We'll start by generating a simple string with a roman alphabet. The
+ layout is thus horizontal, left to right.
+
+ For now, we'll assume all glyphs are rendered in a single target
+ bitmap. The case of generating individual glyph bitmaps, then placing
+ them on demand on a device is presented in a later chapter of this
+ section (see below).
+
+ Rendering the string needs to place each glyph on the baseline; this
+ process looks like:
+
+ 1. place the pen to the cursor position. The pen is always located on
+ the baseline. These coordinates must be grid-fitted (i.e.,
+ multiples of 64)!
+
+ pen_x = cursor_x;
+ pen_y = cursor_y;
+
+ 2. load the glyph outline and its metrics. Using the flag
+ TTLOAD_DEFAULT will scale and hint the glyph:
+
+ TT_Load_Glyph( instance,
+ glyph,
+ glyph_index,
+ TTLOAD_DEFAULT );
+
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+ TT_Get_Glyph_Outline( glyph, &outline );
+
+ 3. The loader always places the glyph outline relative to the
+ imaginary pen position (0,0). You thus simply need to translate
+ the outline by the vector:
+
+ ( pen_x, pen_y )
+
+ to place it on its correct position, you can use the call
+
+ TT_Translate_Outline( outline, pen_x, pen_y );
+
+ 4. render the outline in the target bitmap, the glyph will be
+ surimposed on it with a binary "or" (FreeType never creates glyph
+ bitmaps by itself, it simply renders glyphs in the arrays you pass
+ to it. See the API reference for a complete description of bitmaps
+ and pixmaps).
+
+ TT_Get_Outline_Bitmap( outline, &target_bitmap );
+
+ ------------------------------------------------------------------
+ IMPORTANT NOTE:
+
+ If you don't want to access the outline in your code, you can also
+ use the API TT_Get_Glyph_Bitmap() which works the same as the
+ previous lines:
+
+ TT_Get_Glyph_Outline( glyph, &outline );
+ TT_Translate_Outline( outline, x_offset, y_offset );
+ TT_Get_Outline_Bitmap( outline, &target_bitmap );
+ TT_Translate_Outline( outline, -x_offset, -y_offset );
+
+ being equivalent to:
+
+ TT_Get_Glyph_Bitmap( glyph,
+ x_offset,
+ y_offset,
+ &target_bitmap );
+
+ ------------------------------------------------------------------
+
+ 5. now advance the pen to its next position. The advance is always
+ grid-fitted when the glyph was hinted:
+
+ pen_x += metrics.advance;
+
+ the advance being grid-fitted, the pen position remains aligned on
+ the grid.
+
+ 6. start over on item 2 until string completion. That's it!
+
+ 3. Writing right-to-left and vertical text:
+
+ Generating strings for different layouts is very similar. Here are the
+ most important differences:
+
+ o For right-to-left text (like Arabic):
+
+ the main difference here is that, as the advance width and left
+ side bearings are oriented against the flow of text, the pen
+ position must be decremented by the advance width, before placing
+ and rendering the glyph. Other than that, the rest is strictly
+ similar.
+
+ o for vertical text (like Chinese or Japanese):
+
+ in this case, the baseline is vertical, which means that the pen
+ position must be shifted in the vertical direction. You need the
+ vertical glyph metrics to do that.
+
+ ------------------------------------------------------------------
+ There is no way to do that now with FreeType. However, it will be
+ probably implemented with the help of an additional glyph
+ property. For example, calling a function like:
+
+ TT_Set_Glyph_Layout( glyph, TT_LAYOUT_VERTICAL );
+
+ will force the function TT_Get_Glyph_Metrics() to place the
+ vertical glyph metrics in the bearingX, bearingY and advance
+ metrics fields, instead of the default horizontal ones. Another
+ function will be probably provided to return all glyph metrics at
+ once (horizontal and vertical).
+ ------------------------------------------------------------------
+
+ Once you get these, the rest of the process is very similar. The
+ glyph outline is placed relative to an imaginary origin of (0,0),
+ and you should translate it to the pen position before rendering
+ it.
+
+ The big difference is that you must decrement pen_y, rather than
+ increment pen_x (this is for the TrueType convention of Y oriented
+ upwards).
+
+ pen_y -= metrics.advance;
+
+ 4. Generating individual glyph bitmaps and using them to render text:
+
+ Loading each glyph when rendering text is slow, and it's much more
+ efficient to render each one in a standalone bitmap to place it in a
+ cache. Text can then be rendered fast by applying simple blit
+ operations on the target device.
+
+ To be able to render text correctly with the bitmaps, you must record
+ and associate with them its fitted bearings and advances. Hence the
+ following process:
+
+ 1. Generate the bitmaps:
+
+ + load the glyph and get its metrics
+
+ TT_Load_Glyph( instance,
+ glyph,
+ glyph_index,
+ TTLOAD_DEFAULT );
+
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+
+ the bbox is always fitted when calling TT_Get_Glyph_Metrics()
+ on a hinted glyph. You can then easily compute the glyph's
+ dimension in pixels as:
+
+ width = (bbox.xMax - bbox.xMin) / 64;
+ height = (bbox.yMax - bbox.yMin) / 64;
+
+ NOTE 1:
+ the fitted boudning box always contains all the dropouts that
+ may be produced by the scan-line converter. These width and
+ height are thus valid for all kinds of glyphs).
+
+ NOTE 2:
+ If you want to compute the dimensions of a rotated outline's
+ bitmap, compute its bounding box with TT_Get_Outline_BBox(),
+ then grid-fit the bbox manually:
+
+ #define FLOOR(x) ((x) & -64)
+ #define CEILING(x) (((x)+63) & -64)
+
+ xMin = FLOOR(xMin);
+ yMin = FLOOR(yMin);
+ yMin = CEILING(xMax);
+ yMax = CEILING(yMax);
+
+ then compute width and height as above.
+
+ + create a bitmap of the given dimension, e.g.:
+
+ bitmap.width = width;
+ bitmap.cols = (width+7) & -8;
+ bitmap.rows = height;
+ bitmap.flow = TT_Flow_Up;
+ bitmap.size = bitmap.cols * bitmap.rows;
+ bitmap.buffer = malloc( bitmap.size );
+
+ + render the glyph into the bitmap.
+
+ Don't forget to shift it by (-xMin, -yMin) to fit it in the
+ bitmap:
+
+ /* Note that the offsets must be grid-fitted to */
+ /* preserve hinting! */
+ TT_Get_Glyph_Bitmap( glyph,
+ &bitmap,
+ -bbox.xMin,
+ -bbox.yMin );
+
+ 2. Store the bitmap with the following values:
+
+ bearingX / 64 = left side bearing in pixels
+ advance / 64 = advance width/height in pixels
+
+ When you cache is set up, you can them render text using a scheme
+ similar to the ones describe in 1. and 2., with the exception that
+ now, pen positions and metrics are expressed in pixel values. Et
+ voila!
+
+ pen_x = cursor_x;
+ pen_y = cursor_y;
+
+ while ( glyph_to_render )
+ {
+ access_cache( glyph_index, metrics, bitmap );
+
+ blit bitmap to position
+ ( pen_x + bearingX,
+ pen_y (+ bearingY depending on orientation ) );
+
+ pen_x += advance;
+ }
+
+ 5. Device-independent text rendering:
+
+ The previous rendering processes all aligned glyphs on the baseline
+ according to metrics fitted for the display's distance. In some cases,
+ the display isn't the final output, and placing the glyphs in a
+ device-independent way is more important than anything.
+
+ A typical case is a word processor which displays text as it should
+ appear on paper when printed. As you've probably noticed, the glyphs
+ aren't always spaced uniformly on the screen as you type them,
+ sometimes the space between an "m" and a "t" is too small, some other
+ it is too large, etc.
+
+ These differences are simply due to the fact that the word processor
+ aligns glyphs in an device-independent way, using original metrics in
+ font units to do it, then scale them as it can to display text on
+ screen, usually at a very smaller resolution than your printer's one.
+
+ Device-independence is a crucial part of document portability, and it
+ is very saddening to see that most professional word processors don't
+ do it correctly. For example, MS Word uses the fitted metrics of the
+ printer's resolution, rather than the originals in font units.
+
+ This is great to get sure that your text prints very well on your
+ printer, but it also implies that someone printing the exact same
+ document on a device with different output resolutions (e.g. bubble-jet
+ vs. laser printers) may encounter trouble:
+
+ As the differences in advances accumulate on one line, they can sum to
+ the width of one or more glyphs in extreme cases, which is enough to
+ "overflow" the automatic justification. This may add additional lines
+ of printed text, or even remove some. Moreover, supplemental lines can
+ produce unexpected page breaks and "blank" pages. This can be extremely
+ painful when working with large documents, as this "feature" may
+ require you to redesign completely your formatting to re-print it.
+
+ In conclusion, if you want portable document rendering, never hesitate
+ to use and apply device-independent terms! For example, a simple way to
+ produce text would be:
+
+ 1. get a scale to convert from your device-independent units to 26.6
+ pixels
+
+ 2. get another scale to convert from original font units to
+ device-independent units
+
+ 3. perform pen placement and advances in device-independent units
+
+ 4. to render each glyph, compute the pen's rounded position, as well
+ as the rounded glyph left side bearing, both expressed in 26.6
+ pixels (don't use the fitted metrics). You will then be able to
+ place the glyph and/or blit its bitmap.
+
+ 6. Kerning glyphs:
+
+ An interesting effect that most people appreciate is "kerning". It
+ consists in modifying the spacing between two successive glyphs
+ according to their outlines. For example, a "T" and a "y" can be easily
+ moved closer, as the top of the "y" fits nicely under the "T"'s upper
+ right bar.
+
+ To perform kerning, the TrueType specification provides a specific
+ table (its tag being "kern"), with several storage formats. This
+ section doesn't explain how to access this information; however, you
+ can have a look at the standard extension called "ttkern.h" which comes
+ with FreeType.
+
+ The "kerning distance" between two glyphs is a value expressed in font
+ units which indicate whether their outline can be moved together or
+ apart when one follows the other. The distance isn't reflexive, which
+ means that the kerning for the glyph pair ("T","y") isn't the same as
+ the one for ("y","T").
+
+ The value is positive when the glyphs must be moved apart, and negative
+ when they must be moved closer. You can implement kerning simply by
+ adding its scaled and rounded value to the advance width when moving
+ the pen position. For example:
+
+ #define ROUND(x) ((x+32) & -64)
+
+ pen_x += metrics.advance + ROUND( scaled_kerning );
+
+ 7. Rotated and stretched/slanted text:
+
+ In order to produce rotated glyphs with FreeType, one must understand a
+ few things:
+
+ o The engine doesn't apply specific transformations to the glyphs it
+ loads and processes (other than the simpler resolution-base
+ scaling and grid-fitting). If you want to rotate glyphs, you will
+ have to load their outline, then apply the geometric
+ transformations that please you (a number of APIs are there to
+ help you to do it easily).
+
+ o Even if the glyph loader hints "straight" glyphs, it is possible
+ to inform the font and glyph programs that you're going to later
+ transform the resultant outlines. Two flags can be passed to the
+ bytecode interpreter:
+
+ + the "rotated" flag indicates that you're going to rotate the
+ glyphs in a non-trivial direction (i.e., on neither of the
+ two coordinate axis). You're advised not to set it when
+ writing 90 degrees-rotated text for example.
+
+ + the "stretched" flag indicates that you're going to apply a
+ transform that will distort distances. While rotations and
+ symmetries keep distances constants, slanting and stretching
+ do modify them.
+
+ These flags can be interpreted by the glyph code to toggle certain
+ processings which vary from one font to the other. However, most of the
+ TrueType fonts that were tested with FreeType, if not all of them,
+ simply change the dropout-mode when any of these flags is set, and/or
+ disable hinting when rotation is detected. We advise you to never set
+ these flags, even when rotating text. For what it's worth, hinted
+ rotated text is no uglier than un-hinted one.
+
+ You can use the function TT_Set_Instance_Transform_Flags() to set them.
+ Then, rendering can be done with the following calls:
+
+ /* set the flags */
+ TT_Set_Instance_Transforms( instance,
+ rotated,
+ stretched );
+
+ /* load a given glyph */
+ TT_Get_Glyph_Outline( instance,
+ glyph,
+ index,
+ TTLOAD_DEFAULT );
+
+ /* access its outline */
+ TT_Get_Glyph_Outline( instance, &outline );
+
+ /* in order to transform it */
+ TT_Transform_Outline( outline, &matrix );
+ /* and/or */
+ TT_Translate_Outline( outline,
+ x_offset, y_offset );
+
+ /* to render it */
+ TT_Get_Outline_Bitmap( outline, &bitmap );
+
+ Here is an example, assuming that the following variables
+
+ TT_Matrix matrix; /* 2x2 matrix */
+ TT_Pos x_off, y_off; /* corrective offsets */
+
+ define a transformation that can be correctly applied to a glyph
+ outline which have been previously placed relative to the imaginary
+ point position (0,0) with bearings preserved. Rendering text can now be
+ done as follows:
+
+ 1. initialize the pen position; when rotating, it is extremely well
+ advised to use sub-pixel placement as you don't care about
+ hinting.
+
+ pen_x = cursor_x;
+ pen_y = cursor_y;
+
+ 2. transform the glyph as needed, then translate it to the current
+ pen position:
+
+ TT_Transform_Outline( outline, &matrix );
+ TT_Translate_Outline( outline,
+ pen_x + x_off,
+ pen_y + y_off );
+
+ (Note that the transformation offsets have been included in the
+ translation.)
+
+ 3. render the bitmap, as it has now been placed correctly.
+
+ 4. to change the pen position, transform the vector (0,advance) with
+ your matrix, and add it:
+
+ vec_x = metrics.advance;
+ vec_y = 0;
+ TT_Transform_Vector( &vec_x, &vec_y, &matrix );
+ pen_x += vec_x;
+ pen_y += vec_y;
+
+ 5. start over at 2. until completion.
+
+ -----------------------------------------------------------------------
+ IMPORTANT NOTE:
+
+ Do not grid-fit the pen position before rendering your glyph when
+ rendering rotated text. If you do, your transformed baseline won't be
+ preserved on each glyph, and the text will look like it's "hopping"
+ randomly. This is particularly visible at small sizes.
+
+ Sub-pixel precision placement is very important for clean rotated text.
+ -----------------------------------------------------------------------
+
+ 8. Font-smoothing, a.k.a. gray-levels rendering
+
+ The FreeType engine's scan-line converter (the component also called
+ the "rasterizer") is able to convert a vectorial glyph outline into
+ either a normal bitmap, or an 8-bit pixmap (a.k.a. "colored bitmaps" on
+ some systems). This last feature is called "gray-level rendering" or
+ "font-smoothing", because it uses a user-supplied palette to produce
+ anti-aliased versions of the glyphs.
+
+ Its principle is to render a bitmap which is twice as large than the
+ target pixmap, then simply filter it using a 2x2 sommation.
+
+ -----------------------------------------------------------------------
+ NOTE:
+
+ FreeType's scan-line converter doesn't use or need an intermediate
+ double bitmap. Rather, filtering is performed in a single pass, during
+ the sweep (see the file raster.txt for more information about it).
+ -----------------------------------------------------------------------
+
+ You'll notice that, as with Win95, FreeType's raster only grays those
+ parts of the glyph which need it, i.e., diagonals and curves, while
+ keeping horizontal and vertical stems straight "black". This improves
+ greatly the legibility of text, while avoiding the "blurry" look
+ anti-aliased fonts typically have with Adobe's Type Manager or Acrobat.
+
+ There are thus five available gray-levels, ranging from 0 to 4, where
+ level 0 and level 4 are the background and foreground colors,
+ respectively, and where levels 1, 2, 3 are intermediate. For example,
+ to render black text on a white background, one can use a palette like:
+
+ palette[0] = white (background)
+ palette[1] = light gray
+ palette[2] = medium gray
+ palette[3] = dark gray
+ palette[4] = black (foreground)
+
+ To set the engine's gray-level palette, simply use the API
+ TT_Set_Raster_Palette() after initialization. It expects an array of 5
+ chars which will be used to render the pixmaps.
+
+ Note that the raster doesn't create bitmaps or pixmaps. Rather, it
+ simply renders glyphs in the arrays you pass to it. The generated glyph
+ bitmaps are simply "or"-ed to the target (with 0 being the background
+ as a convention); in the case of pixmaps, pixels are simply written to
+ the buffer, in spans of four aligned bytes.
+
+ -----------------------------------------------------------------------
+ NOTE:
+
+ The raster isn't able to superpose "transparent" glyphs on the target
+ pixmap. This means that you should always call the APIs
+ TT_Get_Glyph_Pixmap() and TT_Get_Outline_Pixmap() with an empty map,
+ and perform the superposition yourself.
+
+ This can be more or less tricky, depending on the palette you're using
+ and your target graphics resolution. One of the components found in the
+ test directory, called "display.c" has large comments on the way it
+ implements it for the test programs. You're encouraged to read the test
+ programs sources to understand how one can take advantage of font
+ smoothing.
+
+ Pixmap surimposition is too system-specific a feature to be part of the
+ FreeType engine. Moreover, not everybody needs it!
+ -----------------------------------------------------------------------
+
+ Finally, the question of sur-imposing anti-aliased colored text on any
+ texture being even more tricky, it is left as an exercise to the reader
+ ;-) If this topic really interests you, the freetype mailing list may
+ host some helpful enthusiasts ready to answer your questions. Who knows
+ :-)
+
+ 9. Other interesting text processes:
+
+ o Glyph substitution:
+
+ Substitution is used to replace one glyph by another when some
+ specific condition is met in the text string. Its most common
+ examples are ligatures (like replacing the "f" followed by "i" by
+ the single glyph "fi" when available in the font), as well as
+ positional selection as performed in the arabic script (for those
+ not aware of this, each letter of the arabic alphabet can be
+ written differently according to its position on words: starting,
+ ending, intermediate or isolated).
+
+ The base TrueType format doesn't define any table for glyph
+ substitution. However, both GX and OpenType provide (incompatible)
+ extensions to perform it. Of course, it isn't supported by the
+ engine, but an extension could be easily written to access the
+ required tables.
+
+ o Justification:
+
+To be continued...
diff --git a/xc/extras/FreeType/docs/i18n.txt b/xc/extras/FreeType/docs/i18n.txt
new file mode 100644
index 000000000..f102ab677
--- /dev/null
+++ b/xc/extras/FreeType/docs/i18n.txt
@@ -0,0 +1,153 @@
+
+Using national language support (NLS) in FreeType
+=================================================
+
+21. 1. 1998
+Erwin Dieterich
+
+
+1) Intro
+2) Using gettext (user's view)
+3) Using gettext (programmer's view)
+4) Using gettext (maintainer's view)
+5) How can I switch off NLS, I don't need/want it.
+
+
+Only Unix NLS using gettext() is covered here. If you are able to
+help with internationalization (i18n) for different operating
+systems, please e-mail me at Erwin.Dieterich.ED@Bayer-AG.de.
+
+
+
+1) Intro
+
+If a program is to be used by people who are not fluent speakers of
+English, the first thing they will ask for is communication in their
+native language. If someone tries to support NLS in a program using
+only #ifdefs and other such programming strategies, it's likely that
+this someone will get nowhere.
+
+Gettext() is a possible way to help. Only minimal extra programming
+effort is needed; the translations are implemented separately from
+the program, and it is not necessary to recompile a program if you
+want to switch the messages to a different language. If you'd like
+to know more about gettext(), I recommend reading the GNU gettext
+tools manual, version 0.10.27 by Ulrich Drepper, Jim Meyering and
+Francois Pinard.
+
+Currently supported languages are:
+
+ Czech (cz) Translator: Pavel Kankovsky
+ <peak@kerberos.troja.mff.cuni.cz>
+ Dutch (nl) Translator: Gertjan de Back <gertjan.de.back@pi.net>
+ French (fr) Translator: David Turner <turner@enst.fr>
+ German (de) Translator: Erwin Dieterich
+ <erwin.dieterich.ed@bayer-ag.de>
+
+Currently supported programs in test/ are:
+
+ ftlint
+ ftdump
+ fterrtest
+
+
+2) Using gettext (user's view)
+
+Using gettext as an end user is very simple. If FreeType is
+correctly installed on your computer, you can simply issue an
+"export LANG=<language id>" in your Bourne shell or "setenv
+LANG=<language id>" if you are using csh. That's all. In order to
+switch back to English, just use "export LANG=" or "setenv LANG=".
+<language id> is a two character code describing your language:
+de=German, fr=French etc. Every supported language has its own
+<language id>.po file in the po/ directory of FreeType. If your
+language is not there you should consider contributing a
+translation. Just e-mail me. Here is a transcript of what "export
+LANG=<language id>" does:
+
+ test> ftlint 24 furiosot.ttf
+ furiosot.ttf: Could not find or open file.
+ FreeType error message: OS/2 table missing.
+
+ test> export LANG=de
+ test> ftlint 24 furiosot.ttf
+ furiosot.ttf: Datei konnte nicht gefunden oder geöffnet werden.
+ FreeType Fehlermeldung: OS/2-Tabelle fehlt.
+
+ test> export LANG=
+ test> ftlint 24 furiosot.ttf
+ furiosot.ttf: Could not find or open file.
+ FreeType error message: OS/2 table missing.
+
+Doesn't this look good? But what if nothing happens when you set
+LANG? Here are some hints:
+
+First: Is your language really supported? If it is, you need to be
+sure that you have gettext() installed (if you are sitting at a
+Linux box, chances are very good that you have). If you compiled
+FreeType yourself and nothing strange happened, then your version of
+FreeType has NLS compiled in, as this is the default, unless you
+forgot to install the translation files in the right places ("make
+install" in the po/ directory should be enough, but you need root
+permissions as these files are installed somewhere in /usr/local) --
+good luck :-)
+
+
+3) Using gettext (programmer's view)
+
+If you intend to use NLS in your program, you just need to make a
+few simple changes. Here I only describe how NLS is enabled in the
+programs that come with FreeType in test/. If you'd like to add NLS
+to other programs using FreeType as well, take a look at FreeType's
+installation files; you can probably use these files as a model.
+
+Every string that should be translated needs gettext() around it.
+So
+
+ Message("Usage: %s fontname[.ttf|.ttc]\n\n", execname);
+
+becomes
+
+ Message(gettext("Usage: %s fontname[.ttf|.ttc]\n\n"), execname);
+
+
+Yes, it's that simple. Next you need to initialize gettext. You
+need this in the header section of your file:
+
+ #include "ft_conf.h"
+ #ifdef HAVE_LIBINTL_H
+ #include <libintl.h>
+ #endif
+
+ #ifndef HAVE_LIBINTL_H
+ #define gettext(x) (x)
+ #endif
+
+and this at the very beginning of your main program:
+
+ #ifdef HAVE_LIBINTL_H
+ setlocale(LC_ALL, "");
+ bindtextdomain("freetype", LOCALEDIR);
+ textdomain("freetype");
+ #endif
+
+
+That's all. Just have a look at fterror.c in test/.
+
+
+4) Using gettext (maintainer's view)
+
+I am too lazy today :-) If something isn't clear, just ask me .
+
+
+5) How can I switch off NLS, I don't need/want it.
+
+Just say "configure --disable-nls" and recompile FreeType.
+
+
+If you have any questions or comments regarding this short
+introduction to NLS & FreeType, feel free to email me at
+Erwin.Dieterich.ED@Bayer-AG.de.
+
+
+--- END ---
diff --git a/xc/extras/FreeType/docs/image/baselin2.gif b/xc/extras/FreeType/docs/image/baselin2.gif
new file mode 100644
index 000000000..b9c28bd65
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/baselin2.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/baseline.gif b/xc/extras/FreeType/docs/image/baseline.gif
new file mode 100644
index 000000000..f966ad218
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/baseline.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/emsquare.gif b/xc/extras/FreeType/docs/image/emsquare.gif
new file mode 100644
index 000000000..21dcfb34e
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/emsquare.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/freetype.gif b/xc/extras/FreeType/docs/image/freetype.gif
new file mode 100644
index 000000000..8be6d2153
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/freetype.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/freetype.png b/xc/extras/FreeType/docs/image/freetype.png
new file mode 100644
index 000000000..d520046fe
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/freetype.png
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/grid1.gif b/xc/extras/FreeType/docs/image/grid1.gif
new file mode 100644
index 000000000..db15e23cf
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/grid1.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/grid2.gif b/xc/extras/FreeType/docs/image/grid2.gif
new file mode 100644
index 000000000..d0d952960
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/grid2.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/grid3.gif b/xc/extras/FreeType/docs/image/grid3.gif
new file mode 100644
index 000000000..5b8035daf
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/grid3.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/metrics.gif b/xc/extras/FreeType/docs/image/metrics.gif
new file mode 100644
index 000000000..b8813b410
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/metrics.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/metrics2.gif b/xc/extras/FreeType/docs/image/metrics2.gif
new file mode 100644
index 000000000..1366ef237
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/metrics2.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/small2.gif b/xc/extras/FreeType/docs/image/small2.gif
new file mode 100644
index 000000000..25f6afe83
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/small2.gif
Binary files differ
diff --git a/xc/extras/FreeType/docs/image/tfp-back.png b/xc/extras/FreeType/docs/image/tfp-back.png
new file mode 100644
index 000000000..53be67191
--- /dev/null
+++ b/xc/extras/FreeType/docs/image/tfp-back.png
Binary files differ
diff --git a/xc/extras/FreeType/docs/porting.txt b/xc/extras/FreeType/docs/porting.txt
new file mode 100644
index 000000000..90e7b753f
--- /dev/null
+++ b/xc/extras/FreeType/docs/porting.txt
@@ -0,0 +1,1078 @@
+
+
+ The FreeType Porting Guide
+
+ or
+
+ Everything you need to know to make FreeType
+ run on the weirdest system
+
+
+ David Turner - version 1.0 - 28 march 1998
+
+--------------------------------------------------------------------
+
+ Table of Contents
+
+
+ Introduction
+
+ I. General design and system modules
+
+ II. Memory component API
+
+ 1. The alloction function: TT_Alloc()
+ 2. The release function: TT_Free()
+ 3. The ALLOC() and ALLOC_ARRAY() macros
+ 4. The MEM_xxxx() macros
+
+ III. File component API
+
+ 1. Streams and their functions
+ 2. Frames and file access
+ 3. Differences in thread support levels
+
+ IV. Mutex component API
+
+ V. Summary & Advanced concepts
+
+ 1. Porting summary
+ 2. Exotic filesystems
+
+ VI. Troubleshooting
+
+ Conclusion
+
+
+--------------------------------------------------------------------
+
+Introduction:
+
+The FreeType engine is portable in many ways:
+
+- First, it can be compiled by any ANSI C compliant compiler, which
+ guarantees the widest possible uses.
+
+- Its default build uses a tiny fraction of the ANSI libc, mainly
+ for memory management and I/O access, which should be available on
+ most systems (i.e., malloc(), free(), fopen(), fread(), etc).
+
+- Its design is modular, and allows an implementer to remove all
+ dependencies on a particular runtime environment, to adapt the
+ engine to its specific needs.
+
+ (For example, it is possible to use memory-mapped files on systems
+ which support them.)
+
+This document explains the engine's design, presenting the "system"
+modules that need to be changed by porters of the library, as well
+as how to do it.
+
+Note that this documentation is _very_ detailed, and you may
+DIRECTLY JUMP to SECTION V (Summary and advanced concepts) which
+gives you a QUICK STEP-BY-STEP GUIDE TO PORTING each component,
+without the need to understand all the guts of the TrueType engine.
+
+Several issues are discussed, including the use of exotic font
+storage conventions.
+
+--------------------------------------------------------------------
+
+I. General design, and system modules:
+
+ The engine's design is intentionally highly modular. It is made
+ of several "components", each with its own specific goals. Three
+ of these play an important role with regards to portability. They
+ are:
+
+ - the memory component:
+
+ Found in the files 'ttmemory.h' and 'ttmemory.c'. It defines
+ several macros and a few functions used by _all_ other modules
+ to allocate, release, copy, and move memory blocks.
+
+ - the file component:
+
+ Found in the files 'ttfile.h' and 'ttfile.c'. It defines
+ several types and abstractions (streams, frames), that are used
+ by _all_ other modules to access font files.
+
+ - the mutex component:
+
+ This component compiles to a null object when the engine is
+ built in single-thread mode. Otherwise, for thread-safe and
+ reentrant builds, the macros and functions it defines are used
+ by the rest of the engine to protect shared variables.
+
+ NOTE:
+
+ Because the ANSI libc doesn't provide synchronisation
+ primitives, (synchronisation isn't portable accross
+ platforms), the default implementation, found in 'ttmutex.c',
+ is made of dummy functions which always return a successful
+ error condition.
+
+ You _need_ to re-define this component for your system if you
+ decide to make a thread-safe or reentrant build, even if you
+ use the ANSI libc.
+
+
+ When specializing a component, i.e., rewriting it for your
+ platform, you should respect a few conventions which are explained
+ in the following sections. Note also that the system-specific
+ implementations are usually placed in the
+ "freetype/lib/arch/<system>" directory. For example:
+
+ freetype/lib/arch/unix/ttmmap.c
+
+ A Unix-only implementation of ttfile which uses the
+ memory-mapped file API (this greatly improves the engine's
+ performance, due to the random access pattern typicals of
+ glyph data retrieval).
+
+ freetype/lib/arch/os2/os2file.c
+
+ This is an implementation of ttfile specific to OS/2, which
+ directly calls the system functions DosOpen(), DosRead(), etc.
+
+ The FreeType/2 DLL (a free TrueType font driver for OS/2) also
+ uses its own memory component, which calls a special
+ allocation routine required in its runtime environment, and
+ also provides additional statistics than can be displayed by
+ an auxiliary tool while the driver is running in the system.
+
+We ask you to respect this directory convention. This really needs
+a minor Makefile change, and still having the ability to compile the
+"default" ttfile and ttmemory will help you debug your specific
+ports by easy comparisons.
+
+
+---------------------------------------------------------------------------
+
+
+II. Memory component API:
+
+ This section presents the macros and functions defined in
+ ttmemory.h, and how they should be implemented, if you decide to
+ rewrite the source file ttmemory.c from scratch. An easier
+ solution would be to replace the calls to malloc() and free() with
+ your own functions, though.
+
+
+1. Allocation routine : TT_Alloc()
+
+ This function is used to allocate blocks of memory, just like
+ malloc(), but defines a very different interface. Its prototype
+ is:
+
+ TT_Error TT_Alloc( long size, void** p );
+
+ [The FreeType source files use abstract data types like `Long' for
+ all internal functions and `TT_Long' for externally visible
+ structures. See tttypes.h and freetype.h, respectively.]
+
+ We can see that:
+
+ - The function returns an error code, and _not_ a pointer. The
+ reason for this is that your own implementation may perfectly
+ fail for more than one good reason. For example, it could
+ detect a corrupted heap, a memory exhaustion or an unusually
+ large block, and have a different error code for each of these
+ cases.
+
+ When a memory allocation error occurs in a FreeType function, it
+ is always taken into account (of course, for safety reasons),
+ but its code is directly sent to the caller. This means that
+ your own applications and font servers will be able to interpret
+ these errors, and let you handle them appropriately.
+
+ - Its second argument is the _address_ of a typeless pointer.
+ This means the need to typecast it before calling this function.
+
+ The macro MEM_Alloc() is defined in ttmemory.h to do it for you,
+ as well as the "memory extraction" performed by the '&'
+ operator, so that you can write:
+
+ {
+ char* buffer;
+ MEM_Alloc( size, buffer );
+
+ instead of
+
+ TT_Alloc( size, (void**)&buffer );
+ ...
+ }
+
+ Note that the engine _never_ uses this macro directly, but
+ ALLOC() instead (see below) in order to _always_ test the error
+ code.
+
+ *****************
+ *** IMPORTANT ***
+ *****************
+
+ - A newly allocated block should _always_ be filled with zeroes!
+ This is a _very_ strong convention used within all the engine.
+ It helps greatly reduce code size, in general. If your
+ implementation of TT_Alloc() doesn't respect it, you're pretty
+ certain to build an unrunnable (at best) or (worse) instable
+ engine! Beware.
+
+
+2. Release routine: TT_Free()
+
+ This routine is naturally used to release any block created
+ through TT_Alloc(). Its prototype is:
+
+ TT_Error TT_Free( void** P );
+
+ We can see that:
+
+ - It also returns an error code. Note, however, that the error is
+ ignored in most, if not all, parts of the engine. This is
+ because frees usually happen when all necessary work has been
+ finished, or when something already wrong happened.
+
+ A later implementation of FreeType (2.0?) may change the return
+ type of this function, but this is unlikely.
+
+ - It takes the address of a typeless-pointer, and _not_ the
+ pointer's value itself. This is used to set the pointer's value
+ to NULL just after the block was released, which avoids dangling
+ references in objects. Of course, there is a macro defined to
+ simplify source writing. One can use FREE() like:
+
+ {
+ char* buffer;
+
+ MEM_Alloc( size, buffer );
+
+ .... work ....
+
+ FREE( buffer );
+
+ /* now `buffer' values to NULL, the following line will */
+ /* seg-fault */
+
+ a = buffer[0];
+ }
+
+ *****************
+ *** IMPORTANT ***
+ *****************
+
+ - the function TT_Free() (and thus the macro FREE()) will accept a
+ NULL pointer succesfully! This means more precisely the address
+ of a pointer having the value NULL; in this case it will return
+ with a successful error code (TT_Err_Ok == 0).
+
+ This convention is also _very_ strong in the engine, and
+ simplifies both code size and style. One of its primary origin
+ is the engine's object management which requires the ability to
+ release an object, be it normal or "partial", with the same
+ code.
+
+
+3. The ALLOC() and ALLOC_ARRAY() macros:
+
+ Two macros are also defined to make the FreeType source code
+ easier to read and understand. Their role is to perform an
+ allocation, while saving the error condition in an _implicit_
+ local variable called "error" and returning a boolean which is set
+ to true in case of error. Their definition is
+
+ #define ALLOC( pointer, size ) \
+ ( ( error = MEM_Alloc( pointer, size ) ) != TT_Err_Ok )
+
+ and
+
+ #define ALLOC_ARRAY( pointer, count, type ) \
+ ( ( error = MEM_Alloc( pointer, \
+ (count) * sizeof ( type ) ) ) \
+ != TT_Err_Ok )
+
+ They are always used in "if" statements, and can be chained
+ together. Here is some example code:
+
+ {
+ char* buffer1 = 0; /* temporary buffer 1 */
+ char* buffer2 = 0; /* temporary buffer 2 */
+ TT_Error error;
+
+ ...
+
+ if ( ALLOC_ARRAY( buffer1, n, TT_F26Dot6 ) ||
+ ALLOC_ARRAY( buffer2, n, short ) )
+ goto Fail;
+
+ ... work ...
+
+ Fail:
+ FREE( buffer2 );
+ FREE( buffer1 );
+ return error;
+ }
+
+ Note:
+
+ - If an error occurs during the first alloc, execution will jump
+ immediately to the "Fail" label.
+
+ - The failure code, which releases the buffers, doesn't need to
+ differentiate whether the first allocation succeeded or not
+ (simply because FREE() accepts null pointers with no
+ problems).
+
+ The equivalent code, without macros, would be:
+
+ {
+ char* buffer1;
+ char* buffer2;
+ TT_Error error;
+
+ error = TT_Alloc( n * sizeof ( TT_F26Dot6 ),
+ (void**)&buffer1 );
+ if ( error ) goto Fail_Buffer1;
+
+ error = TT_Alloc( n * sizeof ( short ),
+ (void**)&buffer2 );
+ if ( error ) goto Fail_Buffer2;
+
+ .... work ....
+
+ Fail_Buffer2:
+ TT_Free( (void**)&buffer2 );
+
+ Fail_Buffer1:
+ TT_Free( (void**)&buffer1 );
+ }
+
+ Which is a lot less clear about its intents, and uses more special
+ cases.
+
+
+4. The MEM_xxxx() macros:
+
+ Finally, three macros are defined to perform some common memory
+ block operations. Their names are rather explicative:
+
+ - MEM_Copy():
+
+ Used by the engine to copy one block of data in memory to
+ another one.
+
+ - MEM_Set():
+
+ Used to set all bytes of a block of memory to a given value.
+
+ - MEM_Move():
+
+ Well, guess what ;-)
+
+
+ These operations could have been embedded in functions like
+ TT_Mem_Copy(), TT_Mem_Set(), and TT_Mem_Move(), but a lot of
+ compilers are able to inline directly calls to such "intrinsic"
+ functions as memcpy() and memmove(). Hence, macros make sense
+ here.
+
+
+---------------------------------------------------------------------------
+
+
+III. File Component API:
+
+
+ This section describes the file component's API, and the things
+ that are needed to port it to a specific system. Note that only a
+ fraction of the source code in "ttfile.c" needs to be rewritten
+ during a port.
+
+
+1. Streams and their functions:
+
+ A stream in FreeType (1.0 and 1.1) encapsulates both the
+ location/naming of a file, and its access. This is due to the
+ fact that they were originally designed to embed a simple ANSI
+ "FILE*" file pointer.
+
+ This means several things:
+
+ - A stream is created and opened via the TT_Open_Stream()
+ function. It takes, in the default build, a font pathname of
+ type `char*' that it uses when calling fopen().
+
+ - It can be released/closed via the function TT_Close_Stream().
+
+ - It embeds a "current file position", just like an ordinary file
+ descriptor. It is thus seekable, through the function
+ TT_Seek_File().
+
+ - Raw data can be extracted from a stream through TT_Read_File()
+ and TT_Read_At_File().
+
+ However, it has certain properties that differ from a libc FILE*:
+
+ - Because each face object has its own stream, and because most
+ operating systems limit the number of opened system resources in
+ each process, it is more than helpful to be able to "flush" a
+ stream.
+
+ A stream is said to be flushed when the system resource it
+ contains (like a file descriptor) has been closed. However,
+ this resource is re-opened automatically when needed.
+
+ The function TT_Flush_Stream() is used to flush a stream. When
+ a stream has been flushed, it is also said to be "asleep".
+
+ - The engine calls TT_Use_Stream() before each new stream access.
+ With it, the file component is able to awake (or 'activate')
+ streams that are flushed, if needed.
+
+ - Consequently, the engine calls TT_Done_Stream() when it has
+ performed all I/O access. These two APIs (TT_Use_Stream() and
+ TT_Done_Stream()) let the file component track and manage the
+ engine's access patterns, and allows it to cache opened streams
+ more cleverly.
+
+ For example, one could implement an LRU list used to track the
+ "oldest" streams, and only activate the 10 "freshest" ones, thus
+ limiting the total number of system stream resources used by the
+ library, independently of the total number of opened faces in
+ the engine.
+
+
+2. Frames and file access
+
+ In order to resolve endianess and alignment issues, the engine
+ uses the concept of "frames" to extract data from a TrueType
+ table. It works like:
+
+ - A frame is simply a sequence of successive bytes, taken from a
+ stream from its current position. A frame can only exist within
+ a stream.
+
+ - The function TT_Access_Frame() (ideally) reads its data and
+ places it in an intermediate buffer, which is later used for
+ parsing. This function also checks that the whole frame fits
+ within the original file. For example, it will return an error
+ when detecting "over-reads" in the file (which can happen if the
+ font file is broken).
+
+ Note that the intermediate buffer disappears in the case of
+ memory-mapped files.
+
+ - Each frame has an internal cursor, which is set to its buffer's
+ base by the previous function. Note, however, that it differs
+ from the stream's current position, which has been advanced once
+ TT_Acess_Frame() is completed.
+
+ - Data is extracted from the frame through calls to functions of
+ the form:
+
+ TT_Get_<IntegerType>();
+
+ where <IntegerType> can be any of: Byte (unsigned char), Char
+ (signed char), Short, UShort, Long, or ULong.
+
+ Each function returns the integer below the current frame
+ cursor, and advances the latter in the buffer.
+
+ - Finally, when the frame access ends, the engine calls the
+ TT_Forget_Frame() function, which will release the intermediate
+ buffer and set the cursor to NULL.
+
+ Here is a typical frame read sequence:
+
+ {
+ /* first - read the next 12-bytes frame in memory */
+ error = TT_Access_Frame( 12 );
+ if ( error )
+ return error;
+
+ /* now, extract all data */
+ object->field1 = TT_Get_Short();
+ object->field2 = TT_Get_Long();
+ object->field3 = TT_Get_Char();
+ object->filed4 = TT_Get_Long();
+ object->field5 = TT_Get_Byte();
+
+ /* done - now release the frame */
+ TT_Forget_Frame();
+
+ /* now perform some checks */
+ if ( object->field1 == -1 )
+ return Error_1;
+
+ if ( object->field2 > object->field4 )
+ return Error_2;
+
+ ....
+ }
+
+
+ *****************
+ *** IMPORTANT ***
+ *****************
+
+ A few things need to be noticed by porters when they implement
+ frame loading (i.e., the TT_Access_Frame() function):
+
+ - The functions that need to be ported are really
+ TT_Access_Frame() and TT_Forget_Frame(). The TT_Get_XXXX()
+ functions should be left as is.
+
+ - A frame has state, and must _always_ be released through
+ TT_Forget_Frame() in case of an error. This means that the
+ engine will _never_ use code like the following:
+
+ {
+ ...
+
+ error = TT_Access_Frame( 12 );
+ if ( error )
+ goto Fail;
+
+ object->field1 = TT_Get_Short();
+
+ /* now check error and return immediately -- */
+ /* WITHOUT RELEASING FRAME ! */
+ if ( object->field1 == -1 )
+ goto Fail;
+
+ object->field2 = TT_Get_Long();
+ object->field3 = TT_Get_Char();
+ object->field4 = TT_Get_Long();
+
+ /* check for error, return immediately -- */
+ /* WITHOUT RELEASING FRAME! */
+ if ( object->field2 > object->field4 )
+ goto Fail;
+
+ /* now release frame */
+ TT_Forget_Frame();
+ }
+
+ This means more simply that EACH successful call to
+ TT_Access_Frame() will ALWAYS be followed by a call to
+ TT_Forget_Frame()!
+
+ - As a consequence of the first rule, and also in order to keep
+ things simple, NESTING FRAME ACCESSES aren't allowed. For
+ example, the following code will produce an error:
+
+ {
+ ...
+
+ /* First frame access */
+ error = TT_Access_Frame( 8 );
+ if ( error )
+ goto Fail;
+
+ /* read a file offset */
+ offset = TT_Get_Long();
+
+ /* seek and load another frame */
+ error = TT_File_Seek( stream, offset );
+ if ( error )
+ goto Fail;
+
+ error = TT_Access_Frame( 4 );
+ /* The function TT_Access_Frame detects nested calls */
+ /* and ALWAYS returns TT_Err_Nested_Frame_Access! */
+ if ( error )
+ goto Fail;
+
+ data1 = TT_Get_Long();
+
+ /* release second frame */
+ TT_Forget_Frame();
+
+ /* read next integer from the first frame */
+ data2 = TT_Get_Long();
+
+ /* release first frame */
+ TT_Forget_Frame();
+ }
+
+ This simplifies the work that needs to be done wen porting the
+ TT_Access_Frame() and TT_Forget_Frame() functions.
+
+
+3. Differences in thread support levels
+
+ The FreeType library can be built to three distinct thread-support
+ levels. This section will present each other, and show how this
+ translates within the ttfile.c source code.
+
+ a. Levels:
+
+ The three levels are:
+
+ - single thread:
+
+ No synchronization primitive is used to protect the data in
+ the file component. Hence, there is only one "current" stream
+ at any one time. Note, however, that in some cases, more than
+ one stream may be "active" (or "awakened"); e.g., when using
+ memory-mapped files, each opened face needs a valid mapping
+ before it can be used/parsed by the engine.
+
+ - thread-safe:
+
+ The thread safe mode synchronizes concurrent accesses to the
+ renderer's component through mutexes. For the file component,
+ this means a single mutex which is "locked" by a call to
+ TT_Use_Stream(), and "released" by TT_Done_Stream().
+
+ As a consequence, there is only one possible "current" stream
+ when the engine reads files, like in the single thread case.
+
+ - re-entrant:
+
+ In this mode, concurrent accesses are possible on many
+ components, including ttfile. This means that each
+ TT_Use_Stream() must _really_ create its own system/ANSI
+ stream for a single file, and that the file component _cannot_
+ have any state (only stream objects have!), like a "current
+ stream" and "current frame".
+
+ This mode must use mutexes to protect all shared variables and
+ lists from concurrent changes/reads. The only component which
+ is still serialized in this mode is the scan-line converter
+ (a.k.a. ttraster).
+
+ b. Implementation differences:
+
+ Because the TrueType engine serves more as a "font format
+ driver" than a general and high-level text-rendering library, it
+ has been decided to keep its code as simple and compact as
+ possible.
+
+ This implies some implementation differences between the three
+ thread modes, which are briefly explained below:
+
+ - Single-thread and thread-safe mode can have a state, which
+ means for ttfile.c, a "current stream" and "current frame".
+
+ - In the reentrant mode, the 'state' must be stored in a
+ thread-local place, which means the stack (or more simply
+ local function variables).
+
+ What follows is that some ttfile functions won't take the same
+ number of arguments depending on the thread-support mode. Let's
+ take the example of frame access and parsing:
+
+ In single-thread and thread-safe mode, the current frame is
+ automatically set by the TT_Access_Frame() function, which only
+ takes a 'size' argument to determine the run of bytes to extract
+ from the _current_stream_ within ttfile's state.
+
+ Moreover, the TT_Get_XXXX() functions extract data from the
+ current frame, and need no arguments. A simple frame access
+ then looks like this:
+
+ {
+ /* read the next 12-bytes frame from the _current_stream_ */
+ error = TT_Access_Frame( 12 );
+ if ( error )
+ return error;
+
+ /* now, extract all data from the _current_frame_ */
+ object->field1 = TT_Get_Short();
+ object->field2 = TT_Get_Long();
+ object->field3 = TT_Get_Char();
+ object->filed4 = TT_Get_Long();
+ object->field5 = TT_Get_Byte();
+
+ /* done - now release the current frame */
+ TT_Forget_Frame();
+ }
+
+ In reentrant mode, things are a bit different. The current
+ stream and current frame must be passed as parameters, and the
+ code looks like this (notice the new function parameters!):
+
+ {
+ TT_Frame frame; /* define a local variable to handle */
+ /* the current frame */
+
+ .... /* we suppose we already have a stream variable */
+ .... /* named 'stream' (how surprising ;-) */
+
+ /* read the next 12-bytes frame from a given stream */
+ error = TT_Access_Frame( stream, 12, &frame );
+ if ( error )
+ return error;
+
+ /* now, extract all data from the given frame */
+ object->field1 = TT_Get_Short( frame );
+ object->field2 = TT_Get_Long ( frame );
+ object->field3 = TT_Get_Char ( frame );
+ object->filed4 = TT_Get_Long ( frame );
+ object->field5 = TT_Get_Byte ( frame );
+
+ /* done - now release the current frame */
+ TT_Forget_Frame( frame );
+ }
+
+ The differences between these two schemes are striking. Though
+ an 'easy' solution would have been to only write the engine in
+ reentrant-mode, it would have resulted in a larger and slightly
+ slower code, as well as the source a bit more obscure about its
+ intents and thus harder to maintain. Also, the reentrant
+ version is only needed in rare cases and environments, and it
+ wasn't thought as a good idea to complexify _source_ code in
+ order to comply with rare uses.
+
+ The problem is solved within the engine by the use of a set of
+ carefully selected macros, which help generate both versions
+ from a _single_ source file.
+
+ Moreover, as the macros copy the non-reentrant syntax (i.e., the
+ use of the "stream" and "frame" parameters is implicit to the
+ macros), the source is kept clear and easy to understand, even
+ when compiled in re-entrant mode.
+
+ The code looks then like the following in the engine:
+
+ {
+ ...
+
+ /* read the next 12-bytes frame from the current stream */
+ /* assignement of the error code in the local 'error' */
+ /* variable is also implicit to the ACCESS_Frame macro, */
+ /* and its result is always a boolean (no ANSI warnings) */
+
+ if ( ACCESS_Frame( 12 ) )
+ goto Fail;
+
+ /* Now, extract all data from the current frame */
+ /* the macros GET_xxxxx use an implicit local 'frame' */
+ /* variable in reentrant mode. */
+
+ object->field1 = GET_Short();
+ object->field2 = GET_Long();
+ object->field3 = GET_Char();
+ object->filed4 = GET_Long();
+ object->field5 = GET_Byte();
+
+ /* done - now release the current frame */
+
+ FORGET_Frame();
+ }
+
+ What's also good is that the above code is "expressive" in the
+ sense that it really describes what's happening during the frame
+ load, hiding the boring but necessary details required by error
+ checking and reentrancy. And when the error checks are within
+ the macros, we're sure we won't forget them because they're "too
+ boring to code" (one of the reason why 'exceptions' caught so
+ quickly in C++ and Java).
+
+ c. Consequences on ttfile:
+
+ Of course, the macros only hide real differences in
+ implementation which must be reflected in ttfile.h and ttfile.c.
+ In order to ease this task, some other macros are used, which
+ use is reserved for these two files. There are:
+
+ STREAM_ARG
+ STREAM_ARGS
+ FRAME_ARG
+ FRAME_ARGS in ttfile.h
+
+ CUR_Stream
+ STREAM_VAR
+ STREAM_VARS
+ FRAME_VAR
+ FRAME_VARS in ttfile.c
+
+ All of these macros (with the exception of CUR_Stream) default
+ to nothing (i.e., a void macro) in single-thread and re-entrant
+ mode, which only differ from the use of a mutex lock and release
+ in the functions TT_Use_Stream() and TT_Done_Stream().
+ CUR_Stream defaults to the file component's current stream,
+ found in its internal state (as you can guess, it designates the
+ "current stream").
+
+ On the opposite, the macros are used to define additional function
+ parameters (when a function is called) and arguments (when calling
+ in a function). For example, the following (fictional) code:
+
+ /* return the size of a given stream */
+ long Stream_Size( STREAM_ARG )
+ {
+ return CUR_Stream.size;
+ }
+
+ expands to:
+
+ long Stream_Size()
+ {
+ return file_component.current_stream.size;
+ }
+
+ in non-reentrant mode, and to:
+
+ long Stream_Size( TT_Stream stream )
+ {
+ return (*stream).size;
+ }
+
+ otherwise.
+
+ Thus, we can see the following reentrant expansions:
+
+ STREAM_ARG --> TT_Stream stream
+ STREAM_ARGS --> TT_Stream stream, (note the comma)
+
+ FRAME_ARG --> TT_Frame frame
+ FRAME_ARGS --> TT_Frame frame, (note the comme too)
+
+ STREAM_VAR --> stream
+ STREAM_VARS --> stream,
+
+ FRAME_VAR --> frame
+ FRAME_VARS --> frame,
+
+ They follow these simple rules:
+
+ - An XXXX_ARG is used to define a single optional parameter in
+ a function _prototype_. The parameter is said to be single
+ when it is not followed by anything, e.g.
+
+ long Stream_Size( STREAM_ARG )
+
+
+ - An XXXX_ARGS is the same, followed a comma, in order to place
+ other (non-optional) parameters behind, e.g.
+
+ TT_Error Stream_Seek( STREAM_ARGS long pos )
+
+ - An XXXX_VAR is used, _only_ within ttfile.c, to _call_ a
+ function having an XXXX_ARG or XXXX_ARGS in its prototype
+ resp. declaration.
+
+ long Stream_Left( STREAM_ARG )
+ {
+ return ( Stream_Size( STREAM_VAR ) -
+ Stream_Pos( STREAM_VAR ) );
+ }
+
+ - An XXXX_VARS is the same, but can be followed by non-optional
+ parameters.
+
+ The macros allow you to write some code independently of the
+ thread level within ttfile.c.
+
+ *****************
+ *** IMPORTANT ***
+ *****************
+
+ In general, porters should not be concerned about the use of
+ these macros. One easy way to port is to take the ANSI code in
+ ttfile.c and modify only the parts that really access the system
+ (like fopen, fread, fseek, etc).
+
+ These details are explained here to make you understand how the
+ code works, in case you're interested in more elaborate ports.
+
+
+---------------------------------------------------------------------------
+
+
+IV. Mutex Component API:
+
+ As said before, the default library source code uses the ANSI libc
+ only, and the source code in ttmutex.c only contains dummy
+ functions which return a succesful error condition in all cases.
+
+ You thus NEED to specialize it in order to successfully use a
+ thread-safe or reentrant build. Here is explained what's really
+ important:
+
+
+1. the TMutex type:
+
+ The engine uses the "TMutex" type defined in ttmutex.h to handle
+ mutexes. It is only a typedef of a void* and should be kept that
+ way for the fastest porting.
+
+ Your job will most probably be to store a system mutex/semaphore
+ handle or pointer in it.
+
+
+2. the mutex macros and functions:
+
+ The interface file ttmutex.h defines several macros that are used
+ within the engine to protect all shared variables (like lists)
+ from concurrent accesses. All macros default to void (nothing) in
+ single thread mode, and to calls to the TT_Mutex_XXXX() functions
+ in multi-threaded modes.
+
+ These functions are:
+
+ o TT_Mutex_Create()
+
+ Which takes a TMutex address as an argument. It should place a
+ NULL pointer in this output variable in case of failure.
+
+ o TT_Mutex_Lock()
+
+ It also takes the address of a TMutex as an argument. Used to
+ lock the mutex/semaphore, of course.
+
+ o TT_Mutex_Release()
+
+ Guess what ;-) Same interface.
+
+ o TT_Mutex_Delete()
+
+ Destroys a mutex/semaphore.
+
+
+3. Redefining the TMutex type:
+
+ You can also get rid of the TT_Mutex_xxxx() functions if you want
+ to use your system's synchronization API. This can be done in two
+ simple steps:
+
+ a. Redefine the TMutex type to suit your system's handle types.
+
+ b. Redefine the MUTEX_xxxx() macros in order to call directly your
+ API in the case of multi-threaded builds.
+
+ Both methods (specializing the TT_Mutex_xxx() functions or
+ redefining the macros) are possible.
+
+
+--------------------------------------------------------------------------
+
+
+V. Summary and Advanced Concepts:
+
+1. Quick step-by-step guide to porting the system components:
+
+ a. Port the memory component:
+
+ o Look at the "ttmemory.h" file and change the macros
+ MEM_Copy(), MEM_Move(), and MEM_Set() to reflect your system's
+ API providing the equivalent functionality. The reason that
+ macros instead of functions are used there is that many
+ compilers are able to inline directly these functions within
+ your code.
+
+ o Look at the "ttmemory.c" file. Replace the single malloc()
+ call with your own allocation routine, and the single free()
+ with your own release routine. If your allocator uses more
+ sophisticated functions, you'll probably have to rewrite more
+ parts of this file. See section I above.
+
+ b. Port the mutex component:
+
+ o Look at the file "ttmutex.c" and specialize each routine to
+ have it use your system's synchronization API.
+
+ o For a more advanced port, you can also directly redefine the
+ definition of the TMutex type in ttmutex.h, as well as the
+ macro definitions (like MUTEX_Create(), MUTEX_Lock(), etc.) to
+ use directly your system's API. The TT_Mutex_xxxx() won't be
+ necessary then.
+
+ c. Port the file component:
+
+ o For a quick port, look at the following functions and replace
+ the ANSI libc calls (like fopen(), fclose(), fread(), etc.):
+
+ Stream_Activate(), Stream_Deactivate(), TT_Open_Stream(),
+ TT_Done_Stream(), TT_Seek_File(), TT_Skip_File(),
+ TT_Read_File(), and TT_File_Pos()
+
+ o If you plan to use memory-mapped files, you can have a look at
+ the Unix file component found in
+ "freetype/lib/arch/unix/ttmmap.c". It should give you an
+ indication of what to do.
+
+
+2. Exotic file systems and font resources:
+
+1. Other file naming conventions:
+
+ The high-level library uses the "TT_Text*" type to define the type
+ of characters used for a font file's pathname. By default, it
+ equals the "char*" type, which allow you to open a face object
+ with the following call:
+
+ error = TT_Open_Face( engine, "c:\fonts\times.ttf", &face );
+
+ The implementation of TT_Open_Face() passes directly the pathname
+ pointer to the internal TT_Open_Stream() function, located in the
+ file component, which really opens the file.
+
+ Some filesystems use different naming conventions, like UTF-16
+ code, where each character is coded in 16-bits. In order to help
+ them use FreeType, all you need to do is the following:
+
+ - Define the macro TT_HAVE_TT_TEXT.
+
+ - Define the type "TT_Text" to the character type you need, like
+ 'wchar_t' for Unicode.
+
+ Note that this should apply when compiling the FreeType library,
+ as well as WHEN INCLUDING THE FILE "freetype.h" IN YOUR
+ APPLICATIONS.
+
+ When the configuration macro TT_HAVE_TT_TEXT is not defined, the
+ file "freetype.h" defines TT_Text as "char*". You can read its
+ source code to see it more explicitly (look at the very first
+ lines of code).
+
+ You can also use TT_Text as a pointer to more specific files, like
+ a simple memory address when the font is located in ROM, etc.
+
+ Just synchronize the definition of TT_Text with the implementation
+ in ttfile.c!
+
+
+2. Font Resources:
+
+ FreeType 2.0 will feature many architectural changes that will
+ help make porting easier, especially with regards of the file
+ component.
+
+ To do this, it will separate the concepts of a "font resource",
+ i.e. a file seen as a storage, from a "font stream", i.e. a file
+ seen as a stream of data. Only the resource-wise code will be
+ visible to porters, and it will be much easier to port (for
+ example, nearly all thread-support levels issues will be treated
+ internally in the rest of the engine, and will be invisible to the
+ resource component).
+
+ We're sorry for the current design and state, but the TT_Stream
+ started as a simple encapsulation of an ANSI FILE* variable,
+ before font-specific access patterns made them become what they
+ now are.
+
+ FreeType 2.0 will be a good reason to re-design I/O access more
+ clearly, and fortunately with more power and flexibility (like
+ using easily files from different type, ROM-based, memory-mapped,
+ disk-based, in a single engine).
+
+ However, all of this doesn't mean than the current design doesn't
+ work. It does, so don't hesitate to use it :-)
+
+
+
+VI. Troubleshooting:
+
+ To be written
+
+
+
+Conclusion
+
+ To be written
+
+
+--- end of porting.txt ---
diff --git a/xc/extras/FreeType/docs/raster.doc b/xc/extras/FreeType/docs/raster.doc
new file mode 100644
index 000000000..2b3f81b98
--- /dev/null
+++ b/xc/extras/FreeType/docs/raster.doc
@@ -0,0 +1,578 @@
+This file is an attempt at explaining the internals of the FreeType
+rasterizer. This component is quite general purpose and could
+easily be integrated into other programs (but still under the
+current license).
+
+--------------------------------------------------------------------
+
+ HOWs and WHYs of the FreeType rasterizer
+
+ by David Turner
+
+
+ I. Introduction
+
+ II. Rendering Technology
+
+III. Implementation Details
+
+ IV. Gray-Level Support
+
+
+
+I. Introduction:
+
+ A rasterizer is a library in charge of converting a vectorial
+ representation of a shape into a bitmap. The FreeType rasterizer
+ has been developed to render the glyphs found in TrueType files,
+ made up of segments and second-order Beziers. This document is an
+ explanation of its design and implementation.
+
+ Though these explanations start from the basics, a knowledge of
+ common rasterization techniques is assumed.
+
+
+II. Rendering Technology:
+
+ 1. Requirements:
+
+ We will assume that all scaling/rotating/hinting/whatever have
+ been already done. The glyph is thus described, as in the
+ TrueType specification, by a list of points. Each point has an x
+ and y coordinate, as well as a flag that indicates whether the
+ point is _on_ or _off_ the curve.
+
+ More precisely:
+
+ - All point coordinates are in the 26.6 fixed float format as
+ defined by the specification. The orientation used is:
+
+ ^ y
+ | reference orientation
+ |
+ *----> x
+ 0
+
+ This means that the 'distance' between two neighbouring pixels
+ is 64 'units' (1 unit = 1/64th of a pixel).
+
+ Note that, for the rasterizer, pixel centers are located at
+ integer coordinates, i.e. (0.0, 0.0) is the coordinate of the
+ origin's center (unlike what happens within the TrueType
+ bytecode interpreter where this point's center lies at
+ (0.5, 0.5)).
+
+ A pixel line in the target bitmap is called a 'scanline'.
+
+
+ - A glyph is usually made of several contours, also called
+ outlines. A contour is simply a closed curve that delimits an
+ outer or inner region of the glyph. It is described by a
+ series of successive points of the points table.
+
+ Each point of the glyph has an associated flag that indicates
+ whether it is "on" or "off" the curve. Two successive "on"
+ points indicate a line segment joining the two points.
+
+ One "off" point amidst two "on" points indicates a second
+ degree Bezier parametric arc, defined by these three points
+ (the "off" point being the control point, and the "on" ones the
+ start and end points).
+
+ Finally, two successive "off" points forces the rasterizer to
+ create, during rendering, an "on" point amidst them, at their
+ exact middle. This greatly facilitates the definition of
+ successive Bezier arcs.
+
+ * # on
+ * off
+ __---__
+ #-__ _-- -_
+ --__ _- -
+ --__ # \
+ --__ #
+ -#
+ Two "on" points
+ Two "on" points and one "off" point
+ between them
+
+ *
+ # __ Two "on" points with two "off"
+ \ - - points between them. The point
+ \ / \ marked '0' is the middle of the
+ - 0 \ "off" points, and is a 'virtual'
+ -_ _- # "on" point where the curve passes.
+ -- It does not appear in the point
+ * list.
+
+
+ The FreeType rasterizer, as intended to render TrueType glyphs,
+ does not support third order Beziers, usually found in Type 1
+ fonts. Type 1 support may lead to further development of the
+ engine.
+
+ The parametric form of a second-order Bezier is:
+
+ P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3
+
+ with t a real number in the range [0..1]
+
+ P1 and P3 are the endpoints, P2 the control point.
+
+ Note that the rasterizer does not use this formula. It
+ exhibits, however, one very useful property of Bezier arcs:
+ each point of the curve is a weighted average of the control
+ points.
+
+ As all weights are positive and always sum up to 1, whatever
+ the value of t, each arc point lies within the triangle defined
+ by the arc's three control points.
+
+
+ 2. Profiles and Spans:
+
+ The following is a basic explanation of the _kind_ of
+ computations made by the rasterizer to build a bitmap from a
+ vector representation. Note that the actual implementation is
+ slightly different, due to performance tuning and other factors.
+
+ However, the following ideas remain in the same category, and are
+ more convenient to understand.
+
+
+ a. Sweeping the shape:
+
+ The best way to fill a shape is to decompose it into a number
+ of simple horizontal segments, then turn them on in the target
+ bitmap. These segments are called 'spans'.
+
+ __---__
+ _-- -_
+ _- -
+ - \
+ / \
+ / \
+ | \
+
+ __---__ Example: filling a shape
+ _----------_ with spans.
+ _--------------
+ ----------------\
+ /-----------------\ This is typically done from the top
+ / \ to the bottom of the shape, in a
+ | | \ movement called a "sweep".
+ V
+
+ __---__
+ _----------_
+ _--------------
+ ----------------\
+ /-----------------\
+ /-------------------\
+ |---------------------\
+
+
+ In order to draw a span, the rasterizer must compute its
+ coordinates, which are simply the shape's contours'
+ x-coordinates taken on the y scanlines.
+
+
+ /---/ |---| Note that there are usually several
+ /---/ |---| spans per scanline.
+ | /---/ |---|
+ | /---/_______|---| When rendering this shape to the
+ V /----------------| current scanline y, we must compute
+ /-----------------| the x values of the points a, b, c,
+ a /----| |---| and d.
+- - - * * - - - - * * - - y -
+ / / b c| |d
+
+
+ /---/ |---|
+ /---/ |---| And then turn on the spans a-b and c-d.
+ /---/ |---|
+ /---/_______|---|
+ /----------------|
+ /-----------------|
+ a /----| |---|
+- - - ####### - - - - ##### - - y -
+ / / b c| |d
+
+
+
+ b. Decomposing outlines into profiles:
+
+ For each scanline during the sweep, we need the following
+ information:
+
+ o The number of spans on the current scanline, given by the
+ number of shape points intersecting the scanline (these are
+ the points a, b, c, and d in the above example).
+
+ o The x coordinates of these points.
+
+ These are computed before the sweep, in a phase called
+ 'decomposition' which converts the glyph into *profiles*.
+
+ Put it simply, a "profile" is a contour's portion that can only
+ be either ascending or descending, i.e., it is monotonic in the
+ vertical direction (we will also say Y-monotonic). There is no
+ such thing as a horizontal profile, as we shall see.
+
+ Here are a few examples:
+
+
+ this square
+ 1 2
+ ---->---- is made of two
+ | | | |
+ | | profiles | |
+ ^ v ^ + v
+ | | | |
+ | | | |
+ ----<----
+
+ up down
+
+
+ this triangle
+
+ P2 1 2
+
+ |\ is made of two | \
+ ^ | \ \ | \
+ | | \ \ profiles | \ |
+ | | \ v ^ | \ |
+ | \ | | + \ v
+ | \ | | \
+ P1 ---___ \ ---___ \
+ ---_\ ---_ \
+ <--__ P3 up down
+
+
+
+ A more general contour can be made of more than
+ two profiles:
+
+ __ ^
+ / | / ___ / |
+ / | / | / | / |
+ | | / / => | v / /
+ | | | | | | ^ |
+ ^ | |___| | | ^ + | + | + v
+ | | | v | |
+ | | | up |
+ |___________| | down |
+
+ <-- up down
+
+
+ Successive profiles are always joined by horizontal segments
+ that are not part of the profiles themselves.
+
+ Note that for the rasterizer, a profile is simply an _array_
+ that associates one horizontal *pixel* coordinate to each
+ bitmap *scanline* crossed by the contour's section containing
+ the profile. Note also that profiles are *oriented* up or down
+ along the glyph's original flow orientation.
+
+ In other graphics libraries, profiles are also called 'edges'
+ or 'edgelists'.
+
+
+ c. The Render Pool:
+
+ FreeType has been designed to be able to run well on _very_
+ light systems, including embedded systems with very few memory.
+
+
+ A render pool will be allocated once; the rasterizer uses this
+ pool for all its needs by managing this memory directly in it.
+ The algorithms that are used for profile computation make it
+ possible to use the pool as a simple growing heap. This means
+ that this memory management is actually easy, and faster than
+ any kind of malloc()/free() combination.
+
+ Moreover, we'll see later that the rasterizer is able, when
+ dealing with profiles too large and numerous to lie all at once
+ in the render pool, to immediately decompose recursively the
+ rendering process into independent sub-tasks, each taking less
+ memory to be performed (see "sub-banding" below).
+
+ The render pool doesn't need to be large. A 4kByte pool is
+ enough for nearly all renditions, though nearly 100% slower
+ than a more confortable 16 or 32kByte pool (that was tested
+ with complex glyphs at sizes over 500 pixels).
+
+
+ d. Computing Profiles Extents:
+
+ Remember that a profile is an array, associating a _scanline_
+ to the x pixel coordinate of its intersection with a contour.
+
+ Though it's not exactly how the FreeType rasterizer works, it
+ is convenient to think that we need a profile's height before
+ allocating it in the pool and computing its coordinates.
+
+ The profile's height is the number of scanlines crossed by the
+ Y-monotonic section of a contour. We thus need to compute
+ these sections from the vectorial description. In order to do
+ that, we are obliged to compute all (local and global)
+ Y-extrema of the glyph (minima and maxima).
+
+
+ P2 For instance, this triangle has only
+ two Y-extrema, which are simply
+ |\
+ | \ P2.y as an Y-maximum
+ | \ P3.y as an Y-minimum
+ | \
+ | \ P1.y is not an Y-extremum (though it is
+ | \ a X-minimum, which we don't need).
+ P1 ---___ \
+ ---_\
+ P3
+
+ Note that the extrema are expressed in pixel units, not in
+ scanlines. The triangle's height is certainly (P3.y-P2.y+1)
+ pixel units, but its profiles' heights are computed in
+ scanlines. The exact conversion is simply:
+
+ - min scanline = FLOOR ( min y )
+ - max scanline = CEILING( max y )
+
+ A problem arises with Bezier Arcs. While a segment is always
+ necessarily Y-monotonic (i.e., flat, ascending, or descending),
+ which makes extrema computations easy, the ascent of a arc can
+ vary between its control points.
+
+ P2
+ *
+ # on
+ * off
+ __-x--_
+ _-- -_
+ P1 _- - A non Y-monotonic Bezier arc.
+ # \
+ - The arc goes from P1 to P3.
+ \
+ \ P3
+ #
+
+ We first need to be able to easily detect non-monotonic arcs,
+ according to their control points. I will state here, without
+ proof, that the monotony condition can be expressed as:
+
+ P1.y <= P2.y <= P3.y for an ever-ascending arc
+
+ P1.y >= P2.y >= P3.y for an ever_descending arc
+
+ with the special case of
+
+ P1.y = P2.y = P3.y where the arc is said to be 'flat'.
+
+ As you can see, these conditions can be very easily tested.
+ They are, however, extremely important, as any arc that does
+ not satisfy them necessarily contains an extremum.
+
+ Note also that a monotonic arc can contain an extremum too,
+ which is then one of its 'on' points:
+
+ P1 P2
+ #---__ * P1P2P3 is ever-descending, but P1
+ -_ is an Y-extremum.
+ -
+ ---_ \
+ -> \
+ \ P3
+ #
+
+
+ Let's go back to our previous example:
+
+ P2
+ *
+ # on
+ * off
+ __-x--_
+ _-- -_
+ P1 _- - A non Y-monotonic Bezier arc.
+ # \
+ - here we have
+ \ P2.y >= P1.y &&
+ \ P3 P2.y >= P3.y (!)
+ #
+
+ We need to compute the y-maximum of this arc to be able to
+ compute a profile's height (the point marked by an 'x'). The
+ arc's equation indicates that a direct computation is possible,
+ but we'll rely on a different technique, which use will become
+ apparent a bit later...
+
+
+ Bezier arcs have the special property of being very easily
+ decomposed into two other sub-arcs, which are themselves
+ Beziers arcs. Moreover, it is easy to prove that there is at
+ most one Y-extremum on each Bezier arc (for second degree
+ ones).
+
+ For instance, the following arc P1P2P3 can be decomposed into
+ two sub-arcs Q1Q2Q3 and R1R2R3 that look like:
+
+ P2
+ *
+ # on curve
+ * off curve
+
+
+ Original Bezier Arc P1P2P3
+ __---__
+ _-- --_
+ _- -_
+ - -
+ / \
+ / \
+ # #
+ P1 P3
+ P2
+ *
+
+
+
+ Q3 Decomposed into two subarcs
+ Q2 R2
+ * __-#-__ * Q1Q2Q3 and R1R2R3 with
+ _-- --_
+ _- R1 -_ Q1 = P1 R3 = P3
+ - - Q2 = (P1+P2)/2 R2 = (P2+P3)/2
+ / \
+ / \ Q3 = R1 = (Q2+R2)/2
+ # #
+ Q1 R3 Note that Q2, R2, and Q3=R1
+ are on a single line which is
+ tangent to the curve.
+
+ We have then decomposed a non-Y-monotonic bezier into two
+ smaller sub-arcs. Note that in the above drawing, both sub-arcs
+ are monotonic, and that the extremum is then Q3=R1. However, in
+ a more general case, only one sub-arc is guaranteed to be
+ monotonic. Getting back to our former example:
+
+ Q2
+ *
+
+ __-x--_ R1
+ _-- #_
+ Q1 _- Q3 - R2
+ # \ *
+ -
+ \
+ \ R3
+ #
+
+
+ Here, we see that, though Q1Q2Q3 is still non-monotonic, R1R2R3
+ is ever descending: we thus know that it doesn't contain the
+ extremum. We can then re-subdivide Q1Q2Q3 into two sub-arcs,
+ and go on recursively, stopping when we encounter two monotonic
+ subarcs, or when the subarcs become simply too small.
+
+ We will finally find the y-extremum. Note that the iterative
+ process of finding an extremum is called 'flattening'.
+
+
+ e. Computing Profiles coordinates:
+
+ Once we have the height of each profile, we're able to allocate
+ it in the render pool. We now have to compute its coordinate
+ for each scanline.
+
+ In the case of segments, the computation is straightforward, and
+ uses good old Euclide (also known as Bresenham ;-). However,
+ for Bezier arcs, things get a little more complicated.
+
+ We assume that all Beziers that are part of a profile are the
+ result of 'flattening' the curve, which means that they're all
+ y-monotonic (ascending or descending, and never flat). We now
+ have to compute the arcs' intersections with the profile's
+ scanlines. One way is to use a similar scheme to 'flattening',
+ called 'stepping'.
+
+ Consider this arc, going from P1 to
+ --------------------- P3. Suppose that we need to
+ compute its intersections with the
+ drawn scanlines. Again, this is
+ --------------------- feasible directly, if we dare
+ to compute one square root per
+ * P2 _---# P3 scanline (how great!).
+ ------------- _-- --
+ _-
+ _/ Rather, it is still possible to use
+ ---------/----------- the decomposition property in the
+ / same recursive way, i.e. subdivide
+ | the arc into subarcs until these
+ ------|-------------- get too small to cross more than
+ | one scanline!
+ |
+ -----|--------------- This is very easily done using a
+ | rasterizer-managed stack of
+ | subarcs.
+ # P1
+
+
+ f. Sweeping and Sorting the spans:
+
+ Once all our profiles have been computed, we begin the sweep to
+ build (and fill) the spans.
+
+ As the TrueType specification uses the winding fill rule, we
+ place on each scanline the profiles present in two separate
+ lists.
+
+ One list, called the 'left' one, only contains ascending
+ profiles, while the other 'right' list contains the descending
+ profiles.
+
+ As each glyph is made of closed curves, a simple geometric
+ property is that the two lists necessarily contain the same
+ number of elements.
+
+ Creating spans is there straightforward:
+
+ 1. We sort each list in increasing X order.
+
+ 2. We pair each value of the left list, with its
+ corresponding value in the right one.
+
+
+ / / | | For example, we have here four
+ / / | | profiles. Two of them are
+ >/ / | | | ascending (1 & 3), while the two
+ 1// / ^ | | | 2 others are descending (2 & 4).
+ // // 3| | | v
+ / //4 | | | On the given scanline, the left
+ a / /< | | list is (1,3) and the right one
+- - - *-----* - - - - *---* - - y - is (4,2) (sorted).
+ / / b c| |d
+ There are then two spans, joining
+ 1 to 4 (i.e. a-b) and 3 to 2
+ (i.e. c-d)!
+
+ Sorting doesn't necessarily take much time, as in 99 cases out
+ of 100, the lists' order is kept from one scanline to the next.
+ We can thus implement it with two simple singly-linked lists,
+ sorted by a classic bubble-sort, which takes a minimum amount of
+ time when the lists are already sorted.
+
+ A previous version of the rasterizer used more elaborate
+ structures, like arrays to perform 'faster' sorting. It turned
+ out that this old scheme is not faster than the one described
+ above.
+
+ Once the spans have been 'created', we can simply draw them in
+ the target bitmap.
+
+
+ g. Drop-out control:
+
+ /* to be continued */
diff --git a/xc/extras/FreeType/docs/readme.txt b/xc/extras/FreeType/docs/readme.txt
new file mode 100644
index 000000000..fa3a54b67
--- /dev/null
+++ b/xc/extras/FreeType/docs/readme.txt
@@ -0,0 +1,78 @@
+Welcome to the documentation directory.
+
+Most of the files here are obsolete or will undergo great changes!
+However, the following titles are up-to-date and useful:
+
+
+ ..................................................................
+
+ apiref.txt FreeType high-level API reference. All the types,
+ functions and error codes of FreeType
+
+ ..................................................................
+
+ user.txt FreeType's user guide. A guide to FreeType's
+ concepts, a step by step example, and a note about
+ future works and projects.
+
+ ..................................................................
+
+ FAQ The new up-to-date FreeType FAQ. Look here first if
+ you have problems with the library.
+
+ ..................................................................
+
+ convntns.txt The FreeType developer's conventions guide. Lists
+ the design and coding conventions used in the
+ engine's source code. This file is incomplete but
+ contains information that should be read by any
+ person willing to hack the FreeType code.
+
+ ..................................................................
+
+ porting.txt The FreeType porting guide. All you need to
+ configure and adapt very easily FreeType's source
+ code to tailor it to your own platform.
+
+ Learn how to provide your own memory, i/o and mutex
+ components, best fitted to your system. See how you
+ can build a singly-threaded, thread-safe or
+ re-entrant version of the engine from the same
+ source code!
+
+ ..................................................................
+
+ raster.doc The scan-line converter's internals explained. The
+ document is still incomplete but presents many key
+ concepts.
+
+
+Soon to come: These documents will probably come later.
+
+ ..................................................................
+
+ develop.txt The FreeType developer's guide. All you need to know
+ in order to be able to understand and even hack the
+ engine's core source code.
+
+ ..................................................................
+
+ extend.txt The FreeType extension writer's how-to. All you need
+ to be able to provide new extensions to the engine.
+
+ This information is currently available in the
+ "conventions" file
+
+ ..................................................................
+
+ undoc.txt Undocumented TrueType!
+
+ Yes, ladies and gentlemen, the TrueType
+ specification is fuzzy and misleading enough to
+ disband some serious commercial developers, but
+ that's wasn't enough for us. Even though it took
+ some time (aaargh...), we finally discovered through
+ hard work the real meanings of the specs, fixed some
+ errors and even found surprising undocumented
+ behaviour or features!
+
diff --git a/xc/extras/FreeType/docs/threads.txt b/xc/extras/FreeType/docs/threads.txt
new file mode 100644
index 000000000..f17d90bde
--- /dev/null
+++ b/xc/extras/FreeType/docs/threads.txt
@@ -0,0 +1,120 @@
+Threads with FreeType
+=====================
+
+
+The FreeType engine can now be compiled in thread-safe mode.
+Because we want to keep the engine small and fast, the thread
+protection is simple. This file gives an overview of what you can
+do, and what you should strictly never do.
+
+
+How to enable thread-safe support?
+
+A. You must have a valid replacement for the file "lib/ttmutex.c"
+ which calls your system's API to create, lock and release mutexes
+ or semaphores. The current implementation is a dummy and doesn't
+ do anything.
+
+B. You must re-define the configuration macro
+ TT_CONFIG_OPTION_THREAD_SAFE located in ttconfig.h. Then
+ recompile.
+
+
+IMPORTANT NOTE:
+
+ If two threads create and use their own TT_Engine, they can freely
+ call the library concurrently on each of them (as well as all
+ their related objects), even in the non-threaded build. The
+ following remarks only apply to concurrent requests performed on a
+ single TT_Engine shared by multiple threads.
+
+
+------------------------------------------------------------------------
+
+- What you can do:
+
+ With the exceptions listed below (in "What you can't do"), you can
+ call all API functions concurrently with two different threads.
+ This includes:
+
+ Creating two or more faces from the same engine
+ (i.e., concurrent calls to TT_Open_Face()/TT_Open_Collection())
+
+ Creating two or more instances from the same face object
+ (i.e., concurrent calls to TT_New_Instance())
+
+ Creating two or more glyph containers from the same face object
+ (i.e., concurrent calls to TT_New_Glyph())
+
+ The same holds for destruction of objects.
+
+ Load two or more glyphs concurrently for the same face or
+ instance
+ (i.e., concurrent TT_Load_Glyph() calls)
+
+ Render two or more glyphs at the same time, in the same engine
+ (i.e., calling TT_Get_Glyph_Bitmap()/TT_Get_Glyph_Pixmap() or
+ TT_Get_Outline_Bitmap()/TT_GetOutline_Pixmap() concurrently)
+
+ NOTE: the scan-line converter can only render one glyph at a
+ time, for a given TT_Engine. Concurrent calls are
+ synchronized through a mutex, though.
+
+ If you really, _really_, need to generate bitmaps or
+ pixmaps concurrently, create an additional engine and use
+ it with TT_Get_Outline_Bitmap()/TT_Get_Outline_Pixmap()
+ (you don't need to create any object in it, the outline
+ can come from any source too).
+
+ This is, however, not recommended (it works perfectly, but
+ this could change in the future for various technical
+ reasons).
+
+
+---------------------------------------------------------------------------
+
+- What you cannot do:
+
+ - You shouldn't try to delete an object while still using it with
+ another thread. The engine doesn't protect you from stupidity!
+ For example, these concurrent calls:
+
+ TT_Close_Face( face );
+ TT_Get_Glyph_Bitmap( glyph, &bitmap );
+
+ will act unexpectedly if the glyph is a child of the face (i.e.,
+ was created with TT_New_Glyph( face, &glyph ))
+ ^^^^
+ same face
+
+ Here are some other examples:
+
+ TT_Get_Glyph_Outline( glyph1, ... )
+ TT_Load_Glyph( instance, glyph1, ... )
+
+ or
+
+ TT_Get_Outline_BBox( outline, &bbox )
+ TT_Transform_Outline( outline )
+
+ etc.
+
+ You get the idea: Only the face and instances are protected --
+ glyph containers and outlines should be thread-specific.
+
+
+ - You shouldn't initialize extensions in an engine concurrently
+ (which is what every mere mortal will do anyway :-)
+
+
+
+That's about it. Now enjoy the lib ;-)
+
+- David
+
+
+PS: See the 'MT-Note' and 'MT-Safe' remarks in ttapi.c for more
+ detailed information on each specific function.
+
+
+--- END ---
diff --git a/xc/extras/FreeType/docs/user.txt b/xc/extras/FreeType/docs/user.txt
new file mode 100644
index 000000000..d0e33a99a
--- /dev/null
+++ b/xc/extras/FreeType/docs/user.txt
@@ -0,0 +1,944 @@
+
+ The FreeType Engine
+
+ Core Library User Guide
+
+ or
+
+ How to use the engine in your applications and font servers
+ by David Turner
+
+ ---------------------------------------------------
+
+ Introduction
+
+
+ I. Basic Concepts:
+
+ 1. Concepts
+ 2. Handles
+ 3. Conventions of use
+ 4. Object classes
+
+ II. Extensions:
+
+ 1. What is an extension?
+ 2. Where to find them
+ 3. Writing your own extension
+
+ Conclusion
+
+ ----------------------------
+
+Introduction:
+
+This file has been written to present the FreeType core library to
+would-be writers of applications and font servers. It first
+describes the concepts on which the engine is based, then how to use
+it to obtain glyph metrics, outlines and bitmaps.
+
+The last part discusses the ability to add and use extensions to the
+core library to get access to supplemental TrueType tables which are
+not currently provided by the core engine. If you would like to
+write your own extensions, read also the FreeType developer's guide.
+
+
+
+I. Basic Concepts:
+
+
+ 1. Concepts:
+
+ FreeType defines several kinds of structures, called "objects",
+ that are used to manage the various abstractions required to
+ access and display fonts.
+
+ In a care of good encapsulation, these objects are not directly
+ accessible from a client application. Rather, the user receives
+ a 'handle' for each object it queries and wants to use. This
+ handle is a stand-alone reference; it cannot be used like a
+ pointer to access directly the object's data.
+
+
+ 2. Properties:
+
+ It is however possible to obtain and set object properties
+ through several functions of the API. For example, you can
+ query a face object's properties with only a handle for it,
+ using the function TT_Get_Face_Properties().
+
+ Note that the data will be returned in a user-allocated
+ structure, but will also contain pointers addressing directly
+ some data found within the object.
+
+ A client application should never modify the data through these
+ pointers! In order to set new properties' values, the user must
+ always call a specific API to do so, as a certain number of
+ other related data might not appear in the returned structure
+ and imply various non-visible coherency and coercion rules.
+
+
+ 3. Conventions of use:
+
+ o All API functions have their label prefixed by 'TT_', as well
+ as all external (i.e. client-side) types.
+
+
+ o To allow the use of FreeType's core engine in threaded
+ environments, nearly all API functions return an error code,
+ which is always set to 0 in case of success.
+
+ The error codes' type is TT_Error, and a listing of them is
+ given in the API reference (see "apiref.txt").
+
+ Some functions do not return an error code. Their result is
+ usually a value that becomes negative in case of error (this
+ is used for functions where only one kind of error can be
+ reported, like an invalid glyph index).
+
+ An important note is that the engine should not leak memory
+ when returning an error, e.g., querying the creation of an
+ object will allocate several internal tables that will be
+ freed if a disk error occurs during a load.
+
+
+ o A handle is acquired through API functions labelled along the
+ names:
+
+ TT_Open_xxxx(), TT_New_xxxx()
+
+ where 'xxxx' is the object's class (Face, Instance, etc).
+
+ Examples:
+
+ TT_Open_Face(), TT_Open_Collection(),
+ TT_New_Instance(), TT_New_Glyph()
+
+
+ o A handle is closed through an API labelled
+
+ TT_Close_xxxx() or TT_Done_xxxx()
+
+ where 'xxxx' is the object's class (Face, Instance, etc).
+
+ Examples:
+
+ TT_Close_Face(), TT_Done_Instance(), TT_Done_Glyph()
+
+
+ o Properties are obtained through an API labelled
+
+ TT_Get_xxxx_yyyy()
+
+ where 'xxxx' is the object's class, and 'yyyy' its property.
+
+ Examples:
+
+ TT_Get_Face_Properties(), TT_Get_Instance_Metrics()
+ TT_Get_Glyph_Outline(), TT_Get_Glyph_Bitmap()
+
+
+ o Properties are set through an API labelled
+
+ TT_Set_xxxx_yyyy()
+
+ where 'xxxx' is the object's class, and 'yyyy' its property.
+
+ Examples:
+
+ TT_Set_Instance_Resolutions(),
+ TT_Set_Instance_CharSize()
+
+
+ 4. Object Classes:
+
+ The following object classes are defined in this release of the
+ engine:
+
+ o The Engine objects:
+
+ The FreeType library can be built to be completely re-entrant,
+ even though its default build doesn't support threads (more on
+ this in the developer's guide).
+
+ As a consequence, it is possible to open several instances of
+ the library, called 'engines'. Each engine has its own set of
+ current objects (faces, instances, etc.), and there is no
+ sharing between them.
+
+ The idea is that the library could be compiled as a shared
+ DLL, and then be able to provide several distinct engines to
+ independent client applications. In this case, each client
+ program must create its own engine with TT_Init_FreeType() to
+ hold its data.
+
+ Closing an engine will destroy _all_ objects that were
+ allocated since its opening, releasing all resources etc.,
+ with the exception of user-allocated outline objects.
+
+
+ o The Face objects:
+
+ A face contains the data that is specific to a single TrueType
+ font file. It presents information common to all glyphs and
+ all point sizes like font-specific metrics and properties.
+
+ You can open a face object by simply giving a pathname to the
+ TrueType file. You can later close (i.e., discard) the face
+ object.
+
+ You can also open a single face embedded in a TrueType
+ collection.
+
+ See also:
+
+ TT_Open_Face(), TT_Open_Collection(), TT_Close_Face(),
+ TT_Get_face_Properties()
+
+
+ o The Instance objects:
+
+ An instance is also called a 'pointsize' or a 'fontsize' in
+ some windowing systems. An instance holds the information
+ used to render glyphs on a specific device at a given point
+ size; it is always related to an opened face object.
+
+ For instance, if you want to generate glyphs for text from the
+ same typeface at 'sizes' of 10 and 12 points, all you need is
+ one face object, from which you'll create two distinct
+ instances.
+
+ A device is defined by its horizontal and vertical resolution,
+ usually specified in dots per inch (dpi). A point size is a
+ scaling number, given as _absolute_ values in points, where 1
+ point = 1/72 inch.
+
+ The 'pixel' size, also known as the 'ppem' value (for Points
+ Per EM square) is computed from both the device resolution and
+ the point size. It determines the size of the resulting glyph
+ bitmaps on your screen or sheet of paper.
+
+ The default device resolution for any new instance is 96dpi in
+ both directions, which corresponds to VGA screens. The
+ default point size is 10pt. The high-level API allows you to
+ change this whenever you want for any given instance object.
+
+ Note that closing a face object will automatically destroy all
+ its child instances (even though you can release them yourself
+ to free memory).
+
+ See also:
+
+ TT_New_Instance(), TT_Done_Instance(),
+ TT_Get_Instance_Metrics(), TT_Set_Instance_Resolutions(),
+ TT_Set_Instance_Pointsize()
+
+
+ o The Glyph objects:
+
+ A Glyph object is a _container_ for the data that describes
+ any glyph of a given font. This means that it typically
+ holds:
+
+ - glyph metrics information, like bounding box or advance
+ width.
+
+ - outline arrays sized large enough to hold any glyph from the
+ face. This size is extracted from the face's internal
+ 'maxProfile' table to optimize memory costs.
+
+ - other important parameters related to the 'fine' rendering
+ of the glyphs. This includes things like the
+ dropout-control mode used at low sizes.
+
+ - and it doesn't contain a bitmap or a pixmap!
+
+
+ A glyph object is used to load, hint and rasterize a single
+ glyph, as taken from the font file.
+
+ See also:
+
+ TT_New_Glyph(), TT_Done_Glyph(), TT_Get_Glyph_Metrics(),
+ TT_Get_Glyph_Outline(), TT_Get_Glyph_Bitmap(),
+ TT_Get_Glyph_Pixmap()
+
+
+ o The Character Map (CharMap) handle:
+
+ Glyphs can be indexed in a TrueType file in any order,
+ independently of any standard character encoding, like ASCII
+ or Unicode. For this reason, each file comes with one or more
+ character mapping tables, used to translate from one specific
+ encoding's charcodes to font glyph indexes.
+
+ There are many encoding formats, and each one can be
+ distinguished by two values:
+
+ - its platform ID
+ - its platform-specific encoding ID
+
+ Their values are defined in the TrueType specification and
+ won't be commented there. The FAQ lists the most commonly
+ used (platform:encoding) pairs.
+
+ It is possible to enumerate the charmaps provided by a
+ TrueType font and to use any of these to perform translations.
+
+ The charmaps are loaded in memory only on demand to save the
+ space taken by the maps that are not needed on your system.
+ They are part of the face object, however.
+
+ This means that even though a charmap can be accessed through
+ a handle (obtained through the TT_Get_CharMap() function), it
+ isn't a stand-alone object. For example, you never need to
+ de-allocate it; this is done automatically by the engine when
+ its face object expires.
+
+ See also:
+
+ TT_Get_CharMap_Count(), TT_Get_CharMap_ID(),
+ TT_Get_CharMap(), TT_Char_Index().
+
+
+ o The Outline Objects:
+
+ An outline is a vector representation of a glyph. It is made
+ of several control points joined by line segments and bezier
+ arcs, themselves gathered in closed paths called "contours".
+ The outline have also several flags, or attributes, which are
+ used by the scan-line converter to select the best rendering
+ algorithms to convert the glyph's bitmap.
+
+ Unlike other objects in FreeType, outlines aren't managed
+ through handles, but directly with the structure TT_Outline,
+ defined for client applications. Each glyph container
+ contains an outline sized large enough to hold any glyph from
+ its parent face. Client applications can access it with
+ TT_Get_Glyph_Outline(). However, one can also create its own
+ outlines if needed with TT_New_Outline() and
+ TT_Clone_Outline().
+
+ Note that user-created outlines are NOT tracked by the
+ library. Hence, the client must release them itself with one
+ or more calls to TT_Done_Outline().
+
+ A various number of methods/operations are defined for the
+ outline class to simplify its management.
+
+
+ IMPORTANT NOTE: **********************************************
+
+ The definition of TT_Outline may change in the future.
+ Developers are thus advised to always use the outline
+ methods provided by the API rather than reading or setting
+ data themselves.
+
+ **************************************************************
+
+ See also:
+
+ TT_New_Outline(), TT_Clone_Outline(), TT_Copy_Outline(),
+ TT_Done_Outline(), TT_Get_Outline_BBox(),
+ TT_Get_Outline_Bitmap(), TT_Get_Outline_Pixmap(),
+ TT_Translate_Outline(), TT_Transform_Outline()
+
+
+ o Bitmaps and Pixmaps:
+
+ One very important aspect of FreeType is that it is unable to
+ create bitmaps on its own. Rather, it is to the client
+ application to do it, and pass a reference, in the form of a
+ TT_Raster_Map, to the scan-line converter (the component in
+ charge of generating bitmaps from outlines).
+
+ Hence the importance of the TT_Raster_Map structure, which
+ layout is:
+
+ struct
+ {
+ int rows; /* number of rows */
+ int cols; /* number of columns (bytes) per row */
+ int width; /* number of pixels per line */
+ int flow; /* bitmap orientation */
+
+ void* bitmap; /* bit/pixmap buffer */
+ long size; /* bit/pixmap size in bytes */
+ } TT_Raster_Map;
+
+
+ And where:
+
+ - The 'rows' field contains the total number of rows in the
+ bitmap.
+
+ - The 'width' field gives the number of pixels per row (a bit
+ or a byte, depending on the map's nature).
+
+ - The 'cols' field gives the number of columns, i.e., bytes,
+ taken by each row in the map buffer.
+
+ IMPORTANT: the 'cols' field must be a multiple of 4 for
+ pixmaps!
+
+ Typically, its value should be '(width+7)/8' for bitmaps,
+ and '(width+3) & -4' for pixmaps.
+
+ - The 'flow' field gives the map's vertical orientation.
+
+ For example, if the first bytes of the bitmap buffer pertain
+ to its upper row, the flow is said to be going 'down', and
+ the field should take the value 'TT_Flow_Down'. If these
+ bytes pertain to its lowest row, the flow is going 'up', and
+ the value is 'TT_Flow_Up'.
+
+ As an example, the PC video modes use a 'down' flow, where
+ the first VRAM byte corresponds to the upper and leftmost
+ corner of the screen.
+
+ - The 'bitmap' field is a typeless pointer to the map's
+ buffer.
+
+ - The 'size' field contains the buffer's size in bytes. It is
+ usually computed as follows:
+
+ size = rows * cols;
+
+ NOTE: For bitmaps, the leftmost-pixel is related to the
+ highest (i.e., most significant) bit of its byte.
+ There is currently no support for the opposite
+ convention found in some systems.
+
+ (It can be easily added if you really need it, just
+ ask the development team.)
+
+
+
+II. Step-by-step Example:
+
+ Here is an example to show, step by step, how a client application
+ can open a font file, set one or several instances, load any
+ glyph, then render it to a bitmap.
+
+ a. Initialize the engine:
+
+ This is the first thing to do. You need to initialize an engine
+ through a call to TT_Init_FreeType(). This function will set up
+ a various number of structures needed by the library.
+
+ This allocates about 68kByte, of which 64kByte are dedicated to
+ the scan-line converter's "render pool", a workspace used for
+ bitmap generation. Note that even though this space is bounded,
+ the raster is able to render a glyph to any size or bitmap, even
+ horribly huge ones.
+
+ NOTE: You can reduce the size of this pool by modifying the
+ constant RASTER_RENDER_POOL in the file 'ttraster.c'. A
+ smaller pool will result in slower rendering at large
+ sizes. Take care of never assigning a value smaller than
+ 4kByte however, as bugs may start to lurk in!
+
+ Example:
+
+ TT_Engine engine;
+ error = TT_Init_FreeType( &engine );
+ if (error)
+ {
+ printf( "could not create engine instance\n");
+ ...
+ }
+
+
+ b. Init the extensions you need:
+
+ FreeType provides several extensions, which are optional
+ separately compilable components which, adding some rare
+ features to the engine and its API.
+
+ You need to explicitly initialize the extensions you want to
+ use. Each extension must provide an initialization function,
+ following the naming convention:
+
+ TT_Init_xxxxx_Extension( engine );
+
+ where 'xxxxxx' is the extension's "kind".
+
+ Example:
+
+ error = TT_Init_Kerning_Extension( engine );
+ if ( error )
+ ...
+
+
+ c. Open the font file:
+
+ There are two ways to open a font face, depending on its file
+ format:
+
+ - If it's a TrueType file (ttf), you can simply use the API
+ named TT_Open_Face(), which takes the file's pathname as
+ argument, as well as the address of the returned face handle.
+
+ Check the returned error code to see if the file could be
+ opened and accessed successfully.
+
+ TT_Face face; /* face handle */
+ error = TT_Open_Face( engine, "/fonts/arial.ttf", &face );
+ if ( error )
+ {
+ printf( "could not open the file\n" );
+ ...
+ }
+
+ - If the font is embedded in a TrueType collection (ttc), you
+ can use the API named TT_Open_Collection(), which takes also
+ the font's index within the collection's directory.
+
+ TT_Face face; /* face handle */
+
+ /* Load the collection's second face (index=1) */
+ error = TT_Open_Collection( engine, "/fonts/mingli.ttc",
+ 1, &face );
+ if ( error )
+ {
+ printf( "could not open the file\n" );
+ ...
+ }
+
+ - Finally, when you do not know the number of faces embedded in
+ a TrueType collection, the following technique can be used:
+
+ o Call TT_Open_Face() with the collection file's pathname.
+ This API recognizes collections automatically and always
+ return a handle for its first embedded font.
+
+ o Get the face's properties through TT_Get_Face_Properties().
+ These contain, among other things, the total number of fonts
+ emebdded in the collection, in its field 'num_Faces'.
+
+ TT_Face face; /* face handle */
+ TT_Face_Properties props; /* face properties */
+
+ /* open the first collection font */
+ error = TT_Open_Face( engine, "/fonts/mingli.ttc",
+ &face );
+ if ( error )
+ {
+ printf( "could not open the file\n" );
+ ...
+ }
+
+ /* Get the face properties */
+ TT_Get_Face_Properties( face, &props );
+
+ /* Now print the number of faces */
+ printf( "there are %d faces in this collection file\n",
+ props->num_Faces );
+
+
+ d. Create an instance from the face object:
+
+ You must create an instance (also known as a 'pointsize') which
+ contains information relative to the target output device's
+ resolutions and a given point size.
+
+ o The instance object is created through TT_New_Instance():
+
+ TT_Instance instance;
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ {
+ printf( "could not create instance\n" );
+ ...
+ }
+
+ TECHNICAL NOTE: Creating a new instance executes its font
+ program. This can fail if the font is broken.
+ Never assume that the error code returned here
+ is always 0.
+
+ o You must set the instance's properties to suit your needs.
+ These are simply its device resolutions, set through
+ TT_Set_Instance_Resolutions(), and its point size, set through
+ TT_Set_Instance_CharSize():
+
+ /* set the target horizontal and vertical resolution to */
+ /* 300dpi in each direction (typically for a printer) */
+ /* A fresh instance's default resolutions are 96dpi in */
+ /* both directions. */
+ error = TT_Set_Instance_Resolutions( instance, 300, 300 );
+ if ( error )
+ {
+ printf( "could not set resolution\n" );
+ ...
+ }
+
+ /* Now set the point size to 12 pts. Default is 10pt. */
+ /* Don't forget that the size is expressed in 26.6 fixed */
+ /* float format, so multiply by 64... */
+ error = TT_Set_Instance_CharSize( instance, 12*64 );
+ if ( error )
+ {
+ printf( "could not set point size\n" );
+ ...
+ }
+
+ TECHNICAL NOTE: These calls may execute the font's prep
+ program, which can fail when the font is
+ broken. Never assume that the error codes
+ returned there are always successful.
+
+ o You can also set the instance's transformation flags to tell
+ the glyph loading function that you're going to perform a
+ transformation (like rotation or slanting) on the glyph. Note
+ that the glyph loader doesn't perform the transformation. It
+ only informs the glyphs' hinting instruction streams about
+ these flags which may use it to disable or enable various
+ features (grid-fitting, drop-out control etc).
+
+ Use e.g.
+
+ TT_Set_Instance_Transforms( FALSE, TRUE );
+
+ to indicate that you're going to stretch, but not rotate, this
+ instance's glyphs. Default is, of course, both FALSE.
+
+ **************************************************************
+
+ RELEASE NOTE: With FreeType 1.1, setting these flags doesn't
+ work and produces errors during glyph loading.
+ You should not use them until a later release
+ that fixes this.
+
+
+ e. Create a glyph container:
+
+ You need a glyph object to serve as a container for the glyphs
+ you want to load from the face. This is done simply by
+
+ TT_Glyph glyph; /* glyph object handle */
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ {
+ printf( "could not create glyph\n" );
+ ...
+ }
+
+
+ f. Find your platform's character mappings:
+
+ Each font file can come with one or more character mapping
+ tables, used to convert char. codes to glyph indexs. You must
+ know the values of the "platformId" and "encodingID" defined in
+ the TrueType specification for your platform's
+ charcode/codepage. For example, Windows Unicode encoding is
+ (platform:3,encoding:1), while Apple Unicode is
+ (platform:0,encoding:0). Both formats differ in internal
+ storage layout and can be used transparently with the same
+ inputs with FreeType.
+
+ The function TT_Get_CharMap_Count() returns the number of
+ character mappings present in a face. You can then enumerate
+ these with the function TT_Get_CharMap_ID(). Once you've found
+ the mapping that masp your platform, use TT_Get_CharMap() to
+ return a TT_CharMap handle that will be used later to get glyph
+ indexs.
+
+
+ g. Load the glyph:
+
+ The glyph loader is easily queried through TT_Load_Glyph().
+ This API function takes several arguments:
+
+ o An instance handle to specify at which point size and
+ resolution the loaded glyph should be scaled and grid-fitted.
+
+ o A glyph container, used to hold the glyph's data in memory.
+ Note that the instance and the glyph must relate to the _same_
+ font file. An error would be produced immediately otherwise.
+
+ o A glyph index, used to reference the glyph within the font
+ file. This index is not a platform specific character code,
+ and a character's glyph index may vary from one font to
+ another. To compute glyph indexes from character codes, use
+ the TT_CharMap handle created in section (f.) with
+ TT_Char_Index().
+
+ We strongly recommend using the Unicode charmap whenever
+ possible.
+
+ o A load mode, indicating what kind of operations you need.
+ There are only two defined for the moment:
+
+ TTLOAD_SCALE_GLYPH:
+
+ When set, this flag indicates that the loaded glyph will
+ be scaled according to the instance specified as argument
+ to fractional pixel coordinates (26.6). If not, the
+ coordinates will remain integer FUnits. Please refer to
+ the TrueType specification and the FreeType header files
+ for more details on the 26.6 format and other data types.
+
+ TTLOAD_HINT_GLYPH:
+
+ This flag is only in effect when the TTLOAD_SCALE_GLYPH
+ flag is set. It indicates that the glyph must also be
+ 'hinted', or 'grid-fitted' for better display results.
+ Note that this also means that the glyph metrics will be
+ grid-fitted, including the bounding box.
+
+ You can 'or' the flags simply. As most applications will
+ require both flags to be set, the constant TTLOAD_DEFAULT is
+ defined as:
+
+ #define TTLOAD_DEFAULT (TTLOAD_SCALE_GLYPH | \
+ TTLOAD_HINT_GLYPH )
+
+
+ Example:
+
+ error = TT_Load_Glyph( instance, glyph, 36,
+ TTLOAD_DEFAULT );
+ if ( error )
+ {
+ printf("could not load the glyph\n");
+ ...
+ }
+
+
+ h. Query glyph properties:
+
+ You're then able to query various glyph properties:
+
+ o The glyph metrics can be obtained through
+ TT_Get_Glyph_Metrics(). The data returned in the metrics
+ structure is:
+
+ - the glyph's left side bearing (bearingX)
+ - the glyph's top side bearing (bearingY)
+ - the glyph's advance width (advance)
+ - the glyph's bounding box (bbox)
+
+ These values are expressed in 26.6 pixel units when the glyph
+ was loaded with scaling, or in FUnits if not.
+
+ o The glyph outline can be queried through
+ TT_Get_Glyph_Outline(). This can be useful to process the
+ points coordinates (e.g., applying stretching or rotation)
+ with functions like TT_Apply_Outline_Matrix() or
+ TT_Apply_Outline_Translation(). Note that these functions do
+ not recompute a glyph's metrics after the transformation!
+
+ The outline's structure is described in the reference
+ "apiref.txt".
+
+ A bitmap or pixmap for the glyph can be queried with the APIs
+ TT_Get_Glyph_Bitmap() and TT_Get_Glyph_Pixmap(). These
+ functions take a glyph handle as an argument, as well as a
+ bitmap/pixmap description block and two offsets.
+
+ The target map is described through a TT_Raster_Map object,
+ which structure is defined in the reference (see
+ "apiref.txt"). The offsets are given in the same units as the
+ points coordinates and glyph metrics: 26.6 pixel units for a
+ scaled glyph, and FUnits for an unscaled one.
+
+ IMPORTANT TECHNICAL NOTE: When the glyph has been scaled and
+ hinted, the offsets _must_ be
+ multiples of 64 (i.e. integer pixel
+ offsets). Otherwise, you would
+ simply ruin the grid fitting (which
+ usually results in ugly glyphs).
+
+ Example:
+
+ TT_Glyph_Metrics metrics;
+ TT_Outline outline;
+ TT_Raster_Map bitmap;
+
+
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+ TT_Get_Glyph_Outline( glyph, &outline );
+
+ /* set up the bitmap */
+ ...
+ TT_Get_Glyph_Bitmap( glyph, &bitmap, 0, 0 );
+
+
+ i. When you're done:
+
+ o You can close any font face object with TT_Close_Face(). This
+ call will automatically discard its child instances, glyphs
+ and charmaps.
+
+ o You can also close the engine with a single call to
+ TT_Done_FreeType(). This will simply release _all_ objects
+ that were previously allocated (with the exception of
+ user-created outlines), and close all font files, as well as
+ extensions that were inited for it.
+
+
+
+III. Extensions:
+
+ 1. What is an extension?
+
+ FreeType allows you to access a various number of TrueType
+ tables, as well as to render individual glyphs. However:
+
+ 1. it doesn't perform some high-level operations, like
+ generating a string text from many individual glyphs.
+
+ 2. it doesn't perform kerning (which can be needed by operations
+ mentioned in item 1).
+
+ 3. it doesn't give access to all the defined TrueType tables,
+ especially the optional ones.
+
+ While point 1 is a feature that will never go into FreeType's
+ core engine, which goal is to provide easy access to font data
+ and rendering _individual_ glyphs, point 2 and 3 can be added to
+ the engine's features through extensions.
+
+ An extension is simply a small piece of code that extends the
+ engine's abilities and APIs. It is possible to extend the
+ engine without touching the core's source code, this is
+ described in chapter 3 below.
+
+
+ 2. The two kinds of extensions:
+
+ There are basically two kinds of extensions, which require
+ different implementations.
+
+
+ a. API extensions:
+
+ An API extension is a set of functions that extend the
+ FreeType core API to give access to tables that are already
+ loaded by the engine, but not provided for now. An example of
+ such data can be:
+
+ - the horizontal metrics table (HMTX)
+ - the gasp table
+
+ This kind of extension is made of:
+
+ o an API extension header file, following the usage convention
+ introduced here (all labels prefixed with 'TT_'), and which
+ will be included by the clients which want to use the
+ extension. By convention, such header names begin with
+ 'ftx' (for FreeType eXtension).
+
+ Examples: ftxgasp.h, ftxhtmx.h
+
+ o One or more functions used to give access to the tables that
+ are already loaded and managed by the engine. They usually
+ only copy pointers to the target structure given by the
+ client application since these structures are not accessible
+ through the 'normal' API. An API extension doesn't need to
+ be initialized before being used.
+
+
+ b. engine extensions:
+
+ It can be sometimes useful to load and manage several tables
+ that are not considered by the core engine. These extensions
+ need to provide additional functions to fit into FreeType's
+ internal object management model, and are more sophisticated
+ than API extensions.
+
+ An example is given in this distribution to provide kerning
+ support (or more technically spoken, access to the kerning
+ tables found within the TrueType files). It is made of:
+
+ o An API extension providing new interfaces to the client
+ applications that need it. See the file "ftxkern.h".
+
+ o A specific implementation, providing services to create,
+ load, and manage kerning tables as additional parts of a
+ face object. In the case of kerning, the directory of
+ tables is loaded when the face is opened, and tables
+ themselves are fetched from the file on demand. This
+ implies several 'hooks' in the core engine. See the files
+ "ttkern.h" and "ttkern.c". These are called 'engine
+ extensions'.
+
+ o A specific extension initialization function, namely
+ TT_Init_Kerning_Extension(), that must be called after an
+ engine's creation, and before any face object allocation.
+ This function will "register" the extension within the
+ engine and make its API workable.
+
+
+ 3. Writing your own extensions:
+
+ As it was suggested earlier, writing an engine extension is a
+ delicate process, as the additional code must follow a certain
+ number of design rules, presented in the FreeType developer's
+ guide. There is also an extension writer's guide in the file
+ "extend.txt".
+
+ ****************************************************************
+
+ RELEASE NOTE: FreeType 1.1 doesn't provide the file "extend.txt"
+ yet...
+
+ By writing your own extensions, it will be possible to support
+ more advanced TrueType formats like TrueType GX or OpenType in a
+ near future, without having to torture the engine core source at
+ each iteration.
+
+ If you encounter some difficulties when trying to create your
+ own extension, please read the core source file carefully, and
+ in the event that you may need changes that are not fitted to
+ the current extension mechanism, do not hesitate to contact the
+ authors at 'freetype-devel@lists.lrz-muenchen.de'.
+
+
+Conclusion:
+
+ This is the second version of this document, updated for the
+ FreeType 1.1 release. The engine source code has become rather
+ stable since the beta, and its quality compares very favorably
+ to Windows and the Macintosh. Its internals will continue to
+ change, though very slowly, even if the API isn't expected to
+ grow much in a near future.
+
+ There is still work to do, however, as the need for a simple and
+ effective way to deal with internationalization in applications
+ calls for the support of non-roman text layouts and metrics
+ (e.g., support for vertical and right-to-left written scripts),
+ or even embedded bitmaps (present in some faces for some glyphs
+ which turn out to be too complex to hint correctly at some small
+ sizes). These features will most probably be supported through
+ extensions, and won't need major changes and re-design of the
+ engine.
+
+ Then, the engine is really a glyph-oriented TrueType driver.
+ Its purpose is to open and manage font files in order to load
+ single glyphs and render them as cleanly as possible. A number
+ of features, important to developers, like text string
+ rendering, font mapping and underlining/stroking, to name a few,
+ aren't provided there even though they'd be highly appreciated.
+
+ We hope you have success and fun using this engine. Much time
+ has been taken to make it one of the best in its genre.
+ Remember that it is not intended to be a complete font server or
+ text rendering library, but a pretty solid base for these kinds
+ of applications, as well as others.
+
+ We would like you to report the bugs you find, _after_ reading
+ the current bug report at our web page:
+
+ http://www.freetype.org
+
+
+
+ We thank you for your time and consideration.
+
+ David Turner, Robert Wilhelm, Werner Lemberg,
+ and all the FreeType enthusiasts...
+
+
+--- End of user.txt ---
diff --git a/xc/extras/FreeType/freetype.spec b/xc/extras/FreeType/freetype.spec
new file mode 100644
index 000000000..4d6fdaf73
--- /dev/null
+++ b/xc/extras/FreeType/freetype.spec
@@ -0,0 +1,164 @@
+Summary: FreeType library
+Name: freetype
+Version: 1.2
+Release: 1
+Source: ftp://ftp.freetype.org/pub/freetype/freetype-%{version}.tar.gz
+URL: http://www.freetype.org/
+Copyright: BSD-Like
+Group: Libraries
+BuildRoot: /var/tmp/freetype
+
+%description
+The FreeType engine is a free and portable TrueType font rendering engine.
+It has been developed to provide TT support to a great variety of platforms
+and environments.
+
+Note that FreeType is a *library*. It is not a font server for your favorite
+platform, even though it was designed to be used in many of them. Note also
+that it is *not* a complete text-rendering library. Its purpose is simply to
+open and manage font files, as well as load, hint and render individual
+glyphs efficiently. You can also see it as a "TrueType driver" for a
+higher-level library, though rendering text with it is extremely easy, as
+demo-ed by the test programs.
+
+This package contains the files needed to run programs that use the
+FreeType engine.
+
+%package devel
+Summary: FreeType development headers and libraries
+Group: Development/Libraries
+Requires: %{name} = %{version}
+
+%description devel
+The FreeType engine is a free and portable TrueType font rendering engine.
+It has been developed to provide TT support to a great variety of platforms
+and environments.
+
+Note that FreeType is a *library*. It is not a font server for your favorite
+platform, even though it was designed to be used in many of them. Note also
+that it is *not* a complete text-rendering library. Its purpose is simply to
+open and manage font files, as well as load, hint and render individual
+glyphs efficiently. You can also see it as a "TrueType driver" for a
+higher-level library, though rendering text with it is extremely easy, as
+demo-ed by the test programs.
+
+This package contains all supplementary files you need to develop your
+own programs using the FreeType engine.
+
+%package demo
+Summary: FreeType test and demo programs
+Group: Applications/Graphics
+Requires: %{name} = %{version}
+
+%description demo
+The FreeType engine is a free and portable TrueType font rendering engine.
+It has been developed to provide TT support to a great variety of platforms
+and environments.
+
+Note that FreeType is a *library*. It is not a font server for your favorite
+platform, even though it was designed to be used in many of them. Note also
+that it is *not* a complete text-rendering library. Its purpose is simply to
+open and manage font files, as well as load, hint and render individual
+glyphs efficiently. You can also see it as a "TrueType driver" for a
+higher-level library, though rendering text with it is extremely easy, as
+demo-ed by the test programs.
+
+This package contains several programs bundled with the FreeType engine for
+testing and demonstration purposes.
+
+%changelog
+* Sun Oct 25 1998 Pavel Kankovsky <peak@kerberos.troja.mff.cuni.cz>
+- libttf.so version number updated again
+- default localedir based on prefix
+- file list adjustments (howto/)
+
+* Sun Oct 16 1998 Pavel Kankovsky <peak@kerberos.troja.mff.cuni.cz>
+- source filename fixed
+- HOWTO removed
+- libttf.so version number updated
+
+* Tue Sep 29 1998 Robert Wilhelm <robert@freetype.org>
+- updated to version 1.2.
+
+* Tue Jul 14 1998 Alexander Zimmermann <Alexander.Zimmermann@fmi.uni-passau.de>
+- added missing files
+- added %defattr tags
+
+* Thu Jun 18 1998 Robert Wilhelm <robert@freetype.org>
+- added lots of attr(-,root,root)
+
+* Wed May 27 1998 Pavel Kankovsky <peak@kerberos.troja.mff.cuni.cz>
+- changed group attr of freetype and freetype-devel package
+- fixed misc glitches
+
+* Sun May 24 1998 Pavel Kankovsky <peak@kerberos.troja.mff.cuni.cz>
+- split the package into three parts (runtime library, development
+ tools, and demo programs)
+- added missing files (headers, NLS)
+- added ldconfing upon (de)installation
+
+* Thu Mar 12 1998 Bruno Lopes F. Cabral <bruno@openline.com.br>
+- NLS for portuguese language is missing, sorry (may be in a near future)
+ (please note the workaround using --with-locale-dir and gnulocaledir.
+ NLS Makefile needs a bit more rework but again I'll not patch it here)
+
+%prep
+%setup
+
+find . -name CVS -type d | xargs rm -rf
+
+%build
+./configure --prefix=/usr --enable-static
+make all
+
+%install
+make install prefix=$RPM_BUILD_ROOT/usr
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%post
+/sbin/ldconfig
+
+%postun
+/sbin/ldconfig
+
+%files
+%defattr(644, root, root, 755)
+%doc announce license.txt
+/usr/lib/libttf.so.2.1.0
+/usr/lib/libttf.so.2
+/usr/share/locale/de/LC_MESSAGES/freetype.mo
+/usr/share/locale/fr/LC_MESSAGES/freetype.mo
+/usr/share/locale/nl/LC_MESSAGES/freetype.mo
+/usr/share/locale/cs/LC_MESSAGES/freetype.mo
+/usr/share/locale/es/LC_MESSAGES/freetype.mo
+
+%files devel
+%defattr(644, root, root, 755)
+%doc README announce license.txt readme.1st
+%doc docs/ howto/
+/usr/lib/libttf.so
+/usr/lib/libttf.la
+/usr/lib/libttf.a
+/usr/include/freetype.h
+/usr/include/fterrid.h
+/usr/include/ftnameid.h
+/usr/include/ftxkern.h
+/usr/include/ftxgasp.h
+/usr/include/ftxcmap.h
+/usr/include/ftxpost.h
+/usr/include/ftxwidth.h
+/usr/include/ftxerr18.h
+
+%files demo
+%defattr(755, root, root, 755)
+%doc announce license.txt
+/usr/bin/ftview
+/usr/bin/fttimer
+/usr/bin/ftlint
+/usr/bin/ftdump
+/usr/bin/ftzoom
+/usr/bin/ftstring
+/usr/bin/ftstrpnm
+/usr/bin/fterror
diff --git a/xc/extras/FreeType/ft_conf.h.in b/xc/extras/FreeType/ft_conf.h.in
new file mode 100644
index 000000000..a940eceda
--- /dev/null
+++ b/xc/extras/FreeType/ft_conf.h.in
@@ -0,0 +1,177 @@
+/* ft_conf.h.in. Generated automatically from configure.in by autoheader. */
+
+/* we need the following because there are some typedefs in this file */
+
+#ifndef FT_CONF_H
+#define FT_CONF_H
+
+/* Define to empty if the keyword does not work. */
+#undef const
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Define if the X Window System is missing or not being used. */
+#undef X_DISPLAY_MISSING
+
+/* The number of bytes in a int. */
+#undef SIZEOF_INT
+
+/* The number of bytes in a long. */
+#undef SIZEOF_LONG
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the memcpy function. */
+#undef HAVE_MEMCPY
+
+/* Define if you have the memmove function. */
+#undef HAVE_MEMMOVE
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
+/* Define if you have the <libintl.h> header file. */
+#undef HAVE_LIBINTL_H
+
+/* Define if you have the libintl library. */
+#undef HAVE_LIBINTL
+
+/**********************************************************************/
+/* */
+/* The following configuration macros can be tweaked manually by */
+/* a developer to turn on or off certain features or options in the */
+/* TrueType engine. This may be useful to tune it for specific */
+/* purposes.. */
+/* */
+/**********************************************************************/
+
+/*************************************************************************/
+/* Define this if the underlying operating system uses a different */
+/* character width than 8bit for file names. You must then also supply */
+/* a typedef declaration for defining 'TT_Text'. Default is off. */
+
+#undef HAVE_TT_TEXT
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support engine extensions */
+/* Default is on, but if you're satisfied by the basic services provided */
+/* by the engine and need no extensions, undefine this configuration */
+/* macro to save a few more bytes. */
+
+#define TT_CONFIG_OPTION_EXTEND_ENGINE
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support gray-scaling, */
+/* a.k.a. font-smoothing or anti-aliasing. Default is on, but you can */
+/* disable it if you don't need it. */
+
+#define TT_CONFIG_OPTION_GRAY_SCALING
+
+
+/*************************************************************************/
+/* Define this if you want to use a big 'switch' statement within the */
+/* bytecode interpreter. Because some non-optimizing compilers are not */
+/* able to produce jump tables from such statements, undefining this */
+/* configuration macro will generate the appropriate C jump table in */
+/* ttinterp.c. If you use an optimizing compiler, you should leave it */
+/* defined for better performance and code compactness.. */
+
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+/*************************************************************************/
+/* Define TT_CONFIG_THREAD_SAFE if you want to build a thread-safe */
+/* version of the library. */
+
+#undef TT_CONFIG_OPTION_THREAD_SAFE
+
+/**********************************************************************/
+/* */
+/* The following macros are used to define the debug level, as well */
+/* as individual tracing levels for each component. There are */
+/* currently three modes of operation : */
+/* */
+/* - trace mode (define DEBUG_LEVEL_TRACE) */
+/* */
+/* The engine prints all error messages, as well as tracing */
+/* ones, filtered by each component's level */
+/* */
+/* - debug mode (define DEBUG_LEVEL_ERROR) */
+/* */
+/* Disable tracing, but keeps error output and assertion */
+/* checks. */
+/* */
+/* - release mode (don't define anything) */
+/* */
+/* Don't include error-checking or tracing code in the */
+/* engine's code. Ideal for releases. */
+/* */
+/* NOTE : */
+/* */
+/* Each component's tracing level is defined in its own source. */
+/* */
+/**********************************************************************/
+
+/* Define if you want to use the tracing debug mode */
+#undef DEBUG_LEVEL_TRACE
+
+/* Define if you want to use the error debug mode - ignored if */
+/* DEBUG_LEVEL_TRACE is defined */
+#undef DEBUG_LEVEL_ERROR
+
+/**************************************************************************/
+/* Definition of various integer sizes. These types are used by ttcalc */
+/* and ttinterp (for the 64-bit integers) only.. */
+
+#if SIZEOF_INT == 4
+
+ typedef signed int TT_Int32;
+ typedef unsigned int TT_Word32;
+
+#elif SIZEOF_LONG == 4
+
+ typedef signed long TT_Int32;
+ typedef unsigned long TT_Word32;
+
+#else
+#error "no 32bit type found"
+#endif
+
+#if SIZEOF_LONG == 8
+
+/* LONG64 must be defined when a 64-bit type is available */
+/* INT64 must then be defined to this type.. */
+#define LONG64
+#define INT64 long
+
+#else
+
+/* GCC provides the non-ANSI 'long long' 64-bit type. You can activate */
+/* by defining the TT_USE_LONG_LONG macro in 'ft_conf.h'. Note that this */
+/* will produce many -ansi warnings during library compilation. */
+#ifdef TT_USE_LONG_LONG
+
+#define LONG64
+#define INT64 long long
+
+#endif /* TT_USE_LONG_LONG */
+#endif
+
+#endif /* FT_CONF_H */
diff --git a/xc/extras/FreeType/howto/os2.txt b/xc/extras/FreeType/howto/os2.txt
new file mode 100644
index 000000000..f8fce4ffa
--- /dev/null
+++ b/xc/extras/FreeType/howto/os2.txt
@@ -0,0 +1,174 @@
+ The FreeType OS/2 Compilation HowTo
+
+
+Introduction:
+
+This file describes the compilation of the FreeType package on an
+OS/2 system. It comes with makefiles for the following compilers:
+
+ - gcc/emx with GNU make
+
+ - icc with nmake (Visual Age C++)
+
+ - wcc386 with wmake (Watcom -- tried with 10.6)
+
+ - gcc/emx with dmake
+
+
+NOTE:
+
+ You're advised to jump to section II.1 if you want to run the
+ FreeType test/demo programs as quick as possible.
+
+
+I. Building the library:
+
+
+1. Quick Compilation
+
+ The easiest way to compile the library on OS/2 is to go to the
+ directory "freetype/lib". Then type, depending on your compiler:
+
+ gcc/emx: make -f arch/os2/makefile.emx
+ gcc/dmake: dmake -f arch/os2/makefile.dm
+
+ icc: nmake -f arch\os2\makefile.icc
+ wcc386: wmake -f=arch\os2\makefile.wat
+
+
+ This should build the "libttf.a" or "libttf.lib" library files.
+
+ You can also use the following targets:
+
+ debug - Makes a development version of the library only
+ useful for FreeType developers and hackers.
+
+ clean - Cleans all intermediate object files created during
+ compilation. Keeps all library and executables in
+ place.
+
+ distclean - Cleans everything, leaving the directories as they
+ were before the compilation.
+
+
+2. Manual compilation:
+
+ Here are explained the steps that are required to compile the
+ FreeType _library_ (and only this one) by hand.
+
+ a. Choose your compilation mode:
+
+ Unlike previous versions, FreeType 1.1 can be compiled in two
+ modes, called "debug mode" and "single object mode".
+
+ Debug mode is simply the normal way of compiling C programs, i.e.,
+ each *.c file is compiled into an individual *.obj object file,
+ and all of them are linked together into an archive (i.e., *.lib
+ library).
+
+ Single object mode is slightly different: all C files are included
+ in a single source during compilation, resulting in a single final
+ object file for the core library. This has the advantage of
+ letting optimizing compilers do more global work, as well as
+ getting rid of all external which are used solely for the purpose
+ of components interfacing.
+
+ In both modes, you need to include the following paths to your
+ makefile/command line:
+
+ the location of all "tt*.[hc]" files
+ the location of system-specific files
+
+ For example, if you're compiling from the "freetype/lib"
+ directory, you can type for debug mode something like:
+
+ gcc -c -I. -Iarch/os2 tt*.c arch/os2/os2file.c
+
+ to compile all required files into object ones. Then assemble
+ them in a library with 'ar' or 'implib'.
+
+ In single object mode, you only need to compile the file named
+ "freetype.c" which is located in "freetype/lib/arch/os2". From
+ the same directory as before, one would type:
+
+ gcc -c -I. -Iarch/os2 arch/os2/freetype.c
+
+ You can also compile the extensions located in
+ "freetype/lib/extend" separately from the base engine. You'll
+ need to include the same paths as before, though.
+
+
+
+II. Building other parts of the package:
+
+1. Test programs:
+
+ These are located in "freetype/test". Most of them use a tiny
+ graphics sub-system which is simply used to display bitmaps and
+ pixmaps in a windows on a variety of platforms. The OS/2 version
+ comes in two flavors: PM and full-screen.
+
+ To compile them, you must simply be in the "freetype/test"
+ directory, and invoke the makefile in arch/os2. For example:
+
+ nmake -f arch\os2\makefile.os2
+
+
+ NOTE 1:
+
+ This will automatically invoke the library makefile for you!
+
+ NOTE 2:
+
+ The test program come in two flavors, distinguished from the "fs"
+ suffix appended to their name. For example:
+
+ ftview (PM version)
+ ftviewfs (Full Screen version)
+
+ The full-screen version is there mainly for debugging purposes.
+
+ NOTE 3:
+
+ For now, the graphical test programs only run on the following
+ platforms: Unix, OS/2, Dos and Amiga. Windows support is expected
+ soon.
+
+ The library being pure ANSI-C, it can be used on any system to
+ generate bitmaps and pixmaps.
+
+
+2. Other contribs:
+
+ You may find some other contributions to the FreeType project in the
+ "freetype/contrib" directory. Each of these programs should have
+ their own Makefiles and documentations. Also check their licenses,
+ as they're not necessarily distributed under the FreeType one. You
+ are invited to port the non-OS/2 applications to OS/2.
+
+ For OS/2, you'll find the source code for the beta FreeType/2 font
+ driver in "freetype/contrib/os2". Read its documentation carefully
+ before trying to compile it, as it certainly won't be easy.
+
+
+III. Trouble Shooting:
+
+ There is only one important point on OS/2:
+
+ "The test program crashes with anti-aliasing on!"
+
+ It has been discovered that some versions of Visual Age C++ contain
+ a bug which miscompiles the anti-aliasing source in ttraster.c,
+ hence resulting in a page fault when trying to render a pixmap in
+ the engine. Apparently, not all levels/versions of the compiler
+ contain the bug. You'll notice the problem immediately (page fault
+ :-).
+
+ Please apply the most recent fixpack to your Visual Age C++ copy in
+ order to get rid of it (newer fixpacks seem to solve the issue).
+
+
+Good luck!
+
+
+--- end of os2.txt ---
diff --git a/xc/extras/FreeType/howto/unix.txt b/xc/extras/FreeType/howto/unix.txt
new file mode 100644
index 000000000..23e9a699c
--- /dev/null
+++ b/xc/extras/FreeType/howto/unix.txt
@@ -0,0 +1,233 @@
+ The FreeType Unix Compilation HowTo
+
+Contents
+
+Introduction
+I. Building the library
+II. Building other parts of the package
+III. Successful Build Reports
+
+Introduction:
+
+This file describes the compilation of the FreeType package on a
+Unix system. Using the 'configure' script it should be rather easy
+to build the library. However, detailed instructions on how to
+compile the library manually are given later in this document.
+
+
+I. Building the library:
+
+
+1. Quick Compilation
+
+ The easiest way to compile the library on a Unix system is by
+ using the 'configure' script that comes with it. Simply go to the
+ root directory of the freetype package, then type:
+
+ ./configure
+
+ This runs a script that will probe your system and detect various
+ configuration issues, which are explained later in this document.
+
+ From there, you can simply type
+
+ make
+
+ to invoke compilation of the whole package. You can also use the
+ following commands:
+
+ make debug - Make a development version of the library.
+ Only useful for FreeType developers and
+ hackers. The default build should come with
+ '-g' (i.e., debug info in the object file)
+ already.
+
+ make clean - Clean all intermediate object files created
+ during compilation. Keeps all library and
+ executables in place.
+
+ make distclean - Clean everything, leaving the directories as
+ they were before the compilation. You'll need
+ to run './configure' again to be able to
+ re-build it.
+
+ make install - Install the library files libttf.a, libttf.la
+ or libttf.so to your system library path
+ (/usr/local/lib by default). The path can be
+ set manually with ./configure.
+
+ make uninstall - Undo a `make install'.
+
+
+2. Trouble-shooting and simple customization:
+
+ The make build seems to fail on some Solaris systems. This is
+ mainly due to the fact that the test programs (not the font
+ library itself) try to use certain libraries and/or utilities if
+ they find them on your system. In some cases, the Sun versions
+ are incompatible to the GNU ones. If you encounter such problems,
+ please report them to us so we can try to fix it.
+
+ The configure script and makefiles that it generates can make use
+ of the following things:
+
+ - gettext - In order to compile the internationalized error
+ message string extension, which isn't part of the
+ core library. You can disable this and get a
+ clean compile with
+
+ ./configure --disable-nls
+
+
+ - libtool - Used to generate shared libraries. You can
+ disable it by typing
+
+ ./configure --disable-shared
+
+ which will generate and link the FreeType engine
+ as a static library.
+
+ By default, static compilation is disabled if the
+ configure script detects that your compiler
+ and/or operating system supports shared
+ libraries. You can ask for static libraries with
+
+ ./configure --enable-static
+
+ For more configuration options, type './configure --help' to see a
+ summary of what is possible. The option to change the library
+ installation path for 'make install' is, as usual,
+ "--prefix=...". Example:
+
+ ./configure --prefix=${HOME}/local/lib --disable-shared
+
+ To install a static library (libttf.a) in '~/local/lib' (after a
+ `make install')
+
+
+3. Manual compilation:
+
+ Here are explained the steps that are required to compile the
+ FreeType _library_ (and only this one) by hand.
+
+ a. Generate a configuration file named "ft_conf.h":
+
+ This file must contain a certain number of configuration macro
+ declarations which must fit your system. The configure script
+ generates it automatically for you, but you can also take the
+ template file "freetype/ft_conf.h.in" and change it by hand,
+ then save it as "freetype/ft_conf.h".
+
+ b. Choose your compilation mode:
+
+ Unlike previous versions, FreeType 1.1 can be compiled in two
+ modes, called "debug mode" and "single object mode".
+
+ Debug mode is simply the normal way of compiling C programs,
+ i.e., each *.c file is compiled into an individual *.o object
+ file, and all of them are linked together into an archive (i.e.,
+ *.a library).
+
+ Single object mode is slightly different: all C files are
+ included in a single source file during compilation, resulting
+ in a single final object file for the core library. This has
+ the advantage of letting optimizing compilers do more global
+ work, as well as getting rid of all external symbols which are
+ used solely for the purposes of components interfacing.
+
+ In both modes, you need to include the following paths to your
+ makefile/command line:
+
+ the location of the "ft_conf.h" file
+ the location of all "tt*.[hc]" files
+ the location of system-specific files,
+ i.e., "ttmmap.c" on Unix.
+
+ For example, if you're compiling from the "freetype/lib"
+ directory, you can type for debug mode something like:
+
+ gcc -c -I.. -I. -Iarch/unix tt*.c arch/unix/ttmmap.c
+
+ to compile all required files. Then assemble them in a library
+ with 'ar' (and run `runlib' if necessary).
+
+ In single object mode, you only need to compile the file named
+ "freetype.c" which is located in "freetype/lib/arch/unix". From
+ the same directory as before, one would type:
+
+ gcc -c -I.. -I. -Iarch/unix arch/unix/freetype.c
+
+ You can also compile the extensions located in
+ "freetype/lib/extend" separately from the base engine. You'll
+ need to include the same paths as before, though.
+
+
+
+II. Building other parts of the package:
+
+
+1. Test programs:
+
+ These are located in "freetype/test". Most of them use a tiny
+ graphics sub-system which is simply used to display bitmaps and
+ pixmaps in a windows on a variety of platforms. Of course, the
+ Unix version uses X11.
+
+ The default "make" builds all tests programs automatically. Just
+ go the "freetype/test" and launch the programs when you're there.
+ Documentation on the test programs can be found in the file
+ "freetype/test/readme.txt"
+
+ NOTE:
+
+ For now, the graphical test programs only run on the following
+ platforms: Unix, OS/2, Dos and Amiga. Windows support is
+ expected soon.
+
+ The library being pure ANSI-C, it can be used on any system to
+ generate bitmaps and pixmaps.
+
+2. Other contribs:
+
+ You may find some other contributions to the FreeType project in
+ the "freetype/contrib" directory. Each of these programs should
+ have their own makefiles and documentations. Also check their
+ licenses, as they're not necessarily distributed under the
+ FreeType one.
+
+
+III. Successful Build Reports:
+
+Nelson H. F. Beebe <beebe@math.utah.edu> and others report the
+following successfully builds (with gcc 2.8.1) of freetype-1.1 on
+
+ DEC Alpha 2100-5/250; OSF/1 3.2
+ HP 9000/735; HP-UX 10.01
+ Intel Pentium (200MHz MMX) Linux 2.0.30
+ SGI Challenge L; IRIX 5.3
+ Sun SPARC 20/512; Solaris 2.6
+ Sun SPARC Ultra-2 SunOS 5.5.1
+ IBM RS/6000; AIX 4.1
+
+
+There are build problems reported on SunOs 4.x which have the form
+
+ ld: /usr/tmp/cca07291.o: assert pure-text failed:
+ reference to [offset] at f754 in /usr/tmp/cca07291.o
+
+This may be a compiler bug in gcc 2.8.1.
+
+You can work around by just building a static library
+(./configure --disable-shared --enable-static --disable-nls).
+Maybe make debug will help here, too (untested).
+
+
+Other successful builds:
+
+ Sun SPARC Solaris 2.5 with Sun C compiler+linker
+
+For updated build reports, please consult our web site:
+
+ http://www.freetype.org
+
+--- end of unix.txt ---
diff --git a/xc/extras/FreeType/howto/win32.txt b/xc/extras/FreeType/howto/win32.txt
new file mode 100644
index 000000000..b4f59ef96
--- /dev/null
+++ b/xc/extras/FreeType/howto/win32.txt
@@ -0,0 +1,136 @@
+ The FreeType Win32 Compilation HowTo
+
+
+Introduction:
+
+This file describes the compilation of the FreeType package on an
+Win32 system. Unlike other systems, only the library can be
+compiled on such a system, as the demo programs still lack a Win32
+component (we welcome any contribution).
+
+Nevertheless, we _do_ provide project/workspace files for the
+following compilers: Borland C++ 5.0, Visual C++ 4.0, and Visual C++
+5.0. They can be found in the "freetype/lib/arch/win32" directory:
+
+ freetype.ide for Borland C++ 5.0
+
+ freetype.dsp project and workspace files for
+ freetype.dsw Visual C++ 5.0
+
+ freetype.mdp project and makefile files for
+ freetype.mak Visual C++ 4.0
+
+They generate a static library, which contain the core engine as a
+single object file, as well as all standard extensions.
+
+Notes:
+
+ - You may need to update the include paths in the Borland C++
+ workspace settings. The current one looks in the directory
+ "c:\Program Files\Borland\BC 5.0\Include" for include files.
+
+ - Take care that some compilers may overwrite these files when
+ generating the library (e.g. Borland C++ creates its own
+ "freetype.mdp" file, which isn't a Visual C++ project during
+ compilation).
+
+ This is only important if you try to compile the lib with
+ several compilers.
+
+We gladly accept project files for other compilers. The rest of
+this document will show you all the steps required to compile the
+library by hand.
+
+
+
+1. Static compilation:
+
+ Here are explained the steps that are required to compile FreeType
+ as a *static* library. Explanations follow to build a DLL.
+
+ a. Set include paths:
+
+ Simply add the following to your project's include paths:
+
+ "freetype/lib"
+
+ It contains all core library sources (tt*.c files),
+ including the API in "freetype.h", which can be used by
+ client applications to use the library.
+
+ "freetype/lib/arch/win32"
+
+ Here you'll find the file "ft_conf.h" which contains various
+ configuration macros which have been set for the Win32
+ platform. You can also play with some options by
+ setting/undefining the TT_CONFIG_OPTION_???? macros. (Read
+ the comments carefully before that!)
+
+ You might as well decide to compile some extensions (which are
+ separately compilable and linkable units used to extend the
+ engine's capabilities). To do so, add the directory
+
+ "freetype/lib/extend"
+
+
+ b. Set the warning level:
+
+ Set the warning level to 3 under Visual C++, you should get no
+ warnings during compilation. (Compilation produces warnings in
+ level 4, but we're not going to correct this for deep technical
+ reasons.)
+
+ Under BC++, set the warning level to ANSI, and disable the
+ "unused parameter" and "unused variable" warnings. You'll
+ probably get a slew of warnings, because BC is probably the most
+ pedantic and bad-ass ANSI compiler I've ever seen. The library
+ will work perfectly though.
+
+ c. Compile in "normal mode":
+
+ Add all the files in "tt*.c" found in "freetype/lib" to your
+ project. You can also add some extensions from
+ "freetype/lib/extend" provided that you've added this directory
+ to your include path.
+
+ Build. Voila!
+
+ d. Or compile in "single object mode":
+
+ This allows you to build a single object file for the core
+ library. Use the single file "freetype/arch/win32/freetype.c"
+ instead of _all_ the individual "tt*.c" source components (they
+ are included by freetype.c).
+
+ The resulting library file should be smaller, because it got rid
+ of lots of internal extern symbols which are needed for
+ inter-component interfacing.
+
+ You still can add extensions individually to the project.
+ They'll link with the single object too.
+
+
+2. DLL Compilation:
+
+ Some people have expressed the need to compile FreeType as a DLL.
+ This is possible with very, very few changes. Simply follow these
+ instructions:
+
+ - Edit the source of "freetype/arch/win32/freetype.c" and define
+ the EXPORT macro before the first #include.
+
+ - Compile in single object mode.
+
+ This should be enough.
+
+
+3. Other contributions in the package:
+
+ All other parts of the FreeType distribution are currently
+ unsupported on Win32. This includes the test/demo programs, as
+ well as the many tools found in "freetype/contrib" (nevertheless,
+ ttf2pk may compile provided you've got the web2c port to Win32,
+ including the kpathsea library).
+
+
+--- end of win32.txt ---
diff --git a/xc/extras/FreeType/install-sh b/xc/extras/FreeType/install-sh
new file mode 100755
index 000000000..ebc66913e
--- /dev/null
+++ b/xc/extras/FreeType/install-sh
@@ -0,0 +1,250 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software and its
+# documentation for any purpose is hereby granted without fee, provided that
+# the above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear in supporting
+# documentation, and that the name of M.I.T. not be used in advertising or
+# publicity pertaining to distribution of the software without specific,
+# written prior permission. M.I.T. makes no representations about the
+# suitability of this software for any purpose. It is provided "as is"
+# without express or implied warranty.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+ case $1 in
+ -c) instcmd="$cpprog"
+ shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -m) chmodcmd="$chmodprog $2"
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd="$stripprog"
+ shift
+ continue;;
+
+ -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+ shift
+ continue;;
+
+ -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+ shift
+ continue;;
+
+ *) if [ x"$src" = x ]
+ then
+ src=$1
+ else
+ # this colon is to work around a 386BSD /bin/sh bug
+ :
+ dst=$1
+ fi
+ shift
+ continue;;
+ esac
+done
+
+if [ x"$src" = x ]
+then
+ echo "install: no input file specified"
+ exit 1
+else
+ true
+fi
+
+if [ x"$dir_arg" != x ]; then
+ dst=$src
+ src=""
+
+ if [ -d $dst ]; then
+ instcmd=:
+ else
+ instcmd=mkdir
+ fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad
+# if $src (and thus $dsttmp) contains '*'.
+
+ if [ -f $src -o -d $src ]
+ then
+ true
+ else
+ echo "install: $src does not exist"
+ exit 1
+ fi
+
+ if [ x"$dst" = x ]
+ then
+ echo "install: no destination specified"
+ exit 1
+ else
+ true
+ fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+ if [ -d $dst ]
+ then
+ dst="$dst"/`basename $src`
+ else
+ true
+ fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+# this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+ pathcomp="${pathcomp}${1}"
+ shift
+
+ if [ ! -d "${pathcomp}" ] ;
+ then
+ $mkdirprog "${pathcomp}"
+ else
+ true
+ fi
+
+ pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+ $doit $instcmd $dst &&
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+ if [ x"$transformarg" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ dstfile=`basename $dst $transformbasename |
+ sed $transformarg`$transformbasename
+ fi
+
+# don't allow the sed command to completely eliminate the filename
+
+ if [ x"$dstfile" = x ]
+ then
+ dstfile=`basename $dst`
+ else
+ true
+ fi
+
+# Make a temp file name in the proper directory.
+
+ dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+ $doit $instcmd $src $dsttmp &&
+
+ trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing. If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+ if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+ if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+ if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+ if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+ $doit $rmcmd -f $dstdir/$dstfile &&
+ $doit $mvcmd $dsttmp $dstdir/$dstfile
+
+fi &&
+
+
+exit 0
diff --git a/xc/extras/FreeType/lib/arch/amigaos/Makefile.gcc b/xc/extras/FreeType/lib/arch/amigaos/Makefile.gcc
new file mode 100644
index 000000000..eae8d2721
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/amigaos/Makefile.gcc
@@ -0,0 +1,67 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for amiga using ADE Enviroment.
+#
+# You will need GNU make.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# make -f arch/amigaos/Makefile.gcc
+
+ARCH = arch/amigaos
+FT_MAKEFILE = $(ARCH)/Makefile.gcc
+
+AR = ar
+RM = rm
+
+CC = gcc
+
+CFLAGS = -Wall -pedantic -ansi -O2 -g -noixemul -I$(ARCH) -I. -Iextend
+
+SRC_X = extend/ftxgasp.c extend/ftxkern.c extend/ftxpost.c \
+ extend/ftxcmap.c extend/ftxwidth.c
+OBJS_X = $(SRC_X:.c=.o)
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c \
+ ttextend.c ttfile.c ttgload.c ttinterp.c ttload.c \
+ ttmemory.c ttmutex.c ttobjs.c ttraster.c
+OBJS_M = $(SRC_M:.c=.o) $(OBJS_X)
+
+SRC_S = $(ARCH)/freetype.c
+OBJ_S = $(SRC_S:.c=.o)
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+.PHONY: all debug clean distclean
+
+
+all:
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_S libttf.a
+
+debug:
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_M libttf.a
+
+
+$(OBJ_S): $(SRC_S) $(SRC_M)
+
+
+libttf.a: $($(LIB_FILES))
+ $(AR) src $@ $^
+
+clean:
+ $(RM) $($(LIB_FILES))
+
+distclean: clean
+ $(RM) dep.end libttf.a
+
+depend: $(SRC_S) $(SRC_M) $(SRC_X)
+ $(CC) -E -M $^ > dep.end
+
+ifeq (dep.end,$(wildcard dep.end))
+ include dep.end
+endif
+
+# end of Makefile.gcc
diff --git a/xc/extras/FreeType/lib/arch/amigaos/freetype.c b/xc/extras/FreeType/lib/arch/amigaos/freetype.c
new file mode 100644
index 000000000..9115410e4
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/amigaos/freetype.c
@@ -0,0 +1,24 @@
+/* This file is part of the FreeType project */
+
+/* Single object library component for AmigaOS */
+#define TT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "ttapi.c"
+#include "ttcache.c"
+#include "ttcalc.c"
+#include "ttcmap.c"
+#include "ttdebug.c"
+#include "ttfile.c"
+#include "ttgload.c"
+#include "ttinterp.c"
+#include "ttload.c"
+#include "ttmemory.c"
+#include "ttmutex.c"
+#include "ttobjs.c"
+#include "ttraster.c"
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+#include "ttextend.c"
+#endif
+
+/* end of freetype.c */
diff --git a/xc/extras/FreeType/lib/arch/amigaos/ft_conf.h b/xc/extras/FreeType/lib/arch/amigaos/ft_conf.h
new file mode 100644
index 000000000..e7f50d629
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/amigaos/ft_conf.h
@@ -0,0 +1,191 @@
+/* This file is part of the FreeType project */
+
+/* ft_conf.h for AmigaOS using ADE enviroment */
+
+
+/* we need the following because there are some typedefs in this file */
+
+#ifndef FT_CONF_H
+#define FT_CONF_H
+
+/* Define to empty if the keyword does not work. */
+
+/* #undef const */
+
+/* Define if you have a working `mmap' system call. */
+
+/* #undef HAVE_MMAP */
+
+/* Define if you have the <stdlib.h> header file. */
+
+#define HAVE_STDLIB_H
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+
+#define WORDS_BIGENDIAN
+
+/* Define if the X Window System is missing or not being used. */
+
+#define X_DISPLAY_MISSING
+
+/* The number of bytes in a int. */
+
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long. */
+
+#define SIZEOF_LONG 4
+
+/* Define if you have the getpagesize function. */
+
+#define HAVE_GETPAGESIZE
+
+/* Define if you have the memcpy function. */
+
+#define HAVE_MEMCPY
+
+/* Define if you have the memmove function. */
+
+#define HAVE_MEMMOVE
+
+/* Define if you have the valloc function. */
+
+#define HAVE_VALLOC
+
+/* Define if you have the <fcntl.h> header file. */
+
+#define HAVE_FCNTL_H
+
+/* Define if you have the <unistd.h> header file. */
+
+#define HAVE_UNISTD_H
+
+/**********************************************************************/
+/* */
+/* The following configuration macros can be tweaked manually by */
+/* a developer to turn on or off certain features or options in the */
+/* TrueType engine. This may be useful to tune it for specific */
+/* purposes.. */
+/* */
+/**********************************************************************/
+
+
+/*************************************************************************/
+/* Define this if the underlying operating system uses a different */
+/* character width than 8bit for file names. You must then also supply */
+/* a typedef declaration for defining 'TT_Text'. Default is off. */
+
+/* #define HAVE_TT_TEXT */
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support engine extensions */
+/* Default is on, but if you're satisfied by the basic services provided */
+/* by the engine and need no extensions, undefine this configuration */
+/* macro to save a few more bytes. */
+
+#define TT_CONFIG_OPTION_EXTEND_ENGINE
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support gray-scaling, */
+/* a.k.a. font-smoothing or anti-aliasing. Default is on, but you can */
+/* disable it if you don't need it. */
+
+#define TT_CONFIG_OPTION_GRAY_SCALING
+
+
+/*************************************************************************/
+/* Define this if you want to use a big 'switch' statement within the */
+/* bytecode interpreter. Because some non-optimizing compilers are not */
+/* able to produce jump tables from such statements, undefining this */
+/* configuration macro will generate the appropriate C jump table in */
+/* ttinterp.c. If you use an optimizing compiler, you should leave it */
+/* defined for better performance and code compactness.. */
+
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+/*************************************************************************/
+/* Define TT_CONFIG_THREAD_SAFE if you want to build a thread-safe */
+/* version of the library. */
+
+#undef TT_CONFIG_OPTION_THREAD_SAFE
+
+/**********************************************************************/
+/* */
+/* The following macros are used to define the debug level, as well */
+/* as individual tracing levels for each component. There are */
+/* currently three modes of operation : */
+/* */
+/* - trace mode (define DEBUG_LEVEL_TRACE) */
+/* */
+/* The engine prints all error messages, as well as tracing */
+/* ones, filtered by each component's level */
+/* */
+/* - debug mode (define DEBUG_LEVEL_ERROR) */
+/* */
+/* Disable tracing, but keeps error output and assertion */
+/* checks. */
+/* */
+/* - release mode (don't define anything) */
+/* */
+/* Don't include error-checking or tracing code in the */
+/* engine's code. Ideal for releases. */
+/* */
+/* NOTE : */
+/* */
+/* Each component's tracing level is defined in its own source. */
+/* */
+/**********************************************************************/
+
+/* Define if you want to use the tracing debug mode */
+#undef DEBUG_LEVEL_TRACE
+
+/* Define if you want to use the error debug mode - ignored if */
+/* DEBUG_LEVEL_TRACE is defined */
+#undef DEBUG_LEVEL_ERROR
+
+/**************************************************************************/
+/* Definition of various integer sizes. These types are used by ttcalc */
+/* and ttinterp (for the 64-bit integers) only.. */
+
+#if SIZEOF_INT == 4
+
+ typedef signed int TT_Int32;
+ typedef unsigned int TT_Word32;
+
+#elif SIZEOF_LONG == 4
+
+ typedef signed long TT_Int32;
+ typedef unsigned long TT_Word32;
+
+#else
+#error "no 32bit type found"
+#endif
+
+#if SIZEOF_LONG == 8
+
+/* LONG64 must be defined when a 64-bit type is available */
+/* INT64 must then be defined to this type.. */
+#define LONG64
+#define INT64 long
+
+#else
+
+/* GCC provides the non-ANSI 'long long' 64-bit type. You can activate */
+/* by defining the TT_USE_LONG_LONG macro in 'ft_conf.h'. Note that this */
+/* will produce many -ansi warnings during library compilation. */
+#ifdef TT_USE_LONG_LONG
+
+#define LONG64
+#define INT64 long long
+
+#endif /* TT_USE_LONG_LONG */
+#endif
+
+#endif /* FT_CONF_H */
+
+
+/* End of ft_conf.h */
diff --git a/xc/extras/FreeType/lib/arch/mac/README b/xc/extras/FreeType/lib/arch/mac/README
new file mode 100644
index 000000000..80334869b
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/mac/README
@@ -0,0 +1,47 @@
+
+This is the readme of the freetype.hqx archive in the contrib/mac
+subdirectory. Please note that the FreeType team does *not* support the
+Macintosh platform due to lack of knowledge. All questions regarding the
+code should be sent to both David Williss and the freetype-devel list.
+
+
+----------------------------------------------------------------------------
+
+
+These are CodeWarrior projects for building the FreeType library on a Macintosh
+I've only provided PPC projects here, but building for 68K shouldn't be hard.
+There are two directories here (OK, "folders"). One contains a project for
+building freetype.ppc.lib and the other is for freetype.ppc.dll. (I havn't
+actually tested the DLL yet.)
+
+The Macintosh stores TrueType fonts in a "Fonts" folder under the "System"
+folder. There is a standard MacOS API for finding this folder, so I use it.
+However, the fonts aren't normal flat files. They have all the data in
+resources in the resource fork. Each font is an 'sfnt' resource, and each
+file can have more than one 'sfnt' resource.
+
+To get at them, I made a copy of ttmmap.c from the Unix implementation and
+modified it to load/release the resource and lock/unlock the handle as needed.
+This only required a change to the open and close functions. After that, it
+works just as if it was using Unix memory mapping.
+
+One thing however. Because of the bizarre scheme for storing the fonts, I
+made up a way of specifying the font filename.
+
+ fonts:/fontfile/fontname
+
+Where fonts:/ is a literal string that means "the fonts folder", fontfile is
+the name of the actual file and fontname is the name of the 'sfnt' resource.
+Currently, this is the only thing it understands. It might be nice if some
+day (2.0 maybe?) ttfile.c and ttmmap.c wern't mutialy exclusive and it could
+decide which method to use based on the filename or something.
+
+Another thing that I had to change to make this work. It seems that Macintosh
+TrueType fonts have no OS/2 table, so ttload.c needs to be modified to make
+that nonfatal, at least on a Macintosh.
+
+---
+
+David Williss
+MicroImages, Inc.
+dwilliss@microimages.com
diff --git a/xc/extras/FreeType/lib/arch/mac/ttmmap.c b/xc/extras/FreeType/lib/arch/mac/ttmmap.c
new file mode 100644
index 000000000..3a7a917fb
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/mac/ttmmap.c
@@ -0,0 +1,1069 @@
+/*******************************************************************
+ *
+ * ttmmap.c 2.0
+ *
+ * Memory-Mapped file component ( replaces ttfile.c ).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Changes between 2.0 and 1.3 :
+ *
+ * - adopted new design/separation introduced in ttfile.c 2.0
+ *
+ ******************************************************************/
+
+#include "ttconfig.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include <folders.h>
+#include <resources.h>
+
+
+#include "freetype.h"
+#include "tttypes.h"
+#include "ttdebug.h"
+#include "ttengine.h"
+#include "ttmutex.h"
+#include "ttmemory.h"
+#include "ttfile.h" /* our prototypes */
+
+ /* This definition is mandatory for each file component! */
+ EXPORT_FUNC
+ const TFileFrame TT_Null_FileFrame = { NULL, 0, 0 };
+
+ /* It has proven useful to do some bounds checks during */
+ /* development phase. Define DEBUG_FILE when compiling */
+ /* this component to enable them. */
+
+#ifdef DEBUG_FILE
+#define CHECK_FRAME( frame, n ) \
+ do { \
+ if ( frame.cursor+n > frame.address + frame.size ) \
+ Panic( "Frame boundary error!\n" ); \
+ } while ( 0 )
+#else
+#define CHECK_FRAME( frame, n ) \
+ do { \
+ } while( 0 )
+#endif
+
+ struct _TFileMap
+ {
+ String* base; /* base address of mapped file */
+ Int refcount; /* reference count for handle region */
+ Long size; /* stream size in file */
+ Long offset; /* offset in file */
+ Handle handle; /* Macintosh style handle to lock/unlock */
+ short resid; /* Id of resource file to close when done */
+ };
+
+ typedef struct _TFileMap TFileMap;
+
+#define MAP_Address( map ) (Byte*)( (map)->base + (map)->offset )
+
+ /* The stream record structure */
+ typedef struct _TStream_Rec
+ {
+ TFileMap* map; /* mapped file description */
+ Long pos ; /* cursor in mapped file */
+ } TStream_Rec;
+
+ typedef TStream_Rec* PStream_Rec;
+
+#define STREAM2REC( x ) ( (TStream_Rec*)HANDLE_Val( x ) )
+
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /**** ****/
+ /**** N O N R E E N T R A N T I M P L E M E N T A T I O N ****/
+ /**** ****/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+ /* The TFile_Component structure holds all the data that was */
+ /* previously declared static or global in this component. */
+ /* */
+ /* It is accessible through the 'engine.file_component' */
+ /* variable in re-entrant builds, or directly through the */
+ /* static 'files' variable in other builds. */
+
+ struct _TFile_Component
+ {
+ TMutex lock; /* used by the thread-safe build only */
+ PStream_Rec stream; /* current stream */
+ TFileFrame frame; /* current frame */
+ };
+
+ typedef struct _TFile_Component TFile_Component;
+
+/* The macro CUR_Stream denotes the current input stream */
+/* Note that for the re-entrant version, the 'stream' name has been */
+/* chosen according to the macro STREAM_ARGS. */
+
+/* The macro CUR_Frame denotes the current file frame */
+/* Note that for the re-entrant version, the 'frame' name has been */
+/* chosen according to the macro FRAME_ARGS. */
+
+/* The macro STREAM_VAR is used when calling public functions */
+/* that need an 'optional' stream argument. */
+
+#define CUR_Stream files.stream /* thread-safe macros */
+#define CUR_Frame files.frame
+
+#define STREAM_VARS /* void */
+#define STREAM_VAR /* void */
+
+ /* the 'files' variable is only defined in non-reentrant builds */
+
+ static TFile_Component files;
+
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ MUTEX_Create( files.lock );
+ files.stream = NULL;
+ ZERO_Frame( files.frame );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ MUTEX_Destroy( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Copies or duplicates a given stream.
+ *
+ * Input : org_stream original stream
+ * stream target stream (copy or duplicate)
+ *
+ * Output : Error code
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream org_stream,
+ TT_Stream* stream )
+ {
+ MUTEX_Lock( files.lock );
+ *stream = org_stream;
+ files.stream = STREAM2REC( org_stream ); /* set current stream */
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream
+ *
+ * Output : Error code
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ HANDLE_Set( *stream, NULL );
+ MUTEX_Release( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+#else /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /******** ********/
+ /******** R E E N T R A N T I M P L E M E N T A T I O N ********/
+ /******** ********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+#define CUR_Stream STREAM2REC( stream ) /* re-entrant macros */
+#define CUR_Frame (*frame)
+
+#define STREAM_VARS stream,
+#define STREAM_VAR stream
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ engine.file_component = NULL;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Copies or duplicates a given stream.
+ *
+ * Input : org_stream original stream
+ * stream target stream (copy or duplicate)
+ *
+ * Output : Error code. The output stream is set to NULL in
+ * case of Failure.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream input_stream,
+ TT_Stream* copy )
+ {
+ TT_Error error;
+ PStream_Rec stream_rec;
+ PStream_Rec copy_rec;
+
+
+ stream_rec = STREAM2REC( input_stream );
+
+ if ( ALLOC( copy_rec, sizeof ( TStream_Rec ) ) )
+ goto Fail;
+
+ HANDLE_Set( *copy, copy_rec );
+
+ copy_rec->map->refcount++;
+ copy_rec->pos = 0;
+
+ return TT_Err_Ok;
+
+ Fail:
+ HANDLE_Set( *copy, NULL );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream
+ *
+ * Output : error code
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ return TT_Close_Stream( stream );
+ }
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*********** ***********/
+ /*********** C O M M O N I M P L E M E N T A T I O N ***********/
+ /*********** ***********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : AllocateMap
+ *
+ * Description : Allocates a new map from the table.
+ *
+ * Output : Pointer to new stream rec. NULL in case of failure.
+ *
+ ******************************************************************/
+
+ static
+ TFileMap* Allocate_Map( void )
+ {
+ TFileMap* result;
+
+
+ if ( MEM_Alloc( result, sizeof ( TFileMap ) ) )
+ return NULL;
+
+ result->refcount = 1;
+ return result;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : ReleaseMap
+ *
+ * Description : Releases a used map to the table if reference i
+ * counter reaches zero.
+ *
+ * Input : map
+ *
+ * Output : None.
+ *
+ * Note : Called by TT_Close_File()
+ *
+ ******************************************************************/
+
+ static
+ void Release_Map ( TFileMap* map )
+ {
+ map->refcount--;
+ if ( map->refcount <= 0 )
+ {
+ /* MacOS System calls */
+ HUnlock(map->handle);
+ ReleaseResource(map->handle);
+ CloseResFile(map->resid);
+
+ FREE( map );
+ }
+ }
+
+
+/* Whadda ya mean "strdup undefined"? Fine, I'll define my own! */
+static char *mystrdup(const char *str) {
+ char *ret;
+
+ if ( TT_Alloc(strlen(str) + 1, (void**)&ret) != 0 ) return(NULL);
+ strcpy(ret, str);
+ return(ret);
+ }
+
+/*******************************************************************
+ *
+ * Function : TT_Open_Stream
+ *
+ * Description : Opens the font file and saves the total file size.
+ *
+ * Input : error address of stream's error variable
+ * (re-entrant build only).
+ * filepathname pathname of the file to open
+ * stream address of target TT_Stream structure
+ *
+ * Output : SUCCESS on success, FAILURE on error.
+ * The target stream is set to -1 in case of failure.
+ *
+ ******************************************************************/
+/*
+** This is not a totally generic implementation. It currently assumes the filename
+** starts with "fonts:" and uses slashes instead of colons like Mac code normally
+** would. Given a filename of the form "fonts:/filename/resname", Load the resource
+** and lock the handle
+**
+** The "fonts:" at the beginning is just a convention I came up with to
+** indicate the Fonts folder inside the current System folder (find via FindFolder())
+*/
+
+ LOCAL_FUNC
+ TT_Error TT_Open_Stream( const String* filepathname,
+ TT_Stream* stream )
+ {
+ TT_Error error;
+ Int file;
+ PStream_Rec stream_rec;
+ TFileMap* map;
+
+ int size, err = 0;
+ short vRefNum, res = -1;
+ Str255 FontName;
+ char *cp, *p, *fname, *sep;
+ Str63 myName;
+ long dirID;
+
+
+ if ( ALLOC( *stream, sizeof ( TStream_Rec ) ) )
+ return error;
+
+ map = Allocate_Map();
+ if ( !map )
+ {
+ error = TT_Err_Out_Of_Memory;
+ goto Memory_Fail;
+ }
+
+ stream_rec = STREAM2REC( *stream );
+
+ /* Find the dirID of the Fonts folder in the current System folder */
+ if (FindFolder(kOnSystemDisk, kFontsFolderType, kDontCreateFolder, &vRefNum, &dirID))
+ goto File_Fail;
+
+ /* Break the name apart */
+ fname = mystrdup(filepathname); /* Make a copy so we can muck with it */
+ sep = ":/"; /* Things that can seperate file path componants */
+
+ strtok(fname, sep); /* Skip over "fonts:" */
+
+ if ((p = strtok(NULL, sep)) == NULL) /* Get filename */
+ goto File_Fail;
+ strcpy(myName + 1, p); /* Make this a Pascal string (Yuck!) */
+ myName[0] = strlen(p);
+
+ if ((p = strtok(NULL, sep)) == NULL) /* Get res name */
+ goto File_Fail;
+ strcpy(FontName+1, p); /* Make this a Pascal string (Yuck!) */
+ FontName[0] = strlen(p);
+
+ FREE( fname );
+
+ if ((cp = strchr(FontName, '.')) != NULL) /* Strip off ".ttf" , if any */
+ *cp = 0;
+
+ /* Read the font into a buffer */
+ if ((map->resid = HOpenResFile(vRefNum, dirID, myName, fsRdPerm)) == -1)
+ goto File_Fail;
+
+ if ((map->handle = Get1NamedResource('sfnt', FontName)) == NULL)
+ goto Map_Fail;
+
+ HLock(map->handle);
+ map->base = *map->handle;
+ map->offset = 0;
+ map->size = GetResourceSizeOnDisk(map->handle);
+
+ if ( map->base == NULL )
+ goto Lock_Fail;
+
+ stream_rec->map = map;
+ stream_rec->pos = 0;
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+ CUR_Stream = stream_rec;
+#endif
+
+ return TT_Err_Ok;
+
+ Lock_Fail:
+ ReleaseResource(map->handle);
+
+ Map_Fail:
+ CloseResFile(map->resid);
+
+ File_Fail:
+ error = TT_Err_Could_Not_Open_File;
+ FREE( map );
+
+ Memory_Fail:
+ FREE( *stream );
+ FREE( fname );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Close_Stream
+ *
+ * Description : Closes a stream.
+ *
+ * Input : stream
+ *
+ * Output : SUCCESS (always)
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TT_Close_Stream( TT_Stream* stream )
+ {
+ PStream_Rec rec = STREAM2REC( *stream );
+
+
+ Release_Map( rec->map );
+ FREE( rec );
+
+ HANDLE_Set( *stream, NULL );
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Flush_Stream
+ *
+ * Description : Flushes a stream, i.e., closes its file handle.
+ *
+ * Input : stream address of target TT_Stream structure
+ *
+ * Output : Error code
+ *
+ * NOTE : Never flush the current opened stream. This means that
+ * you should _never_ call this function between a
+ * TT_Use_Stream() and a TT_Done_Stream()!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Flush_Stream( TT_Stream* stream )
+ {
+ /* XXX - DUMMY IMPLEMENTATION */
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Stream_Size
+ *
+ * Description : Returns the length of a given stream, even if it
+ * is flushed.
+ *
+ * Input : stream the stream
+ *
+ * Output : Length of stream in bytes.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_Stream_Size( TT_Stream stream )
+ {
+ PStream_Rec rec = STREAM2REC( stream );
+
+
+ if ( rec )
+ return rec->map->size;
+ else
+ return 0; /* invalid stream - return 0 */
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Seek_File
+ *
+ * Description : Seeks the file cursor to a different position.
+ *
+ * Input : position new position in file
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Seek_File( STREAM_ARGS Long position )
+ {
+ if ( position > CUR_Stream->map->size )
+ return TT_Err_Invalid_File_Offset;
+
+ CUR_Stream->pos = position;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Skip_File
+ *
+ * Description : Skips forward the file cursor.
+ *
+ * Input : distance number of bytes to skip
+ *
+ * Output : see TT_Seek_File
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Skip_File( STREAM_ARGS Long distance )
+ {
+ return TT_Seek_File( STREAM_VARS CUR_Stream->pos + distance );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_File
+ *
+ * Description : Reads a chunk of the file and copies it to memory.
+ *
+ * Input : buffer target buffer
+ * count length in bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_File( STREAM_ARGS void* buffer, Long count )
+ {
+ if ( CUR_Stream->pos + count > CUR_Stream->map->size )
+ return TT_Err_Invalid_File_Read;
+
+ MEM_Copy( buffer,
+ MAP_Address( CUR_Stream->map ) + CUR_Stream->pos, count );
+ CUR_Stream->pos += count;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_At_File
+ *
+ * Description : Reads file at a specified position.
+ *
+ * Input : position position to seek to before read
+ * buffer target buffer
+ * count number of bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_At_File( STREAM_ARGS Long position,
+ void* buffer,
+ Long count )
+ {
+ TT_Error error;
+
+
+ if ( (error = TT_Seek_File( STREAM_VARS position )) ||
+ (error = TT_Read_File( STREAM_VARS buffer, count )) )
+ return error;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_File_Pos
+ *
+ * Description : Returns current file seek pointer.
+ *
+ * Input : none
+ *
+ * Output : current file position
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_File_Pos( STREAM_ARG )
+ {
+ return CUR_Stream->pos;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : Error code
+ *
+ * Notes: The function fails if the byte range is not within the
+ * the file, or if there is not enough memory to cache
+ * the bytes properly (which usually means that aSize is
+ * too big in both cases).
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( CUR_Stream->pos + size > CUR_Stream->map->size )
+ return TT_Err_Invalid_Frame_Access;
+
+ CUR_Frame.size = size;
+ CUR_Frame.address = MAP_Address( CUR_Stream->map ) + CUR_Stream->pos;
+ CUR_Frame.cursor = CUR_Frame.address;
+
+ CUR_Stream->pos += size;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Check_And_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : Error code
+ *
+ * Notes: The function truncates 'size' if the byte range is not
+ * within the file.
+ *
+ * It will fail if there is not enough memory to cache
+ * the bytes properly (which usually means that aSize is
+ * too big).
+ *
+ * It will fail if you make two consecutive calls
+ * to TT_Access_Frame(), without a TT_Forget_Frame() between
+ * them.
+ *
+ * The only difference with TT_Access_Frame() is that we
+ * check that the frame is within the current file. We
+ * otherwise truncate it. The 'overflow' is set to zero.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+ Long readBytes;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ readBytes = CUR_Stream->map->size - CUR_Stream->pos;
+ if ( size > readBytes )
+ {
+ /* There is overflow, we allocate a new block then */
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+
+ CUR_Frame.size = size;
+
+ /* copy the valid part */
+ MEM_Copy( CUR_Frame.address,
+ MAP_Address( CUR_Stream->map ) + CUR_Stream->pos,
+ readBytes );
+ }
+ else
+ {
+ CUR_Frame.size = size;
+ CUR_Frame.address = MAP_Address( CUR_Stream->map ) + CUR_Stream->pos;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Forget_Frame
+ *
+ * Description : Releases a cached frame after reading.
+ *
+ * Input : None
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Forget_Frame( FRAME_ARG )
+ {
+ if ( CUR_Frame.address == NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ /* If we were using a duplicate in case of overflow, free it now */
+ if ( CUR_Frame.address < (Byte*)CUR_Stream->map->base ||
+ CUR_Frame.address >= (Byte*)CUR_Stream->map->base +
+ CUR_Stream->map->size )
+ FREE( CUR_Frame.address );
+
+ ZERO_Frame( files.frame );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Byte
+ *
+ * Description : Extracts a byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted Byte
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+#if 0
+
+ EXPORT_FUNC
+ Byte TT_Get_Byte( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Byte)(*CUR_Frame.cursor++);
+ }
+
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : GET_Char
+ *
+ * Description : Extracts a signed byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted char
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Char TT_Get_Char( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Char)(*CUR_Frame.cursor++);
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Short
+ *
+ * Description : Extracts a short from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted short
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Short TT_Get_Short( FRAME_ARG )
+ {
+ Short getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = ((Short)CUR_Frame.cursor[0] << 8) |
+ (Short)CUR_Frame.cursor[1];
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_UShort
+ *
+ * Description : Extracts an unsigned short from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted ushort
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+#if 0
+
+ EXPORT_FUNC
+ UShort TT_Get_UShort( FRAME_ARG )
+ {
+ UShort getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = ((UShort)CUR_Frame.cursor[0] << 8) |
+ (UShort)CUR_Frame.cursor[1];
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : GET_Long
+ *
+ * Description : Extracts a long from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted long
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_Get_Long( FRAME_ARG )
+ {
+ Long getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ((Long)CUR_Frame.cursor[0] << 24) |
+ ((Long)CUR_Frame.cursor[1] << 16) |
+ ((Long)CUR_Frame.cursor[2] << 8 ) |
+ (Long)CUR_Frame.cursor[3];
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_ULong
+ *
+ * Description : Extracts an unsigned long from the frame.
+ *
+ * Input : None
+ *
+ * Output : Extracted ulong
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+#if 0
+
+ EXPORT_FUNC
+ ULong TT_Get_ULong( FRAME_ARG )
+ {
+ ULong getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ( ((ULong)CUR_Frame.cursor[0] << 24) |
+ ((ULong)CUR_Frame.cursor[1] << 16) |
+ ((ULong)CUR_Frame.cursor[2] << 8 ) |
+ (ULong)CUR_Frame.cursor[3] );
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+
+#endif
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/arch/msdos/Makefile.dm b/xc/extras/FreeType/lib/arch/msdos/Makefile.dm
new file mode 100644
index 000000000..5492667de
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/msdos/Makefile.dm
@@ -0,0 +1,82 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc or djgpp under MSDOS.
+#
+# You will need dmake.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# dmake -r -f arch/msdos/Makefile.dm
+
+ARCH = arch/msdos
+FT_MAKEFILE = $(ARCH)/Makefile.dm
+FT_MAKE = dmake -r
+
+.IMPORT: COMSPEC
+SHELL := $(COMSPEC)
+SHELLFLAGS := /c
+GROUPSHELL := $(SHELL)
+GROUPFLAGS := $(SHELLFLAGS)
+GROUPSUFFIX := .bat
+SHELLMETAS := *"?<>&|
+
+CC = gcc
+
+CFLAGS = -Wall -O2 -g -ansi -pedantic -I$(ARCH) -I. -Iextend
+# CFLAGS = -Wall -ansi -O2 -s -I$(ARCH) -I. -Iextend
+
+SRC_X = extend/ftxgasp.c extend/ftxkern.c extend/ftxpost.c \
+ extend/ftxcmap.c extend/ftxwidth.c
+OBJS_X = $(SRC_X:.c=.o)
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c \
+ ttfile.c ttgload.c ttinterp.c ttload.c \
+ ttmemory.c ttmutex.c ttobjs.c ttraster.c ttextend.c
+OBJS_M = $(SRC_M:.c=.o) $(OBJS_X)
+
+SRC_S = $(ARCH)/freetype.c
+OBJ_S = $(SRC_S:.c=.o)
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+.PHONY: all debug clean distclean depend
+
+
+all:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_S libttf.a
+
+debug:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_M libttf.a
+
+
+$(OBJ_S): $(SRC_S) $(SRC_M)
+ $(CC) $(CFLAGS) -c -o $@ $(SRC_S)
+
+libttf.a: $($(LIB_FILES))
+ +-del $@
+ ar src $@ @$(mktmp $(<:t"\n")\n)
+
+clean:
+-[
+ del *.o
+ del extend\*.o
+ del arch\msdos\*.o
+]
+
+distclean: clean
+-[
+ del dep.end
+ del libttf.a
+]
+
+# depend: $(SRC_S) $(SRC_M) $(SRC_X)
+# $(CC) -E -M @$(mktmp $(<:t"\n")\n) > dep.end
+
+# ifeq (dep.end,$(wildcard dep.end))
+# include dep.end
+# endif
+
+# end of Makefile.dm
diff --git a/xc/extras/FreeType/lib/arch/msdos/Makefile.gcc b/xc/extras/FreeType/lib/arch/msdos/Makefile.gcc
new file mode 100644
index 000000000..293c2fc8f
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/msdos/Makefile.gcc
@@ -0,0 +1,75 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc or djgpp under MSDOS.
+#
+# You will need GNU make.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# make -f arch/msdos/Makefile.gcc
+
+ARCH = arch/msdos
+FT_MAKEFILE = $(ARCH)/Makefile.gcc
+
+CC = gcc
+
+CFLAGS = -Wall -O2 -g -ansi -pedantic -I$(ARCH) -I. -Iextend
+#CFLAGS = -Wall -ansi -pedantic -O2 -s -I$(ARCH) -I. -Iextend
+
+TTFILE = ./ttfile.c
+TTMEMORY = ./ttmemory.c
+TTMUTEX = ./ttmutex.c
+
+PORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)
+
+SRC_X = extend/ftxgasp.c extend/ftxkern.c extend/ftxpost.c \
+ extend/ftxcmap.c extend/ftxwidth.c
+OBJS_X = $(SRC_X:.c=.o)
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c \
+ ttgload.c ttinterp.c ttload.c ttobjs.c \
+ ttraster.c ttextend.c $(PORT)
+OBJS_M = $(SRC_M:.c=.o) $(OBJS_X)
+
+SRC_S = $(ARCH)/freetype.c
+OBJ_S = $(SRC_S:.c=.o)
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+.PHONY: all debug clean distclean depend
+
+
+all:
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_S libttf.a
+
+debug:
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_M libttf.a
+
+
+$(OBJ_S): $(SRC_S) $(SRC_M)
+
+libttf.a: $($(LIB_FILES))
+ -del $@
+ ar src $@ $^
+
+clean:
+ -del *.o
+ -del extend\*.o
+ -del arch\msdos\*.o
+ -del response
+
+distclean: clean
+ -del dep.end
+ -del libttf.a
+
+depend: $(SRS_S) $(SRC_M) $(SRC_X)
+ $(CC) -E -M $^ > dep.end
+
+ifeq (dep.end,$(wildcard dep.end))
+ include dep.end
+endif
+
+# end of Makefile.gcc
diff --git a/xc/extras/FreeType/lib/arch/msdos/Makefile.wat b/xc/extras/FreeType/lib/arch/msdos/Makefile.wat
new file mode 100644
index 000000000..5ba247e3d
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/msdos/Makefile.wat
@@ -0,0 +1,84 @@
+# This file is part of the FreeType project
+#
+# This builds the Watcom library with Watcom's wcc386 under DOS
+#
+# You'll need Watcom's wmake
+#
+#
+# Invoke by "wmake -f arch\msdos\Makefile.wat" while in the "lib" directory
+#
+# This will build "freetype\lib\libttf.lib"
+#
+
+ARCH = arch\msdos
+FT_MAKEFILE = $(ARCH)\Makefile.wat
+FT_MAKE = wmake -h
+
+
+.EXTENSIONS:
+.EXTENSIONS: .lib .obj .c .h
+.obj:.;.\extend;.\$(ARCH)
+.c:.;.\extend;.\$(ARCH)
+.h:.;.\extend;.\$(ARCH)
+
+CC = wcc386
+
+CCFLAGS = /otexanl+ /s /w4 /zq /d3 -I$(ARCH) -I. -Iextend
+
+
+# FIXME: should use something like OBJ = $(SRC:.c=.obj)
+
+SRC_X = ftxgasp.c ftxkern.c ftxpost.c ftxcmap.c ftxwidth.c
+OBJS_X = ftxgasp.obj ftxkern.obj ftxpost.obj ftxcmap.obj ftxwidth.obj
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c &
+ ttfile.c ttgload.c ttinterp.c &
+ ttload.c ttmemory.c ttmutex.c ttobjs.c ttraster.c &
+ ttextend.c
+OBJS_M = ttapi.obj ttcache.obj ttcalc.obj ttcmap.obj ttdebug.obj &
+ ttfile.obj ttgload.obj ttinterp.obj &
+ ttload.obj ttmemory.obj ttmutex.obj ttobjs.obj ttraster.obj &
+ ttextend.obj $(OBJS_X)
+
+SRC_S = freetype.c
+OBJ_S = freetype.obj
+OBJS_S = $(OBJ_S) $(OBJ_X)
+
+
+.c.obj:
+ $(CC) $(CCFLAGS) $[* /fo=$[*.obj
+
+libname = libttf
+libfile = $(libname).lib
+cmdfile = $(libname).lst
+
+
+all: .symbolic
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_S $(libfile)
+
+debug: .symbolic
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_M $(libfile)
+
+
+$(libfile): $($(LIB_FILES))
+ wlib -q -n $(libfile) @$(cmdfile)
+
+# is this correct? Know nothing about wmake and the Watcom compiler...
+$(OBJ_S): $(SRC_S) $(SRC_M)
+ $(CC) $(CCFLAGS) $(SRC_S) /fo=$(OBJ_S)
+
+$(cmdfile): $($(LIB_FILES))
+ @for %i in ($($(LIB_FILES))) do @%append $(cmdfile) +-%i
+
+clean: .symbolic
+ @-erase $(OBJ_S)
+ @-erase $(OBJS_M)
+ @-erase $(cmdfile)
+
+distclean: .symbolic clean
+ @-erase $(libfile)
+
+new: .symbolic
+ @-wtouch *.c
+
+# end of Makefile.wat
diff --git a/xc/extras/FreeType/lib/arch/msdos/freetype.c b/xc/extras/FreeType/lib/arch/msdos/freetype.c
new file mode 100644
index 000000000..cb08313c3
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/msdos/freetype.c
@@ -0,0 +1,24 @@
+/* This file is part of the FreeType project */
+
+/* Single object library component for MSDOS */
+#define TT_MAKE_OPTION_SINGLE_OBJECT
+
+#include "ttapi.c"
+#include "ttcache.c"
+#include "ttcalc.c"
+#include "ttcmap.c"
+#include "ttdebug.c"
+#include "ttfile.c"
+#include "ttgload.c"
+#include "ttinterp.c"
+#include "ttload.c"
+#include "ttmemory.c"
+#include "ttmutex.c"
+#include "ttobjs.c"
+#include "ttraster.c"
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+#include "ttextend.c"
+#endif
+
+/* end of freetype.c */
diff --git a/xc/extras/FreeType/lib/arch/msdos/ft_conf.h b/xc/extras/FreeType/lib/arch/msdos/ft_conf.h
new file mode 100644
index 000000000..acf70a2b3
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/msdos/ft_conf.h
@@ -0,0 +1,187 @@
+/* This file is part of the FreeType project */
+
+/* ft_conf.h for MSDOS */
+
+
+/* we need the following because there are some typedefs in this file */
+
+#ifndef FT_CONF_H
+#define FT_CONF_H
+
+/* Define to empty if the keyword does not work. */
+/* #undef const */
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the memcpy function. */
+#define HAVE_MEMCPY
+
+/* Define if you have the memmove function. */
+#define HAVE_MEMMOVE
+
+/* Define if you have the valloc function. */
+#undef HAVE_VALLOC
+
+/* Define if you have the <fcntl.h> header file. */
+#define HAVE_FCNTL_H
+
+/* Define if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H
+
+/* Define if you need <conio.h> for console I/O functions. */
+#ifdef __EMX__
+#define HAVE_CONIO_H
+#endif
+
+/* command.com can't pipe stderr into a file; any message would be */
+/* written into the graphics screen. */
+#define HAVE_PRINT_FUNCTION 1
+
+#define Print( format, ap ) vfprintf( stdout, (format), (ap) )
+
+/* The number of bytes in a int. - for 32-bits DOS compilers only !! */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long. */
+#define SIZEOF_LONG 4
+
+/**********************************************************************/
+/* */
+/* The following configuration macros can be tweaked manually by */
+/* a developer to turn on or off certain features or options in the */
+/* TrueType engine. This may be useful to tune it for specific */
+/* purposes.. */
+/* */
+/**********************************************************************/
+
+
+/*************************************************************************/
+/* Define this if the underlying operating system uses a different */
+/* character width than 8bit for file names. You must then also supply */
+/* a typedef declaration for defining 'TT_Text'. Default is off. */
+
+/* #define HAVE_TT_TEXT */
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support engine extensions */
+/* Default is on, but if you're satisfied by the basic services provided */
+/* by the engine and need no extensions, undefine this configuration */
+/* macro to save a few more bytes. */
+
+#define TT_CONFIG_OPTION_EXTEND_ENGINE
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support gray-scaling, */
+/* a.k.a. font-smoothing or anti-aliasing. Default is on, but you can */
+/* disable it if you don't need it. */
+
+#define TT_CONFIG_OPTION_GRAY_SCALING
+
+
+/*************************************************************************/
+/* Define this if you want to use a big 'switch' statement within the */
+/* bytecode interpreter. Because some non-optimizing compilers are not */
+/* able to produce jump tables from such statements, undefining this */
+/* configuration macro will generate the appropriate C jump table in */
+/* ttinterp.c. If you use an optimizing compiler, you should leave it */
+/* defined for better performance and code compactness.. */
+
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+/*************************************************************************/
+/* Define TT_CONFIG_THREAD_SAFE if you want to build a thread-safe */
+/* version of the library. */
+
+#undef TT_CONFIG_OPTION_THREAD_SAFE
+
+/**********************************************************************/
+/* */
+/* The following macros are used to define the debug level, as well */
+/* as individual tracing levels for each component. There are */
+/* currently three modes of operation : */
+/* */
+/* - trace mode (define DEBUG_LEVEL_TRACE) */
+/* */
+/* The engine prints all error messages, as well as tracing */
+/* ones, filtered by each component's level */
+/* */
+/* - debug mode (define DEBUG_LEVEL_ERROR) */
+/* */
+/* Disable tracing, but keeps error output and assertion */
+/* checks. */
+/* */
+/* - release mode (don't define anything) */
+/* */
+/* Don't include error-checking or tracing code in the */
+/* engine's code. Ideal for releases. */
+/* */
+/* NOTE : */
+/* */
+/* Each component's tracing level is defined in its own source. */
+/* */
+/**********************************************************************/
+
+/* Define if you want to use the tracing debug mode */
+#undef DEBUG_LEVEL_TRACE
+
+/* Define if you want to use the error debug mode - ignored if */
+/* DEBUG_LEVEL_TRACE is defined */
+#undef DEBUG_LEVEL_ERROR
+
+
+/**************************************************************************/
+/* Definition of various integer sizes. These types are used by ttcalc */
+/* and ttinterp (for the 64-bit integers) only.. */
+
+#if SIZEOF_INT == 4
+
+ typedef signed int TT_Int32;
+ typedef unsigned int TT_Word32;
+
+#elif SIZEOF_LONG == 4
+
+ typedef signed long TT_Int32;
+ typedef unsigned long TT_Word32;
+
+#else
+#error "no 32bit type found"
+#endif
+
+#if SIZEOF_LONG == 8
+
+/* LONG64 must be defined when a 64-bit type is available */
+/* INT64 must then be defined to this type.. */
+#define LONG64
+#define INT64 long
+
+#else
+
+/* GCC provides the non-ANSI 'long long' 64-bit type. You can activate */
+/* by defining the TT_USE_LONG_LONG macro in 'ft_conf.h'. Note that this */
+/* will produce many -ansi warnings during library compilation. */
+#ifdef TT_USE_LONG_LONG
+
+#define LONG64
+#define INT64 long long
+
+#endif /* TT_USE_LONG_LONG */
+#endif
+
+#endif /* FT_CONF_H */
+
+
+/* End of ft_conf.h */
diff --git a/xc/extras/FreeType/lib/arch/os2/Makefile.dm b/xc/extras/FreeType/lib/arch/os2/Makefile.dm
new file mode 100644
index 000000000..27efdda5e
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/os2/Makefile.dm
@@ -0,0 +1,82 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc under OS/2
+#
+# You will need dmake.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# dmake -r -f arch/os2/Makefile.dm
+
+ARCH = arch/os2
+FT_MAKEFILE = $(ARCH)/Makefile.dm
+FT_MAKE = dmake -r
+
+.IMPORT: COMSPEC
+SHELL := $(COMSPEC)
+SHELLFLAGS := /c
+GROUPSHELL := $(SHELL)
+GROUPFLAGS := $(SHELLFLAGS)
+GROUPSUFFIX := .cmd
+SHELLMETAS := *"?<>&|
+
+CC = gcc
+
+CFLAGS = -Wall -O2 -g -ansi -pedantic -I$(ARCH) -I. -Iextend
+# CFLAGS = -Wall -ansi -O2 -s -I$(ARCH) -I. -Iextend
+
+TTFILE = $(ARCH)/os2file.c
+TTMEMORY = ./ttmemory.c
+TTMUTEX = ./ttmutex.c
+
+PORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)
+
+SRC_X = extend/ftxgasp.c extend/ftxkern.c extend/ftxpost.c \
+ extend/ftxcmap.c extend/ftxwidth.c
+OBJS_X = $(SRC_X:.c=.o)
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c \
+ ttgload.c ttinterp.c ttload.c ttobjs.c \
+ ttraster.c ttextend.c $(PORT)
+OBJS_M = $(SRC_M:.c=.o) $(OBJS_X)
+
+SRC_S = $(ARCH)/freetype.c
+OBJ_S = $(SRC_S:.c=.o)
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+.PHONY: all debug clean distclean depend
+
+
+all:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_S libttf.a
+
+debug:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_M libttf.a
+
+
+$(OBJ_S): $(SRC_S) $(SRC_M)
+ $(CC) $(CFLAGS) -c -o $@ $(SRC_S)
+
+
+libttf.a: $($(LIB_FILES))
+ +-del $@
+ ar src $@ @$(mktmp $(<:t"\n")\n)
+
+clean:
+ -+del $(subst,/,\ $($(LIB_FILES)))
+
+distclean: clean
+ -+del dep.end libttf.a
+
+# depend: $(SRC_S) $(SRC_M) $(SRC_X)
+# $(CC) -E -M @$(mktmp $(<:t"\n")\n) > dep.end
+
+# ifeq (dep.end,$(wildcard dep.end))
+# include dep.end
+# endif
+
+# end of Makefile.dm
diff --git a/xc/extras/FreeType/lib/arch/os2/Makefile.emx b/xc/extras/FreeType/lib/arch/os2/Makefile.emx
new file mode 100644
index 000000000..7fdf95839
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/os2/Makefile.emx
@@ -0,0 +1,74 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc under OS/2.
+#
+# You will need GNU make.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# make -f arch/os2/Makefile.emx
+
+ARCH = arch/os2
+FT_MAKEFILE = $(ARCH)/Makefile.emx
+
+CC = gcc
+
+CFLAGS = -Wall -O3 -fno-inline -fomit-frame-pointer \
+ -g -ansi -pedantic -I$(ARCH) -I. -Iextend
+#CFLAGS = -Wall -ansi -pedantic -O2 -s -I$(ARCH) -I. -Iextend
+
+TTFILE = $(ARCH)/os2file.c
+TTMEMORY = ./ttmemory.c
+TTMUTEX = ./ttmutex.c
+
+PORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)
+
+SRC_X = extend/ftxgasp.c extend/ftxkern.c extend/ftxpost.c \
+ extend/ftxcmap.c extend/ftxwidth.c
+OBJS_X = $(SRC_X:.c=.o)
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c \
+ ttgload.c ttinterp.c ttload.c ttobjs.c \
+ ttraster.c ttextend.c $(PORT)
+OBJS_M = $(SRC_M:.c=.o) $(OBJS_X)
+
+SRC_S = $(ARCH)/freetype.c
+OBJ_S = $(SRC_S:.c=.o)
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+.PHONY: all debug clean distclean depend
+
+
+all:
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_S libttf.a
+
+debug:
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES=OBJS_M libttf.a
+
+
+$(OBJ_S): $(SRC_S) $(SRC_M)
+
+
+libttf.a: $($(LIB_FILES))
+ -del $@
+ ar src $@ $^
+
+clean:
+ -del $(subst /,\,$($(LIB_FILES)))
+
+distclean: clean
+ -del dep.end
+ -del libttf.a
+
+depend: $(SRC_S) $(SRC_M) $(SRC_X)
+ $(CC) -E -M $^ > dep.end
+
+ifeq (dep.end,$(wildcard dep.end))
+ include dep.end
+endif
+
+# end of Makefile.emx
diff --git a/xc/extras/FreeType/lib/arch/os2/Makefile.icc b/xc/extras/FreeType/lib/arch/os2/Makefile.icc
new file mode 100644
index 000000000..b3e4771db
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/os2/Makefile.icc
@@ -0,0 +1,71 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for IBM VisualAge C++ under OS/2.
+#
+# You will need nmake.
+#
+# Use this file while in the lib directory with the following statement:
+#
+# nmake -f arch\os2\Makefile.icc
+#
+
+ARCH = arch\os2
+FT_MAKEFILE = $(ARCH)\Makefile.icc
+FT_MAKE = $(MAKE) -nologo
+
+CC = icc
+CFLAGS = -O+ -Ti- -Tm- -Sa -W3 -Wpro- -Wcnd- -Q+ -Iarch\os2 -I. -Iextend
+
+# NOTE: Optimizations are discarded, as it seems that Visual Age
+# is buggy when producing ttraster.obj. The resulting code
+# crashes under some circumstances (performing vertical dropout
+# control when rendering smoothed outlines)!
+
+TTFILE = $(ARCH)\os2file.c
+TTMEMORY = .\ttmemory.c
+TTMUTEX = .\ttmutex.c
+
+PORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)
+
+SRC_X = extend\ftxgasp.c extend\ftxkern.c extend\ftxpost.c \
+ extend\ftxcmap.c extend\ftxwidth.c
+OBJS_X = $(SRC_X:.c=.obj)
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c ttdebug.c \
+ ttgload.c ttinterp.c ttload.c ttobjs.c ttraster.c \
+ ttextend.c $(PORT)
+OBJS_M = $(SRC_M:.c=.obj) $(OBJS_X)
+
+SRC_S = $(ARCH)\freetype.c
+OBJ_S = $(SRC_S:.c=.obj)
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+all:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES="$(OBJS_S)" libttf.lib
+
+debug:
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES="$(OBJS_M)" libttf.lib
+
+
+$(OBJ_S): $(SRC_S) $(SRC_M)
+ $(CC) -C $(CFLAGS) /Fo$@ $*.c
+
+$(OBJS_X):
+ $(CC) -C $(CFLAGS) /Fo$@ $*.c
+
+$(ARCH)\os2file.obj:
+ $(CC) -C $(CFLAGS) /Fo$@ $*.c
+
+libttf.lib: $(LIB_FILES)
+ !ilib /nologo /noignorecase /nobackup $@ +$?,,
+
+clean:
+ -del *.obj
+ -del extend\*.obj
+ -del arch\os2\*.obj
+
+distclean: clean
+ -del libttf.lib
+
+# end of Makefile.icc
diff --git a/xc/extras/FreeType/lib/arch/os2/Makefile.wat b/xc/extras/FreeType/lib/arch/os2/Makefile.wat
new file mode 100644
index 000000000..4efa3d6d6
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/os2/Makefile.wat
@@ -0,0 +1,84 @@
+# This file is part of the FreeType project.
+#
+# This builds the Watcom library with Watcom's wcc386 under OS/2.
+#
+# You'll need Watcom's wmake.
+#
+#
+# Invoke by "wmake -f arch\os2\Makefile.wat" when in the "lib" directory
+#
+# This will build "freetype\lib\libttf.lib"
+
+ARCH = arch\os2
+FT_MAKEFILE = $(ARCH)\Makefile.wat
+FT_MAKE = wmake -h
+
+
+.EXTENSIONS:
+.EXTENSIONS: .lib .obj .c .h
+.obj:.;.\extend;.\$(ARCH)
+.c:.;.\extend;.\$(ARCH)
+.h:.;.\extend;.\$(ARCH)
+
+CC = wcc386
+
+CCFLAGS = /otexanl+ /s /w5 /zq -Iarch\os2 -I. -Iextend
+
+TTFILE = .\ttfile.c
+TTMEMORY = .\ttmemory.c
+TTMUTEX = .\ttmutex.c
+
+TTFILE_OBJ = ttfile.obj
+TTMEMORY_OBJ = ttmemory.obj
+TTMUTEX_OBJ = ttmutex.obj
+
+PORT = $(TTFILE) $(TTMEMORY) $(TTMUTEX)
+PORT_OBJS = $(TTFILE_OBJ) $(TTMEMORY_OBJ) $(TTMUTEX_OBJ)
+
+SRC_X = extend\ftxgasp.c extend\ftxkern.c extend\ftxpost.c &
+ extend\ftxcmap.c extend\ftxwidth.c
+
+OBJS_X = extend\ftxgasp.obj extend\ftxkern.obj extend\ftxpost.obj &
+ extend\ftxcmap.obj extend\ftxwidth.obj
+
+SRC_M = ttapi.c ttcache.c ttcalc.c ttcmap.c &
+ ttgload.c ttinterp.c ttload.c ttobjs.c &
+ ttraster.c ttextend.c $(PORT)
+
+OBJS_M = ttapi.obj ttcache.obj ttcalc.obj ttcmap.obj &
+ ttgload.obj ttinterp.obj ttload.obj ttobjs.obj &
+ ttraster.obj ttextend.obj $(PORT_OBJS) $(OBJS_X)
+
+SRC_S = freetype.c
+OBJ_S = freetype.obj
+OBJS_S = $(OBJ_S) $(OBJS_X)
+
+
+.c.obj:
+ $(CC) $(CCFLAGS) $[* /fo=$[*.obj
+
+all: .symbolic
+ $(FT_MAKE) -f $(FT_MAKEFILE) libttf.lib
+
+debug: .symbolic
+ $(FT_MAKE) -f $(FT_MAKEFILE) LIB_FILES="$(OBJS_M)" libttf.lib
+
+
+libttf.lib: $(OBJS_M)
+ wlib -q -n libttf.lib $(OBJS_M)
+
+# is this correct? Know nothing about wmake and the Watcom compiler...
+$(OBJ_S): $(SRC_S) $(SRC_M)
+ $(CC) $(CCFLAGS) $(SRC_S) /fo=$(OBJ_S)
+
+clean: .symbolic
+ @-erase $(OBJS_M)
+ @-erase *.err
+
+distclean: .symbolic clean
+ @-erase libttf.lib
+
+new: .symbolic
+ @-wtouch *.c
+
+# end of Makefile.wat
diff --git a/xc/extras/FreeType/lib/arch/os2/freetype.c b/xc/extras/FreeType/lib/arch/os2/freetype.c
new file mode 100644
index 000000000..856a9d7d9
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/os2/freetype.c
@@ -0,0 +1,32 @@
+/* This file is part of the FreeType project */
+
+/* Single file library component for OS/2 */
+#define TT_MAKE_OPTION_SINGLE_OBJECT
+
+/* first include common core components */
+
+#include "ttapi.c"
+#include "ttcache.c"
+#include "ttcalc.c"
+#include "ttcmap.c"
+#include "ttdebug.c"
+#include "ttgload.c"
+#include "ttinterp.c"
+#include "ttload.c"
+#include "ttobjs.c"
+#include "ttraster.c"
+
+/* then system-specific (or ANSI) components */
+
+#include "os2file.c"
+#include "ttmemory.c"
+#include "ttmutex.c"
+
+/* the extensions are compiled separately, but we need to */
+/* include the file ttextend.c if we want to support them */
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+#include "ttextend.c"
+#endif
+
+/* end of freetype.c */
diff --git a/xc/extras/FreeType/lib/arch/os2/ft_conf.h b/xc/extras/FreeType/lib/arch/os2/ft_conf.h
new file mode 100644
index 000000000..7498e9bd5
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/os2/ft_conf.h
@@ -0,0 +1,208 @@
+/*******************************************************************
+ *
+ * ft_conf.h (OS/2 version)
+ *
+ * High-level interface specification.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * This file is used to contain the definition of several
+ * configuration-specific macros.
+ *
+ *
+ ******************************************************************/
+
+/* we need the following because there are some typedefs in this file */
+
+#ifndef FT_CONF_H
+#define FT_CONF_H
+
+
+/**********************************************************************/
+/* */
+/* We begin by a series of macros that are automatically set by the */
+/* 'configure' script on Unix. They must be set manually on OS/2, */
+/* so here they are : */
+/* */
+/**********************************************************************/
+
+#define OS2
+
+/* Define to empty if the keyword "const" does not work. */
+/* #undef const */
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* The number of bytes in a int. */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long. */
+#define SIZEOF_LONG 4
+
+/* Define if you have the memcpy function. */
+#define HAVE_MEMCPY
+
+/* Define if you have the memmove function. */
+#define HAVE_MEMMOVE
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define if you need <conio.h> for console I/O functions. */
+#if defined(__EMX__) || defined(__IBMC__)
+#define HAVE_CONIO_H
+#endif
+
+/* Define if you have the valloc function. */
+#undef HAVE_VALLOC
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/**********************************************************************/
+/* */
+/* The following configuration macros can be tweaked manually by */
+/* a developer to turn on or off certain features or options in the */
+/* TrueType engine. This may be useful to tune it for specific */
+/* purposes.. */
+/* */
+/**********************************************************************/
+
+
+/*************************************************************************/
+/* Define this if the underlying operating system uses a different */
+/* character width than 8bit for file names. You must then also supply */
+/* a typedef declaration for defining 'TT_Text'. Default is off. */
+
+/* #define HAVE_TT_TEXT */
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support engine extensions */
+/* Default is on, but if you're satisfied by the basic services provided */
+/* by the engine and need no extensions, undefine this configuration */
+/* macro to save a few more bytes. */
+
+#define TT_CONFIG_OPTION_EXTEND_ENGINE
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support gray-scaling, */
+/* a.k.a. font-smoothing or anti-aliasing. Default is on, but you can */
+/* disable it if you don't need it. */
+
+#define TT_CONFIG_OPTION_GRAY_SCALING
+
+
+/*************************************************************************/
+/* Define this if you want to use a big 'switch' statement within the */
+/* bytecode interpreter. Because some non-optimizing compilers are not */
+/* able to produce jump tables from such statements, undefining this */
+/* configuration macro will generate the appropriate C jump table in */
+/* ttinterp.c. If you use an optimizing compiler, you should leave it */
+/* defined for better performance and code compactness.. */
+
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+/*************************************************************************/
+/* Define TT_CONFIG_THREAD_SAFE if you want to build a thread-safe */
+/* version of the library. */
+
+#undef TT_CONFIG_OPTION_THREAD_SAFE
+
+/**********************************************************************/
+/* */
+/* The following macros are used to define the debug level, as well */
+/* as individual tracing levels for each component. There are */
+/* currently three modes of operation : */
+/* */
+/* - trace mode (define DEBUG_LEVEL_TRACE) */
+/* */
+/* The engine prints all error messages, as well as tracing */
+/* ones, filtered by each component's level */
+/* */
+/* - debug mode (define DEBUG_LEVEL_ERROR) */
+/* */
+/* Disable tracing, but keeps error output and assertion */
+/* checks. */
+/* */
+/* - release mode (don't define anything) */
+/* */
+/* Don't include error-checking or tracing code in the */
+/* engine's code. Ideal for releases. */
+/* */
+/* NOTE : */
+/* */
+/* Each component's tracing level is defined in its own source. */
+/* */
+/**********************************************************************/
+
+/* Define if you want to use the tracing debug mode */
+#undef DEBUG_LEVEL_TRACE
+
+/* Define if you want to use the error debug mode - ignored if */
+/* DEBUG_LEVEL_TRACE is defined */
+#undef DEBUG_LEVEL_ERROR
+
+/**************************************************************************/
+/* Definition of various integer sizes. These types are used by ttcalc */
+/* and ttinterp (for the 64-bit integers) only.. */
+
+#if SIZEOF_INT == 4
+
+ typedef signed int TT_Int32;
+ typedef unsigned int TT_Word32;
+
+#elif SIZEOF_LONG == 4
+
+ typedef signed long TT_Int32;
+ typedef unsigned long TT_Word32;
+
+#else
+#error "no 32bit type found"
+#endif
+
+#if SIZEOF_LONG == 8
+
+/* LONG64 must be defined when a 64-bit type is available */
+/* INT64 must then be defined to this type.. */
+#define LONG64
+#define INT64 long
+
+#else
+
+/* GCC provides the non-ANSI 'long long' 64-bit type. You can activate */
+/* by defining the TT_USE_LONG_LONG macro in 'ft_conf.h'. Note that this */
+/* will produce many -ansi warnings during library compilation. */
+#ifdef TT_USE_LONG_LONG
+
+#define LONG64
+#define INT64 long long
+
+#endif /* TT_USE_LONG_LONG */
+#endif
+
+#endif /* FT_CONF_H */
+
+
+/* End of ft_conf.h */
diff --git a/xc/extras/FreeType/lib/arch/os2/os2file.c b/xc/extras/FreeType/lib/arch/os2/os2file.c
new file mode 100644
index 000000000..41b174d0d
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/os2/os2file.c
@@ -0,0 +1,1236 @@
+/*******************************************************************
+ *
+ * os2file.c (OS2 version) 2.1
+ *
+ * File I/O Component (body).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * NOTES:
+ *
+ * This implementation relies on the OS/2 file API. It was provided
+ * by the PM FreeType DLL author, Michal Necasek.
+ *
+ ******************************************************************/
+
+#include "ttconfig.h"
+
+#include <os2.h> /* !Mike! */
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include "freetype.h"
+#include "tttypes.h"
+#include "ttdebug.h"
+#include "ttengine.h"
+#include "ttmutex.h"
+#include "ttmemory.h"
+#include "ttfile.h" /* our prototypes */
+
+
+/* For now, we don't define additional error messages in the core library */
+/* to report open-on demand errors. Define these errors as standard ones. */
+
+#define TT_Err_Could_Not_ReOpen_File TT_Err_Could_Not_Open_File
+#define TT_Err_Could_Not_ReSeek_File TT_Err_Could_Not_Open_File
+
+
+ /* This definition is mandatory for each file component! */
+ EXPORT_FUNC
+ const TFileFrame TT_Null_FileFrame = { NULL, 0, 0 };
+
+
+/* It has proven useful to do some bounds checks during development phase. */
+/* They should probably be undefined for speed reasons in a later release. */
+
+#if 0
+#define CHECK_FRAME( frame, n ) \
+ do { \
+ if ( frame.cursor + n > frame.address + frame.size ) \
+ Panic( "Frame boundary error!\n" ); \
+ } while ( 0 )
+#else
+#define CHECK_FRAME( frame, n ) \
+ do { \
+ } while ( 0 )
+#endif
+
+
+ /* Because a stream can be flushed, i.e., its file handle can be */
+ /* closed to save system resources, we must keep the stream's file */
+ /* pathname to be able to re-open it on demand when it is flushed. */
+
+ struct _TStream_Rec
+ {
+ Bool opened; /* is the stream handle opened ? */
+ String* name; /* the file's pathname */
+ Long position; /* current pos. within the file */
+
+ HFILE file; /* file handle !Mike! */
+ Long base; /* stream base in file */
+ Long size; /* stream size in file */
+ };
+
+ typedef struct _TStream_Rec TStream_Rec;
+ typedef TStream_Rec* PStream_Rec;
+
+
+ /* We support embedded TrueType files by allowing them to be */
+ /* inside any file, at any location, hence the 'base' argument. */
+ /* Note, however, that the current implementation does not allow you */
+ /* to specify a 'base' index when opening a file. */
+ /* (will come later) */
+ /* I still don't know if this will turn out useful... - DavidT */
+
+#define STREAM2REC( x ) ( (TStream_Rec*)HANDLE_Val( x ) )
+
+ static TT_Error Stream_Activate ( PStream_Rec stream );
+ static TT_Error Stream_Deactivate( PStream_Rec stream );
+
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /**** ****/
+ /**** N O N R E E N T R A N T I M P L E M E N T A T I O N ****/
+ /**** ****/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+ /* In non-reentrant builds, we allocate a single block where we'll */
+ /* place all the frames smaller than FRAME_CACHE_SIZE, rather than */
+ /* allocating a new block on each access. Bigger frames will be */
+ /* malloced normally in the heap. */
+ /* */
+ /* See TT_Access_Frame() and TT_Forget_Frame() for details. */
+
+#define FRAME_CACHE_SIZE 2048
+
+ /* The TFile_Component structure holds all the data that was */
+ /* previously declared static or global in this component. */
+ /* */
+ /* It is accessible through the 'engine.file_component' */
+ /* variable in re-entrant builds, or directly through the */
+ /* static 'files' variable in other builds. */
+
+ struct _TFile_Component
+ {
+ TMutex lock; /* used by the thread-safe build only */
+ Byte* frame_cache; /* frame cache */
+ PStream_Rec stream; /* current stream */
+ TFileFrame frame; /* current frame */
+ };
+
+ typedef struct _TFile_Component TFile_Component;
+
+ static TFile_Component files;
+
+#define CUR_Stream files.stream
+#define CUR_Frame files.frame
+
+#define STREAM_VARS /* void */
+#define STREAM_VAR /* void */
+
+/* The macro CUR_Stream denotes the current input stream. */
+/* Note that for the re-entrant version, the 'stream' name has been */
+/* chosen according to the macro STREAM_ARGS. */
+
+/* The macro CUR_Frame denotes the current file frame. */
+/* Note that for the re-entrant version, the 'frame' name has been */
+/* chosen according to the macro FRAME_ARGS. */
+
+/* The macro STREAM_VAR is used when calling public functions */
+/* that need an 'optional' stream argument. */
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ TT_Error error;
+
+ MUTEX_Create( files.lock );
+ files.stream = NULL;
+ ZERO_Frame( files.frame );
+
+ if ( ALLOC( files.frame_cache, FRAME_CACHE_SIZE ) )
+ return error;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ FREE( files.frame_cache );
+ MUTEX_Destroy( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Copies or duplicates a given stream.
+ *
+ * Input : org_stream original stream
+ * stream target stream (copy or duplicate)
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream org_stream,
+ TT_Stream* stream )
+ {
+ MUTEX_Lock( files.lock ); /* lock file mutex */
+
+ *stream = org_stream; /* copy the stream */
+ files.stream = STREAM2REC( org_stream ); /* set current stream */
+
+ Stream_Activate( files.stream );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream target stream
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ HANDLE_Set( *stream, NULL );
+ MUTEX_Release( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function fails if the byte range is not within the
+ * the file, or if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big in both cases).
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( size <= FRAME_CACHE_SIZE )
+ {
+ /* use the cache */
+ CUR_Frame.address = files.frame_cache;
+ CUR_Frame.size = FRAME_CACHE_SIZE;
+ }
+ else
+ {
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+ }
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if ( error )
+ {
+ if ( size > FRAME_CACHE_SIZE )
+ FREE( CUR_Frame.address );
+ CUR_Frame.address = NULL;
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Check_And_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * `size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function truncates `size' if the byte range is not
+ * within the file.
+ *
+ * It will fail if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big).
+ *
+ * It will fail if you make two consecutive calls
+ * to TT_Access_Frame(), without a TT_Forget_Frame() between
+ * them.
+ *
+ * The only difference with TT_Access_Frame() is that we
+ * check that the frame is within the current file. We
+ * otherwise truncate it.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+ Long readBytes, requested;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( size <= FRAME_CACHE_SIZE )
+ {
+ /* use the cache */
+ CUR_Frame.address = files.frame_cache;
+ CUR_Frame.size = FRAME_CACHE_SIZE;
+ }
+ else
+ {
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+ }
+
+ requested = size;
+ readBytes = CUR_Stream->size - TT_File_Pos( STREAM_VAR );
+ if ( size > readBytes )
+ size = readBytes;
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if ( error )
+ {
+ if ( requested > FRAME_CACHE_SIZE )
+ FREE( CUR_Frame.address );
+ CUR_Frame.address = NULL;
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Forget_Frame
+ *
+ * Description : Releases a cached frame after reading.
+ *
+ * Input : None
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Forget_Frame( FRAME_ARG )
+ {
+ if ( CUR_Frame.address == NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( CUR_Frame.size > FRAME_CACHE_SIZE )
+ FREE( CUR_Frame.address );
+
+ ZERO_Frame( CUR_Frame );
+
+ return TT_Err_Ok;
+ }
+
+
+#else /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /******** ********/
+ /******** R E E N T R A N T I M P L E M E N T A T I O N ********/
+ /******** ********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+/* a simple macro to access the file component's data */
+#define files ( *((TFile_Component*)engine.file_component) )
+
+#define CUR_Stream STREAM2REC( stream ) /* re-entrant macros */
+#define CUR_Frame (*frame)
+
+#define STREAM_VARS stream,
+#define STREAM_VAR stream
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Duplicates a stream for a new usage.
+ *
+ * Input : input_stream source stream to duplicate
+ * copy address of target duplicate stream
+ *
+ * Output : error code.
+ * The target stream is set to NULL in case of failure.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream input_stream,
+ TT_Stream* copy )
+ {
+ PStream_Rec rec = STREAM2REC( input_stream );
+
+ return TT_Open_Stream( rec->name, copy );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream target stream
+ *
+ * Output :
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ return TT_Close_Stream( stream );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function fails if the byte range is not within the
+ * the file, or if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big in both cases).
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS int size )
+ {
+ TT_Error error;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if ( error )
+ {
+ FREE( CUR_Frame.address );
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Check_And_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * `size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function truncates `size' if the byte range is not
+ * within the file.
+ *
+ * It will fail if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big).
+ *
+ * It will fail if you make two consecutive calls
+ * to TT_Access_Frame(), without a TT_Forget_Frame() between
+ * them.
+ *
+ * The only difference with TT_Access_Frame() is that we
+ * check that the frame is within the current file. We
+ * otherwise truncate it.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS int size )
+ {
+ TT_Error error;
+ Long readBytes;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+
+ readBytes = CUR_Stream->size - TT_File_Pos( STREAM_VAR );
+ if ( size > readBytes )
+ size = readBytes;
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if ( error )
+ {
+ FREE( CUR_Frame.address );
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Forget_Frame
+ *
+ * Description : Releases a cached frame after reading.
+ *
+ * Input : None
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Forget_Frame( FRAME_ARG )
+ {
+ if ( CUR_Frame.address == NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ FREE( CUR_Frame.address );
+ ZERO_Frame( CUR_Frame );
+
+ return TT_Err_Ok;
+ }
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*********** ***********/
+ /*********** C O M M O N I M P L E M E N T A T I O N ***********/
+ /*********** ***********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : Stream_Activate
+ *
+ * Description : activates a stream, this will either:
+ * - open a new file handle if the stream is closed
+ * - move the stream to the head of the linked list
+ *
+ * Input : stream the stream to activate
+ *
+ * Output : error condition.
+ *
+ * Note : this function is also called with fresh new streams
+ * created by TT_Open_Stream(). They have their 'size'
+ * field set to -1.
+ *
+ ******************************************************************/
+
+ static TT_Error Stream_Activate( PStream_Rec stream )
+ {
+ ULONG ulAction; /* !Mike! */
+
+ if ( !stream->opened )
+ {
+#if 0
+ if ( !(stream->file = fopen( stream->name, "rb" )) ) /* !Mike! */
+#endif
+
+/* XXX : Strange. GCC/EMX wants an (Byte*) for the file name? */
+#ifdef __EMX__
+
+ if ( DosOpen( (Byte*)stream->name, &(stream->file),
+ &ulAction, 0,
+ 0, OPEN_ACTION_OPEN_IF_EXISTS,
+ OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL ) )
+ return TT_Err_Could_Not_ReOpen_File;
+
+#else
+
+ if ( DosOpen( stream->name, &(stream->file),
+ &ulAction, 0,
+ 0, OPEN_ACTION_OPEN_IF_EXISTS,
+ OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, NULL ) )
+ return TT_Err_Could_Not_ReOpen_File;
+
+#endif /* __EMX__ */
+
+ stream->opened = TRUE;
+
+ /* A newly created stream has a size field of -1 */
+ if ( stream->size < 0 )
+ {
+#if 0
+ fseek( stream->file, 0, SEEK_END ); /* !Mike! */
+ stream->size = ftell( stream->file );
+#endif
+
+ DosSetFilePtr( stream->file, 0, FILE_END, (ULONG *)&(stream->size) );
+#if 0
+ fseek( stream->file, 0, SEEK_SET );
+#endif
+
+ DosSetFilePtr( stream->file, 0, FILE_BEGIN, &ulAction );
+ }
+
+ /* Reset cursor in file */
+ if ( stream->position )
+ {
+#if 0 /* !Mike! */
+ if ( fseek( stream->file, stream->position, SEEK_SET ) != 0 )
+#endif
+
+ if ( DosSetFilePtr( stream->file, stream->position,
+ FILE_BEGIN, &ulAction ) )
+ {
+ /* error during seek */
+#if 0
+ fclose( stream->file ); /* !Mike! */
+#endif
+
+ DosClose( stream->file );
+ stream->opened = FALSE;
+ return TT_Err_Could_Not_ReSeek_File;
+ }
+ }
+ }
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Stream_DeActivate
+ *
+ * Description : deactivates a stream, this will:
+ * - close its file handle if it was opened
+ * - remove it from the opened list if necessary
+ *
+ * Input : stream the stream to deactivate
+ *
+ * Output : Error condition
+ *
+ * Note : the function is called whenever a stream is deleted
+ * (_not_ when a stream handle's is closed due to an
+ * activation). However, the stream record isn't
+ * destroyed by it...
+ *
+ ******************************************************************/
+
+ static TT_Error Stream_Deactivate( PStream_Rec stream )
+ {
+ if ( stream->opened )
+ {
+ /* Save its current position within the file */
+#if 0
+ stream->position = ftell( stream->file ); /* !Mike! */
+#endif
+
+ DosSetFilePtr( stream->file, 0, FILE_CURRENT,
+ (ULONG *)&(stream->position) );
+#if 0
+ fclose( stream->file ); /* !Mike! */
+#endif
+
+ DosClose( stream->file );
+ stream->file = 0;
+ stream->opened = FALSE;
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Stream_Size
+ *
+ * Description : Returns the length of a given stream, even if it
+ * is flushed.
+ *
+ * Input : stream the stream
+ *
+ * Output : length of stream in bytes.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_Stream_Size( TT_Stream stream )
+ {
+ PStream_Rec rec = STREAM2REC( stream );
+
+
+ if ( rec )
+ return rec->size;
+ else
+ return 0; /* invalid stream - return 0 */
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Open_Stream
+ *
+ * Description : Opens the font file and saves the total file size.
+ *
+ * Input : error address of stream's error variable
+ * (re-entrant build only)
+ * filepathname pathname of the file to open
+ * stream address of target TT_Stream structure
+ *
+ * Output : SUCCESS on sucess, FAILURE on error.
+ * The target stream is set to -1 in case of failure.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TT_Open_Stream( const String* filepathname,
+ TT_Stream* stream )
+ {
+ int len;
+ TT_Error error;
+ PStream_Rec stream_rec;
+
+
+ if ( ALLOC( *stream, sizeof ( TStream_Rec ) ) )
+ return error;
+
+ stream_rec = STREAM2REC( *stream );
+
+ stream_rec->file = NULLHANDLE; /* !Mike! */
+ stream_rec->size = -1;
+ stream_rec->base = 0;
+ stream_rec->opened = FALSE;
+ stream_rec->position = 0;
+
+ len = strlen( filepathname ) + 1;
+ if ( ALLOC( stream_rec->name, len ) )
+ goto Fail;
+
+ strncpy( (String*)stream_rec->name, filepathname, len );
+
+ error = Stream_Activate( stream_rec );
+ if ( error )
+ goto Fail_Activate;
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+ CUR_Stream = stream_rec;
+#endif
+
+ return TT_Err_Ok;
+
+ Fail_Activate:
+ FREE( stream_rec->name );
+ Fail:
+ FREE( stream_rec );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Close_Stream
+ *
+ * Description : Closes a stream.
+ *
+ * Input : stream address of target TT_Stream structure
+ *
+ * Output : SUCCESS (always).
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TT_Close_Stream( TT_Stream* stream )
+ {
+ PStream_Rec rec = STREAM2REC( *stream );
+
+
+ Stream_Deactivate( rec );
+ FREE( rec->name );
+ FREE( rec );
+
+ HANDLE_Set( *stream, NULL );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Flush_Stream
+ *
+ * Description : Flushes a stream, i.e., closes its file handle.
+ *
+ * Input : stream address of target TT_Stream structure
+ *
+ * Output : Error code
+ *
+ * NOTE : Never flush the current opened stream. This means that
+ * you should _never_ call this function between a
+ * TT_Use_Stream() and a TT_Done_Stream()!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Flush_Stream( TT_Stream* stream )
+ {
+ PStream_Rec rec = STREAM2REC( *stream );
+
+
+ if ( rec )
+ {
+ Stream_Deactivate( rec );
+ return TT_Err_Ok;
+ }
+ else
+ return TT_Err_Invalid_Argument;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Seek_File
+ *
+ * Description : Seeks the file cursor to a different position.
+ *
+ * Input : position new position in file
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Seek_File( STREAM_ARGS long position )
+ {
+ ULONG ibActual; /* !Mike! */
+
+
+ position += CUR_Stream->base;
+
+#if 0
+ if ( fseek( CUR_Stream->file, position, SEEK_SET ) ) /* !Mike! */
+#endif
+
+ if ( DosSetFilePtr( CUR_Stream->file, position, FILE_BEGIN , &ibActual ) )
+ return TT_Err_Invalid_File_Offset;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Skip_File
+ *
+ * Description : Skips forward the file cursor.
+ *
+ * Input : distance number of bytes to skip
+ *
+ * Output : see TT_Seek_File()
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Skip_File( STREAM_ARGS long distance )
+ {
+ ULONG ibActual; /* !Mike! */
+
+
+#if 0
+ return TT_Seek_File( STREAM_VARS ftell( CUR_Stream->file ) -
+ CUR_Stream->base + distance ); /* !Mike! */
+#endif
+
+ DosSetFilePtr( CUR_Stream->file, 0, FILE_CURRENT, &ibActual );
+ return TT_Seek_File( STREAM_VARS ibActual - CUR_Stream->base + distance );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_File
+ *
+ * Description : Reads a chunk of the file and copies it to memory.
+ *
+ * Input : buffer target buffer
+ * count length in bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_File( STREAM_ARGS void* buffer, long count )
+ {
+ ULONG cbActual; /* !Mike! */
+
+#if 0 /* !Mike! */
+ if ( fread( buffer, 1, count, CUR_Stream->file ) != (unsigned long)count )
+#endif
+
+ DosRead( CUR_Stream->file, buffer, count, &cbActual );
+ if ( cbActual != (unsigned long)count )
+ return TT_Err_Invalid_File_Read;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_At_File
+ *
+ * Description : Reads file at a specified position.
+ *
+ * Input : position position to seek to before read
+ * buffer target buffer
+ * count number of bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_At_File( STREAM_ARGS long position,
+ void* buffer,
+ long count )
+ {
+ TT_Error error;
+
+
+ if ( ( error = TT_Seek_File( STREAM_VARS position ) ) ||
+ ( error = TT_Read_File( STREAM_VARS buffer, count ) ) )
+ return error;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_File_Pos
+ *
+ * Description : Returns current file seek pointer.
+ *
+ * Input : none
+ *
+ * Output : current file position
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_File_Pos( STREAM_ARG )
+ {
+ ULONG ibActual; /* !Mike! */
+
+
+#if 0
+ return ftell( CUR_Stream->file ) - CUR_Stream->base; /* !Mike! */
+#endif
+
+ DosSetFilePtr( CUR_Stream->file, 0, FILE_CURRENT, &ibActual );
+ return ibActual - CUR_Stream->base;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Byte
+ *
+ * Description : Extracts a byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted Byte.
+ *
+ ******************************************************************/
+#if 0
+ EXPORT_FUNC
+ Byte TT_Get_Byte( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Byte)(*CUR_Frame.cursor++);
+ }
+#endif
+
+/*******************************************************************
+ *
+ * Function : GET_Char
+ *
+ * Description : Extracts a signed byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted char.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Char TT_Get_Char( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Char)(*CUR_Frame.cursor++);
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Short
+ *
+ * Description : Extracts a short from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted short.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ short TT_Get_Short( FRAME_ARG )
+ {
+ short getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = ((short)CUR_Frame.cursor[0] << 8) |
+ (short)CUR_Frame.cursor[1];
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_UShort
+ *
+ * Description : Extracts an unsigned short from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted ushort.
+ *
+ ******************************************************************/
+#if 0
+ EXPORT_FUNC
+ unsigned short TT_Get_UShort( FRAME_ARG )
+ {
+ unsigned short getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = ((unsigned short)CUR_Frame.cursor[0] << 8) |
+ (unsigned short)CUR_Frame.cursor[1];
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+#endif
+
+/*******************************************************************
+ *
+ * Function : GET_Long
+ *
+ * Description : Extracts a long from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted long.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ long TT_Get_Long( FRAME_ARG )
+ {
+ long getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ((long)CUR_Frame.cursor[0] << 24) |
+ ((long)CUR_Frame.cursor[1] << 16) |
+ ((long)CUR_Frame.cursor[2] << 8 ) |
+ (long)CUR_Frame.cursor[3];
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_ULong
+ *
+ * Description : Extracts an unsigned long from the frame.
+ *
+ * Input : None
+ *
+ * Output : Extracted ulong.
+ *
+ ******************************************************************/
+#if 0
+ EXPORT_FUNC
+ unsigned long TT_Get_ULong( FRAME_ARG )
+ {
+ unsigned long getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ( ((unsigned long)CUR_Frame.cursor[0] << 24) |
+ ((unsigned long)CUR_Frame.cursor[1] << 16) |
+ ((unsigned long)CUR_Frame.cursor[2] << 8 ) |
+ (unsigned long)CUR_Frame.cursor[3] );
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+#endif
+
+/* END */
diff --git a/xc/extras/FreeType/lib/arch/unix/Makefile.in b/xc/extras/FreeType/lib/arch/unix/Makefile.in
new file mode 100644
index 000000000..f1e48828b
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/unix/Makefile.in
@@ -0,0 +1,226 @@
+# This file is part of the FreeType project.
+#
+# lib/arch/unix/Makefile.in
+
+ARCH = arch/unix
+FT_MAKEFILE = $(ARCH)/Makefile
+
+RM = @RM@
+RMF = @RM@ -f
+RMDIR = @RMDIR@
+LN_S = @LN_S@
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+VPATH = @srcdir@/../..
+srcdir = @srcdir@/../..
+
+top_builddir=..
+
+CC = @CC@
+CPP = @CPP@
+
+LIBTOOL = $(top_builddir)/libtool
+MKINSTALLDIRS = $(srcdir)/../mkinstalldirs
+
+version_info = @version_info@
+
+include $(top_builddir)/MakeSub
+
+############### PORTABILITY COMPONENTS ########################
+
+# location of memory component
+MEMSRC = ttmemory.c
+
+# location of file component
+FILESRC = @TT_FILE_COMPONENT@
+
+# location of mutex component
+MUTEXSRC = ttmutex.c
+
+# location of default extensions
+FTEXTDIR = $(srcdir)/extend
+
+
+# default extensions sources
+EXTSRC = $(FTEXTDIR)/ftxkern.c \
+ $(FTEXTDIR)/ftxgasp.c \
+ $(FTEXTDIR)/ftxpost.c \
+ $(FTEXTDIR)/ftxcmap.c \
+ $(FTEXTDIR)/ftxwidth.c \
+ $(FTEXTDIR)/ftxerr18.c
+
+EXTOBJ = ftxkern.lo \
+ ftxgasp.lo \
+ ftxpost.lo \
+ ftxcmap.lo \
+ ftxwidth.lo \
+ ftxerr18.lo
+
+# all engine sources
+SRC_M = $(srcdir)/ttapi.c \
+ $(srcdir)/ttcache.c \
+ $(srcdir)/ttcalc.c \
+ $(srcdir)/ttcmap.c \
+ $(srcdir)/ttdebug.c \
+ $(srcdir)/ttextend.c \
+ $(srcdir)/ttgload.c \
+ $(srcdir)/ttinterp.c \
+ $(srcdir)/ttload.c \
+ $(srcdir)/ttobjs.c \
+ $(srcdir)/ttraster.c \
+ $(srcdir)/$(FILESRC) \
+ $(srcdir)/$(MEMSRC) \
+ $(srcdir)/$(MUTEXSRC)
+SRC_S = $(srcdir)/$(ARCH)/freetype.c
+
+# all header files with path for installation
+FULLHEADERS = $(srcdir)/freetype.h \
+ $(srcdir)/fterrid.h \
+ $(srcdir)/ftnameid.h \
+ $(FTEXTDIR)/ftxkern.h \
+ $(FTEXTDIR)/ftxgasp.h \
+ $(FTEXTDIR)/ftxcmap.h \
+ $(FTEXTDIR)/ftxpost.h \
+ $(FTEXTDIR)/ftxwidth.h \
+ $(FTEXTDIR)/ftxerr18.h
+
+# all header files without path uninstallation
+HEADERS = freetype.h \
+ fterrid.h \
+ ftnameid.h \
+ ftxkern.h \
+ ftxgasp.h \
+ ftxcmap.h \
+ ftxpost.h \
+ ftxwidth.h \
+ ftxerr18.h
+
+# all engine objects
+OBJ_M = ttapi.lo \
+ ttcache.lo \
+ ttcalc.lo \
+ ttcmap.lo \
+ ttdebug.lo \
+ ttextend.lo \
+ ttgload.lo \
+ ttinterp.lo \
+ ttload.lo \
+ ttobjs.lo \
+ ttraster.lo \
+ file.lo \
+ memory.lo \
+ mutex.lo \
+ $(EXTOBJ)
+OBJ_S = freetype.lo $(EXTOBJ)
+
+
+# include paths
+INCLUDES = -I. -I$(top_builddir) -I$(srcdir) -I$(FTEXTDIR)
+
+# C flags
+CFLAGS = @CFLAGS@ @XX_CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+FT_CFLAGS = $(CFLAGS) $(INCLUDES)
+
+# linker flags
+FT_LIBS = @LIBS@
+
+# i18n stuff
+LOCALEDIR = @LOCALEDIR@
+
+
+all: do_link
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES="$(OBJ_S)" libttf.la
+
+debug: do_link
+ $(MAKE) -f $(FT_MAKEFILE) LIB_FILES="$(OBJ_M)" libttf.la
+
+
+do_link:
+ -$(RMF) memory.c file.c mutex.c
+ $(LN_S) $(srcdir)/$(MEMSRC) memory.c
+ $(LN_S) $(srcdir)/$(FILESRC) file.c
+ $(LN_S) $(srcdir)/$(MUTEXSRC) mutex.c
+
+
+.SUFFIXES: .lo
+.c.lo:
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) $<
+
+ftxkern.lo: $(FTEXTDIR)/ftxkern.c
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) $(FTEXTDIR)/ftxkern.c
+
+ftxgasp.lo: $(FTEXTDIR)/ftxgasp.c
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) $(FTEXTDIR)/ftxgasp.c
+
+ftxpost.lo: $(FTEXTDIR)/ftxpost.c
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) $(FTEXTDIR)/ftxpost.c
+
+ftxcmap.lo: $(FTEXTDIR)/ftxcmap.c
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) $(FTEXTDIR)/ftxcmap.c
+
+ftxwidth.lo: $(FTEXTDIR)/ftxwidth.c
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) $(FTEXTDIR)/ftxwidth.c
+
+ftxerr18.lo: $(FTEXTDIR)/ftxerr18.c
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) \
+ -DLOCALEDIR='"$(LOCALEDIR)"' \
+ $(FTEXTDIR)/ftxerr18.c
+
+freetype.lo: $(SRC_S) $(SRC_M)
+ $(LIBTOOL) --mode=compile $(CC) -c $(FT_CFLAGS) \
+ -DLOCALEDIR='"$(LOCALEDIR)"' \
+ -DTT_MAKE_OPTION_SINGLE_OBJECT \
+ $(SRC_S)
+
+libttf.la: $(LIB_FILES)
+ $(LIBTOOL) --mode=link $(CC) -o libttf.la $(LIB_FILES) \
+ -rpath $(libdir) \
+ -version-info $(version_info) $(FT_LIBS)
+
+install: libttf.la
+ $(MKINSTALLDIRS) $(libdir) $(includedir)
+ $(LIBTOOL) --mode=install $(INSTALL) libttf.la $(libdir)
+ -for P in $(FULLHEADERS) ; do \
+ $(INSTALL_DATA) $$P $(includedir) ; \
+ done
+
+uninstall:
+ -$(LIBTOOL) --mode=uninstall $(RM) $(libdir)/libttf.la
+ -for P in $(HEADERS) ; do \
+ $(RMF) $(includedir)/$$P ; \
+ done
+
+clean:
+ -$(RMF) $(OBJ_S) $(OBJ_M) *.o
+
+distclean: clean
+ -$(RMF) file.c memory.c mutex.c
+ -$(RMF) libttf.la
+ -$(RMF) *.orig *~ core *.core
+ -$(RMF) $(ARCH)/Makefile
+ -$(RMF) .libs/*
+ -$(RMDIR) .libs
+
+depend: do_link
+ (echo '/^#.* PUT NO STUFF BELOW/,$$d' ; echo w ; echo q) | \
+ ed - $(ARCH)/Makefile
+ echo '# Dependencies generated by make depend: PUT NO STUFF BELOW' \
+ >> $(ARCH)/Makefile
+ for file in $(SRC_S) $(SRC_M) $(EXTSRC) ; do \
+ $(CPP) $(CPPFLAGS) $(INCLUDES) $$file | \
+ sed -n -e 's|^# [1-9][0-9]* "\([^/].*\.h\)".*|\1|p' \
+ -e 's|^# [1-9][0-9]* "\($(srcdir)/.*\.h\)".*|\1|p' | \
+ sed -e 's|/\./|.|g' -e "s/^/`basename $$file .c`.lo: /" ; \
+ done | \
+ sort -u | \
+ awk '{ if (LINE == 1) \
+ { line = last = $$1 } \
+ else if ($$1 != last) \
+ { print line ; line = last = $$1 } \
+ line = line " " $$2 } \
+ END { print line }' >> $(ARCH)/Makefile
+
+# Dependencies generated by make depend: PUT NO STUFF BELOW
diff --git a/xc/extras/FreeType/lib/arch/unix/freetype.c b/xc/extras/FreeType/lib/arch/unix/freetype.c
new file mode 100644
index 000000000..751412f44
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/unix/freetype.c
@@ -0,0 +1,31 @@
+/* This file is an Xserver-specific version */
+
+/* $XFree86: xc/extras/FreeType/lib/arch/unix/freetype.c,v 1.2 1998/09/06 04:29:55 dawes Exp $ */
+
+/* Single object library component for Unix */
+
+#include "ttapi.c"
+#include "ttcache.c"
+#include "ttcalc.c"
+#include "ttcmap.c"
+#include "ttdebug.c"
+#include "ttgload.c"
+#include "ttinterp.c"
+#include "ttload.c"
+#include "ttobjs.c"
+#include "ttraster.c"
+
+#ifdef HAVE_MMAP
+#include "ttmmap.c"
+#else
+#include "ttfile.c"
+#endif
+#include "ttmemory.c"
+#include "ttmutex.c"
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+#include "ttextend.c"
+#endif
+
+/* end of freetype.c */
+
diff --git a/xc/extras/FreeType/lib/arch/unix/ttmmap.c b/xc/extras/FreeType/lib/arch/unix/ttmmap.c
new file mode 100644
index 000000000..8455e22e1
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/unix/ttmmap.c
@@ -0,0 +1,1027 @@
+/*******************************************************************
+ *
+ * ttmmap.c 2.0
+ *
+ * Memory-Mapped file component ( replaces ttfile.c ).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Changes between 2.0 and 1.3 :
+ *
+ * - adopted new design/separation introduced in ttfile.c 2.0
+ *
+ ******************************************************************/
+
+#include "ttconfig.h"
+
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#include <sys/mman.h>
+#ifndef MAP_FILE
+#define MAP_FILE 0x00
+#endif
+
+/*
+ * The prototype for munmap() is not provided on SunOS. This needs to
+ * have a check added later to see if the GNU C library is being used.
+ * If so, then this prototype is not needed.
+ */
+#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4)
+ extern int munmap( caddr_t addr, int len );
+#endif
+
+#include <sys/stat.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+
+#include "freetype.h"
+#include "tttypes.h"
+#include "ttdebug.h"
+#include "ttengine.h"
+#include "ttmutex.h"
+#include "ttmemory.h"
+#include "ttfile.h" /* our prototypes */
+
+ /* This definition is mandatory for each file component! */
+ EXPORT_FUNC
+ const TFileFrame TT_Null_FileFrame = { NULL, 0, 0 };
+
+ /* It has proven useful to do some bounds checks during */
+ /* development phase. Define DEBUG_FILE when compiling */
+ /* this component to enable them. */
+
+#ifdef DEBUG_FILE
+#define CHECK_FRAME( frame, n ) \
+ do { \
+ if ( frame.cursor+n > frame.address + frame.size ) \
+ Panic( "Frame boundary error!\n" ); \
+ } while ( 0 )
+#else
+#define CHECK_FRAME( frame, n ) \
+ do { \
+ } while( 0 )
+#endif
+
+ struct _TFileMap
+ {
+ String* base; /* base address of mapped file */
+ Int refcount; /* reference count for mmaped region */
+ Long size; /* stream size in file */
+ Long offset; /* offset in file */
+ };
+
+ typedef struct _TFileMap TFileMap;
+
+#define MAP_Address( map ) (Byte*)( (map)->base + (map)->offset )
+
+ /* The stream record structure */
+ typedef struct _TStream_Rec
+ {
+ TFileMap* map; /* mapped file description */
+ Long pos ; /* cursor in mapped file */
+ } TStream_Rec;
+
+ typedef TStream_Rec* PStream_Rec;
+
+#define STREAM2REC( x ) ( (TStream_Rec*)HANDLE_Val( x ) )
+
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /**** ****/
+ /**** N O N R E E N T R A N T I M P L E M E N T A T I O N ****/
+ /**** ****/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+ /* The TFile_Component structure holds all the data that was */
+ /* previously declared static or global in this component. */
+ /* */
+ /* It is accessible through the 'engine.file_component' */
+ /* variable in re-entrant builds, or directly through the */
+ /* static 'files' variable in other builds. */
+
+ struct _TFile_Component
+ {
+ TMutex lock; /* used by the thread-safe build only */
+ PStream_Rec stream; /* current stream */
+ TFileFrame frame; /* current frame */
+ };
+
+ typedef struct _TFile_Component TFile_Component;
+
+/* The macro CUR_Stream denotes the current input stream */
+/* Note that for the re-entrant version, the 'stream' name has been */
+/* chosen according to the macro STREAM_ARGS. */
+
+/* The macro CUR_Frame denotes the current file frame */
+/* Note that for the re-entrant version, the 'frame' name has been */
+/* chosen according to the macro FRAME_ARGS. */
+
+/* The macro STREAM_VAR is used when calling public functions */
+/* that need an 'optional' stream argument. */
+
+#define CUR_Stream files.stream /* thread-safe macros */
+#define CUR_Frame files.frame
+
+#define STREAM_VARS /* void */
+#define STREAM_VAR /* void */
+
+ /* the 'files' variable is only defined in non-reentrant builds */
+
+ static TFile_Component files;
+
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ MUTEX_Create( files.lock );
+ files.stream = NULL;
+ ZERO_Frame( files.frame );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ MUTEX_Destroy( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Copies or duplicates a given stream.
+ *
+ * Input : org_stream original stream
+ * stream target stream (copy or duplicate)
+ *
+ * Output : Error code
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream org_stream,
+ TT_Stream* stream )
+ {
+ MUTEX_Lock( files.lock );
+ *stream = org_stream;
+ files.stream = STREAM2REC( org_stream ); /* set current stream */
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream
+ *
+ * Output : Error code
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ HANDLE_Set( *stream, NULL );
+ MUTEX_Release( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+#else /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /******** ********/
+ /******** R E E N T R A N T I M P L E M E N T A T I O N ********/
+ /******** ********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+#define CUR_Stream STREAM2REC( stream ) /* re-entrant macros */
+#define CUR_Frame (*frame)
+
+#define STREAM_VARS stream,
+#define STREAM_VAR stream
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ engine.file_component = NULL;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Copies or duplicates a given stream.
+ *
+ * Input : org_stream original stream
+ * stream target stream (copy or duplicate)
+ *
+ * Output : Error code. The output stream is set to NULL in
+ * case of Failure.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream input_stream,
+ TT_Stream* copy )
+ {
+ TT_Error error;
+ PStream_Rec stream_rec;
+ PStream_Rec copy_rec;
+
+
+ stream_rec = STREAM2REC( input_stream );
+
+ if ( ALLOC( copy_rec, sizeof ( TStream_Rec ) ) )
+ goto Fail;
+
+ HANDLE_Set( *copy, copy_rec );
+
+ copy_rec->map->refcount++;
+ copy_rec->pos = 0;
+
+ return TT_Err_Ok;
+
+ Fail:
+ HANDLE_Set( *copy, NULL );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream
+ *
+ * Output : error code
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ return TT_Close_Stream( stream );
+ }
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*********** ***********/
+ /*********** C O M M O N I M P L E M E N T A T I O N ***********/
+ /*********** ***********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : AllocateMap
+ *
+ * Description : Allocates a new map from the table.
+ *
+ * Output : Pointer to new stream rec. NULL in case of failure.
+ *
+ ******************************************************************/
+
+ static
+ TFileMap* Allocate_Map( void )
+ {
+ TFileMap* result;
+
+
+ if ( MEM_Alloc( result, sizeof ( TFileMap ) ) )
+ return NULL;
+
+ result->refcount = 1;
+ return result;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : ReleaseMap
+ *
+ * Description : Releases a used map to the table if reference i
+ * counter reaches zero.
+ *
+ * Input : map
+ *
+ * Output : None.
+ *
+ * Note : Called by TT_Close_File()
+ *
+ ******************************************************************/
+
+ static
+ void Release_Map ( TFileMap* map )
+ {
+ map->refcount--;
+ if ( map->refcount <= 0 )
+ {
+ munmap ( (void*)map->base, map->size );
+ FREE( map );
+ }
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Open_Stream
+ *
+ * Description : Opens the font file and saves the total file size.
+ *
+ * Input : error address of stream's error variable
+ * (re-entrant build only).
+ * filepathname pathname of the file to open
+ * stream address of target TT_Stream structure
+ *
+ * Output : SUCCESS on success, FAILURE on error.
+ * The target stream is set to -1 in case of failure.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TT_Open_Stream( const String* filepathname,
+ TT_Stream* stream )
+ {
+ TT_Error error;
+ Int file;
+ PStream_Rec stream_rec;
+ TFileMap* map;
+ struct stat stat_buf;
+
+
+ if ( ALLOC( *stream, sizeof ( TStream_Rec ) ) )
+ return error;
+
+ map = Allocate_Map();
+ if ( !map )
+ {
+ error = TT_Err_Out_Of_Memory;
+ goto Memory_Fail;
+ }
+
+ stream_rec = STREAM2REC( *stream );
+
+ file = open( (String*)filepathname, O_RDONLY );
+ if ( file < 0 )
+ goto File_Fail;
+
+ if ( fstat( file, &stat_buf ) < 0 )
+ goto Map_Fail;
+
+ map->offset = 0;
+ map->size = stat_buf.st_size + map->offset;
+ map->base = mmap( NULL,
+ map->size,
+ PROT_READ,
+ MAP_FILE | MAP_PRIVATE,
+ file,
+ 0 );
+
+ if ( (long)map->base == -1 )
+ goto Map_Fail;
+
+ close( file );
+
+ stream_rec->map = map;
+ stream_rec->pos = 0;
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+ CUR_Stream = stream_rec;
+#endif
+
+ return TT_Err_Ok;
+
+ Map_Fail:
+ close( file );
+
+ File_Fail:
+ error = TT_Err_Could_Not_Open_File;
+ FREE( map );
+
+ Memory_Fail:
+ FREE( *stream );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Close_Stream
+ *
+ * Description : Closes a stream.
+ *
+ * Input : stream
+ *
+ * Output : SUCCESS (always)
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TT_Close_Stream( TT_Stream* stream )
+ {
+ PStream_Rec rec = STREAM2REC( *stream );
+
+
+ Release_Map( rec->map );
+ FREE( rec );
+
+ HANDLE_Set( *stream, NULL );
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Flush_Stream
+ *
+ * Description : Flushes a stream, i.e., closes its file handle.
+ *
+ * Input : stream address of target TT_Stream structure
+ *
+ * Output : Error code
+ *
+ * NOTE : Never flush the current opened stream. This means that
+ * you should _never_ call this function between a
+ * TT_Use_Stream() and a TT_Done_Stream()!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Flush_Stream( TT_Stream* stream )
+ {
+ /* XXX - DUMMY IMPLEMENTATION */
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Stream_Size
+ *
+ * Description : Returns the length of a given stream, even if it
+ * is flushed.
+ *
+ * Input : stream the stream
+ *
+ * Output : Length of stream in bytes.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_Stream_Size( TT_Stream stream )
+ {
+ PStream_Rec rec = STREAM2REC( stream );
+
+
+ if ( rec )
+ return rec->map->size;
+ else
+ return 0; /* invalid stream - return 0 */
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Seek_File
+ *
+ * Description : Seeks the file cursor to a different position.
+ *
+ * Input : position new position in file
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Seek_File( STREAM_ARGS Long position )
+ {
+ if ( position > CUR_Stream->map->size )
+ return TT_Err_Invalid_File_Offset;
+
+ CUR_Stream->pos = position;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Skip_File
+ *
+ * Description : Skips forward the file cursor.
+ *
+ * Input : distance number of bytes to skip
+ *
+ * Output : see TT_Seek_File
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Skip_File( STREAM_ARGS Long distance )
+ {
+ return TT_Seek_File( STREAM_VARS CUR_Stream->pos + distance );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_File
+ *
+ * Description : Reads a chunk of the file and copies it to memory.
+ *
+ * Input : buffer target buffer
+ * count length in bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_File( STREAM_ARGS void* buffer, Long count )
+ {
+ if ( CUR_Stream->pos + count > CUR_Stream->map->size )
+ return TT_Err_Invalid_File_Read;
+
+ MEM_Copy( buffer,
+ MAP_Address( CUR_Stream->map ) + CUR_Stream->pos, count );
+ CUR_Stream->pos += count;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_At_File
+ *
+ * Description : Reads file at a specified position.
+ *
+ * Input : position position to seek to before read
+ * buffer target buffer
+ * count number of bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_At_File( STREAM_ARGS Long position,
+ void* buffer,
+ Long count )
+ {
+ TT_Error error;
+
+
+ if ( (error = TT_Seek_File( STREAM_VARS position )) ||
+ (error = TT_Read_File( STREAM_VARS buffer, count )) )
+ return error;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_File_Pos
+ *
+ * Description : Returns current file seek pointer.
+ *
+ * Input : none
+ *
+ * Output : current file position
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_File_Pos( STREAM_ARG )
+ {
+ return CUR_Stream->pos;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : Error code
+ *
+ * Notes: The function fails if the byte range is not within the
+ * the file, or if there is not enough memory to cache
+ * the bytes properly (which usually means that aSize is
+ * too big in both cases).
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( CUR_Stream->pos + size > CUR_Stream->map->size )
+ return TT_Err_Invalid_Frame_Access;
+
+ CUR_Frame.size = size;
+ CUR_Frame.address = MAP_Address( CUR_Stream->map ) + CUR_Stream->pos;
+ CUR_Frame.cursor = CUR_Frame.address;
+
+ CUR_Stream->pos += size;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Check_And_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx()
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : Error code
+ *
+ * Notes: The function truncates 'size' if the byte range is not
+ * within the file.
+ *
+ * It will fail if there is not enough memory to cache
+ * the bytes properly (which usually means that aSize is
+ * too big).
+ *
+ * It will fail if you make two consecutive calls
+ * to TT_Access_Frame(), without a TT_Forget_Frame() between
+ * them.
+ *
+ * The only difference with TT_Access_Frame() is that we
+ * check that the frame is within the current file. We
+ * otherwise truncate it. The 'overflow' is set to zero.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+ Long readBytes;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ readBytes = CUR_Stream->map->size - CUR_Stream->pos;
+ if ( size > readBytes )
+ {
+ /* There is overflow, we allocate a new block then */
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+
+ CUR_Frame.size = size;
+
+ /* copy the valid part */
+ MEM_Copy( CUR_Frame.address,
+ MAP_Address( CUR_Stream->map ) + CUR_Stream->pos,
+ readBytes );
+ }
+ else
+ {
+ CUR_Frame.size = size;
+ CUR_Frame.address = MAP_Address( CUR_Stream->map ) + CUR_Stream->pos;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Forget_Frame
+ *
+ * Description : Releases a cached frame after reading.
+ *
+ * Input : None
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Forget_Frame( FRAME_ARG )
+ {
+ if ( CUR_Frame.address == NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ /* If we were using a duplicate in case of overflow, free it now */
+ if ( CUR_Frame.address < (Byte*)CUR_Stream->map->base ||
+ CUR_Frame.address >= (Byte*)CUR_Stream->map->base +
+ CUR_Stream->map->size )
+ FREE( CUR_Frame.address );
+
+ ZERO_Frame( files.frame );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Byte
+ *
+ * Description : Extracts a byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted Byte
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+#if 0
+
+ EXPORT_FUNC
+ Byte TT_Get_Byte( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Byte)(*CUR_Frame.cursor++);
+ }
+
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : GET_Char
+ *
+ * Description : Extracts a signed byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted char
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Char TT_Get_Char( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Char)(*CUR_Frame.cursor++);
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Short
+ *
+ * Description : Extracts a short from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted short
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Short TT_Get_Short( FRAME_ARG )
+ {
+ Short getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = ((Short)CUR_Frame.cursor[0] << 8) |
+ (Short)CUR_Frame.cursor[1];
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_UShort
+ *
+ * Description : Extracts an unsigned short from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted ushort
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+#if 0
+
+ EXPORT_FUNC
+ UShort TT_Get_UShort( FRAME_ARG )
+ {
+ UShort getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = ((UShort)CUR_Frame.cursor[0] << 8) |
+ (UShort)CUR_Frame.cursor[1];
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : GET_Long
+ *
+ * Description : Extracts a long from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted long
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_Get_Long( FRAME_ARG )
+ {
+ Long getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ((Long)CUR_Frame.cursor[0] << 24) |
+ ((Long)CUR_Frame.cursor[1] << 16) |
+ ((Long)CUR_Frame.cursor[2] << 8 ) |
+ (Long)CUR_Frame.cursor[3];
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_ULong
+ *
+ * Description : Extracts an unsigned long from the frame.
+ *
+ * Input : None
+ *
+ * Output : Extracted ulong
+ *
+ * NOTES : We consider that the programmer is intelligent enough
+ * not to try to get a byte that is out of the frame. Hence,
+ * we provide no bounds check here. (A misbehaving client
+ * could easily page fault using this call.)
+ *
+ ******************************************************************/
+
+#if 0
+
+ EXPORT_FUNC
+ ULong TT_Get_ULong( FRAME_ARG )
+ {
+ ULong getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ( ((ULong)CUR_Frame.cursor[0] << 24) |
+ ((ULong)CUR_Frame.cursor[1] << 16) |
+ ((ULong)CUR_Frame.cursor[2] << 8 ) |
+ (ULong)CUR_Frame.cursor[3] );
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+
+#endif
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/arch/win32/freetype.c b/xc/extras/FreeType/lib/arch/win32/freetype.c
new file mode 100644
index 000000000..76deaebc1
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/win32/freetype.c
@@ -0,0 +1,39 @@
+/* This file is part of the FreeType project */
+
+/* single object library component for Win32 */
+#define TT_MAKE_OPTION_SINGLE_OBJECT
+
+/* Note, you should define the EXPORT macro here if you want */
+/* to build a Win32 DLL. If undefined, the macro is defined */
+/* as "" (i.e. void) by default. See 'freetype.h' for details */
+
+/* The macro is placed before each high-level API function */
+/* declaration. You can then use it to take any compiler-specific */
+/* pragma for DLL-exported symbols */
+
+/* first include common core components */
+
+#include "ttapi.c"
+#include "ttcache.c"
+#include "ttcalc.c"
+#include "ttcmap.c"
+#include "ttdebug.c"
+#include "ttgload.c"
+#include "ttinterp.c"
+#include "ttload.c"
+#include "ttobjs.c"
+#include "ttraster.c"
+
+/* then system-specific (or ANSI) components */
+
+#include "ttfile.c"
+#include "ttmemory.c"
+#include "ttmutex.c"
+
+/* finally, add some extensions */
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+#include "ttextend.c"
+#endif
+
+/* end of freetype.c */
diff --git a/xc/extras/FreeType/lib/arch/win32/freetype.dsp b/xc/extras/FreeType/lib/arch/win32/freetype.dsp
new file mode 100644
index 000000000..959c4f804
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/win32/freetype.dsp
@@ -0,0 +1,104 @@
+# Microsoft Developer Studio Project File - Name="freetype" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+CFG=freetype - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "freetype.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+
+!IF "$(CFG)" == "freetype - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O1 /I "." /I "..\.." /I "..\..\extend" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ELSEIF "$(CFG)" == "freetype - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /Zi /O1 /I "." /I "..\.." /I "..\..\extend" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c
+# SUBTRACT CPP /YX
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+
+!ENDIF
+
+# Begin Target
+
+# Name "freetype - Win32 Release"
+# Name "freetype - Win32 Debug"
+# Begin Source File
+
+SOURCE=.\freetype.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\Extend\Ftxcmap.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\Extend\ftxerr18.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\Extend\Ftxgasp.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\Extend\Ftxkern.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\Extend\ftxpost.c
+# End Source File
+# End Target
+# End Project
diff --git a/xc/extras/FreeType/lib/arch/win32/freetype.dsw b/xc/extras/FreeType/lib/arch/win32/freetype.dsw
new file mode 100644
index 000000000..28d8963b4
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/win32/freetype.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"=.\freetype.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/xc/extras/FreeType/lib/arch/win32/freetype.ide b/xc/extras/FreeType/lib/arch/win32/freetype.ide
new file mode 100644
index 000000000..3df621fd0
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/win32/freetype.ide
Binary files differ
diff --git a/xc/extras/FreeType/lib/arch/win32/freetype.mak b/xc/extras/FreeType/lib/arch/win32/freetype.mak
new file mode 100644
index 000000000..789ef4ec6
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/win32/freetype.mak
@@ -0,0 +1,353 @@
+# Microsoft Developer Studio Generated NMAKE File, Format Version 4.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Static Library" 0x0104
+
+!IF "$(CFG)" == ""
+CFG=freetype - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to freetype - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "freetype - Win32 Release" && "$(CFG)" !=\
+ "freetype - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE on this makefile
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "freetype.mak" CFG="freetype - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "freetype - Win32 Release" (based on "Win32 (x86) Static Library")
+!MESSAGE "freetype - Win32 Debug" (based on "Win32 (x86) Static Library")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+################################################################################
+# Begin Project
+# PROP Target_Last_Scanned "freetype - Win32 Debug"
+CPP=cl.exe
+
+!IF "$(CFG)" == "freetype - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+OUTDIR=.\Release
+INTDIR=.\Release
+
+ALL : "$(OUTDIR)\freetype.lib"
+
+CLEAN :
+ -@erase ".\Release\freetype.lib"
+ -@erase ".\Release\Ftxkern.obj"
+ -@erase ".\Release\ftxpost.obj"
+ -@erase ".\Release\ftxerr18.obj"
+ -@erase ".\Release\Ftxcmap.obj"
+ -@erase ".\Release\Freetype.obj"
+ -@erase ".\Release\Ftxgasp.obj"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /W3 /GX /O2 /I "." /I "..\.." /I "..\..\extend" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c
+CPP_PROJ=/nologo /ML /W3 /GX /O2 /I "." /I "..\.." /I "..\..\extend" /D "WIN32"\
+ /D "NDEBUG" /D "_WINDOWS" /Fp"$(INTDIR)/freetype.pch" /YX /Fo"$(INTDIR)/" /c
+CPP_OBJS=.\Release/
+CPP_SBRS=
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/freetype.bsc"
+BSC32_SBRS=
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+LIB32_FLAGS=/nologo /out:"$(OUTDIR)/freetype.lib"
+LIB32_OBJS= \
+ "$(INTDIR)/Ftxkern.obj" \
+ "$(INTDIR)/ftxpost.obj" \
+ "$(INTDIR)/ftxerr18.obj" \
+ "$(INTDIR)/Ftxcmap.obj" \
+ "$(INTDIR)/Freetype.obj" \
+ "$(INTDIR)/Ftxgasp.obj"
+
+"$(OUTDIR)\freetype.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+ $(LIB32) @<<
+ $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "freetype - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+OUTDIR=.\Debug
+INTDIR=.\Debug
+
+ALL : "$(OUTDIR)\freetype.lib"
+
+CLEAN :
+ -@erase ".\Debug\freetype.lib"
+ -@erase ".\Debug\Freetype.obj"
+ -@erase ".\Debug\Ftxkern.obj"
+ -@erase ".\Debug\ftxpost.obj"
+ -@erase ".\Debug\Ftxcmap.obj"
+ -@erase ".\Debug\Ftxgasp.obj"
+ -@erase ".\Debug\ftxerr18.obj"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+# ADD CPP /nologo /W3 /GX /Z7 /Od /I "." /I "..\.." /I "..\..\extend" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c
+CPP_PROJ=/nologo /MLd /W3 /GX /Z7 /Od /I "." /I "..\.." /I "..\..\extend" /D\
+ "WIN32" /D "_DEBUG" /D "_WINDOWS" /Fp"$(INTDIR)/freetype.pch" /YX\
+ /Fo"$(INTDIR)/" /c
+CPP_OBJS=.\Debug/
+CPP_SBRS=
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/freetype.bsc"
+BSC32_SBRS=
+LIB32=link.exe -lib
+# ADD BASE LIB32 /nologo
+# ADD LIB32 /nologo
+LIB32_FLAGS=/nologo /out:"$(OUTDIR)/freetype.lib"
+LIB32_OBJS= \
+ "$(INTDIR)/Freetype.obj" \
+ "$(INTDIR)/Ftxkern.obj" \
+ "$(INTDIR)/ftxpost.obj" \
+ "$(INTDIR)/Ftxcmap.obj" \
+ "$(INTDIR)/Ftxgasp.obj" \
+ "$(INTDIR)/ftxerr18.obj"
+
+"$(OUTDIR)\freetype.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS)
+ $(LIB32) @<<
+ $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS)
+<<
+
+!ENDIF
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+################################################################################
+# Begin Target
+
+# Name "freetype - Win32 Release"
+# Name "freetype - Win32 Debug"
+
+!IF "$(CFG)" == "freetype - Win32 Release"
+
+!ELSEIF "$(CFG)" == "freetype - Win32 Debug"
+
+!ENDIF
+
+################################################################################
+# Begin Source File
+
+SOURCE=\Freetype\Lib\Extend\ftxpost.c
+DEP_CPP_FTXPO=\
+ ".\..\..\Extend\ftxpost.h"\
+ ".\..\..\tttypes.h"\
+ ".\..\..\ttobjs.h"\
+ ".\..\..\tttables.h"\
+ ".\..\..\ttload.h"\
+ ".\..\..\ttfile.h"\
+ ".\..\..\tttags.h"\
+ ".\..\..\ttmemory.h"\
+ ".\..\..\ttextend.h"\
+ ".\..\..\freetype.h"\
+ "..\..\ttconfig.h"\
+ ".\ft_conf.h"\
+ "..\..\ttengine.h"\
+ "..\..\ttmutex.h"\
+ "..\..\ttcache.h"\
+ "..\..\ttcmap.h"\
+ ".\..\..\ttdebug.h"\
+
+
+"$(INTDIR)\ftxpost.obj" : $(SOURCE) $(DEP_CPP_FTXPO) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=\Freetype\Lib\Extend\ftxerr18.c
+DEP_CPP_FTXER=\
+ ".\..\..\Extend\ftxerr18.h"\
+ ".\..\..\Extend\ftxkern.h"\
+ ".\..\..\Extend\ftxpost.h"\
+ ".\..\..\freetype.h"\
+ "..\..\ttconfig.h"\
+ ".\ft_conf.h"\
+
+
+"$(INTDIR)\ftxerr18.obj" : $(SOURCE) $(DEP_CPP_FTXER) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=\Freetype\Lib\Extend\Ftxgasp.c
+DEP_CPP_FTXGA=\
+ ".\..\..\Extend\ftxgasp.h"\
+ ".\..\..\tttypes.h"\
+ ".\..\..\ttobjs.h"\
+ ".\..\..\tttables.h"\
+ ".\..\..\freetype.h"\
+ "..\..\ttconfig.h"\
+ ".\ft_conf.h"\
+ "..\..\ttengine.h"\
+ "..\..\ttmutex.h"\
+ "..\..\ttcache.h"\
+ "..\..\ttcmap.h"\
+
+
+"$(INTDIR)\Ftxgasp.obj" : $(SOURCE) $(DEP_CPP_FTXGA) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=\Freetype\Lib\Extend\Ftxkern.c
+DEP_CPP_FTXKE=\
+ ".\..\..\Extend\ftxkern.h"\
+ ".\..\..\ttextend.h"\
+ ".\..\..\tttypes.h"\
+ ".\..\..\ttdebug.h"\
+ ".\..\..\ttmemory.h"\
+ ".\..\..\ttfile.h"\
+ ".\..\..\ttobjs.h"\
+ ".\..\..\ttload.h"\
+ ".\..\..\tttags.h"\
+ ".\..\..\freetype.h"\
+ "..\..\ttconfig.h"\
+ ".\ft_conf.h"\
+ "..\..\ttengine.h"\
+ "..\..\ttmutex.h"\
+ "..\..\ttcache.h"\
+ ".\..\..\tttables.h"\
+ "..\..\ttcmap.h"\
+
+
+"$(INTDIR)\Ftxkern.obj" : $(SOURCE) $(DEP_CPP_FTXKE) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=\Freetype\Lib\Extend\Ftxcmap.c
+DEP_CPP_FTXCM=\
+ ".\..\..\Extend\ftxcmap.h"\
+ ".\..\..\tttypes.h"\
+ ".\..\..\ttobjs.h"\
+ ".\..\..\tttables.h"\
+ ".\..\..\freetype.h"\
+ "..\..\ttconfig.h"\
+ ".\ft_conf.h"\
+ "..\..\ttengine.h"\
+ "..\..\ttmutex.h"\
+ "..\..\ttcache.h"\
+ "..\..\ttcmap.h"\
+
+
+"$(INTDIR)\Ftxcmap.obj" : $(SOURCE) $(DEP_CPP_FTXCM) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\Freetype.c
+DEP_CPP_FREET=\
+ ".\..\..\ttapi.c"\
+ ".\..\..\ttcache.c"\
+ ".\..\..\ttcalc.c"\
+ ".\..\..\ttcmap.c"\
+ ".\..\..\ttgload.c"\
+ ".\..\..\ttinterp.c"\
+ ".\..\..\ttload.c"\
+ ".\..\..\ttobjs.c"\
+ ".\..\..\ttraster.c"\
+ ".\..\..\ttfile.c"\
+ ".\..\..\ttmemory.c"\
+ ".\..\..\ttmutex.c"\
+ ".\..\..\ttextend.c"\
+ ".\..\..\freetype.h"\
+ "..\..\ttengine.h"\
+ "..\..\ttcalc.h"\
+ ".\..\..\ttmemory.h"\
+ "..\..\ttcache.h"\
+ ".\..\..\ttfile.h"\
+ ".\..\..\ttobjs.h"\
+ ".\..\..\ttload.h"\
+ "..\..\ttgload.h"\
+ "..\..\ttraster.h"\
+ ".\..\..\ttextend.h"\
+ "..\..\ttconfig.h"\
+ ".\ft_conf.h"\
+ "..\..\ttmutex.h"\
+ ".\..\..\tttypes.h"\
+ ".\..\..\ttdebug.h"\
+ ".\..\..\tttables.h"\
+ "..\..\ttcmap.h"\
+ ".\..\..\tttags.h"\
+ "..\..\ttinterp.h"\
+ {$(INCLUDE)}"\unistd.h"\
+
+
+"$(INTDIR)\Freetype.obj" : $(SOURCE) $(DEP_CPP_FREET) "$(INTDIR)"
+
+
+# End Source File
+# End Target
+# End Project
+################################################################################
diff --git a/xc/extras/FreeType/lib/arch/win32/freetype.mdp b/xc/extras/FreeType/lib/arch/win32/freetype.mdp
new file mode 100644
index 000000000..9082b5a70
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/win32/freetype.mdp
Binary files differ
diff --git a/xc/extras/FreeType/lib/arch/win32/ft_conf.h b/xc/extras/FreeType/lib/arch/win32/ft_conf.h
new file mode 100644
index 000000000..97ad712ca
--- /dev/null
+++ b/xc/extras/FreeType/lib/arch/win32/ft_conf.h
@@ -0,0 +1,179 @@
+/* This file is part of the FreeType project */
+
+/* ft_conf.h for Win32 */
+
+
+/* we need the following because there are some typedefs in this file */
+
+#ifndef FT_CONF_H
+#define FT_CONF_H
+
+#ifndef WIN32
+#define WIN32
+#endif
+
+/* Define to empty if the 'const' keyword does not work. */
+/* #undef const */
+
+/* Define if you have a working `mmap' system call. */
+#undef HAVE_MMAP
+
+/* Define if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H
+
+/* Define if your processor stores words with the most significant
+ byte first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* Define if you have the getpagesize function. */
+#undef HAVE_GETPAGESIZE
+
+/* Define if you have the memcpy function. */
+#define HAVE_MEMCPY
+
+/* Define if you have the memmove function. */
+#define HAVE_MEMMOVE
+
+/* Define if you have the valloc function. */
+#undef HAVE_VALLOC
+
+/* Define if you have the <fcntl.h> header file. */
+#undef HAVE_FCNTL_H
+
+/* Define if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* The number of bytes in a int. */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long. */
+#define SIZEOF_LONG 4
+
+/**********************************************************************/
+/* */
+/* The following configuration macros can be tweaked manually by */
+/* a developer to turn on or off certain features or options in the */
+/* TrueType engine. This may be useful to tune it for specific */
+/* purposes.. */
+/* */
+/**********************************************************************/
+
+
+/*************************************************************************/
+/* Define this if the underlying operating system uses a different */
+/* character width than 8bit for file names. You must then also supply */
+/* a typedef declaration for defining 'TT_Text'. Default is off. */
+
+/* #define HAVE_TT_TEXT */
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support engine extensions */
+/* Default is on, but if you're satisfied by the basic services provided */
+/* by the engine and need no extensions, undefine this configuration */
+/* macro to save a few more bytes. */
+
+#define TT_CONFIG_OPTION_EXTEND_ENGINE
+
+
+/*************************************************************************/
+/* Define this if you want to generate code to support gray-scaling, */
+/* a.k.a. font-smoothing or anti-aliasing. Default is on, but you can */
+/* disable it if you don't need it. */
+
+#define TT_CONFIG_OPTION_GRAY_SCALING
+
+
+/*************************************************************************/
+/* Define this if you want to use a big 'switch' statement within the */
+/* bytecode interpreter. Because some non-optimizing compilers are not */
+/* able to produce jump tables from such statements, undefining this */
+/* configuration macro will generate the appropriate C jump table in */
+/* ttinterp.c. If you use an optimizing compiler, you should leave it */
+/* defined for better performance and code compactness.. */
+
+#define TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+
+/*************************************************************************/
+/* Define TT_CONFIG_THREAD_SAFE if you want to build a thread-safe */
+/* version of the library. */
+
+#undef TT_CONFIG_OPTION_THREAD_SAFE
+
+/**********************************************************************/
+/* */
+/* The following macros are used to define the debug level, as well */
+/* as individual tracing levels for each component. There are */
+/* currently three modes of operation : */
+/* */
+/* - trace mode (define DEBUG_LEVEL_TRACE) */
+/* */
+/* The engine prints all error messages, as well as tracing */
+/* ones, filtered by each component's level */
+/* */
+/* - debug mode (define DEBUG_LEVEL_ERROR) */
+/* */
+/* Disable tracing, but keeps error output and assertion */
+/* checks. */
+/* */
+/* - release mode (don't define anything) */
+/* */
+/* Don't include error-checking or tracing code in the */
+/* engine's code. Ideal for releases. */
+/* */
+/* NOTE : */
+/* */
+/* Each component's tracing level is defined in its own source. */
+/* */
+/**********************************************************************/
+
+/* Define if you want to use the tracing debug mode */
+#undef DEBUG_LEVEL_TRACE
+
+/* Define if you want to use the error debug mode - ignored if */
+/* DEBUG_LEVEL_TRACE is defined */
+#undef DEBUG_LEVEL_ERROR
+
+/**************************************************************************/
+/* Definition of various integer sizes. These types are used by ttcalc */
+/* and ttinterp (for the 64-bit integers) only.. */
+
+#if SIZEOF_INT == 4
+
+ typedef signed int TT_Int32;
+ typedef unsigned int TT_Word32;
+
+#elif SIZEOF_LONG == 4
+
+ typedef signed long TT_Int32;
+ typedef unsigned long TT_Word32;
+
+#else
+#error "no 32bit type found"
+#endif
+
+#if SIZEOF_LONG == 8
+
+/* LONG64 must be defined when a 64-bit type is available */
+/* INT64 must then be defined to this type.. */
+#define LONG64
+#define INT64 long
+
+#else
+
+/* GCC provides the non-ANSI 'long long' 64-bit type. You can activate */
+/* by defining the TT_USE_LONG_LONG macro in 'ft_conf.h'. Note that this */
+/* will produce many -ansi warnings during library compilation. */
+#ifdef TT_USE_LONG_LONG
+
+#define LONG64
+#define INT64 long long
+
+#endif /* TT_USE_LONG_LONG */
+#endif
+
+#endif /* FT_CONF_H */
+
+
+/* End of ft_conf.h */
diff --git a/xc/extras/FreeType/lib/changes.txt b/xc/extras/FreeType/lib/changes.txt
new file mode 100644
index 000000000..aabf678d7
--- /dev/null
+++ b/xc/extras/FreeType/lib/changes.txt
@@ -0,0 +1,247 @@
+- Werner made an impressive work by reviewing and fixing the source
+ code for 16-bitness
+
+- Thread-safety and reentrancy support is now coded in the engine.
+ This is still untested though, one must specialize the component
+ ttmutex.c before even trying this.., as well as change a configuration
+ macro in its ft_conf.h
+
+==========================================================================
+
+
+- Changed the structure of a TT_Outline. Now, coordinates are placed
+ in a single array of TT_Vector elements, instead of two parallel
+ arrays of TT_PCoordinates.
+ (many changes in ttapi, ttobjs, ttgload, ttraster and ttinterp)
+
+- Introduced the new TT_MulDiv and TT_MulFix functions.
+ TT_MulFix is used for 16.16 multiplications
+
+- re-designed the cache manager to get rid of ttlists. It is
+ now smaller and simpler (it's now certain that no other component
+ needs a generic list :-)
+
+- _big_ changes in the object management scheme :
+
+ Execution contexts are not childs of a face anymore. Rather,
+ they're now listed by the engine, and their arrays (i.e loadStack,
+ stack and glyphIns) grow whenever necessary in function "Context_Load"
+
+ This should save between 7 and 15 Kb per opened face (except for the
+ first one, of course). Great when having a lot of opened fonts at
+ once.
+
+ Also, the twilight zone and storage area are now part of a TInstance
+ and are thus shared by all glyphs of a same instance.
+
+- Corrected the Makefiles and freetype.c so that the extensions aren't
+ compiled with the engine into a single object. Rather, they're now
+ compiled separately, and added to 'libttf' so that only the
+ applications that need them will really link them.
+
+ Also made some changes to allow to compile statically the test
+ program with electric fence, in order to track memory overwrites.
+ So far, no error was detected !! :-)
+
+
+- All in all, code size was reduced, and performance slightly increased
+
+
+==========================================================================
+
+- Fixed some problems within the interpreter in SWITCH mode.
+ Rather than trying to track the bug, and potentially lose
+ several hours, I defined some macros from the functional
+ definitions, and moved the non-trivial opcode like SCFS, GC and MD
+ out of the switch.
+
+ This means that the macro shouldn't interfere with debugging, as
+ they're only used for trivial stuff now. All problems seem
+ fixed now.
+
+ ( previous problems : error 0x408 (invalid reference) in many
+ glyphs of common fonts like times.ttf, etc..
+
+
+- Some functions are now "EXPORTED", though they're not defined in
+ the file "freetype.h". They're reserved for extensions that should
+ now be able to link separately with the single-object freetype.o
+
+ These functions are :
+
+ o Memory management, i.e. TT_Alloc and TT_Free
+
+ o File and Frame access : in ttfile.c, os2file.c and ttmmap.c
+
+ o The function Extension_Register, defined in ttextend.h, has been
+ renamed TT_Register_Extension and is now exported. current
+ extensions have been modified accordingly
+
+ o The function LookUp_TrueType_Table, defined in ttload.c has been
+ renamed to TT_LookUp_Table and is now exported. Of course, changes,
+ etc...
+
+ Extensions are still free to #include all relevant FreeType header
+ files, however, they should not try to call functions that are not
+ exported now.
+
+ If some internal function call is dearly needed, please contact us
+ to discuss the issue..
+
+
+- Updated Load_TrueType_Any (in ttload.c), as well as updated the
+ documentation for this function (called by TT_Get_Font_Data)
+
+
+- added a #define TT_MAKE_OPTION_SINGLE_OBJECT to all the "freetype.c"
+ files, to make sure to export only the correct symbols..
+
+
+- removed the implementation of the TT_Get_Byte, TT_Get_UShort and
+ TT_Get_ULong function, replacing them with simple macros in ttfile.h
+ (there isn't a good reason to have two functions which perform
+ _exactly_ the same task but return values of different signess).
+
+
+- fixed TT_Get_Face_Metrics : two serious bugs.. Oopss :-( !!
+ Credits go to Michal..
+
+
+- the macro TT_MAKE_TAG referenced the 'Long' type, instead of 'long'
+
+----------------------------------------------------------------------
+
+Many relatively important changes :
+
+- Major code clean-up to eliminate warnings when compiling with
+ Visual C++ (4.0 and 5.0, warning level 3 now ok) and Borland C++
+ (5.0, some warnings must be deselected from the 'ANSI' set though..)
+
+- Vertical information support. The glyph loader uses the vertical data
+ found in the file to build big glyph metrics.. Loading is automatic.
+
+ NOTE: The glyph is _still_ placed relative to the horizontal roman
+ metrics. You'll have to translate it yourself to position it
+ correctly for vertical layouts..
+
+ (translation vector is :
+
+ ( vertBearingX - bbox.xMin, vertBearingY - bbox.yMax ) )
+
+- new APIS :
+
+ o TT_Get_Face_Metrics :
+
+ used to returned glyph metrics expressed in font units, as found
+ in the "hmtx" and/or "vmtx" tables.. Much faster than loading
+ each glyph individually..
+
+
+ o TT_Get_Big_Glyph_Metrics :
+
+ used to return a glyph's big metrics, which include vertical
+ bearings and advance.
+
+
+- huge re-organisation in the bytecode interpreter, to introduce a
+ giant "switch" statement to interpret opcodes. This usually produce
+ smaller and faster code, though this is HIGHLY dependent on your
+ compiler.
+
+ You can revert back to the old "call-jump-table" by undefining the
+ macro TT_CONFIG_OPTION_INTERPRETER_SWITCH in ttconfig.h
+
+
+- removed tterror.h. All its functions and macros were moved to
+ ttdebug.h/c. Fixed all references in the sources and Makefiles.
+
+
+- removed "ttcommon.h" which is now useless with the single object
+ compilation mode. NOTE : It may be a good idea to get rid of all
+ those ".lo" relocatable objects when compiling freetype as a shared
+ library on Unix !!
+
+
+- introduced an opcode counter. The "RunIns" function will return an
+ error code when an infinite loop is detected. See macro
+ MAX_RUNNABLE_OPCODES in ttinterp.c, currently set to 10000
+
+
+- two new error codes :
+
+ TT_Err_No_Vertical_Data 0x030 /* there is no vertical data in */
+ /* the file. Returned by the new */
+ /* TT_Get_Face_Metrics API */
+
+ TT_Err_Execution_Too_Long 0x411 /* infinite loop detected */
+
+
+- introduced four new fields in TT_Big_Glyph_Metrics to reflect un-hinted
+ scaled glyph metrics (useful for device-independent positioning) :
+
+ linearHoriBearingX left side bearing - horizontal layouts
+ linearHoriAdvance advance width - "
+ linearVertBearingY top side bearing - vertical layouts
+ linearVertAdvance advance height - "
+
+
+--------------------------------------------------------------------------
+
+Some more planned changes :
+
+ - REENTRANCY SUPPORT !!!!!!!!!! I just printed the code on _lots_
+ of sheets of paper to study it carefully..
+
+ - A set of regression tests. Will probably help locate some evil
+ bugs for the next "big change".
+
+ - re-organisation of the outline coordinates layout,
+ going from two parallel arrays to one single array of
+ points (i.e. x & y) structures.
+
+ This will require huge concurrent changes in the scan-line converter,
+ the interpreter as well as the glyph loader. However, it should
+ help reduce code size while improving performance
+
+ (Actually, this is already done in the Pascal source..)
+
+ - support for third-order beziers in the scan-line converter.
+ (an easy but necessary "evil" ;-)
+
+ - introducing an special "outline path iterator" function, much
+ like "Decompose_Curve" but slightly more generic. It will be
+ used to :
+
+ 1. scan-line convert the curve into a bit/pixmap
+ 2. compute a shape's _exact_ bounding box !
+ 3. provide clients with an API that will let them convert
+ FreeType outlines to wathever format they choose
+
+ The current, and speedy, TT_Get_Outline_BBox API will probably
+ be renamed TT_Get_Outline_CBox (for "Control BOX") and thus
+ still be available to speed-expecting clients..
+
+
+ - some fix in the raster, because I found some weird cases where
+ some drop-outs can be generated outside of the current bbox
+ (future "cbox") ! Darn !!
+
+
+ - a faster and better anti-alias routine (with the ability to select
+ between 5 or 17 shades of gray..)
+
+
+ - in general, as most of the code seems now rock solid, the C version
+ will progressively become more C-ish in style, mainly in order
+ to reduce code size. Performance is already satisfying but some
+ tricks might be introduced too..
+
+
+ - some new apis for ttfile.h in order to "load" permanently a
+ frame in memory. For memory mapped files, this will do nothing but
+ return a pointer to it. Very similar to the current frame scheme
+ but persistent and nesting..
+
+ This will get rid of some stupid copies and allocations (programs,
+ location table, etc...) and will reduce heap memory comsuption in
+ the case of memory-mapped files and ROM/memory-placed fonts.
diff --git a/xc/extras/FreeType/lib/extend/ftxcmap.c b/xc/extras/FreeType/lib/extend/ftxcmap.c
new file mode 100644
index 000000000..b9cc1e80c
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxcmap.c
@@ -0,0 +1,342 @@
+/*******************************************************************
+ *
+ * ftxcmap.h 1.0
+ *
+ * API extension for iterating over Cmaps
+ *
+ * Copyright 1996-1998 by Juliusz Chroboczek,
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "ftxcmap.h"
+
+#include "tttypes.h"
+#include "ttobjs.h"
+#include "tttables.h"
+
+static Long charmap_first4 ( PCMap4, UShort* );
+static Long charmap_next4 ( PCMap4, UShort, UShort* );
+static Long charmap_last4 ( PCMap4, UShort* );
+static UShort charmap_find_id4( PCMap4, UShort, TCMap4Segment*, UShort );
+
+
+/*******************************************************************
+ *
+ * Function : TT_CharMap_First
+ *
+ * Description : Returns the first valid character code in a
+ * given character map. Also returns the corresponding
+ * glyph index.
+ *
+ * Input : charMap handle to the target character map
+ * id address where the glyph index will be
+ * be returned in case of success
+ *
+ * Output : First valid character code. -1 in case of failure.
+ *
+ * Notes :
+ *
+ ******************************************************************/
+
+TT_Long TT_CharMap_First( TT_CharMap charMap,
+ TT_UShort* id )
+{
+ PCMapTable cmap;
+ UShort i, c;
+
+
+ if ( !( cmap = HANDLE_CharMap( charMap ) ) )
+ return -1;
+
+ switch( cmap->format )
+ {
+ case 0:
+ if ( id )
+ *id = cmap->c.cmap0.glyphIdArray[0];
+ return 0;
+
+ case 4:
+ return charmap_first4( &cmap->c.cmap4, id );
+
+ case 6:
+ if ( cmap->c.cmap6.entryCount < 1 )
+ return -1;
+
+ if ( id )
+ *id = cmap->c.cmap6.glyphIdArray[0];
+ return cmap->c.cmap6.firstCode;
+
+ default:
+ /* Now loop from 0 to 65535. We can't use a simple "for' on */
+ /* 16-bits systems, hence the "strange" loop here.. */
+ i = 0;
+ do
+ {
+ c = TT_Char_Index( charMap, i );
+ if ( c > 0 )
+ {
+ if ( id )
+ *id = c;
+ return i;
+ }
+ i++;
+ }
+ while (i != 0); /* because i is UShort !! */
+
+ return -1;
+ }
+}
+
+
+static Long charmap_first4( PCMap4 cmap4,
+ UShort* id )
+{
+ UShort firstCode;
+
+
+ if( cmap4->segCountX2 / 2 < 1 )
+ return -1;
+
+ firstCode = cmap4->segments[0].startCount;
+
+ if ( id )
+ *id = charmap_find_id4( cmap4, firstCode, &(cmap4->segments[0]), 0 );
+
+ return firstCode;
+}
+
+
+/*******************************************************************
+ *
+ * Function : TT_CharMap_Next
+ *
+ * Description : Returns the next valid character code in a given
+ * charMap.
+ *
+ * Input : charMap handle to the target char. map
+ * index starting character code
+ * id address where the glyph index of the next
+ * character will be returned
+ *
+ * Output : Next valid character code after 'index'. -1 in case
+ * of failure.
+ *
+ * Notes :
+ *
+ ******************************************************************/
+
+TT_Long TT_CharMap_Next( TT_CharMap charMap,
+ TT_UShort index,
+ TT_UShort* id )
+{
+ PCMapTable cmap;
+ UShort i, c;
+
+
+ cmap = HANDLE_CharMap(charMap);
+ if (!cmap)
+ return -1;
+
+ switch ( cmap->format )
+ {
+ case 0:
+ if( index < 255 )
+ {
+ if ( id )
+ *id = cmap->c.cmap0.glyphIdArray[index + 1];
+ return index + 1;
+ }
+ else
+ return -1;
+
+ case 4:
+ return charmap_next4( &cmap->c.cmap4, index, id );
+
+ case 6:
+ {
+ UShort firstCode = cmap->c.cmap6.firstCode;
+
+
+ if ( index + 1 < firstCode + cmap->c.cmap6.entryCount )
+ {
+ if( id )
+ *id = cmap->c.cmap6.glyphIdArray[index + 1 - firstCode];
+ return index + 1;
+ }
+ else
+ return -1;
+ }
+
+ default:
+ /* Now loop from 0 to 65535. We can't use a simple "for' on */
+ /* 16-bits systems, hence the "strange" loop here.. */
+ i = 0;
+ do
+ {
+ c = TT_Char_Index( charMap, i );
+ if ( c > 0 )
+ {
+ if( id )
+ *id = c;
+ return i;
+ }
+ i++;
+ }
+ while (i != 0); /* because i is UShort !! */
+
+ return -1;
+ }
+}
+
+
+static Long charmap_next4( PCMap4 cmap4,
+ UShort charCode,
+ UShort* id)
+{
+ UShort segCount, nextCode;
+ UShort i;
+ TCMap4Segment seg4;
+
+
+ if ( charCode == 0xFFFF )
+ return -1; /* get it out of the way now */
+
+ segCount = cmap4->segCountX2 / 2;
+
+ for ( i = 0; i < segCount; i++ )
+ if ( charCode < cmap4->segments[i].endCount )
+ break;
+
+ /* Safety check - even though the last endCount should be 0xFFFF */
+ if ( i >= segCount )
+ return -1;
+
+ seg4 = cmap4->segments[i];
+
+ if ( charCode < seg4.startCount )
+ nextCode = seg4.startCount;
+ else
+ nextCode = charCode + 1;
+
+ if ( id )
+ *id = charmap_find_id4( cmap4, nextCode, &seg4, i );
+
+ return nextCode;
+}
+
+
+static UShort
+charmap_find_id4( PCMap4 cmap4,
+ UShort charCode,
+ TCMap4Segment* seg4,
+ UShort i )
+{
+ UShort index1;
+
+
+ if ( seg4->idRangeOffset == 0 )
+ return (charCode + seg4->idDelta) & 0xFFFF;
+ else
+ {
+ index1 = seg4->idRangeOffset / 2 + charCode-seg4->startCount -
+ ( cmap4->segCountX2 / 2 - i );
+
+ if ( index1 >= cmap4->numGlyphId || cmap4->glyphIdArray[index1] == 0 )
+ return 0;
+ else
+ return (cmap4->glyphIdArray[index1] + seg4->idDelta) & 0xFFFF;
+ }
+}
+
+/*******************************************************************
+ *
+ * Function : TT_CharMap_Last
+ *
+ * Description : Returns the last valid character code in a
+ * given character map. Also returns the corresponding
+ * glyph index.
+ *
+ * Input : charMap handle to the target character map
+ * id address where the glyph index will be
+ * be returned in case of success
+ *
+ * Output : Last valid character code. -1 in case of failure.
+ *
+ * Notes :
+ *
+ ******************************************************************/
+
+TT_Long TT_CharMap_Last( TT_CharMap charMap,
+ TT_UShort* id )
+{
+ PCMapTable cmap;
+ UShort i, c;
+
+
+ if ( !( cmap = HANDLE_CharMap( charMap ) ) )
+ return -1;
+
+ switch( cmap->format )
+ {
+ case 0:
+ if ( id )
+ *id = cmap->c.cmap0.glyphIdArray[255];
+ return 255;
+
+ case 4:
+ return charmap_last4( &cmap->c.cmap4, id );
+
+ case 6:
+ if ( cmap->c.cmap6.entryCount < 1 )
+ return -1;
+
+ if ( id )
+ *id = cmap->c.cmap6.glyphIdArray[cmap->c.cmap6.entryCount - 1];
+ return cmap->c.cmap6.firstCode + cmap->c.cmap6.entryCount - 1;
+
+ default:
+ i = 65535;
+ do
+ {
+ c = TT_Char_Index( charMap, i );
+ if ( c > 0 )
+ {
+ if ( id )
+ *id = c;
+ return i;
+ }
+ i--;
+ }
+ while (i != 0);
+
+ return -1;
+ }
+}
+
+
+static Long charmap_last4( PCMap4 cmap4,
+ UShort* id )
+{
+ UShort lastCode;
+
+
+ if( cmap4->segCountX2 / 2 < 1 )
+ return -1;
+
+ lastCode = cmap4->segments[cmap4->segCountX2/2-1].endCount;
+
+ if ( id )
+ *id = charmap_find_id4( cmap4, lastCode, &(cmap4->segments[cmap4->segCountX2/2-1]), 0 );
+
+ return lastCode;
+}
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxcmap.h b/xc/extras/FreeType/lib/extend/ftxcmap.h
new file mode 100644
index 000000000..9e6264780
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxcmap.h
@@ -0,0 +1,54 @@
+/*******************************************************************
+ *
+ * ftxcmap.h 1.0
+ *
+ * API extension for iterating over Cmaps
+ *
+ * Copyright 1996-1998 by Juliusz Chroboczek,
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FTXCMAP_H
+#define FTXCMAP_H
+
+#include "freetype.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* Find the first entry of a Cmap. Its glyph index is returned */
+ /* in the "id" field, while the function returns the first valid */
+ /* character code in the Cmap. It returns -1 in case of failure. */
+
+ TT_Long TT_CharMap_First( TT_CharMap charMap,
+ TT_UShort* id );
+
+
+ /* Find the next entry of Cmap. Same return conventions. */
+
+ TT_Long TT_CharMap_Next( TT_CharMap charMap,
+ TT_UShort startId,
+ TT_UShort* id );
+
+ /* Find the last entry of a Cmap. Its glyph index is returned */
+ /* in the "id" field, while the function returns the last valid */
+ /* character code in the Cmap. It returns -1 in case of failure. */
+
+ TT_Long TT_CharMap_Last( TT_CharMap charMap,
+ TT_UShort* id );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXCMAP_H */
diff --git a/xc/extras/FreeType/lib/extend/ftxerr18.c b/xc/extras/FreeType/lib/extend/ftxerr18.c
new file mode 100644
index 000000000..aaeb972dc
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxerr18.c
@@ -0,0 +1,212 @@
+/****************************************************************************/
+/* */
+/* Erwin Dieterich, 15. 10. 1997 */
+/* - 06. 07. 1998 */
+/* */
+/* TT_ErrToString: translate error codes to character strings */
+/* */
+/* This extension provides internationalized error strings from the */
+/* various error messages. It uses the "gettext" package if available */
+/* or returns English/American message strings if not. */
+/* */
+/* If you do not want to use it, or if you encounter some problems */
+/* compiling this file, try to disable nls support when invoking */
+/* ./configure (on Unix). */
+/* */
+/* */
+/****************************************************************************/
+
+#include "ft_conf.h"
+
+#include "ftxerr18.h"
+#include "ftxkern.h"
+#include "ftxpost.h"
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#ifdef HAVE_LIBINTL_H
+#include <libintl.h>
+#define _( String ) dgettext( "freetype", String )
+#else
+#define _( String ) ( String )
+#endif
+
+
+TT_String* TT_ErrToString18( TT_Error error )
+{
+
+ switch ( error )
+ {
+ /* ----- high-level API error codes -----*/
+ case TT_Err_Ok:
+ return _( "Successful function call, no error." );
+
+ case TT_Err_Invalid_Face_Handle:
+ return _( "Invalid face handle." );
+ case TT_Err_Invalid_Instance_Handle:
+ return _( "Invalid instance handle." );
+ case TT_Err_Invalid_Glyph_Handle:
+ return _( "Invalid glyph handle." );
+ case TT_Err_Invalid_CharMap_Handle:
+ return _( "Invalid charmap handle." );
+ case TT_Err_Invalid_Result_Address:
+ return _( "Invalid result address." );
+ case TT_Err_Invalid_Glyph_Index:
+ return _( "Invalid glyph index." );
+ case TT_Err_Invalid_Argument:
+ return _( "Invalid argument." );
+ case TT_Err_Could_Not_Open_File:
+ return _( "Could not open file." );
+ case TT_Err_File_Is_Not_Collection:
+ return _( "File is not a TrueType collection." );
+
+ case TT_Err_Table_Missing:
+ return _( "Mandatory table missing." );
+ case TT_Err_Invalid_Horiz_Metrics:
+ return _( "Invalid horizontal metrics (hmtx table broken)." );
+ case TT_Err_Invalid_CharMap_Format:
+ return _( "Invalid charmap format." );
+
+ case TT_Err_Invalid_File_Format:
+ return _( "Invalid file format." );
+
+ case TT_Err_Invalid_Engine:
+ return _( "Invalid engine." );
+ case TT_Err_Too_Many_Extensions:
+ return _( "Too many extensions (max: 8)." );
+ case TT_Err_Extensions_Unsupported:
+ return _( "Extensions unsupported." );
+ case TT_Err_Invalid_Extension_Id:
+ return _( "Invalid extension id." );
+
+ case TT_Err_No_Vertical_Data:
+ return _( "No vertical data in font." );
+
+ case TT_Err_Max_Profile_Missing:
+ return _( "Maximum Profile (maxp) table missing." );
+ case TT_Err_Header_Table_Missing:
+ return _( "Font Header (head) table missing." );
+ case TT_Err_Horiz_Header_Missing:
+ return _( "Horizontal Header (hhea) table missing." );
+ case TT_Err_Locations_Missing:
+ return _( "Index to Location (loca) table missing." );
+ case TT_Err_Name_Table_Missing:
+ return _( "Naming (name) table missing." );
+ case TT_Err_CMap_Table_Missing:
+ return _( "Character to Glyph Index Mapping (cmap) tables missing." );
+ case TT_Err_Hmtx_Table_Missing:
+ return _( "Horizontal Metrics (hmtx) table missing." );
+ case TT_Err_OS2_Table_Missing:
+ return _( "OS/2 table missing." );
+ case TT_Err_Post_Table_Missing:
+ return _( "PostScript (post) table missing." );
+
+
+ /* ----- memory component error codes -----*/
+ case TT_Err_Out_Of_Memory:
+ return _( "Out of memory." );
+
+
+ /* ----- file component error codes -----*/
+ case TT_Err_Invalid_File_Offset:
+ return _( "Invalid file offset." );
+ case TT_Err_Invalid_File_Read:
+ return _( "Invalid file read." );
+ case TT_Err_Invalid_Frame_Access:
+ return _( "Invalid frame access." );
+
+
+ /* ----- glyph loader error codes -----*/
+ case TT_Err_Too_Many_Points:
+ return _( "Too many points." );
+ case TT_Err_Too_Many_Contours:
+ return _( "Too many contours." );
+ case TT_Err_Invalid_Composite:
+ return _( "Invalid composite glyph." );
+ case TT_Err_Too_Many_Ins:
+ return _( "Too many instructions." );
+
+
+ /* ----- byte-code interpreter error codes -----*/
+ case TT_Err_Invalid_Opcode:
+ return _( "Invalid opcode." );
+ case TT_Err_Too_Few_Arguments:
+ return _( "Too few arguments." );
+ case TT_Err_Stack_Overflow:
+ return _( "Stack overflow." );
+ case TT_Err_Code_Overflow:
+ return _( "Code overflow." );
+ case TT_Err_Bad_Argument:
+ return _( "Bad argument." );
+ case TT_Err_Divide_By_Zero:
+ return _( "Divide by zero." );
+ case TT_Err_Storage_Overflow:
+ return _( "Storage overflow." );
+ case TT_Err_Cvt_Overflow:
+ return _( "Control Value (cvt) table overflow." );
+ case TT_Err_Invalid_Reference:
+ return _( "Invalid reference." );
+ case TT_Err_Invalid_Distance:
+ return _( "Invalid distance." );
+ case TT_Err_Interpolate_Twilight:
+ return _( "Interpolate twilight points." );
+ case TT_Err_Debug_OpCode:
+ return _( "`DEBUG' opcode found." );
+ case TT_Err_ENDF_In_Exec_Stream:
+ return _( "`ENDF' in byte-code stream." );
+ case TT_Err_Out_Of_CodeRanges:
+ return _( "Out of code ranges." );
+ case TT_Err_Nested_DEFS:
+ return _( "Nested function definitions." );
+ case TT_Err_Invalid_CodeRange:
+ return _( "Invalid code range." );
+ case TT_Err_Invalid_Displacement:
+ return _( "Invalid displacement." );
+ case TT_Err_Execution_Too_Long:
+ return _( "Endless loop encountered while executing instructions." );
+
+
+ /* ----- internal failure error codes -----*/
+ case TT_Err_Nested_Frame_Access:
+ return _( "Nested frame access." );
+ case TT_Err_Invalid_Cache_List:
+ return _( "Invalid cache list." );
+ case TT_Err_Could_Not_Find_Context:
+ return _( "Could not find context." );
+ case TT_Err_Unlisted_Object:
+ return _( "Unlisted object." );
+
+
+ /* ----- scan-line converter error codes -----*/
+ case TT_Err_Raster_Pool_Overflow:
+ return _( "Raster pool overflow." );
+ case TT_Err_Raster_Negative_Height:
+ return _( "Raster: negative height encountered." );
+ case TT_Err_Raster_Invalid_Value:
+ return _( "Raster: invalid value." );
+ case TT_Err_Raster_Not_Initialized:
+ return _( "Raster not initialized." );
+
+
+ /* ----- engine extensions error codes -----*/
+ case TT_Err_Invalid_Kerning_Table_Format:
+ return _( "Invalid kerning (kern) table format." );
+ case TT_Err_Invalid_Kerning_Table:
+ return _( "Invalid kerning (kern) table." );
+ case TT_Err_Invalid_Post_Table_Format:
+ return _( "Invalid PostScript (post) table format." );
+ case TT_Err_Invalid_Post_Table:
+ return _( "Invalid PostScript (post) table." );
+
+ default:
+ ;
+ }
+
+
+ return _( "Invalid Error Number." );
+}
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxerr18.h b/xc/extras/FreeType/lib/extend/ftxerr18.h
new file mode 100644
index 000000000..9b7ea8a28
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxerr18.h
@@ -0,0 +1,37 @@
+/****************************************************************************/
+/* */
+/* Erwin Dieterich, 15. 10. 1997 */
+/* - 06. 07. 1998 */
+/* */
+/* TT_ErrToString: translate error codes to character strings */
+/* */
+/* This extension provides internationalised error strings from the */
+/* various error messages. It uses the "gettext" package where available */
+/* or returns english/american message strings if not. */
+/* */
+/* If you do not want to use it, or if you encounter some problems */
+/* compiling this file, try to disable nls support by configuring */
+/* FreeType with ./configure --disable-nls */
+/* */
+/* */
+/****************************************************************************/
+
+#ifndef FTXERR18_H
+#define FTXERR18_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "freetype.h"
+
+TT_String* TT_ErrToString18( TT_Error i );
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* FTXERR18_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxgasp.c b/xc/extras/FreeType/lib/extend/ftxgasp.c
new file mode 100644
index 000000000..71fb12266
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxgasp.c
@@ -0,0 +1,68 @@
+/*******************************************************************
+ *
+ * ftxgasp.c 1.0
+ *
+ * Gasp table support API extension body
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * The gasp table is currently loaded by the core engine, but the
+ * standard API doesn't give access to it. This file is used to
+ * demonstrate the use of a simple API extension.
+ *
+ ******************************************************************/
+
+#include "ftxgasp.h"
+
+#include "tttypes.h"
+#include "ttobjs.h"
+#include "tttables.h"
+
+
+ TT_Error TT_Get_Face_Gasp_Flags( TT_Face face,
+ TT_UShort point_size,
+ TT_Bool* grid_fit,
+ TT_Bool* smooth_font )
+ {
+ PFace faze = HANDLE_Face( face );
+ UShort i, flag;
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( faze->gasp.numRanges == 0 || !faze->gasp.gaspRanges )
+ return TT_Err_Table_Missing;
+
+ for ( i = 0; i < faze->gasp.numRanges; i++ )
+ {
+ if ( point_size <= faze->gasp.gaspRanges[i].maxPPEM )
+ {
+ flag = faze->gasp.gaspRanges[i].gaspFlag;
+
+ *grid_fit = ( (flag & GASP_GRIDFIT) != 0 );
+ *smooth_font = ( (flag & GASP_DOGRAY ) != 0 );
+
+ return TT_Err_Ok;
+ }
+ }
+
+ /* for very large fonts we enable font smoothing and discard */
+ /* grid fitting */
+
+ *grid_fit = 0;
+ *smooth_font = 1;
+
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxgasp.h b/xc/extras/FreeType/lib/extend/ftxgasp.h
new file mode 100644
index 000000000..9f37de8a8
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxgasp.h
@@ -0,0 +1,52 @@
+/*******************************************************************
+ *
+ * ftxgasp.h 1.0
+ *
+ * Gasp table support API extension
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * The gasp table is currently loaded by the core engine, but the
+ * standard API doesn't give access to it. This file is used to
+ * demonstrate the use of a simple API extension.
+ *
+ ******************************************************************/
+
+#ifndef FTXGASP_H
+#define FTXGASP_H
+
+#include "freetype.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+ /* This function returns for a given 'point_size' the values of the */
+ /* gasp flags 'grid_fit' and 'smooth_font'. The returned values */
+ /* are booleans (where 0 = NO, and 1 = YES). */
+
+ /* Note that this function will return TT_Err_Table_Missing if */
+ /* the font file doesn't contain any gasp table. */
+
+ TT_Error TT_Get_Face_Gasp_Flags( TT_Face face,
+ TT_UShort point_size,
+ TT_Bool* grid_fit,
+ TT_Bool* smooth_font );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXGASP_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxgpos.h b/xc/extras/FreeType/lib/extend/ftxgpos.h
new file mode 100644
index 000000000..f1ee9accd
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxgpos.h
@@ -0,0 +1,48 @@
+/*******************************************************************
+ *
+ * ftxgpos.h
+ *
+ * TrueType Open GPOS table support
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FTXOPEN_H
+#error "Don't include this file! Use ftxopen.h instead."
+#endif
+
+#ifndef FTXGPOS_H
+#define FTXGPOS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TTO_Err_Invalid_GPOS_SubTable_Format 0x1020
+
+
+ /* to be written */
+
+ union TTO_GPOS_SubTable_
+ {
+ int dummy;
+ };
+
+ typedef union TTO_GPOS_SubTable_ TTO_GPOS_SubTable;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXGPOS_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxgsub.c b/xc/extras/FreeType/lib/extend/ftxgsub.c
new file mode 100644
index 000000000..055fc2ba2
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxgsub.c
@@ -0,0 +1,1671 @@
+/*******************************************************************
+ *
+ * ftxgsub.c
+ *
+ * GSUB table support.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "tttypes.h"
+#include "tttags.h"
+#include "ttload.h"
+#include "ttextend.h"
+#include "ttmemory.h"
+#include "ttfile.h"
+
+#include "ftxopen.h"
+#include "ftxopenf.h"
+
+
+#define GSUB_ID Build_Extension_ID( 'G', 'S', 'U', 'B' )
+
+
+#define ADD_STRING( in, num_in, out, num_out, data ) \
+ ( ( error = Add_String( (in), (num_in), \
+ (out), (num_out), \
+ (data) ) ) != TT_Err_Ok )
+
+#define String_Send_Begin( s ) (s)->pos = 0;
+#define String_Send_End( s ) (s)->pos = 0;
+#define String_Receive_Begin( s ) (s)->pos = 0;
+#define String_Receive_End( s ) (s)->length = (s)->pos; \
+ (s)->pos = 0;
+
+
+
+ /**********************
+ * Auxiliary functions
+ **********************/
+
+
+ /* The following function copies `num_out' elements from `data' to
+ `out', advancing the array pointer in the `in' structure by `num_in'
+ elements and in `out' by `num_out' elements. If the string array
+ in `out' is empty or too small, it allocates resp. reallocates the
+ string array. */
+
+ static TT_Error Add_String( TTO_String* in,
+ UShort num_in,
+ TTO_String* out,
+ UShort num_out,
+ UShort* data )
+ {
+ TT_Error error = TT_Err_Ok;
+
+
+ /* sanity check */
+
+ if ( !in || !out ||
+ in->length == 0 || in->pos >= in->length ||
+ in->length >= in->pos + num_in )
+ return TT_Err_Invalid_Argument;
+
+ if ( out->allocated == 0 )
+ {
+ if ( ALLOC( out->string, in->length - ( in->pos + num_in ) ) )
+ return error;
+ out->allocated = in->length - ( in->pos + num_in );
+ }
+ else if ( out->pos + num_out >= out->allocated )
+ {
+ if ( REALLOC( out->string, out->pos + num_out +
+ in->length - ( in->pos + num_in ) ) )
+ return error;
+ out->allocated = out->pos + num_out +
+ in->length - ( in->pos + num_in );
+ }
+
+ MEM_Copy( &out->string[in->pos], data, num_out * sizeof ( UShort ) );
+
+ in->pos += num_in;
+ out->pos += num_out;
+
+ return TT_Err_Ok;
+ }
+
+
+
+ /**********************
+ * Extension Functions
+ **********************/
+
+
+ static TT_Error GSUB_Create( void* ext,
+ PFace face )
+ {
+ DEFINE_LOAD_LOCALS( face->stream );
+
+ TTO_GSUBHeader* gsub = (TTO_GSUBHeader*)ext;
+ Long table;
+
+
+ /* by convention */
+ if ( !gsub )
+ return TT_Err_Ok;
+
+ /* a null offset indicates that there is no GSUB table */
+ gsub->offset = 0;
+
+ /* we store the start offset and the size of the subtable */
+ table = TT_LookUp_Table( face, TTAG_GSUB );
+ if ( table < 0 )
+ return TT_Err_Ok; /* The table is optional */
+
+ if ( FILE_Seek( face->dirTables[table].Offset ) ||
+ ACCESS_Frame( 4L ) )
+ return error;
+
+ gsub->offset = FILE_Pos();
+ gsub->Version = GET_ULong();
+
+ FORGET_Frame();
+
+ gsub->loaded = FALSE;
+
+ return TT_Err_Ok;
+ }
+
+
+ static TT_Error GSUB_Destroy( void* ext,
+ PFace face )
+ {
+ TTO_GSUBHeader* gsub = (TTO_GSUBHeader*)ext;
+
+
+ /* by convention */
+ if ( !gsub )
+ return TT_Err_Ok;
+
+ if ( gsub->loaded )
+ {
+ Free_LookupList( &gsub->LookupList, GSUB );
+ Free_FeatureList( &gsub->FeatureList );
+ Free_ScriptList( &gsub->ScriptList );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ TT_Error TT_Init_GSUB_Extension( TT_Engine engine )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+
+ TT_Error error;
+
+
+ if ( !_engine )
+ return TT_Err_Invalid_Engine;
+
+ error = TT_Register_Extension( _engine,
+ GSUB_ID,
+ sizeof ( TTO_GSUBHeader ),
+ GSUB_Create,
+ GSUB_Destroy );
+ return error;
+ }
+
+
+ TT_Error TT_Load_GSUB_Table( TT_Face face,
+ TTO_GSUBHeader* gsub )
+ {
+ TT_Error error;
+ TT_Stream stream;
+
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ error = TT_Extension_Get( faze, GSUB_ID, (void**)&gsub );
+ if ( error )
+ return error;
+
+ if ( gsub->offset == 0 )
+ return TT_Err_Ok; /* no GSUB table; nothing to do */
+
+ /* now access stream */
+ if ( USE_Stream( faze->stream, stream ) )
+ return error;
+
+ /* the next three functions access the current file position
+ to get the real table offset */
+
+ if ( FILE_Seek( gsub->offset ) ||
+ ( error = Load_ScriptList( &gsub->ScriptList,
+ faze ) ) != TT_Err_Ok )
+ goto Fail1;
+
+ if ( FILE_Seek( gsub->offset + 2L ) ||
+ ( error = Load_FeatureList( &gsub->FeatureList,
+ faze ) ) != TT_Err_Ok )
+ goto Fail2;
+
+ if ( FILE_Seek( gsub->offset + 4L ) ||
+ ( error = Load_LookupList( &gsub->LookupList,
+ faze, GSUB ) ) != TT_Err_Ok )
+ goto Fail3;
+
+ gsub->loaded = TRUE;
+ DONE_Stream( stream );
+
+ return TT_Err_Ok;
+
+
+ Fail3:
+ Free_LookupList( &gsub->LookupList, GSUB );
+
+ Fail2:
+ Free_FeatureList( &gsub->FeatureList );
+
+ Fail1:
+ Free_ScriptList( &gsub->ScriptList );
+
+ /* release stream */
+ DONE_Stream( stream );
+
+ return error;
+ }
+
+
+
+ /*****************************
+ * SubTable related functions
+ *****************************/
+
+
+ /* LookupType 1 */
+
+ /* SingleSubstFormat1 */
+ /* SingleSubstFormat2 */
+
+ TT_Error Load_LookupSingle( TTO_SingleSubst* ss,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ UShort* s;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ ss->SubstFormat = GET_UShort();
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Coverage( &ss->Coverage, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+
+ switch ( ss->SubstFormat )
+ {
+ case 1:
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ ss->ssf.ssf1.DeltaGlyphID = GET_UShort();
+
+ FORGET_Frame();
+
+ break;
+
+ case 2:
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = ss->ssf.ssf2.GlyphCount = GET_UShort();
+
+ FORGET_Frame();
+
+ ss->ssf.ssf2.Substitute = NULL;
+
+ if ( ALLOC_ARRAY( ss->ssf.ssf2.Substitute, count, TT_UShort ) )
+ return error;
+
+ s = ss->ssf.ssf2.Substitute;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ s[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ break;
+
+ default:
+ return TTO_Err_Invalid_GSUB_SubTable_Format;
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ void Free_LookupSingle( TTO_SingleSubst* ss )
+ {
+ switch ( ss->SubstFormat )
+ {
+ case 1:
+ break;
+ case 2:
+ if ( ss->ssf.ssf2.Substitute )
+ FREE( ss->ssf.ssf2.Substitute );
+ break;
+ default:
+ break;
+ }
+
+ Free_Coverage( &ss->Coverage );
+ }
+
+
+ static TT_Error Lookup_Single( TTO_SingleSubst* ss,
+ TTO_String* in,
+ TTO_String* out )
+ {
+ UShort index, value[1];
+ TT_Error error;
+
+
+ /* sanity check */
+
+ if ( !in || !out || in->length == 0 || in->pos >= in->length )
+ return TT_Err_Invalid_Argument;
+
+ error = Coverage_Index( &ss->Coverage, in->string[in->pos], &index );
+ if ( error == TTO_Err_Not_Covered )
+ {
+ if ( ADD_STRING( in, 1, out, 1, &in->string[in->pos] ) )
+ return error;
+ }
+ else
+ {
+ switch ( ss->SubstFormat)
+ {
+ case 1:
+ value[0] = in->string[in->pos] + ss->ssf.ssf1.DeltaGlyphID;
+ if ( ADD_STRING( in, 1, out, 1, value ) )
+ return error;
+ break;
+ case 2:
+ if ( index >= ss->ssf.ssf2.GlyphCount )
+ return TTO_Err_Invalid_GSUB_SubTable;
+ if ( ADD_STRING( in, 1, out, 1, &ss->ssf.ssf2.Substitute[index] ) )
+ return error;
+ break;
+ default:
+ return TTO_Err_Invalid_GSUB_SubTable;
+ }
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ /* LookupType 2 */
+
+ /* Sequence */
+
+ static TT_Error Load_Sequence( TTO_Sequence* s,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* sub;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = s->GlyphCount = GET_UShort();
+
+ FORGET_Frame();
+
+ s->Substitute = NULL;
+
+ if ( ALLOC_ARRAY( s->Substitute, count, TT_UShort ) )
+ return error;
+
+ sub = s->Substitute;
+
+ if ( ACCESS_Frame ( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ sub[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Sequence( TTO_Sequence* s )
+ {
+ if ( s->Substitute )
+ FREE( s->Substitute );
+ }
+
+
+ /* MultipleSubstFormat1 */
+
+ TT_Error Load_LookupMultiple( TTO_MultipleSubst* ms,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_Sequence* s;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ ms->SubstFormat = GET_UShort(); /* should be 1 */
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Coverage( &ms->Coverage, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = ms->SequenceCount = GET_UShort();
+
+ FORGET_Frame();
+
+ ms->Sequence = NULL;
+
+ if ( ALLOC_ARRAY( ms->Sequence, count, TTO_Sequence ) )
+ return error;
+
+ s = ms->Sequence;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Sequence( &s[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ void Free_LookupMultiple( TTO_MultipleSubst* ms )
+ {
+ UShort n, count;
+
+
+ if ( ms->Sequence )
+ {
+ count = ms->SequenceCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_Sequence( &ms->Sequence[n] );
+
+ FREE( ms->Sequence );
+ }
+
+ Free_Coverage( &ms->Coverage );
+ }
+
+
+ /* LookupType 3 */
+
+ /* AlternateSet */
+
+ static TT_Error Load_AlternateSet( TTO_AlternateSet* as,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* a;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = as->GlyphCount = GET_UShort();
+
+ FORGET_Frame();
+
+ as->Alternate = NULL;
+
+ if ( ALLOC_ARRAY( as->Alternate, count, TT_UShort ) )
+ return error;
+
+ a = as->Alternate;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ a[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_AlternateSet( TTO_AlternateSet* as )
+ {
+ if ( as->Alternate )
+ FREE( as->Alternate );
+ }
+
+
+ /* AlternateSubstFormat1 */
+
+ TT_Error Load_LookupAlternate( TTO_AlternateSubst* as,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_AlternateSet* aset;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ as->SubstFormat = GET_UShort(); /* should be 1 */
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Coverage( &as->Coverage, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = as->AlternateSetCount = GET_UShort();
+
+ FORGET_Frame();
+
+ as->AlternateSet = NULL;
+
+ if ( ALLOC_ARRAY( as->AlternateSet, count, TTO_AlternateSet ) )
+ return error;
+
+ aset = as->AlternateSet;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_AlternateSet( &aset[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ void Free_LookupAlternate( TTO_AlternateSubst* as )
+ {
+ UShort n, count;
+
+
+ if ( as->AlternateSet )
+ {
+ count = as->AlternateSetCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_AlternateSet( &as->AlternateSet[n] );
+
+ FREE( as->AlternateSet );
+ }
+
+ Free_Coverage( &as->Coverage );
+ }
+
+
+ /* LookupType 4 */
+
+ /* Ligature */
+
+ static TT_Error Load_Ligature( TTO_Ligature* l,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* c;
+
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ l->LigGlyph = GET_UShort();
+ l->ComponentCount = GET_UShort();
+
+ FORGET_Frame();
+
+ l->Component = NULL;
+
+ count = l->ComponentCount - 1; /* only ComponentCount - 1 elements */
+
+ if ( ALLOC_ARRAY( l->Component, count, TT_UShort ) )
+ return error;
+
+ c = l->Component;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ c[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Ligature( TTO_Ligature* l )
+ {
+ if ( l->Component )
+ FREE( l->Component );
+ }
+
+
+ /* LigatureSet */
+
+ static TT_Error Load_LigatureSet( TTO_LigatureSet* ls,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_Ligature* l;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = ls->LigatureCount = GET_UShort();
+
+ FORGET_Frame();
+
+ ls->Ligature = NULL;
+
+ if ( ALLOC_ARRAY( ls->Ligature, count, TTO_Ligature ) )
+ return error;
+
+ l = ls->Ligature;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Ligature( &l[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_LigatureSet( TTO_LigatureSet* ls )
+ {
+ UShort n, count;
+
+
+ if ( ls->Ligature )
+ {
+ count = ls->LigatureCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_Ligature( &ls->Ligature[n] );
+
+ FREE( ls->Ligature );
+ }
+ }
+
+
+ /* LigatureSubstFormat1 */
+
+ TT_Error Load_LookupLigature( TTO_LigatureSubst* ls,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_LigatureSet* lset;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ ls->SubstFormat = GET_UShort(); /* should be 1 */
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Coverage( &ls->Coverage, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = ls->LigatureSetCount = GET_UShort();
+
+ FORGET_Frame();
+
+ ls->LigatureSet = NULL;
+
+ if ( ALLOC_ARRAY( ls->LigatureSet, count, TTO_LigatureSet ) )
+ return error;
+
+ lset = ls->LigatureSet;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_LigatureSet( &lset[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ void Free_LookupLigature( TTO_LigatureSubst* ls )
+ {
+ UShort n, count;
+
+
+ if ( ls->LigatureSet )
+ {
+ count = ls->LigatureSetCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_LigatureSet( &ls->LigatureSet[n] );
+
+ FREE( ls->LigatureSet );
+ }
+
+ Free_Coverage( &ls->Coverage );
+ }
+
+
+ /* LookupType 5 */
+
+ /* SubRule */
+
+ static TT_Error Load_SubRule( TTO_SubRule* sr,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* i;
+ TTO_SubstLookupRecord* slr;
+
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ sr->GlyphCount = GET_UShort();
+ sr->SubstCount = GET_UShort();
+
+ FORGET_Frame();
+
+ sr->Input = NULL;
+
+ count = sr->GlyphCount - 1; /* only GlyphCount - 1 elements */
+
+ if ( ALLOC_ARRAY( sr->Input, count, TT_UShort ) )
+ return error;
+
+ i = sr->Input;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ i[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ sr->SubstLookupRecord = NULL;
+
+ count = sr->SubstCount;
+
+ if ( ALLOC_ARRAY( sr->SubstLookupRecord, count, TTO_SubstLookupRecord ) )
+ return error;
+
+ slr = sr->SubstLookupRecord;
+
+ if ( ACCESS_Frame( count * 4L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ {
+ slr[n].SequenceIndex = GET_UShort();
+ slr[n].LookupListIndex = GET_UShort();
+ }
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_SubRule( TTO_SubRule* sr )
+ {
+ if ( sr->SubstLookupRecord )
+ FREE( sr->SubstLookupRecord );
+ if ( sr->Input )
+ FREE( sr->Input );
+ }
+
+
+ /* SubRuleSet */
+
+ static TT_Error Load_SubRuleSet( TTO_SubRuleSet* srs,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_SubRule* sr;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = srs->SubRuleCount = GET_UShort();
+
+ FORGET_Frame();
+
+ srs->SubRule = NULL;
+
+ if ( ALLOC_ARRAY( srs->SubRule, count, TTO_SubRule ) )
+ return error;
+
+ sr = srs->SubRule;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_SubRule( &sr[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_SubRuleSet( TTO_SubRuleSet* srs )
+ {
+ UShort n, count;
+
+
+ if ( srs->SubRule )
+ {
+ count = srs->SubRuleCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_SubRule( &srs->SubRule[n] );
+
+ FREE( srs->SubRule );
+ }
+ }
+
+
+ /* ContextSubstFormat1 */
+
+ static TT_Error Load_Context1( TTO_ContextSubstFormat1* csf1,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_SubRuleSet* srs;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Coverage( &csf1->Coverage, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = csf1->SubRuleSetCount = GET_UShort();
+
+ FORGET_Frame();
+
+ csf1->SubRuleSet = NULL;
+
+ if ( ALLOC_ARRAY( csf1->SubRuleSet, count, TTO_SubRuleSet ) )
+ return error;
+
+ srs = csf1->SubRuleSet;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_SubRuleSet( &srs[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Context1( TTO_ContextSubstFormat1* csf1 )
+ {
+ UShort n, count;
+
+
+ if ( csf1->SubRuleSet )
+ {
+ count = csf1->SubRuleSetCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_SubRuleSet( &csf1->SubRuleSet[n] );
+
+ FREE( csf1->SubRuleSet );
+ }
+
+ Free_Coverage( &csf1->Coverage );
+ }
+
+
+ /* SubClassRule */
+
+ static TT_Error Load_SubClassRule( TTO_SubClassRule* scr,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* c;
+ TTO_SubstLookupRecord* slr;
+
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ scr->GlyphCount = GET_UShort();
+ scr->SubstCount = GET_UShort();
+
+ FORGET_Frame();
+
+ scr->Class = NULL;
+
+ count = scr->GlyphCount - 1; /* only GlyphCount - 1 elements */
+
+ if ( ALLOC_ARRAY( scr->Class, count, TT_UShort ) )
+ return error;
+
+ c = scr->Class;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ c[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ scr->SubstLookupRecord = NULL;
+
+ count = scr->SubstCount;
+
+ if ( ALLOC_ARRAY( scr->SubstLookupRecord, count, TTO_SubstLookupRecord ) )
+ return error;
+
+ slr = scr->SubstLookupRecord;
+
+ if ( ACCESS_Frame( count * 4L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ {
+ slr[n].SequenceIndex = GET_UShort();
+ slr[n].LookupListIndex = GET_UShort();
+ }
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_SubClassRule( TTO_SubClassRule* scr )
+ {
+ if ( scr->SubstLookupRecord )
+ FREE( scr->SubstLookupRecord );
+ if ( scr->Class )
+ FREE( scr->Class );
+ }
+
+
+ /* SubClassSet */
+
+ static TT_Error Load_SubClassSet( TTO_SubClassSet* scs,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_SubClassRule* scr;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = scs->SubClassRuleCount = GET_UShort();
+
+ FORGET_Frame();
+
+ scs->SubClassRule = NULL;
+
+ if ( ALLOC_ARRAY( scs->SubClassRule, count, TTO_SubClassRule ) )
+ return error;
+
+ scr = scs->SubClassRule;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_SubClassRule( &scr[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_SubClassSet( TTO_SubClassSet* scs )
+ {
+ UShort n, count;
+
+
+ if ( scs->SubClassRule )
+ {
+ count = scs->SubClassRuleCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_SubClassRule( &scs->SubClassRule[n] );
+
+ FREE( scs->SubClassRule );
+ }
+ }
+
+
+ /* ContextSubstFormat2 */
+
+ static TT_Error Load_Context2( TTO_ContextSubstFormat2* csf2,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_SubClassSet* scs;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Coverage( &csf2->Coverage, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_ClassDefinition( &csf2->ClassDef,
+ input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = csf2->SubClassSetCount = GET_UShort();
+
+ FORGET_Frame();
+
+ csf2->SubClassSet = NULL;
+
+ if ( ALLOC_ARRAY( csf2->SubClassSet, count, TTO_SubClassSet ) )
+ return error;
+
+ scs = csf2->SubClassSet;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ if ( new_offset != base_offset ) /* not a NULL offset */
+ {
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_SubClassSet( &scs[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+ else
+ {
+ /* we create a SubClassSet table with no entries */
+ csf2->SubClassSet[n].SubClassRuleCount = 0;
+ csf2->SubClassSet[n].SubClassRule = NULL;
+ }
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Context2( TTO_ContextSubstFormat2* csf2 )
+ {
+ UShort n, count;
+
+
+ if ( csf2->SubClassSet )
+ {
+ count = csf2->SubClassSetCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_SubClassSet( &csf2->SubClassSet[n] );
+
+ FREE( csf2->SubClassSet );
+ }
+
+ Free_ClassDefinition( &csf2->ClassDef );
+ Free_Coverage( &csf2->Coverage );
+ }
+
+
+ /* ContextSubstFormat3 */
+
+ static TT_Error Load_Context3( TTO_ContextSubstFormat3* csf3,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_Coverage* c;
+ TTO_SubstLookupRecord* slr;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 6L ) )
+ return error;
+
+ csf3->GlyphCount = GET_UShort();
+ csf3->SubstCount = GET_UShort();
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ csf3->Coverage = NULL;
+
+ count = csf3->GlyphCount;
+
+ if ( ALLOC_ARRAY( csf3->Coverage, count, TTO_Coverage ) )
+ return error;
+
+ c = csf3->Coverage;
+
+ for ( n = 0; n < count; n++ )
+ {
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Coverage( &c[n], input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ csf3->SubstLookupRecord = NULL;
+
+ count = csf3->SubstCount;
+
+ if ( ALLOC_ARRAY( csf3->SubstLookupRecord, count,
+ TTO_SubstLookupRecord ) )
+ return error;
+
+ slr = csf3->SubstLookupRecord;
+
+ if ( ACCESS_Frame( count * 4L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ {
+ slr[n].SequenceIndex = GET_UShort();
+ slr[n].LookupListIndex = GET_UShort();
+ }
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Context3( TTO_ContextSubstFormat3* csf3 )
+ {
+ UShort n, count;
+
+
+ if ( csf3->SubstLookupRecord )
+ FREE( csf3->SubstLookupRecord );
+
+ if ( csf3->Coverage )
+ {
+ count = csf3->GlyphCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_Coverage( &csf3->Coverage[n] );
+
+ FREE( csf3->Coverage );
+ }
+ }
+
+
+ /* ContextSubst */
+
+ TT_Error Load_LookupContext( TTO_ContextSubst* cs,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ cs->SubstFormat = GET_UShort();
+
+ FORGET_Frame();
+
+ switch ( cs->SubstFormat )
+ {
+ case 1:
+ return Load_Context1( &cs->csf.csf1, input );
+ case 2:
+ return Load_Context2( &cs->csf.csf2, input );
+ case 3:
+ return Load_Context3( &cs->csf.csf3, input );
+ default:
+ return TTO_Err_Invalid_GSUB_SubTable_Format;
+ }
+
+ return TT_Err_Ok; /* never reached */
+ }
+
+
+ void Free_LookupContext( TTO_ContextSubst* cs )
+ {
+ switch ( cs->SubstFormat )
+ {
+ case 1:
+ Free_Context1( &cs->csf.csf1 );
+ break;
+ case 2:
+ Free_Context2( &cs->csf.csf2 );
+ break;
+ case 3:
+ Free_Context3( &cs->csf.csf3 );
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ /***********
+ * GSUB API
+ ***********/
+
+
+ TT_Error TT_GSUB_Select_Script( TTO_GSUBHeader* gsub,
+ TT_ULong script_tag,
+ TT_UShort* script_index )
+ {
+ UShort n;
+
+ TTO_ScriptList* sl = &gsub->ScriptList;
+ TTO_ScriptRecord* sr = sl->ScriptRecord;
+
+
+ for ( n = 0; n < sl->ScriptCount; n++ )
+ if ( script_tag == sr[n].ScriptTag )
+ {
+ *script_index = n;
+ return TT_Err_Ok;
+ }
+
+ return TTO_Err_Not_Covered;
+ }
+
+
+ TT_Error TT_GSUB_Select_Language( TTO_GSUBHeader* gsub,
+ TT_ULong language_tag,
+ TT_UShort script_index,
+ TT_UShort* language_index )
+ {
+ UShort n;
+
+ TTO_ScriptList* sl = &gsub->ScriptList;
+ TTO_ScriptRecord* sr = sl->ScriptRecord;
+ TTO_Script* s;
+ TTO_LangSysRecord* lsr;
+
+
+ if ( script_index >= sl->ScriptCount )
+ return TT_Err_Invalid_Argument;
+
+ s = &sr[script_index].Script;
+ lsr = s->LangSysRecord;
+
+ for ( n = 0; n < s->LangSysCount; n++ )
+ if ( language_tag == lsr[n].LangSysTag )
+ {
+ *language_index = n;
+ return TT_Err_Ok;
+ }
+
+ return TTO_Err_Not_Covered;
+ }
+
+
+ /* selecting 0xFFFF for language_index asks for the values of the
+ default language (DefaultLangSys) */
+
+ TT_Error TT_GSUB_Select_Feature( TTO_GSUBHeader* gsub,
+ TT_ULong feature_tag,
+ TT_UShort script_index,
+ TT_UShort language_index,
+ TT_UShort* feature_index )
+ {
+ UShort n;
+
+ TTO_ScriptList* sl = &gsub->ScriptList;
+ TTO_ScriptRecord* sr = sl->ScriptRecord;
+ TTO_Script* s;
+ TTO_LangSysRecord* lsr;
+ TTO_LangSys* ls;
+ UShort* fi;
+
+ TTO_FeatureList* fl = &gsub->FeatureList;
+ TTO_FeatureRecord* fr = fl->FeatureRecord;
+
+
+ if ( script_index >= sl->ScriptCount )
+ return TT_Err_Invalid_Argument;
+
+ s = &sr[script_index].Script;
+ lsr = s->LangSysRecord;
+
+ if ( language_index == 0xFFFF )
+ ls = &s->DefaultLangSys;
+ else
+ {
+ if ( language_index >= s->LangSysCount )
+ return TT_Err_Invalid_Argument;
+
+ ls = &lsr[language_index].LangSys;
+ }
+ fi = ls->FeatureIndex;
+
+ for ( n = 0; n < ls->FeatureCount; n++ )
+ {
+ if ( fi[n] >= fl->FeatureCount )
+ return TTO_Err_Invalid_GSUB_SubTable_Format;
+
+ if ( feature_tag == fr[fi[n]].FeatureTag )
+ {
+ *feature_index = n;
+ return TT_Err_Ok;
+ }
+ }
+
+ return TTO_Err_Not_Covered;
+ }
+
+
+ /* The next three functions return a null-terminated list */
+
+ TT_Error TT_GSUB_Query_Scripts( TTO_GSUBHeader* gsub,
+ TT_ULong** script_tag_list )
+ {
+ UShort n;
+ TT_Error error;
+ ULong* stl;
+
+ TTO_ScriptList* sl = &gsub->ScriptList;
+ TTO_ScriptRecord* sr = sl->ScriptRecord;
+
+
+ if ( ALLOC_ARRAY( stl, sl->ScriptCount + 1, TT_ULong ) )
+ return error;
+
+ for ( n = 0; n < sl->ScriptCount; n++ )
+ stl[n] = sr[n].ScriptTag;
+ stl[n] = 0;
+
+ *script_tag_list = stl;
+
+ return TT_Err_Ok;
+ }
+
+
+ TT_Error TT_GSUB_Query_Languages( TTO_GSUBHeader* gsub,
+ TT_UShort script_index,
+ TT_ULong** language_tag_list )
+ {
+ UShort n;
+ TT_Error error;
+ ULong* ltl;
+
+ TTO_ScriptList* sl = &gsub->ScriptList;
+ TTO_ScriptRecord* sr = sl->ScriptRecord;
+ TTO_Script* s;
+ TTO_LangSysRecord* lsr;
+
+
+ if ( script_index >= sl->ScriptCount )
+ return TT_Err_Invalid_Argument;
+
+ s = &sr[script_index].Script;
+ lsr = s->LangSysRecord;
+
+ if ( ALLOC_ARRAY( ltl, s->LangSysCount + 1, TT_ULong ) )
+ return error;
+
+ for ( n = 0; n < s->LangSysCount; n++ )
+ ltl[n] = lsr[n].LangSysTag;
+ ltl[n] = 0;
+
+ *language_tag_list = ltl;
+
+ return TT_Err_Ok;
+ }
+
+
+ /* selecting 0xFFFF for language_index asks for the values of the
+ default language (DefaultLangSys) */
+
+ TT_Error TT_GSUB_Query_Features( TTO_GSUBHeader* gsub,
+ TT_UShort script_index,
+ TT_UShort language_index,
+ TT_ULong** feature_tag_list )
+ {
+ UShort n;
+ TT_Error error;
+ ULong* ftl;
+
+ TTO_ScriptList* sl = &gsub->ScriptList;
+ TTO_ScriptRecord* sr = sl->ScriptRecord;
+ TTO_Script* s;
+ TTO_LangSysRecord* lsr;
+ TTO_LangSys* ls;
+ UShort* fi;
+
+ TTO_FeatureList* fl = &gsub->FeatureList;
+ TTO_FeatureRecord* fr = fl->FeatureRecord;
+
+
+ if ( script_index >= sl->ScriptCount )
+ return TT_Err_Invalid_Argument;
+
+ s = &sr[script_index].Script;
+ lsr = s->LangSysRecord;
+
+ if ( language_index == 0xFFFF )
+ ls = &s->DefaultLangSys;
+ else
+ {
+ if ( language_index >= s->LangSysCount )
+ return TT_Err_Invalid_Argument;
+
+ ls = &lsr[language_index].LangSys;
+ }
+ fi = ls->FeatureIndex;
+
+ if ( ALLOC_ARRAY( ftl, ls->FeatureCount + 1, TT_ULong ) )
+ return error;
+
+ for ( n = 0; n < ls->FeatureCount; n++ )
+ {
+ if ( fi[n] >= fl->FeatureCount )
+ {
+ FREE( ftl );
+ return TTO_Err_Invalid_GSUB_SubTable_Format;
+ }
+ ftl[n] = fr[fi[n]].FeatureTag;
+ }
+ ftl[n] = 0;
+
+ *feature_tag_list = ftl;
+
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxgsub.h b/xc/extras/FreeType/lib/extend/ftxgsub.h
new file mode 100644
index 000000000..26e65176b
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxgsub.h
@@ -0,0 +1,358 @@
+/*******************************************************************
+ *
+ * ftxgsub.h
+ *
+ * TrueType Open GSUB table support
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FTXOPEN_H
+#error "Don't include this file! Use ftxopen.h instead."
+#endif
+
+#ifndef FTXGSUB_H
+#define FTXGSUB_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TTO_Err_Invalid_GSUB_SubTable_Format 0x1010
+#define TTO_Err_Invalid_GSUB_SubTable 0x1011
+
+
+/* Lookup types for glyph substitution */
+
+#define LOOKUP_SINGLE 1
+#define LOOKUP_MULTIPLE 2
+#define LOOKUP_ALTERNATE 3
+#define LOOKUP_LIGATURE 4
+#define LOOKUP_CONTEXT 5
+
+
+ struct TTO_GSUBHeader_
+ {
+ TT_Bool loaded;
+ TT_ULong offset;
+
+ TT_Fixed Version;
+
+ TTO_ScriptList ScriptList;
+ TTO_FeatureList FeatureList;
+ TTO_LookupList LookupList;
+ };
+
+ typedef struct TTO_GSUBHeader_ TTO_GSUBHeader;
+
+
+ /* Lookup type 1 */
+
+ struct TTO_SingleSubstFormat1_
+ {
+ TT_Short DeltaGlyphID; /* constant added to get
+ substitution glyph index */
+ };
+
+ typedef struct TTO_SingleSubstFormat1_ TTO_SingleSubstFormat1;
+
+
+ struct TTO_SingleSubstFormat2_
+ {
+ TT_UShort GlyphCount; /* number of glyph IDs in
+ Substitute array */
+ TT_UShort* Substitute; /* array of substitute glyph IDs */
+ };
+
+ typedef struct TTO_SingleSubstFormat2_ TTO_SingleSubstFormat2;
+
+
+ struct TTO_SingleSubst_
+ {
+ TT_UShort SubstFormat; /* 1 or 2 */
+ TTO_Coverage Coverage; /* Coverage table */
+
+ union
+ {
+ TTO_SingleSubstFormat1 ssf1;
+ TTO_SingleSubstFormat2 ssf2;
+ } ssf;
+ };
+
+ typedef struct TTO_SingleSubst_ TTO_SingleSubst;
+
+
+ /* Lookup type 2 */
+
+ struct TTO_Sequence_
+ {
+ TT_UShort GlyphCount; /* number of glyph IDs in the
+ Substitute array */
+ TT_UShort* Substitute; /* string of glyph IDs to
+ substitute */
+ };
+
+ typedef struct TTO_Sequence_ TTO_Sequence;
+
+
+ struct TTO_MultipleSubst_
+ {
+ TT_UShort SubstFormat; /* always 1 */
+ TTO_Coverage Coverage; /* Coverage table */
+ TT_UShort SequenceCount; /* number of Sequence tables */
+ TTO_Sequence* Sequence; /* array of Sequence tables */
+ };
+
+ typedef struct TTO_MultipleSubst_ TTO_MultipleSubst;
+
+
+ /* Lookup type 3 */
+
+ struct TTO_AlternateSet_
+ {
+ TT_UShort GlyphCount; /* number of glyph IDs in the
+ Alternate array */
+ TT_UShort* Alternate; /* array of alternate glyph IDs */
+ };
+
+ typedef struct TTO_AlternateSet_ TTO_AlternateSet;
+
+
+ struct TTO_AlternateSubst_
+ {
+ TT_UShort SubstFormat; /* always 1 */
+ TTO_Coverage Coverage; /* Coverage table */
+ TT_UShort AlternateSetCount;
+ /* number of AlternateSet tables */
+ TTO_AlternateSet* AlternateSet; /* array of AlternateSet tables */
+ };
+
+ typedef struct TTO_AlternateSubst_ TTO_AlternateSubst;
+
+
+ /* Lookup type 4 */
+
+ struct TTO_Ligature_
+ {
+ TT_UShort LigGlyph; /* glyphID of ligature
+ to substitute */
+ TT_UShort ComponentCount; /* number of components in ligature */
+ TT_UShort* Component; /* array of component glyph IDs */
+ };
+
+ typedef struct TTO_Ligature_ TTO_Ligature;
+
+
+ struct TTO_LigatureSet_
+ {
+ TT_UShort LigatureCount; /* number of Ligature tables */
+ TTO_Ligature* Ligature; /* array of Ligature tables */
+ };
+
+ typedef struct TTO_LigatureSet_ TTO_LigatureSet;
+
+
+ struct TTO_LigatureSubst_
+ {
+ TT_UShort SubstFormat; /* always 1 */
+ TTO_Coverage Coverage; /* Coverage table */
+ TT_UShort LigatureSetCount; /* number of LigatureSet tables */
+ TTO_LigatureSet* LigatureSet; /* array of LigatureSet tables */
+ };
+
+ typedef struct TTO_LigatureSubst_ TTO_LigatureSubst;
+
+
+ /* Lookup type 5 */
+
+ struct TTO_SubstLookupRecord_
+ {
+ TT_UShort SequenceIndex; /* index into current
+ glyph sequence */
+ TT_UShort LookupListIndex; /* Lookup to apply to that pos. */
+ };
+
+ typedef struct TTO_SubstLookupRecord_ TTO_SubstLookupRecord;
+
+
+ struct TTO_SubRule_
+ {
+ TT_UShort GlyphCount; /* total number of input glyphs */
+ TT_UShort SubstCount; /* number of SubstLookupRecords */
+ TT_UShort* Input; /* array of input glyph IDs */
+ TTO_SubstLookupRecord* SubstLookupRecord;
+ /* array of SubstLookupRecords */
+ };
+
+ typedef struct TTO_SubRule_ TTO_SubRule;
+
+
+ struct TTO_SubRuleSet_
+ {
+ TT_UShort SubRuleCount; /* number of SubRule tables */
+ TTO_SubRule* SubRule; /* array of SubRule tables */
+ };
+
+ typedef struct TTO_SubRuleSet_ TTO_SubRuleSet;
+
+
+ struct TTO_ContextSubstFormat1_
+ {
+ TTO_Coverage Coverage; /* Coverage table */
+ TT_UShort SubRuleSetCount; /* number of SubRuleSet tables */
+ TTO_SubRuleSet* SubRuleSet; /* array of SubRuleSet tables */
+ };
+
+ typedef struct TTO_ContextSubstFormat1_ TTO_ContextSubstFormat1;
+
+
+ struct TTO_SubClassRule_
+ {
+ TT_UShort GlyphCount; /* total number of context classes */
+ TT_UShort SubstCount; /* number of SubstLookupRecords */
+ TT_UShort* Class; /* array of classes */
+ TTO_SubstLookupRecord* SubstLookupRecord;
+ /* array of substitution lookups */
+ };
+
+ typedef struct TTO_SubClassRule_ TTO_SubClassRule;
+
+
+ struct TTO_SubClassSet_
+ {
+ TT_UShort SubClassRuleCount;
+ /* number of SubClassRule tables */
+ TTO_SubClassRule* SubClassRule; /* array of SubClassRule tables */
+ };
+
+ typedef struct TTO_SubClassSet_ TTO_SubClassSet;
+
+
+ struct TTO_ContextSubstFormat2_
+ {
+ TTO_Coverage Coverage; /* Coverage table */
+ TTO_ClassDefinition ClassDef; /* ClassDef table */
+ TT_UShort SubClassSetCount;
+ /* number of SubClassSet tables */
+ TTO_SubClassSet* SubClassSet; /* array of SubClassSet tables */
+ };
+
+ typedef struct TTO_ContextSubstFormat2_ TTO_ContextSubstFormat2;
+
+
+ struct TTO_ContextSubstFormat3_
+ {
+ TT_UShort GlyphCount; /* number of input glyphs */
+ TT_UShort SubstCount; /* number of SubstLookupRecords */
+ TTO_Coverage* Coverage; /* array of Coverage tables */
+ TTO_SubstLookupRecord* SubstLookupRecord;
+ /* array of substitution lookups */
+ };
+
+ typedef struct TTO_ContextSubstFormat3_ TTO_ContextSubstFormat3;
+
+
+ struct TTO_ContextSubst_
+ {
+ TT_UShort SubstFormat; /* 1, 2, or 3 */
+
+ union
+ {
+ TTO_ContextSubstFormat1 csf1;
+ TTO_ContextSubstFormat2 csf2;
+ TTO_ContextSubstFormat3 csf3;
+ } csf;
+ };
+
+ typedef struct TTO_ContextSubst_ TTO_ContextSubst;
+
+
+ union TTO_GSUB_SubTable_
+ {
+ TTO_SingleSubst single;
+ TTO_MultipleSubst multiple;
+ TTO_AlternateSubst alternate;
+ TTO_LigatureSubst ligature;
+ TTO_ContextSubst context;
+ };
+
+ typedef union TTO_GSUB_SubTable_ TTO_GSUB_SubTable;
+
+
+ /* A simple string object. It can both `send' and `receive' data.
+ In case of sending, `length' and `pos' will be used. In case of
+ receiving, `pos' points to the latest glyph, and `allocated'
+ specifies the amount of allocated memory (and the `length' field
+ will be ignored). The routine Add_String() will increase the
+ amount of memory if necessary. After end of receive, `length'
+ will be set to the value of `pos', and `pos' will be set to zero.
+
+ As a consequence, NEVER modify any elements of the structure!
+ You should rather copy its contents if necessary.
+
+ Add_String() will also handle allocation; you should use free()
+ in case you want to destroy this object. */
+
+ struct TTO_String_
+ {
+ TT_ULong length;
+ TT_ULong pos;
+ TT_ULong allocated;
+ TT_UShort* string;
+ };
+
+ typedef struct TTO_String_ TTO_String;
+
+
+ /* finally, the GSUB API */
+
+ TT_Error TT_Init_GSUB_Extension( TT_Engine engine );
+ TT_Error TT_Load_GSUB_Table( TT_Face face,
+ TTO_GSUBHeader* gsub );
+
+ TT_Error TT_GSUB_Select_Script( TTO_GSUBHeader* gsub,
+ TT_ULong script_tag,
+ TT_UShort* script_index );
+ TT_Error TT_GSUB_Select_Language( TTO_GSUBHeader* gsub,
+ TT_ULong language_tag,
+ TT_UShort script_index,
+ TT_UShort* language_index );
+ TT_Error TT_GSUB_Select_Feature( TTO_GSUBHeader* gsub,
+ TT_ULong feature_tag,
+ TT_UShort script_index,
+ TT_UShort language_index,
+ TT_UShort* feature_index );
+
+ TT_Error TT_GSUB_Query_Scripts( TTO_GSUBHeader* gsub,
+ TT_ULong** script_tag_list );
+ TT_Error TT_GSUB_Query_Languages( TTO_GSUBHeader* gsub,
+ TT_UShort script_index,
+ TT_ULong** language_tag_list );
+ TT_Error TT_GSUB_Query_Features( TTO_GSUBHeader* gsub,
+ TT_UShort script_index,
+ TT_UShort language_index,
+ TT_ULong** feature_tag_list );
+
+ TT_Error TT_GSUB_Apply( TTO_GSUBHeader* gsub,
+ TT_UShort script_index,
+ TT_UShort language_index,
+ TT_UShort feature_index,
+ TTO_String* in,
+ TTO_String* out );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXGSUB_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxkern.c b/xc/extras/FreeType/lib/extend/ftxkern.c
new file mode 100644
index 000000000..7836591bb
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxkern.c
@@ -0,0 +1,558 @@
+/*******************************************************************
+ *
+ * ftxkern.c 1.0
+ *
+ * Kerning support extension.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * The kerning support is currently part of the engine extensions.
+ *
+ ******************************************************************/
+
+#include "ftxkern.h"
+
+#include "ttextend.h"
+#include "tttypes.h"
+#include "ttdebug.h"
+#include "ttmemory.h"
+#include "ttfile.h"
+#include "ttobjs.h"
+#include "ttload.h" /* For the macros */
+#include "tttags.h"
+
+/* Required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_any
+
+#define KERNING_ID Build_Extension_ID( 'k', 'e', 'r', 'n' )
+
+
+/*******************************************************************
+ *
+ * Function : SubTable_Load_0
+ *
+ * Description : Loads a format 0 kerning subtable data.
+ *
+ * Input : kern0 pointer to the kerning subtable
+ *
+ * Output : error code
+ *
+ * Notes : - Assumes that the stream is already 'used'
+ *
+ * - the file cursor must be set by the caller
+ *
+ * - in case of error, the function _must_ destroy
+ * the data it allocates!
+ *
+ ******************************************************************/
+
+ static TT_Error Subtable_Load_0( TT_Kern_0* kern0,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort num_pairs, n;
+
+
+ if ( ACCESS_Frame( 8L ) )
+ return error;
+
+ num_pairs = GET_UShort();
+ kern0->nPairs = 0;
+ kern0->searchRange = GET_UShort();
+ kern0->entrySelector = GET_UShort();
+ kern0->rangeShift = GET_UShort();
+
+ /* we only set kern0->nPairs when the subtable has been loaded */
+
+ FORGET_Frame();
+
+ if ( ALLOC_ARRAY( kern0->pairs, num_pairs, TT_Kern_0_Pair ) )
+ return error;
+
+ if ( ACCESS_Frame( num_pairs * 6L ) )
+ goto Fail;
+
+ for ( n = 0; n < num_pairs; n++ )
+ {
+ kern0->pairs[n].left = GET_UShort();
+ kern0->pairs[n].right = GET_UShort();
+ kern0->pairs[n].value = GET_UShort();
+
+ if ( kern0->pairs[n].left >= input->numGlyphs ||
+ kern0->pairs[n].right >= input->numGlyphs )
+ {
+ FORGET_Frame();
+ error = TT_Err_Invalid_Kerning_Table;
+ goto Fail;
+ }
+ }
+
+ FORGET_Frame();
+
+ /* we're ok, set the pairs count */
+ kern0->nPairs = num_pairs;
+
+ return TT_Err_Ok;
+
+ Fail:
+ FREE( kern0->pairs );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : SubTable_Load_2
+ *
+ * Description : Loads a format 2 kerning subtable data.
+ *
+ * Input : kern2 pointer to the kerning subtable
+ * length subtable length. This is required as
+ * the subheader doesn't give any indication
+ * of the size of the 'array' table.
+ *
+ * Output : error code
+ *
+ * Notes : - Assumes that the stream is already 'used'
+ *
+ * - the file cursor must be set by the caller
+ *
+ * - in case of error, the function _must_ destroy
+ * the data it allocates!
+ *
+ ******************************************************************/
+
+ static TT_Error Subtable_Load_2( TT_Kern_2* kern2,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ Long table_base;
+
+ UShort left_offset, right_offset, array_offset;
+ ULong array_size;
+ UShort left_max, right_max, n;
+
+
+ /* record the table offset */
+ table_base = FILE_Pos();
+
+ if ( ACCESS_Frame( 8L ) )
+ return error;
+
+ kern2->rowWidth = GET_UShort();
+ left_offset = GET_UShort();
+ right_offset = GET_UShort();
+ array_offset = GET_UShort();
+
+ FORGET_Frame();
+
+ /* first load left and right glyph classes */
+
+ if ( FILE_Seek( table_base + left_offset ) ||
+ ACCESS_Frame( 4L ) )
+ return error;
+
+ kern2->leftClass.firstGlyph = GET_UShort();
+ kern2->leftClass.nGlyphs = GET_UShort();
+
+ FORGET_Frame();
+
+ if ( ALLOC_ARRAY( kern2->leftClass.classes,
+ kern2->leftClass.nGlyphs,
+ UShort ) )
+ return error;
+
+ /* load left offsets */
+
+ if ( ACCESS_Frame( kern2->leftClass.nGlyphs * 2L ) )
+ goto Fail_Left;
+
+ for ( n = 0; n < kern2->leftClass.nGlyphs; n++ )
+ kern2->leftClass.classes[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ /* right class */
+
+ if ( FILE_Seek( table_base + right_offset ) ||
+ ACCESS_Frame( 4L ) )
+ goto Fail_Left;
+
+ kern2->rightClass.firstGlyph = GET_UShort();
+ kern2->rightClass.nGlyphs = GET_UShort();
+
+ FORGET_Frame();
+
+ if ( ALLOC_ARRAY( kern2->rightClass.classes,
+ kern2->rightClass.nGlyphs,
+ UShort ) )
+ goto Fail_Left;
+
+ /* load right offsets */
+
+ if ( ACCESS_Frame( kern2->rightClass.nGlyphs * 2L ) )
+ goto Fail_Right;
+
+ for ( n = 0; n < kern2->rightClass.nGlyphs; n++ )
+ kern2->rightClass.classes[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ /* Now load the kerning array. We don't have its size, we */
+ /* must compute it from what we know. */
+
+ /* We thus compute the maximum left and right offsets and */
+ /* add them to get the array size. */
+
+ left_max = right_max = 0;
+
+ for ( n = 0; n < kern2->leftClass.nGlyphs; n++ )
+ left_max = MAX( left_max, kern2->leftClass.classes[n] );
+
+ for ( n = 0; n < kern2->rightClass.nGlyphs; n++ )
+ right_max = MAX( right_max, kern2->leftClass.classes[n] );
+
+ array_size = left_max + right_max + 2;
+
+ if ( ALLOC( kern2->array, array_size ) )
+ goto Fail_Right;
+
+ if ( ACCESS_Frame( array_size ) )
+ goto Fail_Array;
+
+ for ( n = 0; n < array_size/2; n++ )
+ kern2->array[n] = GET_Short();
+
+ FORGET_Frame();
+
+ /* we're good now */
+
+ return TT_Err_Ok;
+
+ Fail_Array:
+ FREE( kern2->array );
+
+ Fail_Right:
+ FREE( kern2->rightClass.classes );
+ kern2->rightClass.nGlyphs = 0;
+
+ Fail_Left:
+ FREE( kern2->leftClass.classes );
+ kern2->leftClass.nGlyphs = 0;
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Kerning_Create
+ *
+ * Description : Creates the kerning directory when a face is
+ * loaded. The tables however are loaded on
+ * demand to save space.
+ *
+ * Input : face pointeur to the parent face object
+ * kern pointeur to the extension's kerning field
+ *
+ * Output : error code
+ *
+ * Notes : as in all constructors, the memory allocated isn't
+ * released in case of failure. Rather, the task is left
+ * to the destructor (which is called when an error
+ * occurs during the loading of a face).
+ *
+ ******************************************************************/
+
+ static TT_Error Kerning_Create( void* ext,
+ PFace face )
+ {
+ DEFINE_LOAD_LOCALS( face->stream );
+
+ TT_Kerning* kern = (TT_Kerning*)ext;
+ UShort num_tables;
+ Long table;
+
+ TT_Kern_Subtable* sub;
+
+
+ /* by convention */
+ if ( !kern )
+ return TT_Err_Ok;
+
+ /* Now load the kerning directory. We're called from the face */
+ /* constructor. We thus need not use the stream. */
+
+ kern->version = 0;
+ kern->nTables = 0;
+ kern->tables = NULL;
+
+ table = TT_LookUp_Table( face, TTAG_kern );
+ if ( table < 0 )
+ return TT_Err_Ok; /* The table is optional */
+
+ if ( FILE_Seek( face->dirTables[table].Offset ) ||
+ ACCESS_Frame( 4L ) )
+ return error;
+
+ kern->version = GET_UShort();
+ num_tables = GET_UShort();
+
+ FORGET_Frame();
+
+ /* we don't set kern->nTables until we have allocated the array */
+
+ if ( ALLOC_ARRAY( kern->tables, num_tables, TT_Kern_Subtable ) )
+ return error;
+
+ kern->nTables = num_tables;
+
+ /* now load the directory entries, but do _not_ load the tables ! */
+
+ sub = kern->tables;
+
+ for ( table = 0; table < num_tables; table++ )
+ {
+ if ( ACCESS_Frame( 6L ) )
+ return error;
+
+ sub->loaded = FALSE; /* redundant, but good to see */
+ sub->version = GET_UShort();
+ sub->length = GET_UShort() - 6; /* substract header length */
+ sub->format = GET_Byte();
+ sub->coverage = GET_Byte();
+
+ FORGET_Frame();
+
+ sub->offset = FILE_Pos();
+
+ /* now skip to the next table */
+
+ if ( FILE_Skip( sub->length ) )
+ return error;
+
+ sub++;
+ }
+
+ /* that's fine, leave now */
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Kerning_Destroy
+ *
+ * Description : Destroys all kerning information.
+ *
+ * Input : kern pointer to the extension's kerning field
+ *
+ * Output : error code
+ *
+ * Notes : This function is a destructor; it must be able
+ * to destroy partially built tables.
+ *
+ ******************************************************************/
+
+ static TT_Error Kerning_Destroy( void* ext,
+ PFace face )
+ {
+ TT_Kerning* kern = (TT_Kerning*)ext;
+ TT_Kern_Subtable* sub;
+ UShort n;
+
+
+ /* by convention */
+ if ( !kern )
+ return TT_Err_Ok;
+
+ if ( kern->nTables == 0 )
+ return TT_Err_Ok; /* no tables to release */
+
+ /* scan the table directory and release loaded entries */
+
+ sub = kern->tables;
+ for ( n = 0; n < kern->nTables; n++ )
+ {
+ if ( sub->loaded )
+ {
+ switch ( sub->format )
+ {
+ case 0:
+ FREE( sub->t.kern0.pairs );
+ sub->t.kern0.nPairs = 0;
+ sub->t.kern0.searchRange = 0;
+ sub->t.kern0.entrySelector = 0;
+ sub->t.kern0.rangeShift = 0;
+ break;
+
+ case 2:
+ FREE( sub->t.kern2.leftClass.classes );
+ sub->t.kern2.leftClass.firstGlyph = 0;
+ sub->t.kern2.leftClass.nGlyphs = 0;
+
+ FREE( sub->t.kern2.rightClass.classes );
+ sub->t.kern2.rightClass.firstGlyph = 0;
+ sub->t.kern2.rightClass.nGlyphs = 0;
+
+ FREE( sub->t.kern2.array );
+ sub->t.kern2.rowWidth = 0;
+ break;
+
+ default:
+ ; /* invalid subtable format - do nothing */
+ }
+
+ sub->loaded = FALSE;
+ sub->version = 0;
+ sub->offset = 0;
+ sub->length = 0;
+ sub->coverage = 0;
+ sub->format = 0;
+ }
+ sub++;
+ }
+
+ FREE( kern->tables );
+ kern->nTables = 0;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Kerning_Directory
+ *
+ * Description : Returns a given face's kerning directory.
+ *
+ * Input : face handle to the face object
+ * directory pointer to client's target directory
+ *
+ * Output : error code
+ *
+ * Notes : The kerning table directory is loaded with the face
+ * through the extension constructor. However, the kerning
+ * tables themselves are only loaded on demand, as they
+ * may represent a lot of data, unneeded by most uses of
+ * the engine.
+ *
+ ******************************************************************/
+
+ TT_Error TT_Get_Kerning_Directory( TT_Face face,
+ TT_Kerning* directory )
+ {
+ PFace faze = HANDLE_Face( face );
+ TT_Error error;
+ TT_Kerning* kerning;
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ /* copy directory header */
+ error = TT_Extension_Get( faze, KERNING_ID, (void**)&kerning );
+ if ( !error )
+ *directory = *kerning;
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Load_Kerning_Table
+ *
+ * Description : Loads a kerning table intro memory.
+ *
+ * Input : face face handle
+ * kern_index index in the face's kerning directory
+ *
+ * Output : error code
+ *
+ * Notes :
+ *
+ ******************************************************************/
+
+ TT_Error TT_Load_Kerning_Table( TT_Face face,
+ TT_UShort kern_index )
+ {
+ TT_Error error;
+ TT_Stream stream;
+
+ TT_Kerning* kern;
+ TT_Kern_Subtable* sub;
+
+
+ PFace faze = HANDLE_Face( face );
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ error = TT_Extension_Get( faze, KERNING_ID, (void**)&kern );
+ if ( error )
+ return error;
+
+ if ( kern_index >= kern->nTables )
+ return TT_Err_Bad_Argument;
+
+ sub = kern->tables + kern_index;
+
+ if ( sub->format != 0 && sub->format != 2 )
+ return TT_Err_Invalid_Kerning_Table_Format;
+
+ /* now access stream */
+ if ( USE_Stream( faze->stream, stream ) )
+ return error;
+
+ if ( FILE_Seek( sub->offset ) )
+ goto Fail;
+
+ if ( sub->format == 0 )
+ error = Subtable_Load_0( &sub->t.kern0, faze );
+ else if ( sub->format == 2 )
+ error = Subtable_Load_2( &sub->t.kern2, faze );
+
+ if ( !error )
+ sub->loaded = TRUE;
+
+ Fail:
+ /* release stream */
+ DONE_Stream( stream );
+
+ return error;
+ }
+
+
+ TT_Error TT_Init_Kerning_Extension( TT_Engine engine )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+
+ TT_Error error;
+
+
+ if ( !_engine )
+ return TT_Err_Invalid_Engine;
+
+ error = TT_Register_Extension( _engine,
+ KERNING_ID,
+ sizeof ( TT_Kerning ),
+ Kerning_Create,
+ Kerning_Destroy );
+ return error;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxkern.h b/xc/extras/FreeType/lib/extend/ftxkern.h
new file mode 100644
index 000000000..e07e1f6c0
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxkern.h
@@ -0,0 +1,179 @@
+/*******************************************************************
+ *
+ * ftxkern.h 1.0
+ *
+ * High-Level API Kerning extension
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * The kerning support is currently part of the engine extensions.
+ *
+ * This file should _not_ depend on engine internal types.
+ *
+ ******************************************************************/
+
+#ifndef FTXKERN_H
+#define FTXKERN_H
+
+#include "freetype.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* The kerning support in FreeType is minimal. This means that */
+ /* we do not try to interpret the kerning data in any way to */
+ /* 'cook' it for a user application. This API lets you access */
+ /* directly the kerning tables found in the TrueType file; it's */
+ /* up to the client application to apply its own processing on */
+ /* these. */
+
+ /* The reason for this is that we generally do not encourage */
+ /* feature-bloat of the core engine. Moreover, not all */
+ /* libraries or font servers really need kerning data, or all */
+ /* formats of this data. */
+
+ /************** kerning error codes *****************************/
+
+ /* we choose the class 0x0A for our errors, this should not */
+ /* match with any error code class used in any other extension */
+
+#define TT_Err_Invalid_Kerning_Table_Format 0x0A00
+#define TT_Err_Invalid_Kerning_Table 0x0A01
+
+
+ /********** structures definitions ******************************/
+
+ /* Remember that all types and function are accessible by client */
+ /* applications in this section, and thus should have the 'TT_' */
+ /* prefix. */
+
+ /* format 0 kerning pair */
+
+ struct TT_Kern_0_Pair_
+ {
+ TT_UShort left; /* index of left glyph in pair */
+ TT_UShort right; /* index of right glyph in pair */
+ TT_FWord value; /* kerning value */
+ };
+
+ typedef struct TT_Kern_0_Pair_ TT_Kern_0_Pair;
+
+
+ /* format 0 kerning subtable */
+
+ struct TT_Kern_0_
+ {
+ TT_UShort nPairs; /* number of kerning pairs */
+
+ TT_UShort searchRange; /* these values are defined by the TT spec */
+ TT_UShort entrySelector; /* for table searchs. */
+ TT_UShort rangeShift;
+
+ TT_Kern_0_Pair* pairs; /* a table of nPairs 'pairs' */
+ };
+
+ typedef struct TT_Kern_0_ TT_Kern_0;
+
+
+ /* format 2 kerning glyph class */
+
+ struct TT_Kern_2_Class_
+ {
+ TT_UShort firstGlyph; /* first glyph in range */
+ TT_UShort nGlyphs; /* number of glyphs in range */
+ TT_UShort* classes; /* a table giving for each ranged glyph */
+ /* it's class offset in the subtable pairs */
+ /* two-dimensional array */
+ };
+
+ typedef struct TT_Kern_2_Class_ TT_Kern_2_Class;
+
+
+ /* format 2 kerning subtable */
+
+ struct TT_Kern_2_
+ {
+ TT_UShort rowWidth; /* length of one row in bytes */
+ TT_Kern_2_Class leftClass; /* left class table */
+ TT_Kern_2_Class rightClass; /* right class table */
+ TT_FWord* array; /* 2-dimensional kerning values array */
+ };
+
+ typedef struct TT_Kern_2_ TT_Kern_2;
+
+
+ /* kerning subtable */
+
+ struct TT_Kern_Subtable_
+ {
+ TT_Bool loaded; /* boolean; indicates whether the table is */
+ /* loaded */
+ TT_UShort version; /* table version number */
+ TT_Long offset; /* file offset of table */
+ TT_UShort length; /* length of table, _excluding_ header */
+ TT_Byte coverage; /* lower 8 bit of the coverage table entry */
+ TT_Byte format; /* the subtable format, as found in the */
+ /* higher 8 bits of the coverage table entry */
+ union
+ {
+ TT_Kern_0 kern0;
+ TT_Kern_2 kern2;
+ } t;
+ };
+
+ typedef struct TT_Kern_Subtable_ TT_Kern_Subtable;
+
+
+ struct TT_Kerning_
+ {
+ TT_UShort version; /* kern table version number. starts at 0 */
+ TT_UShort nTables; /* number of tables */
+
+ TT_Kern_Subtable* tables; /* the kerning sub-tables */
+ };
+
+ typedef struct TT_Kerning_ TT_Kerning;
+
+
+
+ /***************** high-level API extension **************************/
+
+ /* Initialize Kerning extension, must be called after */
+ /* TT_Init_FreeType(). There is no need for a finaliser */
+
+ TT_Error TT_Init_Kerning_Extension( TT_Engine engine );
+
+ /* Note on the implemented mechanism: */
+
+ /* The kerning table directory is loaded with the face through the */
+ /* extension constructor. However, the tables will only be loaded */
+ /* on demand, as they may represent a lot of data, unnecessary to */
+ /* most applications. */
+
+ /* Queries a pointer to the kerning directory for the face object */
+ TT_Error TT_Get_Kerning_Directory( TT_Face face,
+ TT_Kerning* directory );
+
+ /* Load the kerning table number 'kern_index' in the kerning */
+ /* directory. The table will stay in memory until the 'face' */
+ /* face is destroyed. */
+ TT_Error TT_Load_Kerning_Table( TT_Face face,
+ TT_UShort kern_index );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXKERN_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxopen.c b/xc/extras/FreeType/lib/extend/ftxopen.c
new file mode 100644
index 000000000..ec107c9e2
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxopen.c
@@ -0,0 +1,1078 @@
+/*******************************************************************
+ *
+ * ftxopen.c
+ *
+ * TrueType Open common table support.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "tttypes.h"
+#include "ttload.h"
+#include "ttextend.h"
+#include "ttmemory.h"
+#include "ttfile.h"
+
+#include "ftxopen.h"
+#include "ftxopenf.h"
+
+
+ /***************************
+ * Script related functions
+ ***************************/
+
+
+ /* LangSys */
+
+ static TT_Error Load_LangSys( TTO_LangSys* ls,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* fi;
+
+
+ if ( ACCESS_Frame( 6L ) )
+ return error;
+
+ ls->LookupOrderOffset = GET_UShort(); /* should be 0 */
+ ls->ReqFeatureIndex = GET_UShort();
+ count = ls->FeatureCount = GET_UShort();
+
+ FORGET_Frame();
+
+ ls->FeatureIndex = NULL;
+
+ if ( ALLOC_ARRAY( ls->FeatureIndex, count, TT_UShort ) )
+ return error;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ fi = ls->FeatureIndex;
+
+ for ( n = 0; n < count; n++ )
+ fi[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_LangSys( TTO_LangSys* ls )
+ {
+ if ( ls->FeatureIndex )
+ FREE( ls->FeatureIndex );
+ }
+
+
+ /* Script */
+
+ static TT_Error Load_Script( TTO_Script* s,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_LangSysRecord* lsr;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ if ( new_offset != base_offset ) /* not a NULL offset */
+ {
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_LangSys( &s->DefaultLangSys,
+ input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+ else
+ {
+ /* we create a DefaultLangSys table with no entries */
+
+ s->DefaultLangSys.LookupOrderOffset = 0;
+ s->DefaultLangSys.ReqFeatureIndex = 0xFFFF;
+ s->DefaultLangSys.FeatureCount = 0;
+ s->DefaultLangSys.FeatureIndex = NULL;
+ }
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = s->LangSysCount = GET_UShort();
+
+ FORGET_Frame();
+
+ s->LangSysRecord = NULL;
+
+ if ( ALLOC_ARRAY( s->LangSysRecord, count, TTO_LangSysRecord ) )
+ return error;
+
+ lsr = s->LangSysRecord;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 6L ) )
+ return error;
+
+ lsr[n].LangSysTag = GET_ULong();
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_LangSys( &lsr[n].LangSys, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Script( TTO_Script* s )
+ {
+ UShort n, count;
+
+
+ Free_LangSys( &s->DefaultLangSys );
+
+ if ( s->LangSysRecord )
+ {
+ count = s->LangSysCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_LangSys( &s->LangSysRecord[n].LangSys );
+
+ FREE( s->LangSysRecord );
+ }
+ }
+
+
+ /* ScriptList */
+
+ TT_Error Load_ScriptList( TTO_ScriptList* sl,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_ScriptRecord* sr;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ /* get real offset */
+
+ base_offset = FILE_Pos() + GET_UShort() - 6L;
+
+ FORGET_Frame();
+
+ if ( FILE_Seek ( base_offset ) ||
+ ACCESS_Frame( 2L ) )
+ return error;
+
+ count = sl->ScriptCount = GET_UShort();
+
+ FORGET_Frame();
+
+ sl->ScriptRecord = NULL;
+
+ if ( ALLOC_ARRAY( sl->ScriptRecord, count, TTO_ScriptRecord ) )
+ return error;
+
+ sr = sl->ScriptRecord;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 6L ) )
+ return error;
+
+ sr[n].ScriptTag = GET_ULong();
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Script( &sr[n].Script, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ void Free_ScriptList( TTO_ScriptList* sl )
+ {
+ UShort n, count;
+
+
+ if ( sl->ScriptRecord )
+ {
+ count = sl->ScriptCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_Script( &sl->ScriptRecord[n].Script );
+
+ FREE( sl->ScriptRecord );
+ }
+ }
+
+
+
+ /*********************************
+ * Feature List related functions
+ *********************************/
+
+
+ /* Feature */
+
+ static TT_Error Load_Feature( TTO_Feature* f,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* lli;
+
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ f->FeatureParams = GET_UShort(); /* should be 0 */
+ count = f->LookupListCount = GET_UShort();
+
+ FORGET_Frame();
+
+ f->LookupListIndex = NULL;
+
+ if ( ALLOC_ARRAY( f->LookupListIndex, count, TT_UShort ) )
+ return error;
+
+ lli = f->LookupListIndex;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ lli[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Feature( TTO_Feature* f )
+ {
+ if ( f->LookupListIndex )
+ FREE( f->LookupListIndex );
+ }
+
+
+ /* FeatureList */
+
+ TT_Error Load_FeatureList( TTO_FeatureList* fl,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_FeatureRecord* fr;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ /* get real offset */
+
+ base_offset = FILE_Pos() + GET_UShort() - 8L;
+
+ FORGET_Frame();
+
+ if ( FILE_Seek( base_offset ) ||
+ ACCESS_Frame( 2L ) )
+ return error;
+
+ count = fl->FeatureCount = GET_UShort();
+
+ FORGET_Frame();
+
+ fl->FeatureRecord = NULL;
+
+ if ( ALLOC_ARRAY( fl->FeatureRecord, count, TTO_FeatureRecord ) )
+ return error;
+
+ fr = fl->FeatureRecord;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 6L ) )
+ return error;
+
+ fr[n].FeatureTag = GET_ULong();
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Feature( &fr[n].Feature, input ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ void Free_FeatureList( TTO_FeatureList* fl )
+ {
+ UShort n, count;
+
+
+ if ( fl->FeatureRecord )
+ {
+ count = fl->FeatureCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_Feature( &fl->FeatureRecord[n].Feature );
+
+ FREE( fl->FeatureRecord );
+ }
+ }
+
+
+
+ /********************************
+ * Lookup List related functions
+ ********************************/
+
+ /* the subroutines of the following two functions are defined in
+ ftxgsub.c and ftxgpos.c */
+
+
+ /* SubTable */
+
+ static TT_Error Load_SubTable( TTO_SubTable* st,
+ PFace input,
+ TTO_Type table_type,
+ UShort lookup_type )
+ {
+ if ( table_type == GSUB )
+ switch ( lookup_type )
+ {
+ case LOOKUP_SINGLE:
+ return Load_LookupSingle( &st->st.gsub.single, input );
+ case LOOKUP_MULTIPLE:
+ return Load_LookupMultiple( &st->st.gsub.multiple, input );
+ case LOOKUP_ALTERNATE:
+ return Load_LookupAlternate( &st->st.gsub.alternate, input );
+ case LOOKUP_LIGATURE:
+ return Load_LookupLigature( &st->st.gsub.ligature, input );
+ case LOOKUP_CONTEXT:
+ return Load_LookupContext( &st->st.gsub.context, input );
+ default:
+ return TTO_Err_Invalid_GSUB_SubTable_Format;
+ }
+ else
+ ; /* not implemented yet */
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_SubTable( TTO_SubTable* st,
+ TTO_Type table_type,
+ UShort lookup_type )
+ {
+ if ( table_type == GSUB )
+ switch ( lookup_type )
+ {
+ case LOOKUP_SINGLE:
+ Free_LookupSingle( &st->st.gsub.single );
+ break;
+ case LOOKUP_MULTIPLE:
+ Free_LookupMultiple( &st->st.gsub.multiple );
+ break;
+ case LOOKUP_ALTERNATE:
+ Free_LookupAlternate( &st->st.gsub.alternate );
+ break;
+ case LOOKUP_LIGATURE:
+ Free_LookupLigature( &st->st.gsub.ligature );
+ break;
+ case LOOKUP_CONTEXT:
+ Free_LookupContext( &st->st.gsub.context );
+ break;
+ default:
+ break;
+ }
+ else
+ ; /* not implemented yet */
+ }
+
+
+ /* Lookup */
+
+ static TT_Error Load_Lookup( TTO_Lookup* l,
+ PFace input,
+ TTO_Type type )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_SubTable* st;
+
+
+ base_offset = FILE_Pos();
+
+ if ( ACCESS_Frame( 6L ) )
+ return error;
+
+ l->LookupType = GET_UShort();
+ l->LookupFlag = GET_UShort();
+ count = l->SubTableCount = GET_UShort();
+
+ FORGET_Frame();
+
+ l->SubTable = NULL;
+
+ if ( ALLOC_ARRAY( l->SubTable, count, TTO_SubTable ) )
+ return error;
+
+ st = l->SubTable;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_SubTable( &st[n], input,
+ type, l->LookupType ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Lookup( TTO_Lookup* l,
+ TTO_Type type )
+ {
+ UShort n, count;
+
+
+ if ( l->SubTable )
+ {
+ count = l->SubTableCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_SubTable( &l->SubTable[n], type, l->LookupType );
+
+ FREE( l->SubTable );
+ }
+ }
+
+
+ /* LookupList */
+
+ TT_Error Load_LookupList( TTO_LookupList* ll,
+ PFace input,
+ TTO_Type type )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ ULong cur_offset, new_offset, base_offset;
+
+ TTO_Lookup* l;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ /* get real offset */
+
+ base_offset = FILE_Pos() + GET_UShort() - 10L;
+
+ FORGET_Frame();
+
+ if ( FILE_Seek( base_offset ) ||
+ ACCESS_Frame( 2L ) )
+ return error;
+
+ count = ll->LookupCount = GET_UShort();
+
+ FORGET_Frame();
+
+ ll->Lookup = NULL;
+
+ if ( ALLOC_ARRAY( ll->Lookup, count, TTO_Lookup ) )
+ return error;
+
+ l = ll->Lookup;
+
+ for ( n = 0; n < count; n++ )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ new_offset = GET_UShort() + base_offset;
+
+ FORGET_Frame();
+
+ cur_offset = FILE_Pos();
+ if ( FILE_Seek( new_offset ) ||
+ ( error = Load_Lookup( &l[n], input, type ) ) != TT_Err_Ok )
+ return error;
+ (void)FILE_Seek( cur_offset );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ void Free_LookupList( TTO_LookupList* ll,
+ TTO_Type type )
+ {
+ UShort n, count;
+
+
+ if ( ll->Lookup )
+ {
+ count = ll->LookupCount;
+
+ for ( n = 0; n < count; n++ )
+ Free_Lookup( &ll->Lookup[n], type );
+
+ FREE( ll->Lookup );
+ }
+ }
+
+
+
+ /*****************************
+ * Coverage related functions
+ *****************************/
+
+
+ /* CoverageFormat1 */
+
+ static TT_Error Load_Coverage1( TTO_CoverageFormat1* cf1,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ UShort* ga;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = cf1->GlyphCount = GET_UShort();
+
+ FORGET_Frame();
+
+ cf1->GlyphArray = NULL;
+
+ if ( ALLOC_ARRAY( cf1->GlyphArray, count, TT_UShort ) )
+ return error;
+
+ ga = cf1->GlyphArray;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ ga[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Coverage1( TTO_CoverageFormat1* cf1 )
+ {
+ if ( cf1->GlyphArray )
+ FREE( cf1->GlyphArray );
+ }
+
+
+ /* CoverageFormat2 */
+
+ static TT_Error Load_Coverage2( TTO_CoverageFormat2* cf2,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+ TTO_RangeRecord* rr;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = cf2->RangeCount = GET_UShort();
+
+ FORGET_Frame();
+
+ cf2->RangeRecord = NULL;
+
+ if ( ALLOC_ARRAY( cf2->RangeRecord, count, TTO_RangeRecord ) )
+ return error;
+
+ rr = cf2->RangeRecord;
+
+ if ( ACCESS_Frame( count * 6L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ {
+ rr[n].Start = GET_UShort();
+ rr[n].End = GET_UShort();
+ rr[n].StartCoverageIndex = GET_UShort();
+
+ /* sanity check; we are working with 16bit integers */
+ if ( rr[n].Start > rr[n].End ||
+ ( rr[n].End - rr[n].Start + rr[n].StartCoverageIndex ) <
+ rr[n].StartCoverageIndex )
+ return TTO_Err_Invalid_SubTable;
+ }
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_Coverage2( TTO_CoverageFormat2* cf2 )
+ {
+ if ( cf2->RangeRecord )
+ FREE( cf2->RangeRecord );
+ }
+
+
+ TT_Error Load_Coverage( TTO_Coverage* c,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ c->CoverageFormat = GET_UShort();
+
+ FORGET_Frame();
+
+ switch ( c->CoverageFormat )
+ {
+ case 1:
+ return Load_Coverage1( &c->cf.cf1, input );
+ case 2:
+ return Load_Coverage2( &c->cf.cf2, input );
+ default:
+ return TTO_Err_Invalid_SubTable_Format;
+ }
+
+ return TT_Err_Ok; /* never reached */
+ }
+
+
+ void Free_Coverage( TTO_Coverage* c )
+ {
+ switch ( c->CoverageFormat )
+ {
+ case 1:
+ Free_Coverage1( &c->cf.cf1 );
+ break;
+ case 2:
+ Free_Coverage2( &c->cf.cf2 );
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ static TT_Error Coverage_Index1( TTO_CoverageFormat1* cf1,
+ UShort glyphID,
+ UShort* index )
+ {
+ UShort min, max, new_min, new_max, middle;
+
+ UShort* array = cf1->GlyphArray;
+
+
+ /* binary search */
+
+ new_min = 0;
+ new_max = cf1->GlyphCount - 1;
+
+ do
+ {
+ min = new_min;
+ max = new_max;
+
+ /* we use (min + max) / 2 = max - (max - min) / 2 to avoid
+ overflow and rounding errors */
+
+ middle = max - ( ( max - min ) >> 1 );
+
+ if ( glyphID == array[middle] )
+ {
+ *index = middle;
+ return TT_Err_Ok;
+ }
+ else if ( glyphID < array[middle] )
+ {
+ if ( middle == min )
+ break;
+ new_max = middle - 1;
+ }
+ else
+ {
+ if ( middle == max )
+ break;
+ new_min = middle + 1;
+ }
+ } while ( min < max );
+
+ return TTO_Err_Not_Covered;
+ }
+
+
+ static TT_Error Coverage_Index2( TTO_CoverageFormat2* cf2,
+ UShort glyphID,
+ UShort* index )
+ {
+ UShort min, max, new_min, new_max, middle;
+
+ TTO_RangeRecord* rr = cf2->RangeRecord;
+
+
+ /* binary search */
+
+ new_min = 0;
+ new_max = cf2->RangeCount - 1;
+
+ do
+ {
+ min = new_min;
+ max = new_max;
+
+ /* we use (min + max) / 2 = max - (max - min) / 2 to avoid
+ overflow and rounding errors */
+
+ middle = max - ( ( max - min ) >> 1 );
+
+ if ( glyphID >= rr[middle].Start && glyphID <= rr[middle].End )
+ {
+ *index = rr[middle].StartCoverageIndex + glyphID - rr[middle].Start;
+ return TT_Err_Ok;
+ }
+ else if ( glyphID < rr[middle].Start )
+ {
+ if ( middle == min )
+ break;
+ new_max = middle - 1;
+ }
+ else
+ {
+ if ( middle == max )
+ break;
+ new_min = middle + 1;
+ }
+ } while ( min < max );
+
+ return TTO_Err_Not_Covered;
+ }
+
+
+ TT_Error Coverage_Index( TTO_Coverage* c,
+ UShort glyphID,
+ UShort* index )
+ {
+ switch ( c->CoverageFormat )
+ {
+ case 1:
+ return Coverage_Index1( &c->cf.cf1, glyphID, index );
+ case 2:
+ return Coverage_Index2( &c->cf.cf2, glyphID, index );
+ default:
+ return TTO_Err_Invalid_SubTable_Format;
+ }
+
+ return TT_Err_Ok; /* never reached */
+ }
+
+
+
+ /*************************************
+ * Class Definition related functions
+ *************************************/
+
+
+ /* ClassDefFormat1 */
+
+ static TT_Error Load_ClassDef1 ( TTO_ClassDefFormat1* cdf1,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+
+
+ if ( ACCESS_Frame( 4L ) )
+ return error;
+
+ cdf1->StartGlyph = GET_UShort();
+ count = cdf1->GlyphCount = GET_UShort();
+
+ FORGET_Frame();
+
+ /* sanity check; we are working with 16bit integers */
+
+ if ( cdf1->StartGlyph + count < cdf1->StartGlyph )
+ return TTO_Err_Invalid_SubTable;
+
+ cdf1->ClassValueArray = NULL;
+
+ if ( ALLOC_ARRAY( cdf1->ClassValueArray, count, TT_UShort ) )
+ return error;
+
+ if ( ACCESS_Frame( count * 2L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ cdf1->ClassValueArray[n] = GET_UShort();
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_ClassDef1( TTO_ClassDefFormat1* cdf1 )
+ {
+ if ( cdf1->ClassValueArray )
+ FREE( cdf1->ClassValueArray );
+ }
+
+
+ /* ClassDefFormat2 */
+
+ static TT_Error Load_ClassDef2 ( TTO_ClassDefFormat2* cdf2,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, count;
+ TTO_ClassRangeRecord* crr;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ count = cdf2->ClassRangeCount = GET_UShort();
+
+ FORGET_Frame();
+
+ cdf2->ClassRangeRecord = NULL;
+
+ if ( ALLOC_ARRAY( cdf2->ClassRangeRecord, count, TTO_ClassRangeRecord ) )
+ return error;
+
+ crr = cdf2->ClassRangeRecord;
+
+ if ( ACCESS_Frame( count * 6L ) )
+ return error;
+
+ for ( n = 0; n < count; n++ )
+ {
+ crr[n].Start = GET_UShort();
+ crr[n].End = GET_UShort();
+ crr[n].Class = GET_UShort();
+
+ /* sanity check */
+ if ( crr[n].Start > crr[n].End )
+ return TTO_Err_Invalid_SubTable;
+ }
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Free_ClassDef2( TTO_ClassDefFormat2* cdf2 )
+ {
+ if ( cdf2->ClassRangeRecord )
+ FREE( cdf2->ClassRangeRecord );
+ }
+
+
+ /* ClassDefinition */
+
+ TT_Error Load_ClassDefinition( TTO_ClassDefinition* cd,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ cd->ClassFormat = GET_UShort();
+
+ FORGET_Frame();
+
+ switch ( cd->ClassFormat )
+ {
+ case 1:
+ return Load_ClassDef1( &cd->cd.cd1, input );
+ case 2:
+ return Load_ClassDef2( &cd->cd.cd2, input );
+ default:
+ return TTO_Err_Invalid_SubTable_Format;
+ }
+
+ return TT_Err_Ok; /* never reached */
+ }
+
+
+ void Free_ClassDefinition( TTO_ClassDefinition* cd )
+ {
+ switch ( cd->ClassFormat )
+ {
+ case 1:
+ Free_ClassDef1( &cd->cd.cd1 );
+ break;
+ case 2:
+ Free_ClassDef2( &cd->cd.cd2 );
+ break;
+ default:
+ break;
+ }
+ }
+
+
+ static UShort Get_Class1( TTO_ClassDefFormat1* cdf1,
+ UShort glyphID )
+ {
+ UShort* cva = cdf1->ClassValueArray;
+
+
+ if ( glyphID >= cdf1->StartGlyph &&
+ glyphID <= cdf1->StartGlyph + cdf1->GlyphCount )
+ return cva[glyphID - cdf1->StartGlyph];
+
+ return 0;
+ }
+
+
+ static UShort Get_Class2( TTO_ClassDefFormat2* cdf2,
+ UShort glyphID )
+ {
+ UShort min, max, new_min, new_max, middle;
+
+ TTO_ClassRangeRecord* crr = cdf2->ClassRangeRecord;
+
+
+ /* binary search */
+
+ new_min = 0;
+ new_max = cdf2->ClassRangeCount - 1;
+
+ do
+ {
+ min = new_min;
+ max = new_max;
+
+ /* we use (min + max) / 2 = max - (max - min) / 2 to avoid
+ overflow and rounding errors */
+
+ middle = max - ( ( max - min ) >> 1 );
+
+ if ( glyphID >= crr[middle].Start && glyphID <= crr[middle].End )
+ return crr[middle].Class;
+ else if ( glyphID < crr[middle].Start )
+ {
+ if ( middle == min )
+ break;
+ new_max = middle - 1;
+ }
+ else
+ {
+ if ( middle == max )
+ break;
+ new_min = middle + 1;
+ }
+ } while ( min < max );
+
+ return 0;
+ }
+
+
+ UShort Get_Class( TTO_ClassDefinition* cd,
+ UShort glyphID )
+ {
+ switch ( cd->ClassFormat )
+ {
+ case 1:
+ return Get_Class1( &cd->cd.cd1, glyphID );
+ case 2:
+ return Get_Class2( &cd->cd.cd2, glyphID );
+ default:
+ break;
+ }
+
+ return 0;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxopen.h b/xc/extras/FreeType/lib/extend/ftxopen.h
new file mode 100644
index 000000000..605f497b6
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxopen.h
@@ -0,0 +1,282 @@
+/*******************************************************************
+ *
+ * ftxopen.h
+ *
+ * TrueType Open support.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * This file should be included by the application. Nevertheless,
+ * the table specific APIs (and structures) are located in files like
+ * ftxgsub.h or ftxgpos.h; these header files are read by ftxopen.h .
+ *
+ ******************************************************************/
+
+#ifndef FTXOPEN_H
+#define FTXOPEN_H
+
+#include "freetype.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TTO_Err_Invalid_SubTable_Format 0x1000
+#define TTO_Err_Invalid_SubTable 0x1001
+#define TTO_Err_Not_Covered 0x1002
+#define TTO_Err_Done 0x1003
+
+
+ /* Script list related structures */
+
+ struct TTO_LangSys_
+ {
+ TT_UShort LookupOrderOffset; /* always 0 for TT Open 1.0 */
+ TT_UShort ReqFeatureIndex; /* required FeatureIndex */
+ TT_UShort FeatureCount; /* number of Feature indices */
+ TT_UShort* FeatureIndex; /* array of Feature indices */
+ };
+
+ typedef struct TTO_LangSys_ TTO_LangSys;
+
+
+ struct TTO_LangSysRecord_
+ {
+ TT_ULong LangSysTag; /* LangSysTag identifier */
+ TTO_LangSys LangSys; /* LangSys table */
+ };
+
+ typedef struct TTO_LangSysRecord_ TTO_LangSysRecord;
+
+
+ struct TTO_Script_
+ {
+ TTO_LangSys DefaultLangSys; /* DefaultLangSys table */
+ TT_UShort LangSysCount; /* number of LangSysRecords */
+ TTO_LangSysRecord* LangSysRecord; /* array of LangSysRecords */
+ };
+
+ typedef struct TTO_Script_ TTO_Script;
+
+
+ struct TTO_ScriptRecord_
+ {
+ TT_ULong ScriptTag; /* ScriptTag identifier */
+ TTO_Script Script; /* Script table */
+ };
+
+ typedef struct TTO_ScriptRecord_ TTO_ScriptRecord;
+
+
+ struct TTO_ScriptList_
+ {
+ TT_UShort ScriptCount; /* number of ScriptRecords */
+ TTO_ScriptRecord* ScriptRecord; /* array of ScriptRecords */
+ };
+
+ typedef struct TTO_ScriptList_ TTO_ScriptList;
+
+
+ /* Feature list related structures */
+
+ struct TTO_Feature_
+ {
+ TT_UShort FeatureParams; /* always 0 for TT Open 1.0 */
+ TT_UShort LookupListCount; /* number of LookupList indices */
+ TT_UShort* LookupListIndex; /* array of LookupList indices */
+ };
+
+ typedef struct TTO_Feature_ TTO_Feature;
+
+
+ struct TTO_FeatureRecord_
+ {
+ TT_ULong FeatureTag; /* FeatureTag identifier */
+ TTO_Feature Feature; /* Feature table */
+ };
+
+ typedef struct TTO_FeatureRecord_ TTO_FeatureRecord;
+
+
+ struct TTO_FeatureList_
+ {
+ TT_UShort FeatureCount; /* number of FeatureRecords */
+ TTO_FeatureRecord* FeatureRecord; /* array of FeatureRecords */
+ };
+
+ typedef struct TTO_FeatureList_ TTO_FeatureList;
+
+
+ /* Lookup list related structures */
+
+ struct TTO_SubTable_; /* defined below after inclusion
+ of ftxgsub.h and ftxgpos.h */
+ typedef struct TTO_SubTable_ TTO_SubTable;
+
+
+ struct TTO_Lookup_
+ {
+ TT_UShort LookupType; /* Lookup type */
+ TT_UShort LookupFlag; /* Lookup qualifiers */
+ TT_UShort SubTableCount; /* number of SubTables */
+ TTO_SubTable* SubTable; /* array of SubTables */
+ };
+
+ typedef struct TTO_Lookup_ TTO_Lookup;
+
+
+ struct TTO_LookupList_
+ {
+ TT_UShort LookupCount; /* number of Lookups */
+ TTO_Lookup* Lookup; /* array of Lookup records */
+ };
+
+ typedef struct TTO_LookupList_ TTO_LookupList;
+
+
+/* possible LookupFlag bits */
+
+#define RIGHT_TO_LEFT 0x0001
+#define IGNORE_BASE_GLYPHS 0x0002
+#define IGNORE_LIGATURES 0x0004
+#define IGNORE_MARKS 0x0008
+
+
+ struct TTO_CoverageFormat1_
+ {
+ TT_UShort GlyphCount; /* number of glyphs in GlyphArray */
+ TT_UShort* GlyphArray; /* array of glyph IDs */
+ };
+
+ typedef struct TTO_CoverageFormat1_ TTO_CoverageFormat1;
+
+
+ struct TTO_RangeRecord_
+ {
+ TT_UShort Start; /* first glyph ID in the range */
+ TT_UShort End; /* last glyph ID in the range */
+ TT_UShort StartCoverageIndex; /* coverage index of first
+ glyph ID in the range */
+ };
+
+ typedef struct TTO_RangeRecord_ TTO_RangeRecord;
+
+
+ struct TTO_CoverageFormat2_
+ {
+ TT_UShort RangeCount; /* number of RangeRecords */
+ TTO_RangeRecord* RangeRecord; /* array of RangeRecords */
+ };
+
+ typedef struct TTO_CoverageFormat2_ TTO_CoverageFormat2;
+
+
+ struct TTO_Coverage_
+ {
+ TT_UShort CoverageFormat; /* 1 or 2 */
+
+ union
+ {
+ TTO_CoverageFormat1 cf1;
+ TTO_CoverageFormat2 cf2;
+ } cf;
+ };
+
+ typedef struct TTO_Coverage_ TTO_Coverage;
+
+
+ struct TTO_ClassDefFormat1_
+ {
+ TT_UShort StartGlyph; /* first glyph ID of the
+ ClassValueArray */
+ TT_UShort GlyphCount; /* size of the ClassValueArray */
+ TT_UShort* ClassValueArray; /* array of class values */
+ };
+
+ typedef struct TTO_ClassDefFormat1_ TTO_ClassDefFormat1;
+
+
+ struct TTO_ClassRangeRecord_
+ {
+ TT_UShort Start; /* first glyph ID in the range */
+ TT_UShort End; /* last glyph ID in the range */
+ TT_UShort Class; /* applied to all glyphs in range */
+ };
+
+ typedef struct TTO_ClassRangeRecord_ TTO_ClassRangeRecord;
+
+
+ struct TTO_ClassDefFormat2_
+ {
+ TT_UShort ClassRangeCount;
+ /* number of ClassRangeRecords */
+ TTO_ClassRangeRecord* ClassRangeRecord;
+ /* array of ClassRangeRecords */
+ };
+
+ typedef struct TTO_ClassDefFormat2_ TTO_ClassDefFormat2;
+
+
+ struct TTO_ClassDefinition_
+ {
+ TT_UShort ClassFormat; /* 1 or 2 */
+
+ union
+ {
+ TTO_ClassDefFormat1 cd1;
+ TTO_ClassDefFormat2 cd2;
+ } cd;
+ };
+
+ typedef struct TTO_ClassDefinition_ TTO_ClassDefinition;
+
+
+ struct TTO_Device_
+ {
+ TT_UShort StartSize; /* smallest size to correct */
+ TT_UShort EndSize; /* largest size to correct */
+ TT_UShort DeltaFormat; /* DeltaValue array data format:
+ 1, 2, or 3 */
+ TT_UShort* DeltaValue; /* array of compressed data */
+ };
+
+ typedef struct TTO_Device_ TTO_Device;
+
+
+#include "ftxgsub.h"
+#include "ftxgpos.h"
+
+ struct TTO_SubTable_
+ {
+ union
+ {
+ TTO_GSUB_SubTable gsub;
+ TTO_GPOS_SubTable gpos;
+ } st;
+ };
+
+
+ enum TTO_Type_
+ {
+ GSUB,
+ GPOS
+ };
+
+ typedef enum TTO_Type_ TTO_Type;
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXOPEN_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxopenf.h b/xc/extras/FreeType/lib/extend/ftxopenf.h
new file mode 100644
index 000000000..2c4afc844
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxopenf.h
@@ -0,0 +1,84 @@
+/*******************************************************************
+ *
+ * ftxopenf.h
+ *
+ * internal TrueType Open functions
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FTXOPENF_H
+#define FTXOPENF_H
+
+#include "ftxopen.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* functions from ftxopen.c */
+
+ TT_Error Load_ScriptList( TTO_ScriptList* sl,
+ PFace input );
+ TT_Error Load_FeatureList( TTO_FeatureList* fl,
+ PFace input );
+ TT_Error Load_LookupList( TTO_LookupList* ll,
+ PFace input,
+ TTO_Type type );
+
+ TT_Error Load_Coverage( TTO_Coverage* c,
+ PFace input );
+ TT_Error Load_ClassDefinition( TTO_ClassDefinition* cd,
+ PFace input );
+
+ void Free_ScriptList( TTO_ScriptList* sl );
+ void Free_FeatureList( TTO_FeatureList* fl );
+ void Free_LookupList( TTO_LookupList* ll,
+ TTO_Type type );
+
+ void Free_Coverage( TTO_Coverage* c );
+ void Free_ClassDefinition( TTO_ClassDefinition* cd );
+
+
+ /* functions from ftxgsub.c */
+
+ TT_Error Load_LookupSingle( TTO_SingleSubst* ss,
+ PFace input );
+ TT_Error Load_LookupMultiple( TTO_MultipleSubst* ms,
+ PFace input );
+ TT_Error Load_LookupAlternate( TTO_AlternateSubst* as,
+ PFace input );
+ TT_Error Load_LookupLigature( TTO_LigatureSubst* ls,
+ PFace input );
+ TT_Error Load_LookupContext( TTO_ContextSubst* cs,
+ PFace input );
+
+ void Free_LookupSingle( TTO_SingleSubst* ss );
+ void Free_LookupMultiple( TTO_MultipleSubst* ms );
+ void Free_LookupAlternate( TTO_AlternateSubst* as );
+ void Free_LookupLigature( TTO_LigatureSubst* ls );
+ void Free_LookupContext( TTO_ContextSubst* cs );
+
+ TT_Error Coverage_Index( TTO_Coverage* c,
+ UShort glyphID,
+ UShort* index );
+ UShort Get_Class( TTO_ClassDefinition* cd,
+ UShort glyphID );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXOPENF_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxpost.c b/xc/extras/FreeType/lib/extend/ftxpost.c
new file mode 100644
index 000000000..82ef56326
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxpost.c
@@ -0,0 +1,512 @@
+/*******************************************************************
+ *
+ * ftxpost.c
+ *
+ * post table support API extension body
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * The post table is not completely loaded by the core engine. This
+ * file loads the missing PS glyph names and implements an API to
+ * access them.
+ *
+ ******************************************************************/
+
+#include "ftxpost.h"
+
+#include "tttypes.h"
+#include "ttobjs.h"
+#include "tttables.h"
+#include "ttload.h" /* for the macros */
+#include "ttfile.h"
+#include "tttags.h"
+#include "ttmemory.h"
+#include "ttextend.h"
+
+
+#define POST_ID Build_Extension_ID( 'p', 'o', 's', 't' )
+
+
+ /* the 258 default Mac PS glyph names */
+
+ String* TT_Post_Default_Names[258] =
+ {
+ /* 0 */
+ ".notdef", ".null", "CR", "space", "exclam",
+ "quotedbl", "numbersign", "dollar", "percent", "ampersand",
+ /* 10 */
+ "quotesingle", "parenleft", "parenright", "asterisk", "plus",
+ "comma", "hyphen", "period", "slash", "zero",
+ /* 20 */
+ "one", "two", "three", "four", "five",
+ "six", "seven", "eight", "nine", "colon",
+ /* 30 */
+ "semicolon", "less", "equal", "greater", "question",
+ "at", "A", "B", "C", "D",
+ /* 40 */
+ "E", "F", "G", "H", "I",
+ "J", "K", "L", "M", "N",
+ /* 50 */
+ "O", "P", "Q", "R", "S",
+ "T", "U", "V", "W", "X",
+ /* 60 */
+ "Y", "Z", "bracketleft", "backslash", "bracketright",
+ "asciicircum", "underscore", "grave", "a", "b",
+ /* 70 */
+ "c", "d", "e", "f", "g",
+ "h", "i", "j", "k", "l",
+ /* 80 */
+ "m", "n", "o", "p", "q",
+ "r", "s", "t", "u", "v",
+ /* 90 */
+ "w", "x", "y", "z", "braceleft",
+ "bar", "braceright", "asciitilde", "Adieresis", "Aring",
+ /* 100 */
+ "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis",
+ "aacute", "agrave", "acircumflex", "adieresis", "atilde",
+ /* 110 */
+ "aring", "ccedilla", "eacute", "egrave", "ecircumflex",
+ "edieresis", "iacute", "igrave", "icircumflex", "idieresis",
+ /* 120 */
+ "ntilde", "oacute", "ograve", "ocircumflex", "odieresis",
+ "otilde", "uacute", "ugrave", "ucircumflex", "udieresis",
+ /* 130 */
+ "dagger", "degree", "cent", "sterling", "section",
+ "bullet", "paragraph", "germandbls", "registered", "copyright",
+ /* 140 */
+ "trademark", "acute", "dieresis", "notequal", "AE",
+ "Oslash", "infinity", "plusminus", "lessequal", "greaterequal",
+ /* 150 */
+ "yen", "mu", "partialdiff", "summation", "product",
+ "pi", "integral", "ordfeminine", "ordmasculine", "Omega",
+ /* 160 */
+ "ae", "oslash", "questiondown", "exclamdown", "logicalnot",
+ "radical", "florin", "approxequal", "Delta", "guillemotleft",
+ /* 170 */
+ "guillemotright", "ellipsis", "nbspace", "Agrave", "Atilde",
+ "Otilde", "OE", "oe", "endash", "emdash",
+ /* 180 */
+ "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide",
+ "lozenge", "ydieresis", "Ydieresis", "fraction", "currency",
+ /* 190 */
+ "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl",
+ "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
+ /* 200 */
+ "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute",
+ "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex",
+ /* 210 */
+ "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave",
+ "dotlessi", "circumflex", "tilde", "macron", "breve",
+ /* 220 */
+ "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek",
+ "caron", "Lslash", "lslash", "Scaron", "scaron",
+ /* 230 */
+ "Zcaron", "zcaron", "brokenbar", "Eth", "eth",
+ "Yacute", "yacute", "Thorn", "thorn", "minus",
+ /* 240 */
+ "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf",
+ "onequarter", "threequarters", "franc", "Gbreve", "gbreve",
+ /* 250 */
+ "Idot", "Scedilla", "scedilla", "Cacute", "cacute",
+ "Ccaron", "ccaron", "dmacron",
+ };
+
+
+
+ static TT_Error Load_Format_20( TT_Post_20* post20,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort nameindex, n, num;
+ Byte len;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ num = GET_UShort();
+
+ FORGET_Frame();
+
+ /* UNDOCUMENTED! The number of glyphs in this table can be smaller */
+ /* than the value in the maxp table (cf. cyberbit.ttf). */
+
+ /* There already exist fonts which have more than 32768 glyph names */
+ /* in this table, so the test for this threshold has been dropped. */
+ if ( num > input->numGlyphs )
+ return TT_Err_Invalid_Post_Table;
+
+ post20->numGlyphs = num;
+
+ if ( ALLOC_ARRAY( post20->glyphNameIndex, num, TT_UShort ) )
+ return error;
+
+ if ( ACCESS_Frame( num * 2L ) )
+ goto Fail;
+
+ for ( n = 0; n < num; n++ )
+ {
+ post20->glyphNameIndex[n] = GET_UShort();
+
+ if ( post20->glyphNameIndex[n] > 258 + num )
+ {
+ FORGET_Frame();
+ error = TT_Err_Invalid_Post_Table;
+ goto Fail;
+ }
+ }
+
+ FORGET_Frame();
+
+ if ( ALLOC_ARRAY( post20->glyphNames, num, Char* ) )
+ goto Fail;
+
+ /* We must initialize the glyphNames array for proper */
+ /* deallocation. */
+ for ( n = 0; n < num; n++ )
+ post20->glyphNames[n] = NULL;
+
+ /* Now we can read the glyph names which are stored in */
+ /* Pascal string format. */
+ for ( n = 0; n < num; n++ )
+ {
+ nameindex = post20->glyphNameIndex[n];
+
+ if ( nameindex < 258 )
+ ; /* default Mac glyph, do nothing */
+ else
+ {
+ if ( ACCESS_Frame( 1L ) )
+ goto Fail1;
+
+ len = GET_Byte();
+
+ FORGET_Frame();
+
+ if ( ALLOC_ARRAY( post20->glyphNames[nameindex - 258],
+ len + 1, Char ) ||
+ FILE_Read( post20->glyphNames[nameindex - 258], len ) )
+ goto Fail1;
+
+ /* we make a C string */
+ post20->glyphNames[nameindex - 258][len] = '\0';
+ }
+ }
+
+ return TT_Err_Ok;
+
+
+ Fail1:
+ for ( n = 0; n < num; n++ )
+ if ( post20->glyphNames[n] )
+ FREE( post20->glyphNames[n] );
+
+ FREE( post20->glyphNames );
+
+ Fail:
+ FREE( post20->glyphNameIndex );
+ return error;
+ }
+
+
+ static TT_Error Load_Format_25( TT_Post_25* post25,
+ PFace input )
+ {
+ DEFINE_LOAD_LOCALS( input->stream );
+
+ UShort n, num;
+
+
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ /* UNDOCUMENTED! This value appears only in the Apple TT specs. */
+ num = GET_UShort();
+
+ FORGET_Frame();
+
+ if ( num > input->numGlyphs || num > 258 )
+ return TT_Err_Invalid_Post_Table;
+
+ post25->numGlyphs = num;
+
+ if ( ALLOC_ARRAY( post25->offset, num, Char ) )
+ return error;
+
+ if ( ACCESS_Frame( num ) )
+ goto Fail;
+
+ for ( n = 0; n < num; n++ )
+ {
+ post25->offset[n] = GET_Char();
+
+ if ( n + post25->offset[n] > num ||
+ n + post25->offset[n] < 0 )
+ {
+ FORGET_Frame();
+ error = TT_Err_Invalid_Post_Table;
+ goto Fail;
+ }
+ }
+
+ FORGET_Frame();
+
+ return TT_Err_Ok;
+
+
+ Fail:
+ FREE( post25->offset );
+ return error;
+ }
+
+
+ static TT_Error Post_Create( void* ext,
+ PFace face )
+ {
+ TT_Post* post = (TT_Post*)ext;
+ Long table;
+
+
+ /* by convention */
+ if ( !post )
+ return TT_Err_Ok;
+
+ /* we store the start offset and the size of the subtable */
+ table = TT_LookUp_Table( face, TTAG_post );
+ post->offset = face->dirTables[table].Offset + 32L;
+ post->length = face->dirTables[table].Length - 32L;
+ post->loaded = FALSE;
+
+ return TT_Err_Ok;
+ }
+
+
+ static TT_Error Post_Destroy( void* ext,
+ PFace face )
+ {
+ TT_Post* post = (TT_Post*)ext;
+ UShort n;
+
+
+ /* by convention */
+ if ( !post )
+ return TT_Err_Ok;
+
+ if ( post->loaded )
+ {
+ switch ( face->postscript.FormatType )
+ {
+ case 0x00010000: /* nothing to do */
+ break;
+
+ case 0x00020000:
+ for ( n = 0; n < post->p.post20.numGlyphs; n++ )
+ if ( post->p.post20.glyphNames[n] )
+ FREE( post->p.post20.glyphNames[n] );
+ FREE( post->p.post20.glyphNames );
+ FREE( post->p.post20.glyphNameIndex );
+ break;
+
+ case 0x00028000:
+ FREE( post->p.post25.offset );
+ break;
+
+ case 0x00030000: /* nothing to do */
+ break;
+
+#if 0
+ case 0x00040000:
+ break;
+#endif
+
+ default:
+ ; /* invalid format, do nothing */
+ }
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ TT_Error TT_Init_Post_Extension( TT_Engine engine )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+
+ TT_Error error;
+
+
+ if ( !_engine )
+ return TT_Err_Invalid_Engine;
+
+ error = TT_Register_Extension( _engine,
+ POST_ID,
+ sizeof ( TT_Post ),
+ Post_Create,
+ Post_Destroy );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Load_PS_Names
+ *
+ * Description : Loads the PostScript Glyph Name subtable (if any).
+ *
+ * Output : error code
+ *
+ ******************************************************************/
+
+ TT_Error TT_Load_PS_Names( TT_Face face,
+ TT_Post* post )
+ {
+ PFace faze = HANDLE_Face( face );
+ TT_Error error;
+ TT_Stream stream;
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ error = TT_Extension_Get( faze, POST_ID, (void**)&post );
+ if ( error )
+ return error;
+
+ if ( USE_Stream( faze->stream, stream ) )
+ return error;
+
+
+ switch ( faze->postscript.FormatType )
+ {
+ case 0x00010000:
+ error = TT_Err_Ok; /* nothing to do */
+ break;
+
+ case 0x00020000:
+ if ( FILE_Seek( post->offset ) )
+ goto Fail;
+
+ error = Load_Format_20( &post->p.post20, faze );
+ break;
+
+ case 0x00028000: /* 2.5 in 16.16 format */
+ if ( FILE_Seek( post->offset ) )
+ goto Fail;
+
+ error = Load_Format_25( &post->p.post25, faze );
+ break;
+
+ case 0x00030000:
+ error = TT_Err_Ok; /* nothing to do */
+ break;
+
+#if 0
+ case 0x00040000:
+ break;
+#endif
+
+ default:
+ error = TT_Err_Invalid_Post_Table_Format;
+ break;
+ }
+
+ if ( !error )
+ post->loaded = TRUE;
+
+ Fail:
+ DONE_Stream( stream );
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_PS_Name
+ *
+ * Description : Gets the PostScript Glyph Name of a glyph.
+ *
+ * Input : index glyph index
+ * PSname address of a string pointer.
+ * Will be NULL in case of error; otherwise it
+ * contains a pointer to the glyph name.
+ *
+ * You must not modify the returned string!
+ *
+ * Output : error code
+ *
+ ******************************************************************/
+
+ TT_Error TT_Get_PS_Name( TT_Face face,
+ TT_UShort index,
+ TT_String** PSname )
+ {
+ PFace faze = HANDLE_Face( face );
+ TT_Error error;
+ TT_Post* post;
+ UShort nameindex;
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( index >= faze->numGlyphs )
+ return TT_Err_Invalid_Glyph_Index;
+
+ error = TT_Extension_Get( faze, POST_ID, (void**)&post );
+ if ( error )
+ return error;
+
+
+ *PSname = TT_Post_Default_Names[0]; /* default value */
+
+ switch ( faze->postscript.FormatType )
+ {
+ case 0x00010000:
+ if ( index < 258 ) /* paranoid checking */
+ *PSname = TT_Post_Default_Names[index];
+ break;
+
+ case 0x00020000:
+ if ( index < post->p.post20.numGlyphs )
+ nameindex = post->p.post20.glyphNameIndex[index];
+ else
+ break;
+
+ if ( nameindex < 258 )
+ *PSname = TT_Post_Default_Names[nameindex];
+ else
+ *PSname = (String*)post->p.post20.glyphNames[nameindex - 258];
+ break;
+
+ case 0x00028000:
+ if ( index < post->p.post25.numGlyphs ) /* paranoid checking */
+ *PSname = TT_Post_Default_Names[index + post->p.post25.offset[index]];
+ break;
+
+ case 0x00030000:
+ break; /* nothing to do */
+
+#if 0
+ case 0x00040000:
+ break;
+#endif
+
+ default:
+ ; /* should never happen */
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxpost.h b/xc/extras/FreeType/lib/extend/ftxpost.h
new file mode 100644
index 000000000..9bd4dfb2d
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxpost.h
@@ -0,0 +1,103 @@
+/*******************************************************************
+ *
+ * ftxpost.h
+ *
+ * post table support API extension
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * The post table is not completely loaded by the core engine. This
+ * file loads the missing PS glyph names and implements an API to
+ * access them.
+ *
+ ******************************************************************/
+
+#ifndef FTXPOST_H
+#define FTXPOST_H
+
+#include "freetype.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TT_Err_Invalid_Post_Table_Format 0x0B00
+#define TT_Err_Invalid_Post_Table 0x0B01
+
+ /* the 258 standard Mac glyph names, used for format 1.0 and 2.5 */
+
+ extern TT_String* TT_Post_Default_Names[];
+
+
+ /* format 2.0 table */
+
+ struct TT_Post_20_
+ {
+ TT_UShort numGlyphs;
+ TT_UShort* glyphNameIndex;
+ TT_Char** glyphNames;
+ };
+
+ typedef struct TT_Post_20_ TT_Post_20;
+
+ struct TT_Post_25_
+ {
+ TT_UShort numGlyphs;
+ TT_Char* offset;
+ };
+
+ typedef struct TT_Post_25_ TT_Post_25;
+
+#if 0
+ /* format 4.0 table -- not implemented yet */
+
+ struct TT_Post_40_
+ {
+ };
+
+ typedef struct TT_Post_40_ TT_Post_40;
+#endif
+
+
+ struct TT_Post_
+ {
+ TT_Long offset;
+ TT_Long length;
+ TT_Bool loaded;
+
+ union
+ {
+ TT_Post_20 post20;
+ TT_Post_25 post25;
+#if 0
+ TT_Post_40 post40;
+#endif
+ } p;
+ };
+
+ typedef struct TT_Post_ TT_Post;
+
+
+ TT_Error TT_Init_Post_Extension( TT_Engine engine );
+ TT_Error TT_Load_PS_Names( TT_Face face,
+ TT_Post* post );
+ TT_Error TT_Get_PS_Name( TT_Face face,
+ TT_UShort index,
+ TT_String** PSname );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXPOST_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxwidth.c b/xc/extras/FreeType/lib/extend/ftxwidth.c
new file mode 100644
index 000000000..090b856cc
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxwidth.c
@@ -0,0 +1,181 @@
+/*******************************************************************
+ *
+ * ftxwidth.c 1.0
+ *
+ * Glyph Widths (and Heights) fast retrieval extension
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * This extension is used to parse the "glyf" table of a TrueType
+ * file in order to extract the bbox of a given range of glyphs.
+ *
+ * The bbox is then used to build font unit widths and height
+ * that are returned in two parallel arrays.
+ *
+ * This extension is needed by the FreeType/2 OS/2 Font Driver.
+ *
+ ******************************************************************/
+
+
+#include "ftxwidth.h"
+#include "ttdebug.h"
+#include "ttobjs.h"
+#include "ttfile.h"
+#include "tttags.h"
+#include "ttload.h"
+
+/* Required by the tracing mode */
+
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_any
+
+
+ /******************************************************************/
+ /* */
+ /* Function: TT_Get_Face_Widths */
+ /* */
+ /* Description: Returns the widths and/or heights of a given */
+ /* range of glyphs for a face. */
+ /* */
+ /* Input: */
+ /* face :: face handle */
+ /* */
+ /* first_glyph :: first glyph in range */
+ /* */
+ /* last_glyph :: last glyph in range */
+ /* */
+ /* widths :: address of table receiving the widths */
+ /* expressed in font units (ushorts). Set */
+ /* this parameter to NULL if you're not */
+ /* interested by these values. */
+ /* */
+ /* heights :: address of table receiving the heights */
+ /* expressed in font units (ushorts). Set */
+ /* this parameter to NULL if you're not */
+ /* interested by these values. */
+ /* */
+ /* Returns: */
+ /* Error code */
+ /* */
+ /* */
+ /******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Face_Widths( TT_Face face,
+ TT_UShort first_glyph,
+ TT_UShort last_glyph,
+ TT_UShort* widths,
+ TT_UShort* heights )
+ {
+ DEFINE_ALL_LOCALS;
+
+ PFace faze = HANDLE_Face(face);
+ UShort n;
+ Long table;
+
+ ULong glyf_offset; /* offset of glyph table in file */
+ UShort zero_width = 0; /* width of glyph 0 */
+ UShort zero_height = 0; /* height of glyph 0 */
+
+ Bool zero_loaded = 0;
+
+ PStorage locations;
+ TT_BBox bbox;
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( last_glyph >= faze->numGlyphs ||
+ first_glyph > last_glyph )
+ return TT_Err_Bad_Argument;
+
+ /* find "glyf" table */
+ table = TT_LookUp_Table( faze, TTAG_glyf );
+ if ( table < 0 )
+ {
+ PERROR(( "ERROR: there is no glyph table in this font file!\n" ));
+ return TT_Err_Table_Missing;
+ }
+ glyf_offset = faze->dirTables[table].Offset;
+
+ /* now access stream */
+ if ( USE_Stream( faze->stream, stream ) )
+ return error;
+
+ locations = faze->glyphLocations + first_glyph;
+
+ /* loop to load each glyph in the range */
+ for ( n = first_glyph; n <= last_glyph; n++ )
+ {
+ if ( n + 1 < faze->numGlyphs &&
+ locations[0] == locations[1] )
+ {
+ /* Note : Glyph 0 is always used to indicate a missing glyph */
+ /* in a range. We must thus return its width and height */
+ /* where appropriate when we find an undefined glyph. */
+ if ( zero_loaded == 0 )
+ {
+ if ( FILE_Seek( glyf_offset + faze->glyphLocations[0] ) ||
+ ACCESS_Frame( 10L ) )
+ goto Fail;
+
+ (void)GET_Short(); /* skip number of contours */
+
+ bbox.xMin = GET_Short();
+ bbox.yMin = GET_Short();
+ bbox.xMax = GET_Short();
+ bbox.yMax = GET_Short();
+
+ FORGET_Frame();
+
+ zero_width = (UShort)(bbox.xMax - bbox.xMin);
+ zero_height = (UShort)(bbox.yMax - bbox.yMin);
+ zero_loaded = 1;
+ }
+
+ if ( widths )
+ *widths++ = zero_width;
+
+ if ( heights )
+ *heights++ = zero_height;
+ }
+ else
+ {
+ /* normal glyph, read header */
+ if ( FILE_Seek( glyf_offset + locations[0] ) ||
+ ACCESS_Frame( 10L ) )
+ goto Fail;
+
+ (void)GET_Short(); /* skip number of contours */
+
+ bbox.xMin = GET_Short();
+ bbox.yMin = GET_Short();
+ bbox.xMax = GET_Short();
+ bbox.yMax = GET_Short();
+
+ FORGET_Frame();
+
+ if ( widths )
+ *widths++ = (UShort)(bbox.xMax - bbox.xMin);
+
+ if ( heights )
+ *heights++ = (UShort)(bbox.yMax - bbox.yMin);
+ }
+ }
+
+ Fail:
+ DONE_Stream( stream );
+ return error;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/ftxwidth.h b/xc/extras/FreeType/lib/extend/ftxwidth.h
new file mode 100644
index 000000000..77a0e6cc7
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/ftxwidth.h
@@ -0,0 +1,80 @@
+/*******************************************************************
+ *
+ * ftxwidth.h 1.0
+ *
+ * Glyph Widths (and Heights) fast retrieval extension
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * This extension is used to parse the "glyf" table of a TrueType
+ * file in order to extract the bbox of a given range of glyphs.
+ *
+ * The bbox is then used to build font unit widths and height
+ * that are returned in two parallel arrays.
+ *
+ * This extension is needed by the FreeType/2 OS/2 Font Driver.
+ *
+ ******************************************************************/
+
+#ifndef FTXWIDTH_H
+#define FTXWIDTH_H
+
+#include "freetype.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /******************************************************************/
+ /* */
+ /* Function: TT_Get_Face_Widths */
+ /* */
+ /* Description: Returns the widths and/or heights or a given */
+ /* range of glyphs for a face. */
+ /* */
+ /* Input: */
+ /* face :: face handle */
+ /* */
+ /* first_glyph :: first glyph in range */
+ /* */
+ /* last_glyph :: last glyph in range */
+ /* */
+ /* widths :: address of table receiving the widths */
+ /* expressed in font units (ushorts). Set */
+ /* this parameter to NULL if you're not */
+ /* interested by these values. */
+ /* */
+ /* heights :: address of table receiving the heights */
+ /* expressed in font units (ushorts). Set */
+ /* this parameter to NULL if you're not */
+ /* interested by these values */
+ /* */
+ /* Returns: */
+ /* Error code */
+ /* */
+ /* */
+ /******************************************************************/
+
+ EXPORT_DEF
+ TT_Error TT_Get_Face_Widths( TT_Face face,
+ TT_UShort first_glyph,
+ TT_UShort last_glyph,
+ TT_UShort* widths,
+ TT_UShort* heights );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* FTXWIDTH_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/extend/readme.1st b/xc/extras/FreeType/lib/extend/readme.1st
new file mode 100644
index 000000000..887daa010
--- /dev/null
+++ b/xc/extras/FreeType/lib/extend/readme.1st
@@ -0,0 +1,57 @@
+This directory contains several extensions to the core engine.
+
+An extension is a separately compilable unit which can be linked by
+a client application to add new functionalities to the engine.
+
+There are two kinds of extensions: an "API extension" provides
+clients with new APIs to access internal engine structures or data,
+while an "engine extension" implements new TrueType data or table
+management.
+
+This directory contains the following:
+
+ ftxcmap: An API extension to iterate over cmaps.
+
+ ftxgasp: A simple API extension which returns the TrueType "gasp"
+ table to client applications, when found in a font file.
+ Though this table is always loaded by the engine, there
+ is no function in the core API to access it. The reason
+ is simple: to demonstrate a simple API extension with
+ "ftxgasp"!
+
+ ftxkern: This engine extension is used to access kerning data,
+ when available in a font file. Note that it implements
+ on-the-fly loading and retrieving of kerning tables.
+ However, it doesn't interpret or process the data, and
+ client applications should use it according to the
+ TrueType specification.
+
+ ftxpost: An engine extension to load the PostScript glyph names
+ of the `post' table. See the `ftzoom' program for an
+ example how to use it.
+
+ ftxwidth: A simple extension used to load the widths and heights
+ of a given range of glyphs in a face. Results are
+ expressed in unscaled font units. This is required by
+ the latest version of the FreeType/2 DLL to speed up
+ font loading in the GRE (the OS/2 GRaphics Engine). It
+ can be used by other applications though...
+
+ ftxerr18: This extension simply converts a TrueType engine error
+ code into a corresponding string describing the error.
+ It is useful if you intend to write a package for end
+ users and want to give them not "Error code 135" but
+ "OS/2 table missing". See docs/errstr.txt for a
+ description how to use it (really simple!). ftxerr18
+ supports localization of error strings (that is: error
+ strings are automatically translated into supported
+ languages) using gettext(). See docs/i18n.txt about
+ using gettext.
+
+ ftxopen,
+ ftxgsub,
+ ftxgpos: This is experimental stuff for TrueType Open support!
+ Please ignore it or help debugging :-)
+
+
+--- END ---
diff --git a/xc/extras/FreeType/lib/freetype.h b/xc/extras/FreeType/lib/freetype.h
new file mode 100644
index 000000000..29726c37f
--- /dev/null
+++ b/xc/extras/FreeType/lib/freetype.h
@@ -0,0 +1,1144 @@
+/*******************************************************************
+ *
+ * freetype.h
+ *
+ * High-level interface specification.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Note:
+ *
+ * This is the only file that should be included by client
+ * application sources. All other types and functions defined
+ * in the "tt*.h" files are library internals and should not be
+ * included.
+ *
+ ******************************************************************/
+
+#ifndef FREETYPE_H
+#define FREETYPE_H
+
+
+#define TT_FREETYPE_MAJOR 1
+#define TT_FREETYPE_MINOR 2
+
+
+#include "fterrid.h"
+#include "ftnameid.h"
+
+/* To make freetype.h independent from configuration files we check */
+/* whether EXPORT_DEF has been defined already. */
+
+#ifndef EXPORT_DEF
+#define EXPORT_DEF extern
+#endif
+
+/* The same for TT_Text. If you define the HAVE_TT_TEXT macro, you */
+/* have to provide a typedef declaration for TT_Text before */
+/* including this file. */
+
+#ifndef HAVE_TT_TEXT
+#define HAVE_TT_TEXT
+ typedef char TT_Text; /* the data type to represent */
+ /* file name string elements */
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+ /*******************************************************************/
+ /* */
+ /* FreeType types definitions. */
+ /* */
+ /* All these begin with a 'TT_' prefix. */
+ /* */
+ /*******************************************************************/
+
+ typedef unsigned short TT_Bool;
+
+ typedef signed long TT_Fixed; /* Signed Fixed 16.16 Float */
+
+ typedef signed short TT_FWord; /* Distance in FUnits */
+ typedef unsigned short TT_UFWord; /* Unsigned distance */
+
+ typedef char TT_String;
+ typedef signed char TT_Char;
+ typedef unsigned char TT_Byte;
+ typedef signed short TT_Short;
+ typedef unsigned short TT_UShort;
+ typedef signed long TT_Long;
+ typedef unsigned long TT_ULong;
+
+ typedef signed short TT_F2Dot14; /* Signed fixed float 2.14 used for */
+ /* unit vectors, with layout: */
+ /* */
+ /* s : 1 -- sign bit */
+ /* m : 1 -- integer bit */
+ /* f : 14 -- unsigned fractional */
+ /* */
+ /* 's:m' is the 2-bit signed int */
+ /* value to which the positive */
+ /* fractional part should be */
+ /* added. */
+ /* */
+
+ typedef signed long TT_F26Dot6; /* 26.6 fixed float, used for */
+ /* glyph points pixel coordinates. */
+
+ typedef signed long TT_Pos; /* point position, expressed either */
+ /* in fractional pixels or notional */
+ /* units, depending on context. */
+ /* For example, glyph coordinates */
+ /* returned by TT_Load_Glyph are */
+ /* expressed in font units when */
+ /* scaling wasn't requested, and */
+ /* in 26.6 fractional pixels if it */
+ /* was. */
+
+
+ struct TT_UnitVector_ /* guess what... */
+ {
+ TT_F2Dot14 x;
+ TT_F2Dot14 y;
+ };
+
+ typedef struct TT_UnitVector_ TT_UnitVector;
+
+
+ struct TT_Vector_ /* Simple vector type */
+ {
+ TT_F26Dot6 x;
+ TT_F26Dot6 y;
+ };
+
+ typedef struct TT_Vector_ TT_Vector;
+
+
+ /* A simple 2x2 matrix used for transformations. */
+ /* You should use 16.16 fixed floats. */
+ /* */
+ /* x' = xx*x + xy*y */
+ /* y' = yx*x + yy*y */
+ /* */
+
+ struct TT_Matrix_
+ {
+ TT_Fixed xx, xy;
+ TT_Fixed yx, yy;
+ };
+
+ typedef struct TT_Matrix_ TT_Matrix;
+
+
+ /* A structure used to describe the source glyph to the renderer. */
+
+ struct TT_Outline_
+ {
+ TT_Short n_contours; /* number of contours in glyph */
+ TT_UShort n_points; /* number of points in the glyph */
+
+ TT_Vector* points; /* the outline's points */
+ TT_Byte* flags; /* the points flags */
+ TT_UShort* contours; /* the contour end points */
+
+ /* The following flag indicates that the outline owns the arrays it */
+ /* refers to. Typically, this is true of outlines created from the */
+ /* TT_New_Outline() API, while it isn't for those returned by */
+ /* TT_Get_Glyph_Outline(). */
+
+ TT_Bool owner; /* the outline owns the coordinates, */
+ /* flags and contours array it uses */
+
+ /* The following flags are set automatically by */
+ /* TT_Get_Glyph_Outline(). Their meaning is the following: */
+ /* */
+ /* high_precision When true, the scan-line converter will use */
+ /* a higher precision to render bitmaps (i.e. a */
+ /* 1/1024 pixel precision). This is important for */
+ /* small ppem sizes. */
+ /* */
+ /* second_pass When true, the scan-line converter performs */
+ /* a second sweep phase dedicated to find */
+ /* vertical drop-outs. If false, only horizontal */
+ /* drop-outs will be checked during the first */
+ /* vertical sweep (yes, this is a bit confusing */
+ /* but it's really the way it should work). */
+ /* This is important for small ppems too. */
+ /* */
+ /* dropout_mode Specifies the TrueType drop-out mode to */
+ /* use for continuity checking. valid values */
+ /* are 0 (no check), 1, 2, 4, and 5. */
+ /* */
+ /* Most of the engine's users will safely ignore these fields... */
+
+ TT_Bool high_precision; /* high precision rendering */
+ TT_Bool second_pass; /* two sweeps rendering */
+ TT_Char dropout_mode; /* dropout mode */
+ };
+
+ typedef struct TT_Outline_ TT_Outline;
+
+
+ /* A structure used to describe a simple bounding box */
+
+ struct TT_BBox_
+ {
+ TT_Pos xMin;
+ TT_Pos yMin;
+ TT_Pos xMax;
+ TT_Pos yMax;
+ };
+
+ typedef struct TT_BBox_ TT_BBox;
+
+
+ /* A structure used to return glyph metrics. */
+ /* */
+ /* The "bearingX" isn't called "left-side bearing" anymore because */
+ /* it has different meanings depending on the glyph's orientation. */
+ /* */
+ /* The same is true for "bearingY", which is the top-side bearing */
+ /* defined by the TT_Spec, i.e., the distance from the baseline to */
+ /* the top of the glyph's bbox. According to our current convention, */
+ /* this is always the same as "bbox.yMax" but we make it appear for */
+ /* consistency in its proper field. */
+ /* */
+ /* The "advance" width is the advance width for horizontal layout, */
+ /* and advance height for vertical layouts. */
+ /* */
+ /* Finally, the library (ver. 1.1) doesn't support vertical text yet */
+ /* but these changes were introduced to accomodate it, as it will */
+ /* most certainly be introduced in later releases. */
+
+ struct TT_Glyph_Metrics_
+ {
+ TT_BBox bbox; /* glyph bounding box */
+
+ TT_Pos bearingX; /* left-side bearing */
+ TT_Pos bearingY; /* top-side bearing, per se the TT spec */
+
+ TT_Pos advance; /* advance width (or height) */
+ };
+
+
+ /* A structure used to return horizontal _and_ vertical glyph */
+ /* metrics. */
+ /* */
+ /* A glyph can be used either in a horizontal or vertical layout. */
+ /* Its glyph metrics vary with orientation. The Big_Glyph_Metrics */
+ /* structure is used to return _all_ metrics in one call. */
+ /* */
+ /* This structure is currently unused. */
+
+ struct TT_Big_Glyph_Metrics_
+ {
+ TT_BBox bbox; /* glyph bounding box */
+
+ TT_Pos horiBearingX; /* left side bearing in horizontal layouts */
+ TT_Pos horiBearingY; /* top side bearing in horizontal layouts */
+
+ TT_Pos vertBearingX; /* left side bearing in vertical layouts */
+ TT_Pos vertBearingY; /* top side bearing in vertical layouts */
+
+ TT_Pos horiAdvance; /* advance width for horizontal layout */
+ TT_Pos vertAdvance; /* advance height for vertical layout */
+
+ /* The following fields represent unhinted scaled metrics values. */
+ /* They can be useful for applications needing to do some device */
+ /* independent placement of glyphs. */
+ /* */
+ /* Applying these metrics to hinted glyphs will most surely ruin */
+ /* the grid fitting performed by the bytecode interpreter. These */
+ /* values are better used to compute accumulated positioning */
+ /* distances. */
+
+ TT_Pos linearHoriBearingX; /* linearly scaled horizontal lsb */
+ TT_Pos linearHoriAdvance; /* linearly scaled horizontal advance */
+
+ TT_Pos linearVertBearingY; /* linearly scaled vertical tsb */
+ TT_Pos linearVertAdvance; /* linearly scaled vertical advance */
+ };
+
+ typedef struct TT_Glyph_Metrics_ TT_Glyph_Metrics;
+ typedef struct TT_Big_Glyph_Metrics_ TT_Big_Glyph_Metrics;
+
+
+ /* A structure used to return instance metrics. */
+
+ struct TT_Instance_Metrics_
+ {
+ TT_F26Dot6 pointSize; /* char. size in points (1pt = 1/72 inch) */
+
+ TT_UShort x_ppem; /* horizontal pixels per EM square */
+ TT_UShort y_ppem; /* vertical pixels per EM square */
+
+ TT_Fixed x_scale; /* 16.16 to convert from EM units to 26.6 pix */
+ TT_Fixed y_scale; /* 16.16 to convert from EM units to 26.6 pix */
+
+ TT_UShort x_resolution; /* device horizontal resolution in dpi */
+ TT_UShort y_resolution; /* device vertical resolution in dpi */
+ };
+
+ typedef struct TT_Instance_Metrics_ TT_Instance_Metrics;
+
+
+ /* Flow constants: */
+ /* */
+ /* The flow of a bitmap refers to the way lines are oriented */
+ /* within the bitmap data, i.e., the orientation of the Y */
+ /* coordinate axis. */
+
+ /* For example, if the first bytes of the bitmap pertain to */
+ /* its top-most line, then the flow is 'down'. If these bytes */
+ /* pertain to its lowest line, the the flow is 'up'. */
+
+#define TT_Flow_Down -1 /* bitmap is oriented from top to bottom */
+#define TT_Flow_Up 1 /* bitmap is oriented from bottom to top */
+#define TT_Flow_Error 0 /* an error occurred during rendering */
+
+
+ /* A structure used to describe the target bitmap or pixmap to the */
+ /* renderer. Note that there is nothing in this structure that */
+ /* gives the nature of the buffer. */
+
+ /* IMPORTANT NOTE: */
+ /* */
+ /* In the case of a pixmap, the 'width' and 'cols' fields must */
+ /* have the _same_ values, and _must_ be padded to 32-bits, i.e., */
+ /* be a multiple of 4. Clipping problems will arise otherwise, */
+ /* if not even page faults! */
+ /* */
+ /* The typical settings are: */
+ /* */
+ /* - for an WxH bitmap: */
+ /* */
+ /* rows = H */
+ /* cols = (W+7)/8 */
+ /* width = W */
+ /* flow = your_choice */
+ /* */
+ /* - for an WxH pixmap: */
+ /* */
+ /* rows = H */
+ /* cols = (W+3) & ~3 */
+ /* width = cols */
+ /* flow = your_choice */
+
+ struct TT_Raster_Map_
+ {
+ int rows; /* number of rows */
+ int cols; /* number of columns (bytes) per row */
+ int width; /* number of pixels per line */
+ int flow; /* bitmap orientation */
+
+ void* bitmap; /* bit/pixmap buffer */
+ long size; /* bit/pixmap size in bytes */
+ };
+
+ typedef struct TT_Raster_Map_ TT_Raster_Map;
+
+
+ /* ------- The font header TrueType table structure ----- */
+
+ struct TT_Header_
+ {
+ TT_Fixed Table_Version;
+ TT_Fixed Font_Revision;
+
+ TT_Long CheckSum_Adjust;
+ TT_Long Magic_Number;
+
+ TT_UShort Flags;
+ TT_UShort Units_Per_EM;
+
+ TT_Long Created [2];
+ TT_Long Modified[2];
+
+ TT_FWord xMin;
+ TT_FWord yMin;
+ TT_FWord xMax;
+ TT_FWord yMax;
+
+ TT_UShort Mac_Style;
+ TT_UShort Lowest_Rec_PPEM;
+
+ TT_Short Font_Direction;
+ TT_Short Index_To_Loc_Format;
+ TT_Short Glyph_Data_Format;
+ };
+
+ typedef struct TT_Header_ TT_Header;
+
+
+ /* ------- The horizontal header TrueType table structure ----- */
+
+ /*******************************************************/
+ /* This structure is the one defined by the TrueType */
+ /* specification, plus two fields used to link the */
+ /* font-units metrics to the header. */
+
+ struct TT_Horizontal_Header_
+ {
+ TT_Fixed Version;
+ TT_FWord Ascender;
+ TT_FWord Descender;
+ TT_FWord Line_Gap;
+
+ TT_UFWord advance_Width_Max; /* advance width maximum */
+
+ TT_FWord min_Left_Side_Bearing; /* minimum left-sb */
+ TT_FWord min_Right_Side_Bearing; /* minimum right-sb */
+ TT_FWord xMax_Extent; /* xmax extents */
+ TT_FWord caret_Slope_Rise;
+ TT_FWord caret_Slope_Run;
+
+ TT_Short Reserved0,
+ Reserved1,
+ Reserved2,
+ Reserved3,
+ Reserved4;
+
+ TT_Short metric_Data_Format;
+ TT_UShort number_Of_HMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they're used to connect the metrics header to the relevant */
+ /* "HMTX" or "VMTX" table. */
+
+ void* long_metrics;
+ void* short_metrics;
+ };
+
+
+ /*******************************************************/
+ /* This structure is the one defined by the TrueType */
+ /* specification. Note that it has exactly the same */
+ /* layout as the horizontal header (both are loaded */
+ /* by the same function). */
+
+ struct TT_Vertical_Header_
+ {
+ TT_Fixed Version;
+ TT_FWord Ascender;
+ TT_FWord Descender;
+ TT_FWord Line_Gap;
+
+ TT_UFWord advance_Height_Max; /* advance height maximum */
+
+ TT_FWord min_Top_Side_Bearing; /* minimum left-sb or top-sb */
+ TT_FWord min_Bottom_Side_Bearing; /* minimum right-sb or bottom-sb */
+ TT_FWord yMax_Extent; /* xmax or ymax extents */
+ TT_FWord caret_Slope_Rise;
+ TT_FWord caret_Slope_Run;
+ TT_FWord caret_Offset;
+
+ TT_Short Reserved1,
+ Reserved2,
+ Reserved3,
+ Reserved4;
+
+ TT_Short metric_Data_Format;
+ TT_UShort number_Of_VMetrics;
+
+ /* The following fields are not defined by the TrueType specification */
+ /* but they're used to connect the metrics header to the relevant */
+ /* "HMTX" or "VMTX" table. */
+
+ void* long_metrics;
+ void* short_metrics;
+ };
+
+
+ typedef struct TT_Horizontal_Header_ TT_Horizontal_Header;
+ typedef struct TT_Vertical_Header_ TT_Vertical_Header;
+
+
+ /* ----------- OS/2 Table ----------------------------- */
+
+ struct TT_OS2_
+ {
+ TT_UShort version; /* 0x0001 */
+ TT_FWord xAvgCharWidth;
+ TT_UShort usWeightClass;
+ TT_UShort usWidthClass;
+ TT_Short fsType;
+ TT_FWord ySubscriptXSize;
+ TT_FWord ySubscriptYSize;
+ TT_FWord ySubscriptXOffset;
+ TT_FWord ySubscriptYOffset;
+ TT_FWord ySuperscriptXSize;
+ TT_FWord ySuperscriptYSize;
+ TT_FWord ySuperscriptXOffset;
+ TT_FWord ySuperscriptYOffset;
+ TT_FWord yStrikeoutSize;
+ TT_FWord yStrikeoutPosition;
+ TT_Short sFamilyClass;
+
+ TT_Byte panose[10];
+
+ TT_ULong ulUnicodeRange1; /* Bits 0-31 */
+ TT_ULong ulUnicodeRange2; /* Bits 32-63 */
+ TT_ULong ulUnicodeRange3; /* Bits 64-95 */
+ TT_ULong ulUnicodeRange4; /* Bits 96-127 */
+
+ TT_Char achVendID[4];
+
+ TT_UShort fsSelection;
+ TT_UShort usFirstCharIndex;
+ TT_UShort usLastCharIndex;
+ TT_Short sTypoAscender;
+ TT_Short sTypoDescender;
+ TT_Short sTypoLineGap;
+ TT_UShort usWinAscent;
+ TT_UShort usWinDescent;
+
+ /* only version 1 tables: */
+
+ TT_ULong ulCodePageRange1; /* Bits 0-31 */
+ TT_ULong ulCodePageRange2; /* Bits 32-63 */
+ };
+
+ typedef struct TT_OS2_ TT_OS2;
+
+
+ /* ----------- Postscript table ------------------------ */
+
+ struct TT_Postscript_
+ {
+ TT_Fixed FormatType;
+ TT_Fixed italicAngle;
+ TT_FWord underlinePosition;
+ TT_FWord underlineThickness;
+ TT_ULong isFixedPitch;
+ TT_ULong minMemType42;
+ TT_ULong maxMemType42;
+ TT_ULong minMemType1;
+ TT_ULong maxMemType1;
+
+ /* Glyph names follow in the file, but we don't */
+ /* load them by default. See the ftxpost.c extension. */
+ };
+
+ typedef struct TT_Postscript_ TT_Postscript;
+
+
+ /* ------------ horizontal device metrics "hdmx" ---------- */
+
+ struct TT_Hdmx_Record_
+ {
+ TT_Byte ppem;
+ TT_Byte max_width;
+ TT_Byte* widths;
+ };
+
+ typedef struct TT_Hdmx_Record_ TT_Hdmx_Record;
+
+
+ struct TT_Hdmx_
+ {
+ TT_UShort version;
+ TT_Short num_records;
+ TT_Hdmx_Record* records;
+ };
+
+ typedef struct TT_Hdmx_ TT_Hdmx;
+
+
+ /* A structure used to describe face properties. */
+
+ struct TT_Face_Properties_
+ {
+ TT_UShort num_Glyphs; /* number of glyphs in face */
+ TT_UShort max_Points; /* maximum number of points in a glyph */
+ TT_UShort max_Contours; /* maximum number of contours in a glyph */
+
+ TT_UShort num_CharMaps; /* number of charmaps in the face */
+ TT_UShort num_Names; /* number of name records in the face */
+
+ TT_ULong num_Faces; /* 1 for normal TrueType files, and the */
+ /* number of embedded faces for TrueType */
+ /* collections */
+
+ TT_Header* header; /* TrueType header table */
+ TT_Horizontal_Header* horizontal; /* TrueType horizontal header */
+ TT_OS2* os2; /* TrueType OS/2 table */
+ TT_Postscript* postscript; /* TrueType Postscript table */
+ TT_Hdmx* hdmx;
+ TT_Vertical_Header* vertical; /* TT Vertical header, if present */
+ };
+
+ typedef struct TT_Face_Properties_ TT_Face_Properties;
+
+
+
+ /* Here are the definitions of the handle types used for FreeType's */
+ /* most common objects accessed by the client application. We use */
+ /* a simple trick there: */
+ /* */
+ /* Each handle type is a structure that only contains one */
+ /* pointer. The advantage of structures is that there are */
+ /* mutually exclusive types. We could have defined the */
+ /* following types: */
+ /* */
+ /* typedef void* TT_Stream; */
+ /* typedef void* TT_Face; */
+ /* typedef void* TT_Instance; */
+ /* typedef void* TT_Glyph; */
+ /* typedef void* TT_CharMap; */
+ /* */
+ /* but these would have allowed lines like: */
+ /* */
+ /* stream = instance; */
+ /* */
+ /* in the client code this would be a severe bug, unnoticed */
+ /* by the compiler! */
+ /* */
+ /* Thus, we enforce type checking with a simple language */
+ /* trick... */
+ /* */
+ /* NOTE: Some macros are defined in tttypes.h to perform */
+ /* automatic type conversions for library hackers... */
+
+ struct TT_Engine_ { void* z; };
+ struct TT_Stream_ { void* z; };
+ struct TT_Face_ { void* z; };
+ struct TT_Instance_ { void* z; };
+ struct TT_Glyph_ { void* z; };
+ struct TT_CharMap_ { void* z; };
+
+ typedef struct TT_Engine_ TT_Engine; /* engine instance */
+ typedef struct TT_Stream_ TT_Stream; /* stream handle type */
+ typedef struct TT_Face_ TT_Face; /* face handle type */
+ typedef struct TT_Instance_ TT_Instance; /* instance handle type */
+ typedef struct TT_Glyph_ TT_Glyph; /* glyph handle type */
+ typedef struct TT_CharMap_ TT_CharMap; /* character map handle type */
+
+ typedef long TT_Error;
+
+
+
+ /*******************************************************************/
+ /* */
+ /* FreeType API */
+ /* */
+ /* All these begin with a 'TT_' prefix. */
+ /* */
+ /* Most of them are implemented in the 'ttapi.c' source file. */
+ /* */
+ /*******************************************************************/
+
+ /* Initialize the engine. */
+
+ EXPORT_DEF
+ TT_Error TT_Init_FreeType( TT_Engine* engine );
+
+
+ /* Finalize the engine, and release all allocated objects. */
+
+ EXPORT_DEF
+ TT_Error TT_Done_FreeType( TT_Engine engine );
+
+
+ /* Set the gray level palette. This is an array of 5 bytes used */
+ /* to produce the font smoothed pixmaps. By convention: */
+ /* */
+ /* palette[0] = background (white) */
+ /* palette[1] = light */
+ /* palette[2] = medium */
+ /* palette[3] = dark */
+ /* palette[4] = foreground (black) */
+ /* */
+
+ EXPORT_DEF
+ TT_Error TT_Set_Raster_Gray_Palette( TT_Engine engine,
+ TT_Byte* palette );
+
+
+ /* ----------------------- face management ----------------------- */
+
+ /* Open a new TrueType font file, and returns a handle for */
+ /* it in variable '*face'. */
+
+ /* Note: The file can be either a TrueType file (*.ttf) or */
+ /* a TrueType collection (*.ttc, in this case, only */
+ /* the first face is opened). The number of faces in */
+ /* the same collection can be obtained in the face's */
+ /* properties, using TT_Get_Face_Properties() and the */
+ /* 'max_Faces' field. */
+
+ EXPORT_DEF
+ TT_Error TT_Open_Face( TT_Engine engine,
+ const TT_Text* fontPathName,
+ TT_Face* face );
+
+
+ /* Open a TrueType font file located inside a collection. */
+ /* The font is assigned by its index in 'fontIndex'. */
+
+ EXPORT_DEF
+ TT_Error TT_Open_Collection( TT_Engine engine,
+ const TT_Text* collectionPathName,
+ TT_ULong fontIndex,
+ TT_Face* face );
+
+
+ /* Return face properties in the 'properties' structure. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Face_Properties( TT_Face face,
+ TT_Face_Properties* properties );
+
+
+ /* Set a face object's generic pointer */
+
+ EXPORT_DEF
+ TT_Error TT_Set_Face_Pointer( TT_Face face,
+ void* data );
+
+
+ /* Get a face object's generic pointer */
+
+ EXPORT_DEF
+ void* TT_Get_Face_Pointer( TT_Face face );
+
+
+ /* Close a face's file handle to save system resources. The file */
+ /* will be re-opened automatically on the next disk access. */
+
+ EXPORT_DEF
+ TT_Error TT_Flush_Face( TT_Face face );
+
+ /* Get a face's glyph metrics expressed in font units. Returns any */
+ /* number of arrays. Set the fields to NULL if you're not interested */
+ /* by a given array. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Face_Metrics( TT_Face face,
+ TT_UShort firstGlyph,
+ TT_UShort lastGlyph,
+ TT_Short* leftBearings,
+ TT_UShort* widths,
+ TT_Short* topBearings,
+ TT_UShort* heights );
+
+ /* Close a given font object, destroying all associated */
+ /* instances. */
+
+ EXPORT_DEF
+ TT_Error TT_Close_Face( TT_Face face );
+
+
+ /* Get font or table data. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Font_Data( TT_Face face,
+ TT_ULong tag,
+ TT_Long offset,
+ void* buffer,
+ TT_Long* length );
+
+
+/* A simple macro to build table tags from ASCII chars */
+
+#define MAKE_TT_TAG( _x1, _x2, _x3, _x4 ) \
+ (((TT_ULong)_x1 << 24) | \
+ ((TT_ULong)_x2 << 16) | \
+ ((TT_ULong)_x3 << 8) | \
+ (TT_ULong)_x4)
+
+
+
+ /* ----------------------- instance management -------------------- */
+
+ /* Open a new font instance and returns an instance handle */
+ /* for it in '*instance'. */
+
+ EXPORT_DEF
+ TT_Error TT_New_Instance( TT_Face face,
+ TT_Instance* instance );
+
+
+ /* Set device resolution for a given instance. The values are */
+ /* given in dpi (Dots Per Inch). Default is 96 in both directions. */
+
+ EXPORT_DEF
+ TT_Error TT_Set_Instance_Resolutions( TT_Instance instance,
+ TT_UShort xResolution,
+ TT_UShort yResolution );
+
+
+ /* Set the pointsize for a given instance. Default is 10pt. */
+
+ EXPORT_DEF
+ TT_Error TT_Set_Instance_CharSize( TT_Instance instance,
+ TT_F26Dot6 charSize );
+
+ EXPORT_DEF
+ TT_Error TT_Set_Instance_CharSizes( TT_Instance instance,
+ TT_F26Dot6 charWidth,
+ TT_F26Dot6 charHeight );
+
+#define TT_Set_Instance_PointSize( ins, ptsize ) \
+ TT_Set_Instance_CharSize( ins, ptsize*64 )
+
+ EXPORT_DEF
+ TT_Error TT_Set_Instance_PixelSizes( TT_Instance instance,
+ TT_UShort pixelWidth,
+ TT_UShort pixelHeight,
+ TT_F26Dot6 pointSize );
+
+
+ /* This function has been deprecated !! Do not use it, as it */
+ /* doesn't work reliably. You can perfectly control hinting */
+ /* yourself when loading glyphs, then apply transforms as usual */
+
+ EXPORT_DEF
+ TT_Error TT_Set_Instance_Transform_Flags( TT_Instance instance,
+ TT_Bool rotated,
+ TT_Bool stretched );
+
+
+ /* Return instance metrics in 'metrics'. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Instance_Metrics( TT_Instance instance,
+ TT_Instance_Metrics* metrics );
+
+
+ /* Set an instance's generic pointer. */
+
+ EXPORT_DEF
+ TT_Error TT_Set_Instance_Pointer( TT_Instance instance,
+ void* data );
+
+
+ /* Get an instance's generic pointer. */
+
+ EXPORT_DEF
+ void* TT_Get_Instance_Pointer( TT_Instance instance );
+
+
+ /* Close a given instance object, destroying all associated data. */
+
+ EXPORT_DEF
+ TT_Error TT_Done_Instance( TT_Instance instance );
+
+
+
+ /* ----------------------- glyph management ----------------------- */
+
+ /* Create a new glyph object related to the given 'face'. */
+
+ EXPORT_DEF
+ TT_Error TT_New_Glyph( TT_Face face,
+ TT_Glyph* glyph );
+
+
+ /* Discard (and destroy) a given glyph object. */
+
+ EXPORT_DEF
+ TT_Error TT_Done_Glyph( TT_Glyph glyph );
+
+
+#define TTLOAD_SCALE_GLYPH 1
+#define TTLOAD_HINT_GLYPH 2
+
+#define TTLOAD_DEFAULT (TTLOAD_SCALE_GLYPH | TTLOAD_HINT_GLYPH)
+
+
+ /* Load and process (scale/transform and hint) a glyph from the */
+ /* given 'instance'. The glyph and instance handles must be */
+ /* related to the same face object. The glyph index can be */
+ /* computed with a call to TT_Char_Index(). */
+
+ /* The 'load_flags' argument is a combination of the macros */
+ /* TTLOAD_SCALE_GLYPH and TTLOAD_HINT_GLYPH. Hinting will be */
+ /* applied only if the scaling is selected. */
+
+ /* When scaling is off (i.e., load_flags = 0), the returned */
+ /* outlines are in EM square coordinates (also called FUnits), */
+ /* extracted directly from the font with no hinting. */
+ /* Other glyph metrics are also in FUnits. */
+
+ /* When scaling is on, the returned outlines are in fractional */
+ /* pixel units (i.e. TT_F26Dot6 = 26.6 fixed floats). */
+
+ /* NOTE: The glyph index must be in the range 0..num_glyphs-1 */
+ /* where 'num_glyphs' is the total number of glyphs in */
+ /* the font file (given in the face properties). */
+
+ EXPORT_DEF
+ TT_Error TT_Load_Glyph( TT_Instance instance,
+ TT_Glyph glyph,
+ TT_UShort glyphIndex,
+ TT_UShort loadFlags );
+
+
+ /* Return glyph outline pointers in 'outline'. Note that the returned */
+ /* pointers are owned by the glyph object, and will be destroyed with */
+ /* it. The client application should _not_ change the pointers. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Glyph_Outline( TT_Glyph glyph,
+ TT_Outline* outline );
+
+
+ /* Copy the glyph metrics into 'metrics'. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Glyph_Metrics( TT_Glyph glyph,
+ TT_Glyph_Metrics* metrics );
+
+
+ /* Copy the glyph's big metrics into 'metrics'. */
+ /* Necessary to obtain vertical metrics. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Glyph_Big_Metrics( TT_Glyph glyph,
+ TT_Big_Glyph_Metrics* metrics );
+
+
+ /* Render the glyph into a bitmap, with given position offsets. */
+
+ /* Note: Only use integer pixel offsets to preserve the fine */
+ /* hinting of the glyph and the 'correct' anti-aliasing */
+ /* (where vertical and horizontal stems aren't grayed). */
+ /* This means that xOffset and yOffset must be multiples */
+ /* of 64! */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Glyph_Bitmap( TT_Glyph glyph,
+ TT_Raster_Map* map,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset );
+
+
+ /* Render the glyph into a pixmap, with given position offsets. */
+
+ /* Note : Only use integer pixel offsets to preserve the fine */
+ /* hinting of the glyph and the 'correct' anti-aliasing */
+ /* (where vertical and horizontal stems aren't grayed). */
+ /* This means that xOffset and yOffset must be multiples */
+ /* of 64! */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Glyph_Pixmap( TT_Glyph glyph,
+ TT_Raster_Map* map,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset );
+
+
+
+ /* ----------------------- outline support ------------------------ */
+
+ /* Allocate a new outline. Reserve space for 'numPoints' and */
+ /* 'numContours'. */
+
+ EXPORT_DEF
+ TT_Error TT_New_Outline( TT_UShort numPoints,
+ TT_Short numContours,
+ TT_Outline* outline );
+
+
+ /* Release an outline. */
+
+ EXPORT_DEF
+ TT_Error TT_Done_Outline( TT_Outline* outline );
+
+
+ /* Copy an outline into another one. */
+
+ EXPORT_DEF
+ TT_Error TT_Copy_Outline( TT_Outline* source,
+ TT_Outline* target );
+
+
+ /* Render an outline into a bitmap. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Outline_Bitmap( TT_Engine engine,
+ TT_Outline* outline,
+ TT_Raster_Map* map );
+
+
+ /* Render an outline into a pixmap -- note that this function uses */
+ /* a different pixel scale, where 1.0 pixels = 128 XXXX */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Outline_Pixmap( TT_Engine engine,
+ TT_Outline* outline,
+ TT_Raster_Map* map );
+
+
+ /* Return an outline's bounding box -- this function is slow as it */
+ /* performs a complete scan-line process, without drawing, to get */
+ /* the most accurate values. XXXX */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Outline_BBox( TT_Outline* outline,
+ TT_BBox* bbox );
+
+
+ /* Apply a transformation to a glyph outline. */
+
+ EXPORT_DEF
+ void TT_Transform_Outline( TT_Outline* outline,
+ TT_Matrix* matrix );
+
+
+ /* Apply a translation to a glyph outline. */
+
+ EXPORT_DEF
+ void TT_Translate_Outline( TT_Outline* outline,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset );
+
+
+ /* Apply a transformation to a vector. */
+
+ EXPORT_DEF
+ void TT_Transform_Vector( TT_F26Dot6* x,
+ TT_F26Dot6* y,
+ TT_Matrix* matrix );
+
+
+ /* Multiply a matrix with another -- computes "b := a*b". */
+
+ EXPORT_DEF
+ void TT_Matrix_Multiply( TT_Matrix* a,
+ TT_Matrix* b );
+
+
+ /* Invert a transformation matrix. */
+
+ EXPORT_DEF
+ TT_Error TT_Matrix_Invert( TT_Matrix* matrix );
+
+
+ /* Compute A*B/C with 64 bits intermediate precision. */
+
+ EXPORT_DEF
+ TT_Long TT_MulDiv( TT_Long A, TT_Long B, TT_Long C );
+
+
+ /* Compute A*B/0x10000 with 64 bits intermediate precision. */
+ /* Useful to multiply by a 16.16 fixed float value. */
+
+ EXPORT_DEF
+ TT_Long TT_MulFix( TT_Long A, TT_Long B );
+
+
+
+ /* ----------------- character mappings support ------------- */
+
+ /* Return the number of character mappings found in this file. */
+ /* Returns -1 in case of failure (invalid face handle). */
+ /* */
+ /* DON'T USE THIS FUNCTION! IT HAS BEEN DEPRECATED! */
+ /* */
+ /* It is retained for backwards compatibility only and will */
+ /* fail on 16bit systems. */
+ /* */
+ /* You can now get the charmap count in the "num_CharMaps" */
+ /* field of a face's properties. */
+ /* */
+
+ EXPORT_DEF
+ int TT_Get_CharMap_Count( TT_Face face );
+
+
+ /* Return the ID of charmap number 'charmapIndex' of a given face */
+ /* used to enumerate the charmaps present in a TrueType file. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_CharMap_ID( TT_Face face,
+ TT_UShort charmapIndex,
+ TT_UShort* platformID,
+ TT_UShort* encodingID );
+
+
+ /* Look up the character maps found in 'face' and return a handle */
+ /* for the one matching 'platformID' and 'platformEncodingID' */
+ /* (see the TrueType specs relating to the 'cmap' table for */
+ /* information on these ID numbers). Returns an error code. */
+ /* In case of failure, the handle is set to NULL and is invalid. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_CharMap( TT_Face face,
+ TT_UShort charmapIndex,
+ TT_CharMap* charMap );
+
+
+ /* Translate a character code through a given character map */
+ /* and return the corresponding glyph index to be used in */
+ /* a TT_Load_Glyph call. This function returns 0 in case of */
+ /* failure. */
+
+ EXPORT_DEF
+ TT_UShort TT_Char_Index( TT_CharMap charMap,
+ TT_UShort charCode );
+
+
+
+ /* --------------------- names table support ------------------- */
+
+ /* Return the number of name strings found in the name table. */
+ /* Returns -1 in case of failure (invalid face handle). */
+ /* */
+ /* DON'T USE THIS FUNCTION! IT HAS BEEN DEPRECATED! */
+ /* */
+ /* It is retained for backwards compatibility only and will */
+ /* fail on 16bit systems. */
+ /* */
+ /* You can now get the number of name strings in a face with */
+ /* the "num_Names" field of its properties.. */
+ /* */
+
+ EXPORT_DEF
+ int TT_Get_Name_Count( TT_Face face );
+
+
+ /* Return the ID of the name number 'nameIndex' of a given face */
+ /* used to enumerate the charmaps present in a TrueType file. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Name_ID( TT_Face face,
+ TT_UShort nameIndex,
+ TT_UShort* platformID,
+ TT_UShort* encodingID,
+ TT_UShort* languageID,
+ TT_UShort* nameID );
+
+
+ /* Return the address and length of the name number 'nameIndex' */
+ /* of a given face. The string is part of the face object and */
+ /* shouldn't be written to or released. */
+
+ /* Note that if for an invalid platformID a null pointer will */
+ /* be returned. */
+
+ EXPORT_DEF
+ TT_Error TT_Get_Name_String( TT_Face face,
+ TT_UShort nameIndex,
+ TT_String** stringPtr, /* pointer address */
+ TT_UShort* length ); /* string length
+ address */
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* FREETYPE_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/fterrid.h b/xc/extras/FreeType/lib/fterrid.h
new file mode 100644
index 000000000..6a9a14808
--- /dev/null
+++ b/xc/extras/FreeType/lib/fterrid.h
@@ -0,0 +1,160 @@
+/*******************************************************************
+ *
+ * fterrid.h
+ *
+ * TrueType Error ID definitions
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FREETYPE_H
+#error "Don't include this file! Use freetype.h instead."
+#endif
+
+#ifndef FTERRID_H
+#define FTERRID_H
+
+ /************************ error codes declaration **************/
+
+ /* The error codes are grouped in 'classes' used to indicate the */
+ /* 'level' at which the error happened. */
+ /* The class is given by an error code's high byte. */
+
+
+ /* ------------- Success is always 0 -------- */
+
+#define TT_Err_Ok 0
+
+
+ /* -------- High-level API error codes ------ */
+
+#define TT_Err_Invalid_Face_Handle 0x001
+#define TT_Err_Invalid_Instance_Handle 0x002
+#define TT_Err_Invalid_Glyph_Handle 0x003
+#define TT_Err_Invalid_CharMap_Handle 0x004
+#define TT_Err_Invalid_Result_Address 0x005
+#define TT_Err_Invalid_Glyph_Index 0x006
+#define TT_Err_Invalid_Argument 0x007
+#define TT_Err_Could_Not_Open_File 0x008
+#define TT_Err_File_Is_Not_Collection 0x009
+
+#define TT_Err_Table_Missing 0x00A
+#define TT_Err_Invalid_Horiz_Metrics 0x00B
+#define TT_Err_Invalid_CharMap_Format 0x00C
+#define TT_Err_Invalid_PPem 0x00D
+#define TT_Err_Invalid_Vert_Metrics 0x00E
+
+#define TT_Err_Invalid_File_Format 0x010
+
+#define TT_Err_Invalid_Engine 0x020
+#define TT_Err_Too_Many_Extensions 0x021
+#define TT_Err_Extensions_Unsupported 0x022
+#define TT_Err_Invalid_Extension_Id 0x023
+
+#define TT_Err_No_Vertical_Data 0x030
+
+#define TT_Err_Max_Profile_Missing 0x080
+#define TT_Err_Header_Table_Missing 0x081
+#define TT_Err_Horiz_Header_Missing 0x082
+#define TT_Err_Locations_Missing 0x083
+#define TT_Err_Name_Table_Missing 0x084
+#define TT_Err_CMap_Table_Missing 0x085
+#define TT_Err_Hmtx_Table_Missing 0x086
+#define TT_Err_OS2_Table_Missing 0x087
+#define TT_Err_Post_Table_Missing 0x088
+
+
+ /* -------- Memory component error codes ---- */
+
+ /* this error indicates that an operation cannot */
+ /* be performed due to memory exhaustion. */
+
+#define TT_Err_Out_Of_Memory 0x100
+
+
+ /* -------- File component error codes ------ */
+
+ /* these error codes indicate that the file could */
+ /* not be accessed properly. Usually, this means */
+ /* a broken font file! */
+
+#define TT_Err_Invalid_File_Offset 0x200
+#define TT_Err_Invalid_File_Read 0x201
+#define TT_Err_Invalid_Frame_Access 0x202
+
+
+ /* -------- Glyph loader error codes -------- */
+
+ /* Produced only by the glyph loader, these error */
+ /* codes indicate a broken glyph in a font file. */
+
+#define TT_Err_Too_Many_Points 0x300
+#define TT_Err_Too_Many_Contours 0x301
+#define TT_Err_Invalid_Composite 0x302
+#define TT_Err_Too_Many_Ins 0x303
+
+
+ /* --- bytecode interpreter error codes ----- */
+
+ /* These error codes are produced by the TrueType */
+ /* bytecode interpreter. They usually indicate a */
+ /* broken font file, a broken glyph within a font */
+ /* file, or a bug in the interpreter! */
+
+#define TT_Err_Invalid_Opcode 0x400
+#define TT_Err_Too_Few_Arguments 0x401
+#define TT_Err_Stack_Overflow 0x402
+#define TT_Err_Code_Overflow 0x403
+#define TT_Err_Bad_Argument 0x404
+#define TT_Err_Divide_By_Zero 0x405
+#define TT_Err_Storage_Overflow 0x406
+#define TT_Err_Cvt_Overflow 0x407
+#define TT_Err_Invalid_Reference 0x408
+#define TT_Err_Invalid_Distance 0x409
+#define TT_Err_Interpolate_Twilight 0x40A
+#define TT_Err_Debug_OpCode 0x40B
+#define TT_Err_ENDF_In_Exec_Stream 0x40C
+#define TT_Err_Out_Of_CodeRanges 0x40D
+#define TT_Err_Nested_DEFS 0x40E
+#define TT_Err_Invalid_CodeRange 0x40F
+#define TT_Err_Invalid_Displacement 0x410
+#define TT_Err_Execution_Too_Long 0x411
+
+
+ /* ------ internal failure error codes ----- */
+
+ /* These error codes are produced when an incoherent */
+ /* library state has been detected. These reflect a */
+ /* severe bug in the engine! (Or a major overwrite */
+ /* of your application into the library's data.) */
+
+#define TT_Err_Nested_Frame_Access 0x500
+#define TT_Err_Invalid_Cache_List 0x501
+#define TT_Err_Could_Not_Find_Context 0x502
+#define TT_Err_Unlisted_Object 0x503
+
+
+ /* ---- scan-line converter error codes ----- */
+
+ /* These error codes are produced by the raster component. */
+ /* They indicate that an outline structure was incoherently */
+ /* setup, or that you're trying to render an horribly */
+ /* complex glyph! */
+
+#define TT_Err_Raster_Pool_Overflow 0x600
+#define TT_Err_Raster_Negative_Height 0x601
+#define TT_Err_Raster_Invalid_Value 0x602
+#define TT_Err_Raster_Not_Initialized 0x603
+
+#endif /* FTERRID_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ftnameid.h b/xc/extras/FreeType/lib/ftnameid.h
new file mode 100644
index 000000000..55ad56e4c
--- /dev/null
+++ b/xc/extras/FreeType/lib/ftnameid.h
@@ -0,0 +1,597 @@
+/*******************************************************************
+ *
+ * ftnameid.h
+ *
+ * TrueType Name ID definitions
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 FREETYPE_H
+#error "Don't include this file! Use freetype.h instead."
+#endif
+
+#ifndef FTNAMEID_H
+#define FTNAMEID_H
+
+/*
+ * possible values for the 'Platform' identifier code in the name
+ * records of the TTF "name" table
+ */
+
+#define TT_PLATFORM_APPLE_UNICODE 0
+#define TT_PLATFORM_MACINTOSH 1
+#define TT_PLATFORM_ISO 2
+#define TT_PLATFORM_MICROSOFT 3
+
+
+/*
+ * possible values of the platform specific encoding identifier field in
+ * the name records of the TTF "name" table when the 'Platform' identifier
+ * code is TT_PLATFORM_APPLE_UNICODE
+ */
+
+#define TT_APPLE_ID_DEFAULT 0
+#define TT_APPLE_ID_UNICODE_1_1 1
+#define TT_APPLE_ID_ISO_10646 2
+#define TT_APPLE_ID_UNICODE_2_0 3
+
+
+/*
+ * possible values of the platform specific encoding identifier field in
+ * the name records of the TTF "name" table when the 'Platform' identifier
+ * code is TT_PLATFORM_MACINTOSH
+ */
+
+#define TT_MAC_ID_ROMAN 0
+#define TT_MAC_ID_JAPANESE 1
+#define TT_MAC_ID_TRADITIONAL_CHINESE 2
+#define TT_MAC_ID_KOREAN 3
+#define TT_MAC_ID_ARABIC 4
+#define TT_MAC_ID_HEBREW 5
+#define TT_MAC_ID_GREEK 6
+#define TT_MAC_ID_RUSSIAN 7
+#define TT_MAC_ID_RSYMBOL 8
+#define TT_MAC_ID_DEVANAGARI 9
+#define TT_MAC_ID_GURMUKHI 10
+#define TT_MAC_ID_GUJARATI 11
+#define TT_MAC_ID_ORIYA 12
+#define TT_MAC_ID_BENGALI 13
+#define TT_MAC_ID_TAMIL 14
+#define TT_MAC_ID_TELUGU 15
+#define TT_MAC_ID_KANNADA 16
+#define TT_MAC_ID_MALAYALAM 17
+#define TT_MAC_ID_SINHALESE 18
+#define TT_MAC_ID_BURMESE 19
+#define TT_MAC_ID_KHMER 20
+#define TT_MAC_ID_THAI 21
+#define TT_MAC_ID_LAOTIAN 22
+#define TT_MAC_ID_GEORGIAN 23
+#define TT_MAC_ID_ARMENIAN 24
+#define TT_MAC_ID_MALDIVIAN 25
+#define TT_MAC_ID_SIMPLIFIED_CHINESE 25
+#define TT_MAC_ID_TIBETAN 26
+#define TT_MAC_ID_MONGOLIAN 27
+#define TT_MAC_ID_GEEZ 28
+#define TT_MAC_ID_SLAVIC 29
+#define TT_MAC_ID_VIETNAMESE 30
+#define TT_MAC_ID_SINDHI 31
+#define TT_MAC_ID_UNINTERP 32
+
+
+/*
+ * possible values of the platform specific encoding identifier field in
+ * the name records of the TTF "name" table when the 'Platform' identifier
+ * code is TT_PLATFORM_ISO
+ */
+
+#define TT_ISO_ID_7BIT_ASCII 0
+#define TT_ISO_ID_10646 1
+#define TT_ISO_ID_8859_1 2
+
+
+/*
+ * possible values of the platform specific encoding identifier field in
+ * the name records of the TTF "name" table when the 'Platform' identifier
+ * code is TT_PLATFORM_MICROSOFT
+ */
+
+#define TT_MS_ID_SYMBOL_CS 0
+#define TT_MS_ID_UNICODE_CS 1
+#define TT_MS_ID_SJIS 2
+#define TT_MS_ID_GB2312 3
+#define TT_MS_ID_BIG_5 4
+#define TT_MS_ID_WANSUNG 5
+#define TT_MS_ID_JOHAB 6
+
+
+
+/*
+ * possible values of the language identifier field in the name records of
+ * the TTF "name" table when the 'Platform' identifier code is
+ * TT_PLATFORM_MACINTOSH
+ *
+ * the canonical source for the Apple assigned Language ID's is at
+ * http://fonts.apple.com/TTRefMan/RM06/Chap6name.html
+ */
+
+#define TT_MAC_LANGID_ENGLISH 0
+#define TT_MAC_LANGID_FRENCH 1
+#define TT_MAC_LANGID_GERMAN 2
+#define TT_MAC_LANGID_ITALIAN 3
+#define TT_MAC_LANGID_DUTCH 4
+#define TT_MAC_LANGID_SWEDISH 5
+#define TT_MAC_LANGID_SPANISH 6
+#define TT_MAC_LANGID_DANISH 7
+#define TT_MAC_LANGID_PORTUGUESE 8
+#define TT_MAC_LANGID_NORWEGIAN 9
+#define TT_MAC_LANGID_HEBREW 10
+#define TT_MAC_LANGID_JAPANESE 11
+#define TT_MAC_LANGID_ARABIC 12
+#define TT_MAC_LANGID_FINNISH 13
+#define TT_MAC_LANGID_GREEK 14
+#define TT_MAC_LANGID_ICELANDIC 15
+#define TT_MAC_LANGID_MALTESE 16
+#define TT_MAC_LANGID_TURKISH 17
+#define TT_MAC_LANGID_CROATIAN 18
+#define TT_MAC_LANGID_CHINESE_TRADITIONAL 19
+#define TT_MAC_LANGID_URDU 20
+#define TT_MAC_LANGID_HINDI 21
+#define TT_MAC_LANGID_THAI 22
+#define TT_MAC_LANGID_KOREAN 23
+#define TT_MAC_LANGID_LITHUANIAN 24
+#define TT_MAC_LANGID_POLISH 25
+#define TT_MAC_LANGID_HUNGARIAN 26
+#define TT_MAC_LANGID_ESTONIAN 27
+#define TT_MAC_LANGID_LETTISH 28
+#define TT_MAC_LANGID_SAAMISK 29
+#define TT_MAC_LANGID_FAEROESE 30
+#define TT_MAC_LANGID_FARSI 31
+#define TT_MAC_LANGID_RUSSIAN 32
+#define TT_MAC_LANGID_CHINESE_SIMPLIFIED 33
+#define TT_MAC_LANGID_FLEMISH 34
+#define TT_MAC_LANGID_IRISH 35
+#define TT_MAC_LANGID_ALBANIAN 36
+#define TT_MAC_LANGID_ROMANIAN 37
+#define TT_MAC_LANGID_CZECH 38
+#define TT_MAC_LANGID_SLOVAK 39
+#define TT_MAC_LANGID_SLOVENIAN 40
+#define TT_MAC_LANGID_YIDDISH 41
+#define TT_MAC_LANGID_SERBIAN 42
+#define TT_MAC_LANGID_MACEDONIAN 43
+#define TT_MAC_LANGID_BULGARIAN 44
+#define TT_MAC_LANGID_UKRAINIAN 45
+#define TT_MAC_LANGID_BYELORUSSIAN 46
+#define TT_MAC_LANGID_UZBEK 47
+#define TT_MAC_LANGID_KAZAKH 48
+#define TT_MAC_LANGID_AZERBAIJANI 49
+#define TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT 50
+#define TT_MAC_LANGID_ARMENIAN 51
+#define TT_MAC_LANGID_GEORGIAN 52
+#define TT_MAC_LANGID_MOLDAVIAN 53
+#define TT_MAC_LANGID_KIRGHIZ 54
+#define TT_MAC_LANGID_TAJIKI 55
+#define TT_MAC_LANGID_TURKMEN 56
+#define TT_MAC_LANGID_MONGOLIAN 57
+#define TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT 58
+#define TT_MAC_LANGID_PASHTO 59
+#define TT_MAC_LANGID_KURDISH 60
+#define TT_MAC_LANGID_KASHMIRI 61
+#define TT_MAC_LANGID_SINDHI 62
+#define TT_MAC_LANGID_TIBETAN 63
+#define TT_MAC_LANGID_NEPALI 64
+#define TT_MAC_LANGID_SANSKRIT 65
+#define TT_MAC_LANGID_MARATHI 66
+#define TT_MAC_LANGID_BENGALI 67
+#define TT_MAC_LANGID_ASSAMESE 68
+#define TT_MAC_LANGID_GUJARATI 69
+#define TT_MAC_LANGID_PUNJABI 70
+#define TT_MAC_LANGID_ORIYA 71
+#define TT_MAC_LANGID_MALAYALAM 72
+#define TT_MAC_LANGID_KANNADA 73
+#define TT_MAC_LANGID_TAMIL 74
+#define TT_MAC_LANGID_TELUGU 75
+#define TT_MAC_LANGID_SINHALESE 76
+#define TT_MAC_LANGID_BURMESE 77
+#define TT_MAC_LANGID_KHMER 78
+#define TT_MAC_LANGID_LAO 79
+#define TT_MAC_LANGID_VIETNAMESE 80
+#define TT_MAC_LANGID_INDONESIAN 81
+#define TT_MAC_LANGID_TAGALOG 82
+#define TT_MAC_LANGID_MALAY_ROMAN_SCRIPT 83
+#define TT_MAC_LANGID_MALAY_ARABIC_SCRIPT 84
+#define TT_MAC_LANGID_AMHARIC 85
+#define TT_MAC_LANGID_TIGRINYA 86
+#define TT_MAC_LANGID_GALLA 87
+#define TT_MAC_LANGID_SOMALI 88
+#define TT_MAC_LANGID_SWAHILI 89
+#define TT_MAC_LANGID_RUANDA 90
+#define TT_MAC_LANGID_RUNDI 91
+#define TT_MAC_LANGID_CHEWA 92
+#define TT_MAC_LANGID_MALAGASY 93
+#define TT_MAC_LANGID_ESPERANTO 94
+#define TT_MAC_LANGID_WELSH 128
+#define TT_MAC_LANGID_BASQUE 129
+#define TT_MAC_LANGID_CATALAN 130
+#define TT_MAC_LANGID_LATIN 131
+#define TT_MAC_LANGID_QUECHUA 132
+#define TT_MAC_LANGID_GUARANI 133
+#define TT_MAC_LANGID_AYMARA 134
+#define TT_MAC_LANGID_TATAR 135
+#define TT_MAC_LANGID_UIGHUR 136
+#define TT_MAC_LANGID_DZONGKHA 137
+#define TT_MAC_LANGID_JAVANESE 138
+#define TT_MAC_LANGID_SUNDANESE 139
+#define TT_MAC_LANGID_SCOTTISH_GAELIC 140
+#define TT_MAC_LANGID_IRISH_GAELIC 141
+#define TT_MAC_LANGID_BRETON 142
+#define TT_MAC_LANGID_INUKTITUT 143
+
+
+/*
+ * possible values of the language identifier field in the name records of
+ * the TTF "name" table when the 'Platform' identifier code is
+ * TT_PLATFORM_MICROSOFT
+ *
+ * the canonical source for the MS assigned LCID's is at
+ * http://www.microsoft.com/typography/OTSPEC/lcid-cp.txt
+ */
+
+#define TT_MS_LANGID_ARABIC_SAUDI_ARABIA 0x0401
+#define TT_MS_LANGID_ARABIC_IRAQ 0x0801
+#define TT_MS_LANGID_ARABIC_EGYPT 0x0c01
+#define TT_MS_LANGID_ARABIC_LIBYA 0x1001
+#define TT_MS_LANGID_ARABIC_ALGERIA 0x1401
+#define TT_MS_LANGID_ARABIC_MOROCCO 0x1801
+#define TT_MS_LANGID_ARABIC_TUNISIA 0x1c01
+#define TT_MS_LANGID_ARABIC_OMAN 0x2001
+#define TT_MS_LANGID_ARABIC_YEMEN 0x2401
+#define TT_MS_LANGID_ARABIC_SYRIA 0x2801
+#define TT_MS_LANGID_ARABIC_JORDAN 0x2c01
+#define TT_MS_LANGID_ARABIC_LEBANON 0x3001
+#define TT_MS_LANGID_ARABIC_KUWAIT 0x3401
+#define TT_MS_LANGID_ARABIC_UAE 0x3801
+#define TT_MS_LANGID_ARABIC_BAHRAIN 0x3c01
+#define TT_MS_LANGID_ARABIC_QATAR 0x4001
+#define TT_MS_LANGID_BULGARIAN_BULGARIA 0x0402
+#define TT_MS_LANGID_CATALAN_SPAIN 0x0403
+#define TT_MS_LANGID_CHINESE_TAIWAN 0x0404
+#define TT_MS_LANGID_CHINESE_PRC 0x0804
+#define TT_MS_LANGID_CHINESE_HONG_KONG 0x0c04
+#define TT_MS_LANGID_CHINESE_SINGAPORE 0x1004
+#define TT_MS_LANGID_CHINESE_MACAU 0x1404
+#define TT_MS_LANGID_CZECH_CZECH_REPUBLIC 0x0405
+#define TT_MS_LANGID_DANISH_DENMARK 0x0406
+#define TT_MS_LANGID_GERMAN_GERMANY 0x0407
+#define TT_MS_LANGID_GERMAN_SWITZERLAND 0x0807
+#define TT_MS_LANGID_GERMAN_AUSTRIA 0x0c07
+#define TT_MS_LANGID_GERMAN_LUXEMBOURG 0x1007
+#define TT_MS_LANGID_GERMAN_LIECHTENSTEI 0x1407
+#define TT_MS_LANGID_GREEK_GREECE 0x0408
+#define TT_MS_LANGID_ENGLISH_UNITED_STATES 0x0409
+#define TT_MS_LANGID_ENGLISH_UNITED_KINGDOM 0x0809
+#define TT_MS_LANGID_ENGLISH_AUSTRALIA 0x0c09
+#define TT_MS_LANGID_ENGLISH_CANADA 0x1009
+#define TT_MS_LANGID_ENGLISH_NEW_ZEALAND 0x1409
+#define TT_MS_LANGID_ENGLISH_IRELAND 0x1809
+#define TT_MS_LANGID_ENGLISH_SOUTH_AFRICA 0x1c09
+#define TT_MS_LANGID_ENGLISH_JAMAICA 0x2009
+#define TT_MS_LANGID_ENGLISH_CARIBBEAN 0x2409
+#define TT_MS_LANGID_ENGLISH_BELIZE 0x2809
+#define TT_MS_LANGID_ENGLISH_TRINIDAD 0x2c09
+#define TT_MS_LANGID_ENGLISH_ZIMBABWE 0x3009
+#define TT_MS_LANGID_ENGLISH_PHILIPPINES 0x3409
+#define TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT 0x040a
+#define TT_MS_LANGID_SPANISH_MEXICO 0x080a
+#define TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT 0x0c0a
+#define TT_MS_LANGID_SPANISH_GUATEMALA 0x100a
+#define TT_MS_LANGID_SPANISH_COSTA_RICA 0x140a
+#define TT_MS_LANGID_SPANISH_PANAMA 0x180a
+#define TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC 0x1c0a
+#define TT_MS_LANGID_SPANISH_VENEZUELA 0x200a
+#define TT_MS_LANGID_SPANISH_COLOMBIA 0x240a
+#define TT_MS_LANGID_SPANISH_PERU 0x280a
+#define TT_MS_LANGID_SPANISH_ARGENTINA 0x2c0a
+#define TT_MS_LANGID_SPANISH_ECUADOR 0x300a
+#define TT_MS_LANGID_SPANISH_CHILE 0x340a
+#define TT_MS_LANGID_SPANISH_URUGUAY 0x380a
+#define TT_MS_LANGID_SPANISH_PARAGUAY 0x3c0a
+#define TT_MS_LANGID_SPANISH_BOLIVIA 0x400a
+#define TT_MS_LANGID_SPANISH_EL_SALVADOR 0x440a
+#define TT_MS_LANGID_SPANISH_HONDURAS 0x480a
+#define TT_MS_LANGID_SPANISH_NICARAGUA 0x4c0a
+#define TT_MS_LANGID_SPANISH_PUERTO_RICO 0x500a
+#define TT_MS_LANGID_FINNISH_FINLAND 0x040b
+#define TT_MS_LANGID_FRENCH_FRANCE 0x040c
+#define TT_MS_LANGID_FRENCH_BELGIUM 0x080c
+#define TT_MS_LANGID_FRENCH_CANADA 0x0c0c
+#define TT_MS_LANGID_FRENCH_SWITZERLAND 0x100c
+#define TT_MS_LANGID_FRENCH_LUXEMBOURG 0x140c
+#define TT_MS_LANGID_FRENCH_MONACO 0x180c
+#define TT_MS_LANGID_HEBREW_ISRAEL 0x040d
+#define TT_MS_LANGID_HUNGARIAN_HUNGARY 0x040e
+#define TT_MS_LANGID_ICELANDIC_ICELAND 0x040f
+#define TT_MS_LANGID_ITALIAN_ITALY 0x0410
+#define TT_MS_LANGID_ITALIAN_SWITZERLAND 0x0810
+#define TT_MS_LANGID_JAPANESE_JAPAN 0x0411
+#define TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA 0x0412
+#define TT_MS_LANGID_KOREAN_JOHAB_KOREA 0x0812
+#define TT_MS_LANGID_DUTCH_NETHERLANDS 0x0413
+#define TT_MS_LANGID_DUTCH_BELGIUM 0x0813
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL 0x0414
+#define TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK 0x0814
+#define TT_MS_LANGID_POLISH_POLAND 0x0415
+#define TT_MS_LANGID_PORTUGUESE_BRAZIL 0x0416
+#define TT_MS_LANGID_PORTUGUESE_PORTUGAL 0x0816
+#define TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND 0x0417
+#define TT_MS_LANGID_ROMANIAN_ROMANIA 0x0418
+#define TT_MS_LANGID_MOLDAVIAN_MOLDAVIA 0x0818
+#define TT_MS_LANGID_RUSSIAN_RUSSIA 0x0419
+#define TT_MS_LANGID_RUSSIAN_MOLDAVIA 0x0819
+#define TT_MS_LANGID_CROATIAN_CROATIA 0x041a
+#define TT_MS_LANGID_SERBIAN_SERBIA_LATIN 0x081a
+#define TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC 0x0c1a
+#define TT_MS_LANGID_SLOVAK_SLOVAKIA 0x041b
+#define TT_MS_LANGID_ALBANIAN_ALBANIA 0x041c
+#define TT_MS_LANGID_SWEDISH_SWEDEN 0x041d
+#define TT_MS_LANGID_SWEDISH_FINLAND 0x081d
+#define TT_MS_LANGID_THAI_THAILAND 0x041e
+#define TT_MS_LANGID_TURKISH_TURKEY 0x041f
+#define TT_MS_LANGID_URDU_PAKISTAN 0x0420
+#define TT_MS_LANGID_INDONESIAN_INDONESIA 0x0421
+#define TT_MS_LANGID_UKRAINIAN_UKRAINE 0x0422
+#define TT_MS_LANGID_BELARUSIAN_BELARUS 0x0423
+#define TT_MS_LANGID_SLOVENE_SLOVENIA 0x0424
+#define TT_MS_LANGID_ESTONIAN_ESTONIA 0x0425
+#define TT_MS_LANGID_LATVIAN_LATVIA 0x0426
+#define TT_MS_LANGID_LITHUANIAN_LITHUANIA 0x0427
+#define TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA 0x0827
+#define TT_MS_LANGID_MAORI_NEW_ZEALAND 0x0428
+#define TT_MS_LANGID_FARSI_IRAN 0x0429
+#define TT_MS_LANGID_VIETNAMESE_VIET_NAM 0x042a
+#define TT_MS_LANGID_ARMENIAN_ARMENIA 0x042b
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN 0x042c
+#define TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC 0x082c
+#define TT_MS_LANGID_BASQUE_SPAIN 0x042d
+#define TT_MS_LANGID_SORBIAN_GERMANY 0x042e
+#define TT_MS_LANGID_MACEDONIAN_MACEDONIA 0x042f
+#define TT_MS_LANGID_SUTU_SOUTH_AFRICA 0x0430
+#define TT_MS_LANGID_TSONGA_SOUTH_AFRICA 0x0431
+#define TT_MS_LANGID_TSWANA_SOUTH_AFRICA 0x0432
+#define TT_MS_LANGID_VENDA_SOUTH_AFRICA 0x0433
+#define TT_MS_LANGID_XHOSA_SOUTH_AFRICA 0x0434
+#define TT_MS_LANGID_ZULU_SOUTH_AFRICA 0x0435
+#define TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA 0x0436
+#define TT_MS_LANGID_GEORGIAN_GEORGIA 0x0437
+#define TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS 0x0438
+#define TT_MS_LANGID_HINDI_INDIA 0x0439
+#define TT_MS_LANGID_MALTESE_MALTA 0x043a
+#define TT_MS_LANGID_SAAMI_LAPONIA 0x043b
+#define TT_MS_LANGID_IRISH_GAELIC_IRELAND 0x043c
+#define TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM 0x083c
+#define TT_MS_LANGID_MALAY_MALAYSIA 0x043e
+#define TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM 0x083e
+#define TT_MS_LANGID_KAZAK_KAZAKSTAN 0x043f
+#define TT_MS_LANGID_SWAHILI_KENYA 0x0441
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN 0x0443
+#define TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC 0x0843
+#define TT_MS_LANGID_TATAR_TATARSTAN 0x0444
+#define TT_MS_LANGID_BENGALI_INDIA 0x0445
+#define TT_MS_LANGID_PUNJABI_INDIA 0x0446
+#define TT_MS_LANGID_GUJARATI_INDIA 0x0447
+#define TT_MS_LANGID_ORIYA_INDIA 0x0448
+#define TT_MS_LANGID_TAMIL_INDIA 0x0449
+#define TT_MS_LANGID_TELUGU_INDIA 0x044a
+#define TT_MS_LANGID_KANNADA_INDIA 0x044b
+#define TT_MS_LANGID_MALAYALAM_INDIA 0x044c
+#define TT_MS_LANGID_ASSAMESE_INDIA 0x044d
+#define TT_MS_LANGID_MARATHI_INDIA 0x044e
+#define TT_MS_LANGID_SANSKRIT_INDIA 0x044f
+#define TT_MS_LANGID_KONKANI_INDIA 0x0457
+
+
+/*
+ * possible values of the 'Name' identifier field in the name records of
+ * the TTF "name" table. These values are platform independent.
+ */
+
+#define TT_NAME_ID_COPYRIGHT 0
+#define TT_NAME_ID_FONT_FAMILY 1
+#define TT_NAME_ID_FONT_SUBFAMILY 2
+#define TT_NAME_ID_UNIQUE_ID 3
+#define TT_NAME_ID_FULL_NAME 4
+#define TT_NAME_ID_VERSION_STRING 5
+#define TT_NAME_ID_PS_NAME 6
+#define TT_NAME_ID_TRADEMARK 7
+/* the following values are from the OpenType spec */
+#define TT_NAME_ID_MANUFACTURER 8
+#define TT_NAME_ID_DESIGNER 9
+#define TT_NAME_ID_DESCRIPTION 10
+#define TT_NAME_ID_VENDOR_URL 11
+#define TT_NAME_ID_DESIGNER_URL 12
+#define TT_NAME_ID_LICENSE 13
+#define TT_NAME_ID_LICENSE_URL 14
+/* number 15 is reserved */
+#define TT_NAME_ID_PREFERRED_FAMILY 16
+#define TT_NAME_ID_PREFERRED_SUBFAMILY 17
+#define TT_NAME_ID_MAC_FULL_NAME 18
+
+
+/*
+ * Bit Mask values for the Unicode Ranges from the TTF "OS2 " table.
+ */
+
+/* General Scripts Area */
+
+/* Bit 0 C0 Controls and Basic Latin */
+#define TT_UCR_BASIC_LATIN (1 << 0) /* U+0000-U+007F */
+/* Bit 1 C1 Controls and Latin-1 Supplement */
+#define TT_UCR_LATIN1_SUPPLEMENT (1 << 1) /* U+0080-U+00FF */
+/* Bit 2 Latin Extended-A */
+#define TT_UCR_LATIN_EXTENDED_A (1 << 2) /* U+0100-U+017F */
+/* Bit 3 Latin Extended-B */
+#define TT_UCR_LATIN_EXTENDED_B (1 << 3) /* U+0180-U+024F */
+/* Bit 4 IPA Extensions */
+#define TT_UCR_IPA_EXTENSIONS (1 << 4) /* U+0250-U+02AF */
+/* Bit 5 Spacing Modifier Letters */
+#define TT_UCR_SPACING_MODIFIER (1 << 5) /* U+02B0-U+02FF */
+/* Bit 6 Combining Diacritical Marks */
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS (1 << 6) /* U+0300-U+036F */
+/* Bit 7 Greek */
+#define TT_UCR_GREEK (1 << 7) /* U+0370-U+03FF */
+/* Bit 8 is reserved (was: Greek Symbols and Coptic) */
+/* Bit 9 Cyrillic */
+#define TT_UCR_CYRILLIC (1 << 9) /* U+0400-U+04FF */
+/* Bit 10 Armenian */
+#define TT_UCR_ARMENIAN (1 << 10) /* U+0530-U+058F */
+/* Bit 11 Hebrew */
+#define TT_UCR_HEBREW (1 << 11) /* U+0590-U+05FF */
+/* Bit 12 is reserved (was: Hebrew Extended) */
+/* Bit 13 Arabic */
+#define TT_UCR_ARABIC (1 << 13) /* U+0600-U+06FF */
+/* Bit 14 is reserved (was: Arabic Extended) */
+/* Bit 15 Devanagari */
+#define TT_UCR_DEVANAGARI (1 << 15) /* U+0900-U+097F */
+/* Bit 16 Bengali */
+#define TT_UCR_BENGALI (1 << 16) /* U+0980-U+09FF */
+/* Bit 17 Gurmukhi */
+#define TT_UCR_GURMUKHI (1 << 17) /* U+0A00-U+0A7F */
+/* Bit 18 Gujarati */
+#define TT_UCR_GUJARATI (1 << 18) /* U+0A80-U+0AFF */
+/* Bit 19 Oriya */
+#define TT_UCR_ORIYA (1 << 19) /* U+0B00-U+0B7F */
+/* Bit 20 Tamil */
+#define TT_UCR_TAMIL (1 << 20) /* U+0B80-U+0BFF */
+/* Bit 21 Telugu */
+#define TT_UCR_TELUGU (1 << 21) /* U+0C00-U+0C7F */
+/* Bit 22 Kannada */
+#define TT_UCR_KANNADA (1 << 22) /* U+0C80-U+0CFF */
+/* Bit 23 Malayalam */
+#define TT_UCR_MALAYALAM (1 << 23) /* U+0D00-U+0D7F */
+/* Bit 24 Thai */
+#define TT_UCR_THAI (1 << 24) /* U+0E00-U+0E7F */
+/* Bit 25 Lao */
+#define TT_UCR_LAO (1 << 25) /* U+0E80-U+0EFF */
+/* Bit 26 Georgian */
+#define TT_UCR_GEORGIAN (1 << 26) /* U+10A0-U+10FF */
+/* Bit 27 is reserved (was Georgian Extended) */
+/* Bit 28 Hangul Jamo */
+#define TT_UCR_HANGUL_JAMO (1 << 28) /* U+1100-U+11FF */
+/* Bit 29 Latin Extended Additional */
+#define TT_UCR_LATIN_EXTENDED_ADDITIONAL (1 << 29) /* U+1E00-U+1EFF */
+/* Bit 30 Greek Extended */
+#define TT_UCR_GREEK_EXTENDED (1 << 30) /* U+1F00-U+1FFF */
+
+/* Symbols Area */
+
+/* Bit 31 General Punctuation */
+#define TT_UCR_GENERAL_PUNCTUATION (1 << 31) /* U+2000-U+206F */
+/* Bit 32 Superscripts And Subscripts */
+#define TT_UCR_SUPERSCRIPTS_SUBSCRIPTS (1 << 0) /* U+2070-U+209F */
+/* Bit 33 Currency Symbols */
+#define TT_UCR_CURRENCY_SYMBOLS (1 << 1) /* U+20A0-U+20CF */
+/* Bit 34 Combining Diacritical Marks For Symbols */
+#define TT_UCR_COMBINING_DIACRITICAL_MARKS_SYMB (1 << 2) /* U+20D0-U+20FF */
+/* Bit 35 Letterlike Symbols */
+#define TT_UCR_LETTERLIKE_SYMBOLS (1 << 3) /* U+2100-U+214F */
+/* Bit 36 Number Forms */
+#define TT_UCR_NUMBER_FORMS (1 << 4) /* U+2150-U+218F */
+/* Bit 37 Arrows */
+#define TT_UCR_ARROWS (1 << 5) /* U+2190-U+21FF */
+/* Bit 38 Mathematical Operators */
+#define TT_UCR_MATHEMATICAL_OPERATORS (1 << 6) /* U+2200-U+22FF */
+/* Bit 39 Miscellaneous Technical */
+#define TT_UCR_MISCELLANEOUS_TECHNICAL (1 << 7) /* U+2300-U+23FF */
+/* Bit 40 Control Pictures */
+#define TT_UCR_CONTROL_PICTURES (1 << 8) /* U+2400-U+243F */
+/* Bit 41 Optical Character Recognition */
+#define TT_UCR_OCR (1 << 9) /* U+2440-U+245F */
+/* Bit 42 Enclosed Alphanumerics */
+#define TT_UCR_ENCLOSED_ALPHANUMERICS (1 << 10) /* U+2460-U+24FF */
+/* Bit 43 Box Drawing */
+#define TT_UCR_BOX_DRAWING (1 << 11) /* U+2500-U+257F */
+/* Bit 44 Block Elements */
+#define TT_UCR_BLOCK_ELEMENTS (1 << 12) /* U+2580-U+259F */
+/* Bit 45 Geometric Shapes */
+#define TT_UCR_GEOMETRIC_SHAPES (1 << 13) /* U+25A0-U+25FF */
+/* Bit 46 Miscellaneous Symbols */
+#define TT_UCR_MISCELLANEOUS_SYMBOLS (1 << 14) /* U+2600-U+26FF */
+/* Bit 47 Dingbats */
+#define TT_UCR_DINGBATS (1 << 15) /* U+2700-U+27BF */
+
+/* CJK Phonetics and Symbols Area */
+
+/* Bit 48 CJK Symbols And Punctuation */
+#define TT_UCR_CJK_SYMBOLS (1 << 16) /* U+3000-U+303F */
+/* Bit 49 Hiragana */
+#define TT_UCR_HIRAGANA (1 << 17) /* U+3040-U+309F */
+/* Bit 50 Katakana */
+#define TT_UCR_KATAKANA (1 << 18) /* U+30A0-U+30FF */
+/* Bit 51 Bopomofo */
+#define TT_UCR_BOPOMOFO (1 << 19) /* U+3100-U+312F */
+/* Bit 52 Hangul Compatibility Jamo */
+#define TT_UCR_HANGUL_COMPATIBILITY_JAMO (1 << 20) /* U+3130-U+318F */
+/* Bit 53 CJK Miscellaneous */
+#define TT_UCR_CJK_MISC (1 << 21) /* U+3190-U+319F */
+/* Bit 54 Enclosed CJK Letters And Months */
+#define TT_UCR_ENCLOSED_CJK_LETTERS_MONTHS (1 << 22) /* U+3200-U+32FF */
+/* Bit 55 CJK Compatibility */
+#define TT_UCR_CJK_COMPATIBILITY (1 << 23) /* U+3300-U+33FF */
+
+/* Hangul Syllables Area */
+
+/* Bit 56 Hangul */
+#define TT_UCR_HANGUL (1 << 24) /* U+AC00-U+D7A3 */
+
+/* Surrogates Area */
+
+/* Bit 57 Surrogates */
+#define TT_UCR_SURROGATES (1 << 25) /* U+D800-U+DFFF */
+/* Bit 58 is reserved for Unicode SubRanges */
+
+/* CJK Ideographs Area */
+
+/* Bit 59 CJK Unified Ideographs */
+#define TT_UCR_CJK_UNIFIED_IDEOGRAPHS (1 << 27) /* U+4E00-U+9FFF */
+
+/* Private Use Area */
+
+/* Bit 60 Private Use */
+#define TT_UCR_PRIVATE_USE (1 << 28) /* U+E000-U+F8FF */
+
+/* Compatibility Area and Specials */
+
+/* Bit 61 CJK Compatibility Ideographs */
+#define TT_UCR_CJK_COMPATIBILITY_IDEOGRAPHS (1 << 29) /* U+F900-U+FAFF */
+/* Bit 62 Alphabetic Presentation Forms */
+#define TT_UCR_ALPHABETIC_PRESENTATION_FORMS (1 << 30) /* U+FB00-U+FB4F */
+/* Bit 63 Arabic Presentation Forms-A */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_A (1 << 31) /* U+FB50-U+FSFF */
+/* Bit 64 Combining Half Marks */
+#define TT_UCR_COMBINING_HALF_MARKS (1 << 0) /* U+FE20-U+FE2F */
+/* Bit 65 CJK Compatibility Forms */
+#define TT_UCR_CJK_COMPATIBILITY_FORMS (1 << 1) /* U+FE30-U+FE4F */
+/* Bit 66 Small Form Variants */
+#define TT_UCR_SMALL_FORM_VARIANTS (1 << 2) /* U+FE50-U+FE6F */
+/* Bit 67 Arabic Presentation Forms-B */
+#define TT_UCR_ARABIC_PRESENTATION_FORMS_B (1 << 3) /* U+FE70-U+FEFF */
+/* Bit 68 Halfwidth And Fullwidth Forms */
+#define TT_UCR_HALFWIDTH_FULLWIDTH_FORMS (1 << 4) /* U+FF00-U+FFEF */
+/* Bit 69 Specials */
+#define TT_UCR_SPECIALS (1 << 5) /* U+FEFF,
+ U+FFF0-U+FFFF */
+/* Bit 70 Tibetan */
+#define TT_UCR_TIBETAN (1 << 6) /* U+0F00-U+0FBF */
+
+#endif /* FTNAMEID_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/header.h b/xc/extras/FreeType/lib/header.h
new file mode 100644
index 000000000..ebd557440
--- /dev/null
+++ b/xc/extras/FreeType/lib/header.h
@@ -0,0 +1,49 @@
+/*******************************************************************
+ *
+ * Function :
+ *
+ * Description :
+ *
+ * Input :
+ *
+ * Output :
+ *
+ * Notes :
+ *
+ ******************************************************************/
+
+/*******************************************************************
+ *
+ * Function :
+ *
+ * Description :
+ *
+ * Input : None
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+/*******************************************************************
+ *
+ * Function :
+ *
+ * Description :
+ *
+ ******************************************************************/
+
+/*******************************************************************
+ *
+ * Component Name (e.g. TTRaster.C) + eventually a version number.
+ *
+ * Component Short Description (e.g. Rasterizer).
+ *
+ * Copyright 1996 David Turner, Robert Wilhelm and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ ******************************************************************/
diff --git a/xc/extras/FreeType/lib/ttapi.c b/xc/extras/FreeType/lib/ttapi.c
new file mode 100644
index 000000000..1a133f88f
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttapi.c
@@ -0,0 +1,2191 @@
+/*******************************************************************
+ *
+ * ttapi.c
+ *
+ * High-level interface implementation
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used,
+ * modified, and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Notes:
+ *
+ * This file is used to implement most of the functions that are
+ * defined in the file "freetype.h". However, two functions are
+ * implemented elsewhere :
+ *
+ * TT_MulDiv and TT_MulFix are in ttcalc.h/ttcalc.c
+ *
+ ******************************************************************/
+
+#include "freetype.h"
+#include "ttengine.h"
+#include "ttcalc.h"
+#include "ttmemory.h"
+#include "ttcache.h"
+#include "ttfile.h"
+#include "ttobjs.h"
+#include "ttload.h"
+#include "ttgload.h"
+#include "ttraster.h"
+#include "ttextend.h"
+
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_api
+
+
+#ifdef TT_STATIC_RASTER
+#define RAS_OPS /* void */
+#define RAS_OP /* void */
+#else
+#define RAS_OPS ((TRaster_Instance*)_engine->raster_component),
+#define RAS_OP ((TRaster_Instance*)_engine->raster_component)
+#endif /* TT_STATIC_RASTER */
+
+
+#define RENDER_Glyph( glyph, target ) \
+ Render_Glyph( RAS_OPS glyph, target )
+
+#define RENDER_Gray_Glyph( glyph, target, palette ) \
+ Render_Gray_Glyph( RAS_OPS glyph, target, palette )
+
+
+
+/*******************************************************************
+ *
+ * Function : TT_Init_FreeType
+ *
+ * Description : The library's engine initializer. This function
+ * must be called prior to any call.
+ *
+ * Input : engine pointer to a FreeType engine instance
+ *
+ * Output : Error code.
+ *
+ * MT-Note : This function should be called each time you want
+ * to create a TT_Engine. It is not necessarily thread
+ * safe depending on the implementations of ttmemory,
+ * ttfile and ttmutex, so take care. Their default
+ * implementations are safe, however.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Init_FreeType( TT_Engine* engine )
+ {
+ PEngine_Instance _engine;
+
+ TT_Error error;
+ int n;
+
+
+ /* first of all, initialize memory sub-system */
+ error = TTMemory_Init();
+ if ( error )
+ return error;
+
+ /* Allocate engine instance */
+ if ( ALLOC( _engine, sizeof ( TEngine_Instance ) ) )
+ return error;
+
+#undef TT_FAIL
+#define TT_FAIL( x ) ( error = x (_engine) ) != TT_Err_Ok
+
+ /* Initalize components */
+ if ( TT_FAIL( TTFile_Init ) ||
+ TT_FAIL( TTCache_Init ) ||
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+ TT_FAIL( TTExtend_Init ) ||
+#endif
+ TT_FAIL( TTObjs_Init ) ||
+ TT_FAIL( TTRaster_Init ) )
+ goto Fail;
+
+#undef TT_FAIL
+
+ /* set the gray palette defaults: 0 to 4 */
+ for ( n = 0; n < 5; n++ )
+ _engine->raster_palette[n] = (Byte)n; /* Conversion ok, some warn */
+
+ /* create the engine lock */
+ MUTEX_Create( _engine->lock );
+
+ HANDLE_Set( *engine, _engine );
+ return TT_Err_Ok;
+
+ Fail:
+ TT_Done_FreeType( *engine );
+ HANDLE_Set( *engine, NULL );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_FreeType
+ *
+ * Description : The library's engine finalizer. This function
+ * will discard all active face and glyph objects
+ * from the heap.
+ *
+ * Input : engine FreeType engine instance
+ *
+ * Output : Error code.
+ *
+ * MT-Note : Destroys an engine. Not necessarily thread-safe
+ * depending on the implementations of ttmemory,
+ * ttfile and ttmutex. The default implementations
+ * are safe, however.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_FreeType( TT_Engine engine )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+
+
+ if ( !_engine )
+ return TT_Err_Ok;
+
+ MUTEX_Destroy( _engine->lock );
+
+ TTRaster_Done( _engine );
+ TTObjs_Done ( _engine );
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+ TTExtend_Done( _engine );
+#endif
+ TTCache_Done ( _engine );
+ TTFile_Done ( _engine );
+ FREE( _engine );
+
+ TTMemory_Done();
+
+ return TT_Err_Ok;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_GRAY_SCALING
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Raster_Gray_Palette
+ *
+ * Description : Sets the gray-levels palette used for font
+ * smoothing.
+ *
+ * Input : engine FreeType engine instance
+ * palette address of palette (a 5 byte array)
+ *
+ * Output : Invalid argument if 'palette' is NULL.
+ *
+ * MT-Note: NO! Unprotected modification of an engine's palette.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Raster_Gray_Palette( TT_Engine engine,
+ Byte* palette )
+ {
+ int i;
+
+
+ if ( !palette )
+ return TT_Err_Invalid_Argument;
+
+ for ( i = 0; i < 5; i++ )
+ HANDLE_Engine( engine )->raster_palette[i] = (Byte)palette[i];
+
+ return TT_Err_Ok;
+ }
+
+#endif /* TT_CONFIG_OPTION_GRAY_SCALING */
+
+
+/*******************************************************************
+ *
+ * Function : TT_Open_Face
+ *
+ * Description : Creates a new face object from a given font file.
+ *
+ * Input : engine FreeType engine instance
+ * fontPathName the font file's pathname
+ * face adress of returned face handle
+ *
+ * Output : Error code.
+ *
+ * Note : The face handle is set to NULL in case of failure.
+ *
+ * MT-Note : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Open_Face( TT_Engine engine,
+ const TT_Text* fontPathName,
+ TT_Face* face )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+
+ TFont_Input input;
+ TT_Error error;
+ TT_Stream stream;
+ PFace _face;
+
+
+ if ( !_engine )
+ return TT_Err_Invalid_Engine;
+
+ /* open the file */
+ error = TT_Open_Stream( fontPathName, &stream );
+ if ( error )
+ return error;
+
+ input.stream = stream;
+ input.fontIndex = 0;
+ input.engine = _engine;
+
+ /* Create and load the new face object - this is thread-safe */
+ error = CACHE_New( _engine->objs_face_cache,
+ _face,
+ &input );
+
+ /* Set the handle */
+ HANDLE_Set( *face, _face );
+
+ if ( error )
+ goto Fail;
+
+ return TT_Err_Ok;
+
+ Fail:
+ TT_Close_Stream( &stream );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Open_Collection
+ *
+ * Description : Creates a new face object from a given font file.
+ *
+ * Input : engine FreeType engine instance
+ * collectionPathName the font file's pathname
+ * fontIndex index of font in TrueType collection
+ * face adress of returned face handle
+ *
+ * Output : Error code.
+ *
+ * Note : The face handle is set to NULL in case of failure.
+ *
+ * MT-Note : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Open_Collection( TT_Engine engine,
+ const TT_Text* collectionPathName,
+ TT_ULong fontIndex,
+ TT_Face* face )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+
+ TFont_Input input;
+ TT_Error error;
+ TT_Stream stream;
+ PFace _face;
+
+
+ if ( !_engine )
+ return TT_Err_Invalid_Engine;
+
+ /* open the file */
+ error = TT_Open_Stream( collectionPathName, &stream );
+ if ( error )
+ return error;
+
+ input.stream = stream;
+ input.fontIndex = fontIndex;
+ input.engine = _engine;
+
+ /* Create and load the new face object - this is thread-safe */
+ error = CACHE_New( _engine->objs_face_cache,
+ _face,
+ &input );
+
+ /* Set the handle */
+ HANDLE_Set( *face, _face );
+
+ if ( error )
+ goto Fail;
+
+ return TT_Err_Ok;
+
+ Fail:
+ TT_Close_Stream( &stream );
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Face_Properties
+ *
+ * Description : Returns face properties.
+ *
+ * Input : face the face handle
+ * properties address of target properties record
+ *
+ * Output : Error code.
+ *
+ * Note : Currently, max_Faces is always set to 0.
+ *
+ * MT-Note : YES! Reads only permanent data.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Face_Properties( TT_Face face,
+ TT_Face_Properties* properties )
+ {
+ PFace _face = HANDLE_Face( face );
+
+
+ if ( !_face )
+ return TT_Err_Invalid_Face_Handle;
+
+ properties->num_Glyphs = _face->numGlyphs;
+ properties->max_Points = _face->maxPoints;
+ properties->max_Contours = _face->maxContours;
+ properties->num_CharMaps = _face->numCMaps;
+ properties->num_Names = _face->nameTable.numNameRecords;
+
+ if ( _face->ttcHeader.DirCount == 0 )
+ properties->num_Faces = 1;
+ else
+ properties->num_Faces = _face->ttcHeader.DirCount;
+
+ properties->header = &_face->fontHeader;
+ properties->horizontal = &_face->horizontalHeader;
+
+ if ( _face->verticalInfo )
+ properties->vertical = &_face->verticalHeader;
+ else
+ properties->vertical = NULL;
+
+ properties->os2 = &_face->os2;
+ properties->postscript = &_face->postscript;
+ properties->hdmx = &_face->hdmx;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Face_Pointer
+ *
+ * Description : Each face object has one pointer, which use is
+ * reserved to client applications. The TrueType
+ * engine never accesses or uses this field.
+ *
+ * This function is used to set the pointer.
+ *
+ * Input : face the given face handle
+ * data the generic pointer value
+ *
+ * Output : Error code.
+ *
+ * MT-Note : NO! But this function is reserved to "enlightened"
+ * developers, so it shouldn't be a problem.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Face_Pointer( TT_Face face,
+ void* data )
+ {
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+ else
+ faze->generic = data;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Face_Pointer
+ *
+ * Description : Each face object has one pointer, which use is
+ * reserved to client applications. The TrueType
+ * engine never access or use this field.
+ *
+ * This function is used to read the pointer.
+ *
+ * Input : face the given face handle
+ * data the generic pointer value
+ *
+ * Output : Error code.
+ *
+ * MT-Note : NO! But this function is reserved to "enlightened"
+ * developers, so it shouldn't be a problem.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ void* TT_Get_Face_Pointer( TT_Face face )
+ {
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return NULL;
+ else
+ return faze->generic;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Face_Metrics
+ *
+ * Description : This function returns the original horizontal AND
+ * vertical metrics as found in the "hmtx" and "vmtx"
+ * tables. These are the glyphs' left-side-bearings
+ * and advance widths (horizontal), as well as top
+ * side bearings and advance heights (vertical).
+ *
+ * All are expressed in FONT UNITS, a.k.a. EM
+ * units.
+ *
+ * Input : face The given face handle.
+ * first Index of first glyph in table.
+ * last Index of last glyph in table.
+ *
+ * leftBearings A pointer to an array of TT_Shorts where the
+ * left side bearings for the glyphs 'first'
+ * to 'last' will be returned. If these metrics
+ * don't interest you, simply set it to NULL.
+ *
+ * widths A pointer to an array of TT_UShorts
+ * where the advance widths for the glyphs
+ * 'first' to 'last' will be returned. If these
+ * metrics don't interest you, simply set it
+ * to NULL.
+ *
+ * topBearings A pointer to an array of TT_Shorts where the
+ * top side bearings for the glyphs 'first'
+ * to 'last' will be returned. If these metrics
+ * don't interest you, simply set it to NULL.
+ *
+ * heights A pointer to an array of TT_UShorts
+ * where the advance heights for the glyphs
+ * 'first' to 'last' will be returned. If these
+ * metrics don't interest you, simply set it
+ * to NULL.
+ *
+ * Output : Error code.
+ *
+ * IMPORTANT NOTE :
+ *
+ * As vertical metrics are optional in a TrueType font, this
+ * function will return an error ( TT_Err_No_Vertical_Data )
+ * whenever this function is called on such a face with non-NULL
+ * 'topBearings' or 'heights' arguments.
+ *
+ * When a font has no vertical data, the 'vertical' field in its
+ * properties structure is set to NULL.
+ *
+ * MT-Note : YES! Reads only permanent data.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Face_Metrics( TT_Face face,
+ TT_UShort firstGlyph,
+ TT_UShort lastGlyph,
+ TT_Short* leftBearings,
+ TT_UShort* widths,
+ TT_Short* topBearings,
+ TT_UShort* heights )
+ {
+ PFace _face = HANDLE_Face( face );
+ UShort num;
+
+
+ if ( !_face )
+ return TT_Err_Invalid_Face_Handle;
+
+ /* Check the glyph range */
+ if ( lastGlyph >= _face->numGlyphs || firstGlyph > lastGlyph )
+ return TT_Err_Invalid_Argument;
+
+ num = lastGlyph - firstGlyph; /* number of elements-1 in each array */
+
+ /* store the left side bearings and advance widths first */
+ {
+ UShort n;
+ Short left_bearing;
+ UShort advance_width;
+
+
+ for ( n = 0; n <= num; n++ )
+ {
+ TT_Get_Metrics( &_face->horizontalHeader,
+ firstGlyph + n, &left_bearing, &advance_width );
+
+ if ( leftBearings ) leftBearings[n] = left_bearing;
+ if ( widths ) widths[n] = advance_width;
+ }
+ }
+
+ /* check for vertical data if topBearings or heights is non-NULL */
+ if ( !topBearings && !heights )
+ return TT_Err_Ok;
+
+ if ( !_face->verticalInfo )
+ return TT_Err_No_Vertical_Data;
+
+ /* store the top side bearings */
+ {
+ UShort n;
+ Short top_bearing;
+ UShort advance_height;
+
+ for ( n = 0; n <= num; n++ )
+ {
+ TT_Get_Metrics( (TT_Horizontal_Header*)&_face->verticalHeader,
+ firstGlyph + n, &top_bearing, &advance_height );
+
+ if ( topBearings ) topBearings[n] = top_bearing;
+ if ( heights ) heights[n] = advance_height;
+ }
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Flush_Face
+ *
+ * Description : This function is used to close an active face's
+ * file handle or descriptor. This is useful to save
+ * system resources, if your application uses tons
+ * of fonts.
+ *
+ * Input : face the given face handle
+ *
+ * Output : Error code.
+ *
+ * MT-Note : YES! (If ttfile is.)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Flush_Face( TT_Face face )
+ {
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+ else
+ return TT_Flush_Stream( &faze->stream );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Close_Face
+ *
+ * Description : Closes an opened face object. This function
+ * will destroy all objects associated to the
+ * face, except the glyphs.
+ *
+ * Input : face the given face handle
+ *
+ * Output : Error code.
+ *
+ * NOTE : The handle is set to NULL on exit.
+ *
+ * MT-Note : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Close_Face( TT_Face face )
+ {
+ PFace _face = HANDLE_Face( face );
+
+
+ if ( !_face )
+ return TT_Err_Invalid_Face_Handle;
+
+ TT_Close_Stream( &_face->stream );
+
+ /* delete the face object -- this is thread-safe */
+ return CACHE_Done( _face->engine->objs_face_cache, _face );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_New_Instance
+ *
+ * Description : Creates a new instance from a given face.
+ *
+ * Input : face parent face handle
+ * instance address of instance handle
+ *
+ * Output : Error code.
+ *
+ * Note : The handle is set to NULL in case of failure.
+ *
+ * MT-Note : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_New_Instance( TT_Face face,
+ TT_Instance* instance )
+ {
+ TT_Error error;
+ PFace _face = HANDLE_Face( face );
+ PInstance _ins;
+
+
+ if ( !_face )
+ return TT_Err_Invalid_Face_Handle;
+
+ /* get a new instance from the face's cache -- this is thread-safe */
+ error = CACHE_New( &_face->instances, _ins, _face );
+
+ HANDLE_Set( *instance, _ins );
+
+ if ( !error )
+ {
+ error = Instance_Init( _ins );
+ if ( error )
+ {
+ HANDLE_Set( *instance, NULL );
+ CACHE_Done( &_face->instances, _ins );
+ }
+ }
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Instance_Resolutions
+ *
+ * Description : Resets an instance to a new device resolution.
+ *
+ * Input : instance the instance handle
+ * xResolution new horizontal device resolution in dpi
+ * yResolution new vertical device resolution in dpi
+ *
+ * Output : Error code.
+ *
+ * Note : There is no check for overflow; with other words,
+ * the product of glyph dimensions times the device
+ * resolutions must have reasonable values.
+ *
+ * MT-Note : You should set the charsize or pixel size immediately
+ * after this call in multi-threaded programs. This will
+ * force the instance data to be resetted. Otherwise, you
+ * may encounter corruption when loading two glyphs from
+ * the same instance concurrently!
+ *
+ * Happily, 99.99% will do just that :-)
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Instance_Resolutions( TT_Instance instance,
+ TT_UShort xResolution,
+ TT_UShort yResolution )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+
+ ins->metrics.x_resolution = xResolution;
+ ins->metrics.y_resolution = yResolution;
+ ins->valid = FALSE;
+
+ /* In the case of a thread-safe implementation, we immediately */
+ /* call Instance_Reset in order to change the instance's variable */
+
+ /* In the case of a non-threaded build, we simply set the 'valid' */
+ /* flag to FALSE, which will force the instance's resetting at */
+ /* the next glyph loading */
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Instance_CharSizes
+ *
+ * Description : Resets an instance to new point size.
+ *
+ * Input : instance the instance handle
+ * charWidth the new width in 26.6 char points
+ * charHeight the new height in 26.6 char points
+ *
+ * Output : Error code.
+ *
+ * Note : There is no check for overflow; with other words,
+ * the product of glyph dimensions times the device
+ * resolution must have reasonable values.
+ *
+ * MT-Note : NO! This should be called only when setting/resetting
+ * instances, so there is no need to protect.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Instance_CharSizes( TT_Instance instance,
+ TT_F26Dot6 charWidth,
+ TT_F26Dot6 charHeight )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+
+ if ( charWidth < 1 * 64 )
+ charWidth = 1 * 64;
+
+ if ( charHeight < 1 * 64 )
+ charHeight = 1 * 64;
+
+ ins->metrics.x_scale1 = ( charWidth * ins->metrics.x_resolution ) / 72;
+ ins->metrics.x_scale2 = ins->owner->fontHeader.Units_Per_EM;
+
+ ins->metrics.y_scale1 = ( charHeight * ins->metrics.y_resolution ) / 72;
+ ins->metrics.y_scale2 = ins->owner->fontHeader.Units_Per_EM;
+
+ if ( ins->owner->fontHeader.Flags & 8 )
+ {
+ ins->metrics.x_scale1 = (ins->metrics.x_scale1+32) & -64;
+ ins->metrics.y_scale1 = (ins->metrics.y_scale1+32) & -64;
+ }
+
+ ins->metrics.x_ppem = ins->metrics.x_scale1 / 64;
+ ins->metrics.y_ppem = ins->metrics.y_scale1 / 64;
+
+ if ( charWidth > charHeight )
+ ins->metrics.pointSize = charWidth;
+ else
+ ins->metrics.pointSize = charHeight;
+
+ ins->valid = FALSE;
+
+ return Instance_Reset( ins );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Instance_CharSize
+ *
+ * Description : Resets an instance to new point size.
+ *
+ * Input : instance the instance handle
+ * charSize the new character size in 26.6 char points
+ *
+ * Output : Error code.
+ *
+ * Note : There is no check for overflow; with other words,
+ * the product of glyph dimensions times the device
+ * resolution must have reasonable values.
+ *
+ * MT-Note : NO! This should be called only when setting/resetting
+ * instances, so there is no need to protect.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Instance_CharSize( TT_Instance instance,
+ TT_F26Dot6 charSize )
+ {
+ return TT_Set_Instance_CharSizes( instance, charSize, charSize );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Instance_PixelSizes
+ *
+ * Description : Resets an instance to new pixel sizes
+ *
+ * Input : instance the instance handle
+ * pixelWidth the new width in pixels
+ * pixelHeight the new height in pixels
+ *
+ * Output : Error code.
+ *
+ * Note : There is no check for overflow; with other words,
+ * the product of glyph dimensions times the device
+ * resolution must have reasonable values.
+ *
+ * MT-Note : NO! This should be called only when setting/resetting
+ * instances, so there is no need to protect.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Instance_PixelSizes( TT_Instance instance,
+ TT_UShort pixelWidth,
+ TT_UShort pixelHeight,
+ TT_F26Dot6 pointSize )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+
+ if ( pixelWidth < 1 ) pixelWidth = 1;
+ if ( pixelHeight < 1 ) pixelHeight = 1;
+
+ ins->metrics.x_ppem = pixelWidth;
+ ins->metrics.y_ppem = pixelHeight;
+ ins->metrics.pointSize = pointSize;
+
+ ins->metrics.x_scale1 = ins->metrics.x_ppem * 64;
+ ins->metrics.x_scale2 = ins->owner->fontHeader.Units_Per_EM;
+ ins->metrics.y_scale1 = ins->metrics.y_ppem * 64;
+ ins->metrics.y_scale2 = ins->owner->fontHeader.Units_Per_EM;
+
+ ins->valid = FALSE;
+
+ return Instance_Reset( ins );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Instance_Transform_Flags
+ *
+ * Description : Informs the interpreter about the transformations
+ * that will be applied to the rendered glyphs.
+ *
+ * Input : instance the instance handle
+ * rotated set to TRUE if the glyph are rotated
+ * stretched set to TRUE if the glyph are stretched
+ *
+ * Output : Error code.
+ *
+ * Note : This function is deprecated! It's much better to
+ * control hinting manually when calling TT_Load_Glyph
+ * than relying on the font programs...
+ *
+ * Never use it, unless calling for trouble ;-)
+ *
+ * MT-Note : NO! This should be called only when setting/resetting
+ * instances, so there is no need to protect.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Instance_Transform_Flags( TT_Instance instance,
+ TT_Bool rotated,
+ TT_Bool stretched )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+
+ ins->metrics.rotated = rotated;
+ ins->metrics.stretched = stretched;
+ ins->valid = FALSE;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Instance_Metrics
+ *
+ * Description : Returns instance metrics.
+ *
+ * Input : instance the instance handle
+ * metrics address of target instance metrics record
+ *
+ * Output : Error code.
+ *
+ * MT-Note : YES! Reads only semi-permanent data.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Instance_Metrics( TT_Instance instance,
+ TT_Instance_Metrics* metrics )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+
+ if ( !ins->valid )
+ Instance_Reset( ins );
+
+ metrics->pointSize = ins->metrics.pointSize;
+
+ metrics->x_scale = TT_MulDiv( 0x10000,
+ ins->metrics.x_scale1,
+ ins->metrics.x_scale2 );
+
+ metrics->y_scale = TT_MulDiv( 0x10000,
+ ins->metrics.y_scale1,
+ ins->metrics.y_scale2 );
+
+ metrics->x_resolution = ins->metrics.x_resolution;
+ metrics->y_resolution = ins->metrics.y_resolution;
+ metrics->x_ppem = ins->metrics.x_ppem;
+ metrics->y_ppem = ins->metrics.y_ppem;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Set_Instance_Pointer
+ *
+ * Description : Each instance has one pointer, which use is
+ * reserved to client applications. The TrueType
+ * engine never accesses or uses this field.
+ *
+ * This function is used to set the pointer.
+ *
+ * Input : face the given face handle
+ * data the generic pointer value
+ *
+ * Output : Error code.
+ *
+ * MT-Note : NO!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Set_Instance_Pointer( TT_Instance instance,
+ void* data )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+ else
+ ins->generic = data;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Instance_Pointer
+ *
+ * Description : Each instance has one pointer, which use is
+ * reserved to client applications. The TrueType
+ * engine never accesses or uses this field.
+ *
+ * This function is used to read the pointer.
+ *
+ * Input : face the given face handle
+ * data the generic pointer value
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : NO!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ void* TT_Get_Instance_Pointer( TT_Instance instance )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+
+ if ( !ins )
+ return NULL;
+ else
+ return ins->generic;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Instance
+ *
+ * Description : Closes a given instance.
+ *
+ * Input : instance address of instance handle
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Instance( TT_Instance instance )
+ {
+ PInstance ins = HANDLE_Instance( instance );
+
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+
+ /* delete the instance -- this is thread-safe */
+ return CACHE_Done( &ins->owner->instances, ins );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_New_Glyph
+ *
+ * Description : Creates a new glyph object related to a given
+ * face.
+ *
+ * Input : face the face handle
+ * glyph address of target glyph handle
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_New_Glyph( TT_Face face,
+ TT_Glyph* glyph )
+ {
+ TT_Error error;
+ PFace _face = HANDLE_Face( face );
+ PGlyph _glyph;
+
+
+ if ( !_face )
+ return TT_Err_Invalid_Face_Handle;
+
+ /* get a new glyph from the face's cache -- this is thread-safe */
+ error = CACHE_New( &_face->glyphs, _glyph, _face );
+
+ HANDLE_Set( *glyph, _glyph );
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Glyph
+ *
+ * Description : Destroys a given glyph object.
+ *
+ * Input : glyph the glyph handle
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Glyph( TT_Glyph glyph )
+ {
+ PGlyph _glyph = HANDLE_Glyph( glyph );
+
+
+ if ( !_glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ /* delete the engine -- this is thread-safe */
+ return CACHE_Done( &_glyph->face->glyphs, _glyph );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Load_Glyph
+ *
+ * Description : Loads a glyph.
+ *
+ * Input : instance the instance handle
+ * glyph the glyph handle
+ * glyphIndex the glyph index
+ * loadFlags flags controlling how to load the glyph
+ * (none, scaled, hinted, both)
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Load_Glyph( TT_Instance instance,
+ TT_Glyph glyph,
+ TT_UShort glyphIndex,
+ TT_UShort loadFlags )
+ {
+ PInstance _ins;
+ PGlyph _glyph;
+ TT_Error error;
+
+
+ _ins = HANDLE_Instance( instance );
+
+ if ( !_ins )
+ loadFlags &= ~(TTLOAD_SCALE_GLYPH | TTLOAD_HINT_GLYPH);
+
+ if ( (loadFlags & TTLOAD_SCALE_GLYPH) == 0 )
+ _ins = 0;
+
+ _glyph = HANDLE_Glyph( glyph );
+ if ( !_glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ if ( _ins )
+ {
+ if ( _ins->owner != _glyph->face )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( !_ins->valid )
+ {
+ /* This code can only be called in non thread-safe builds */
+ error = Instance_Reset( _ins );
+ if ( error )
+ return error;
+ }
+ }
+
+ return Load_TrueType_Glyph( _ins, _glyph, glyphIndex, loadFlags );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Glyph_Outline
+ *
+ * Description : Returns the glyph's outline data.
+ *
+ * Input : glyph the glyph handle
+ * outline address where the glyph outline will be returned
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES! Reads only semi-permanent data.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Glyph_Outline( TT_Glyph glyph,
+ TT_Outline* outline )
+ {
+ PGlyph _glyph = HANDLE_Glyph( glyph );
+
+
+ if ( !_glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ *outline = _glyph->outline;
+ outline->owner = FALSE;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Glyph_Metrics
+ *
+ * Description : Extracts the glyph's horizontal metrics information.
+ *
+ * Input : glyph glyph object handle
+ * metrics address where metrics will be returned
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : NO! Glyph containers can't be shared.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Glyph_Metrics( TT_Glyph glyph,
+ TT_Glyph_Metrics* metrics )
+ {
+ PGlyph _glyph = HANDLE_Glyph( glyph );
+
+
+ if ( !_glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ metrics->bbox = _glyph->metrics.bbox;
+ metrics->bearingX = _glyph->metrics.horiBearingX;
+ metrics->bearingY = _glyph->metrics.horiBearingY;
+ metrics->advance = _glyph->metrics.horiAdvance;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Big_Glyph_Metrics
+ *
+ * Description : Extracts the glyph's big metrics information.
+ *
+ * Input : glyph glyph object handle
+ * metrics address where big metrics will be returned
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : NO! Glyph containers can't be shared.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Glyph_Big_Metrics( TT_Glyph glyph,
+ TT_Big_Glyph_Metrics* metrics )
+ {
+ PGlyph _glyph = HANDLE_Glyph( glyph );
+
+
+ if ( !_glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ *metrics = _glyph->metrics;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Glyph_Bitmap
+ *
+ * Description : Produces a bitmap from a glyph outline.
+ *
+ * Input : glyph the glyph container's handle
+ * map target pixmap description block
+ * xOffset x offset in fractional pixels (26.6 format)
+ * yOffset y offset in fractional pixels (26.6 format)
+ *
+ * Output : Error code.
+ *
+ * Note : Only use integer pixel offsets if you want to preserve
+ * the fine hints applied to the outline. This means that
+ * xOffset and yOffset must be multiples of 64!
+ *
+ * MT-Safe : NO! Glyph containers can't be shared.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Glyph_Bitmap( TT_Glyph glyph,
+ TT_Raster_Map* map,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset )
+ {
+ PEngine_Instance _engine;
+ TT_Engine engine;
+ TT_Error error;
+ PGlyph _glyph = HANDLE_Glyph( glyph );
+
+ TT_Outline outline;
+
+
+ if ( !_glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ _engine = _glyph->face->engine;
+ HANDLE_Set( engine, _engine );
+
+ outline = _glyph->outline;
+ /* XXX : For now, use only dropout mode 2 */
+ /* outline.dropout_mode = _glyph->scan_type; */
+ outline.dropout_mode = 2;
+
+ TT_Translate_Outline( &outline, xOffset, yOffset );
+ error = TT_Get_Outline_Bitmap( engine, &outline, map );
+ TT_Translate_Outline( &outline, -xOffset, -yOffset );
+
+ return error;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_GRAY_SCALING
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Glyph_Pixmap
+ *
+ * Description : Produces a grayscaled pixmap from a glyph
+ * outline.
+ *
+ * Input : glyph the glyph container's handle
+ * map target pixmap description block
+ * xOffset x offset in fractional pixels (26.6 format)
+ * yOffset y offset in fractional pixels (26.6 format)
+ *
+ * Output : Error code.
+ *
+ * Note : Only use integer pixel offsets to preserve the fine
+ * hinting of the glyph and the 'correct' anti-aliasing
+ * (where vertical and horizontal stems aren't grayed).
+ * This means that xOffset and yOffset must be multiples
+ * of 64!
+ *
+ * You can experiment with offsets of +32 to get 'blurred'
+ * versions of the glyphs (a nice effect at large sizes that
+ * some graphic designers may appreciate :)
+ *
+ * MT-Safe : NO! Glyph containers can't be shared.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Glyph_Pixmap( TT_Glyph glyph,
+ TT_Raster_Map* map,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset )
+ {
+ PEngine_Instance _engine;
+ TT_Engine engine;
+ TT_Error error;
+ PGlyph _glyph = HANDLE_Glyph( glyph );
+
+ TT_Outline outline;
+
+
+ if ( !_glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ _engine = _glyph->face->engine;
+ HANDLE_Set(engine,_engine);
+
+ outline = _glyph->outline;
+ /* XXX : For now, use only dropout mode 2 */
+ /* outline.dropout_mode = _glyph->scan_type; */
+ outline.dropout_mode = 2;
+
+ TT_Translate_Outline( &outline, xOffset, yOffset );
+ error = TT_Get_Outline_Pixmap( engine, &outline, map );
+ TT_Translate_Outline( &outline, -xOffset, -yOffset );
+
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_GRAY_SCALING */
+
+
+ static const TT_Outline null_outline
+ = { 0, 0, NULL, NULL, NULL, 0, 0, 0, 0 };
+
+
+/*******************************************************************
+ *
+ * Function : TT_New_Outline
+ *
+ * Description : Creates a new TrueType outline, reserving
+ * array space for a given number of points and
+ * contours.
+ *
+ * Input : numPoints number of points
+ * numContours number of contours
+ * outline address of target outline structure
+ *
+ * Output : Error code
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_New_Outline( TT_UShort numPoints,
+ TT_Short numContours,
+ TT_Outline* outline )
+ {
+ TT_Error error;
+
+
+ if ( !outline )
+ return TT_Err_Invalid_Argument;
+
+ *outline = null_outline;
+
+ if ( ALLOC( outline->points, numPoints*2*sizeof ( TT_F26Dot6 ) ) ||
+ ALLOC( outline->flags, numPoints *sizeof ( Byte ) ) ||
+ ALLOC( outline->contours, numContours*sizeof ( UShort ) ) )
+ goto Fail;
+
+ outline->n_points = numPoints;
+ outline->n_contours = numContours;
+ outline->owner = TRUE;
+ return TT_Err_Ok;
+
+ Fail:
+ outline->owner = TRUE;
+ TT_Done_Outline( outline );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Outline
+ *
+ * Description : Deletes an outline created through TT_New_Outline().
+ * Calling this function for outlines returned
+ * by TT_Get_Glyph_Outline() yields an error.
+ *
+ * Input : outline address of outline
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Outline( TT_Outline* outline )
+ {
+ if ( outline )
+ {
+ if ( outline->owner )
+ {
+ FREE( outline->points );
+ FREE( outline->flags );
+ FREE( outline->contours );
+ }
+ *outline = null_outline;
+ return TT_Err_Ok;
+ }
+ else
+ return TT_Err_Invalid_Argument;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Outline_Bitmap
+ *
+ * Description : Render a TrueType outline into a bitmap.
+ * Note that the bitmap must be created by the caller.
+ *
+ * Input : outline the outline to render
+ * map the target bitmap
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Outline_Bitmap( TT_Engine engine,
+ TT_Outline* outline,
+ TT_Raster_Map* map )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+ TT_Error error;
+
+
+ if ( !_engine )
+ return TT_Err_Invalid_Engine;
+
+ if ( !outline || !map )
+ return TT_Err_Invalid_Argument;
+
+ MUTEX_Lock( _engine->raster_lock );
+ error = RENDER_Glyph( outline, map );
+ MUTEX_Release( _engine->raster_lock );
+
+ return error;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_GRAY_SCALING
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Outline_Pixmap
+ *
+ * Description : Render a TrueType outline into a pixmap.
+ * Note that the pixmap must be created by the caller.
+ *
+ * Input : outline the outline to render
+ * map the target bitmap
+ *
+ * Output : Error code
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Outline_Pixmap( TT_Engine engine,
+ TT_Outline* outline,
+ TT_Raster_Map* map )
+ {
+ PEngine_Instance _engine = HANDLE_Engine( engine );
+ TT_Error error;
+
+
+ if ( !_engine )
+ return TT_Err_Invalid_Engine;
+
+ if ( !outline || !map )
+ return TT_Err_Invalid_Argument;
+
+ MUTEX_Lock( _engine->raster_lock );
+ error = RENDER_Gray_Glyph( outline, map, _engine->raster_palette );
+ MUTEX_Release( _engine->raster_lock );
+ return error;
+ }
+
+#endif /* TT_CONFIG_OPTION_GRAY_SCALING */
+
+
+/*******************************************************************
+ *
+ * Function : TT_Copy_Outline
+ *
+ * Description : Copy an outline into another. The source and
+ * target outlines must have the same points and
+ * contours numbers.
+ *
+ * Input : source address of source outline
+ * target address of target outline
+ *
+ * Output : Error code
+ *
+ * Note : This function doesn't touch the target outline's 'owner'
+ * field.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Copy_Outline( TT_Outline* source,
+ TT_Outline* target )
+ {
+ if ( !source || !target ||
+ source->n_points != target->n_points ||
+ source->n_contours != target->n_contours )
+ return TT_Err_Invalid_Argument;
+
+ MEM_Copy( target->points, source->points,
+ source->n_points * 2 * sizeof ( TT_F26Dot6 ) );
+
+ MEM_Copy( target->flags, source->flags,
+ source->n_points * sizeof ( Byte ) );
+
+ MEM_Copy( target->contours, source->contours,
+ source->n_contours * sizeof ( Short ) );
+
+ target->high_precision = source->high_precision;
+ target->second_pass = target->second_pass;
+ target->dropout_mode = source->dropout_mode;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Transform_Outline
+ *
+ * Description : Applies a simple transformation to an outline.
+ *
+ * Input : outline the glyph's outline. Can be extracted
+ * from a glyph container through
+ * TT_Get_Glyph_Outline().
+ *
+ * matrix simple matrix with 16.16 fixed floats
+ *
+ * Output : Error code (always TT_Err_Ok).
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ void TT_Transform_Outline( TT_Outline* outline,
+ TT_Matrix* matrix )
+ {
+ UShort n;
+ TT_F26Dot6 x, y;
+ TT_Vector* vec;
+
+
+ vec = outline->points;
+ for ( n = 0; n < outline->n_points; n++ )
+ {
+ x = TT_MulFix( vec->x, matrix->xx ) +
+ TT_MulFix( vec->y, matrix->xy );
+
+ y = TT_MulFix( vec->x, matrix->yx ) +
+ TT_MulFix( vec->y, matrix->yy );
+
+ vec->x = x;
+ vec->y = y;
+ vec++;
+ }
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Transform_Vector
+ *
+ * Description : Apply a simple transform to a vector
+ *
+ * Input : x, y the vector.
+ *
+ * matrix simple matrix with 16.16 fixed floats
+ *
+ * Output : None.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ void TT_Transform_Vector( TT_F26Dot6* x,
+ TT_F26Dot6* y,
+ TT_Matrix* matrix )
+ {
+ TT_F26Dot6 xz, yz;
+
+
+ xz = TT_MulFix( *x, matrix->xx ) +
+ TT_MulFix( *y, matrix->xy );
+
+ yz = TT_MulFix( *x, matrix->yx ) +
+ TT_MulFix( *y, matrix->yy );
+
+ *x = xz;
+ *y = yz;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Translate_Outline
+ *
+ * Description : Applies a simple translation.
+ *
+ * Input : outline no comment :)
+ * xOffset
+ * yOffset
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ void TT_Translate_Outline( TT_Outline* outline,
+ TT_F26Dot6 xOffset,
+ TT_F26Dot6 yOffset )
+ {
+ UShort n;
+ TT_Vector* vec = outline->points;
+
+
+ for ( n = 0; n < outline->n_points; n++ )
+ {
+ vec->x += xOffset;
+ vec->y += yOffset;
+ vec++;
+ }
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Outline_BBox
+ *
+ * Description : Returns an outline's bounding box.
+ *
+ * Input : outline no comment :)
+ * bbox address where the bounding box is returned
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Outline_BBox( TT_Outline* outline,
+ TT_BBox* bbox )
+ {
+ TT_F26Dot6 x, y;
+ UShort k;
+
+
+ if ( outline && bbox )
+ {
+ if ( outline->n_points == 0 )
+ {
+ bbox->xMin = 0;
+ bbox->yMin = 0;
+ bbox->xMax = 0;
+ bbox->yMax = 0;
+ }
+ else
+ {
+ TT_Vector* vec = outline->points;
+
+ bbox->xMin = bbox->xMax = vec->x;
+ bbox->yMin = bbox->yMax = vec->y;
+ vec++;
+
+ for ( k = 1; k < outline->n_points; k++ )
+ {
+ x = vec->x;
+ if ( x < bbox->xMin ) bbox->xMin = x;
+ if ( x > bbox->xMax ) bbox->xMax = x;
+ y = vec->y;
+ if ( y < bbox->yMin ) bbox->yMin = y;
+ if ( y > bbox->yMax ) bbox->yMax = y;
+ vec++;
+ }
+ }
+ return TT_Err_Ok;
+ }
+ else
+ return TT_Err_Invalid_Argument;
+ }
+
+
+
+ /* ----------------- character mappings support ------------- */
+
+/*******************************************************************
+ *
+ * Function : TT_Get_CharMap_Count
+ *
+ * Description : Returns the number of charmaps in a given face.
+ *
+ * Input : face face object handle
+ *
+ * Output : Number of tables. -1 in case of error (bad handle).
+ *
+ * Note : DON'T USE THIS FUNCTION! IT HAS BEEN DEPRECATED!
+ *
+ * It is retained for backwards compatibility only and will
+ * fail on 16bit systems.
+ *
+ * MT-Safe : YES !
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ int TT_Get_CharMap_Count( TT_Face face )
+ {
+ PFace faze = HANDLE_Face( face );
+
+ return ( faze ? faze->numCMaps : -1 );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_CharMap_ID
+ *
+ * Description : Returns the ID of a given charmap.
+ *
+ * Input : face face object handle
+ * charmapIndex index of charmap in directory
+ * platformID address of returned platform ID
+ * encodingID address of returned encoding ID
+ *
+ * Output : error code
+ *
+ * MT-Safe : YES !
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_CharMap_ID( TT_Face face,
+ TT_UShort charmapIndex,
+ TT_UShort* platformID,
+ TT_UShort* encodingID )
+ {
+ PCMapTable cmap;
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( charmapIndex >= faze->numCMaps )
+ return TT_Err_Bad_Argument;
+
+ cmap = faze->cMaps + charmapIndex;
+
+ *platformID = cmap->platformID;
+ *encodingID = cmap->platformEncodingID;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_CharMap
+ *
+ * Description : Looks up a charmap.
+ *
+ * Input : face face object handle
+ * charmapIndex index of charmap in directory
+ * charMap address of returned charmap handle
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_CharMap( TT_Face face,
+ TT_UShort charmapIndex,
+ TT_CharMap* charMap )
+ {
+ TT_Error error;
+ TT_Stream stream;
+ PCMapTable cmap;
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( charmapIndex >= faze->numCMaps )
+ return TT_Err_Bad_Argument;
+
+ cmap = faze->cMaps + charmapIndex;
+
+ /* Load table if needed */
+ error = TT_Err_Ok;
+
+ /* MT-NOTE: We're modifying the face object, so protect it. */
+ MUTEX_Lock( faze->lock );
+
+ if ( !cmap->loaded )
+ {
+ (void)USE_Stream( faze->stream, stream );
+ if ( !error )
+ {
+ error = CharMap_Load( cmap, stream );
+ DONE_Stream( stream );
+ }
+
+ if ( error )
+ cmap = NULL;
+ else
+ cmap->loaded = TRUE;
+ }
+ MUTEX_Release( faze->lock );
+
+ HANDLE_Set( *charMap, cmap );
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Char_Index
+ *
+ * Description : Returns the glyph index corresponding to
+ * a given character code defined for the 'charmap'.
+ *
+ * Input : charMap charmap handle
+ * charcode character code
+ *
+ * Output : glyph index.
+ *
+ * Notes : Character code 0 is the unknown glyph, which should never
+ * be displayed.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_UShort TT_Char_Index( TT_CharMap charMap,
+ TT_UShort charCode )
+ {
+ PCMapTable cmap = HANDLE_CharMap( charMap );
+
+
+ if ( !cmap )
+ return 0; /* we return 0 in case of invalid char map */
+
+ return CharMap_Index( cmap, charCode );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Name_Count
+ *
+ * Description : Returns the number of strings found in the
+ * name table.
+ *
+ * Input : face face handle
+ *
+ * Output : number of strings.
+ *
+ * Notes : Returns -1 on error (invalid handle).
+ *
+ * DON'T USE THIS FUNCTION! IT HAS BEEN DEPRECATED!
+ *
+ * It is retained for backwards compatibility only and will
+ * fail on 16bit systems.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ int TT_Get_Name_Count( TT_Face face )
+ {
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return -1;
+
+ return faze->nameTable.numNameRecords;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Name_ID
+ *
+ * Description : Returns the IDs of the string number 'nameIndex'
+ * in the name table of a given face.
+ *
+ * Input : face face handle
+ * nameIndex index of string. First is 0
+ * platformID addresses of returned IDs
+ * encodingID
+ * languageID
+ * nameID
+ *
+ * Output : Error code.
+ *
+ * Notes : Some files have a corrupt or unusual name table, with some
+ * entries having a platformID > 3. These can usually
+ * be ignored by a client application.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Name_ID( TT_Face face,
+ TT_UShort nameIndex,
+ TT_UShort* platformID,
+ TT_UShort* encodingID,
+ TT_UShort* languageID,
+ TT_UShort* nameID )
+ {
+ TNameRec* namerec;
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( nameIndex >= faze->nameTable.numNameRecords )
+ return TT_Err_Bad_Argument;
+
+ namerec = faze->nameTable.names + nameIndex;
+
+ *platformID = namerec->platformID;
+ *encodingID = namerec->encodingID;
+ *languageID = namerec->languageID;
+ *nameID = namerec->nameID;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Name_String
+ *
+ * Description : Returns the address and length of a given
+ * string found in the name table.
+ *
+ * Input : face face handle
+ * nameIndex string index
+ * stringPtr address of returned pointer to string
+ * length address of returned string length
+ *
+ * Output : Error code.
+ *
+ * Notes : If the string's platformID is invalid,
+ * stringPtr is NULL, and length is 0.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Name_String( TT_Face face,
+ TT_UShort nameIndex,
+ TT_String** stringPtr,
+ TT_UShort* length )
+ {
+ TNameRec* namerec;
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( nameIndex >= faze->nameTable.numNameRecords )
+ return TT_Err_Bad_Argument;
+
+ namerec = faze->nameTable.names + nameIndex;
+
+ *stringPtr = (String*)namerec->string;
+ *length = namerec->stringLength;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Get_Font_Data
+ *
+ * Description : Loads any font table in client memory. Used by
+ * the TT_Get_Font_Data().
+ *
+ * Input : face Face object to look for.
+ *
+ * tag Tag of table to load. Use the value 0 if you
+ * want to access the whole font file, else set
+ * this parameter to a valid TrueType table tag
+ * that you can forge with the MAKE_TT_TAG
+ * macro.
+ *
+ * offset Starting offset in the table (or the file
+ * if tag == 0).
+ *
+ * buffer Address of target buffer
+ *
+ * length Address of decision variable:
+ *
+ * if length == NULL:
+ * Load the whole table. Returns an
+ * an error if 'offset' != 0.
+ *
+ * if *length == 0 :
+ * Exit immediately, returning the
+ * length of the given table, or of
+ * the font file, depending on the
+ * value of 'tag'.
+ *
+ * if *length != 0 :
+ * Load the next 'length' bytes of
+ * table or font, starting at offset
+ * 'offset' (in table or font too).
+ *
+ * Output : Error code.
+ *
+ * MT-Safe : YES!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Get_Font_Data( TT_Face face,
+ TT_ULong tag,
+ TT_Long offset,
+ void* buffer,
+ TT_Long* length )
+ {
+ PFace faze = HANDLE_Face( face );
+
+
+ if ( !faze )
+ return TT_Err_Invalid_Face_Handle;
+
+ return Load_TrueType_Any( faze, tag, offset, buffer, length );
+ }
+
+
+ /************************ callback definition ******************/
+
+ /* Register a new callback to the TrueType engine -- this should */
+ /* only be used by higher-level libraries, not typical clients */
+ /* */
+ /* This is not part of the current FreeType release, thus */
+ /* undefined... */
+
+#if 0
+ EXPORT_FUNC
+ TT_Error TT_Register_Callback( TT_Engine engine,
+ int callback_id,
+ void* callback_ptr )
+ {
+ PEngine_Instance eng = HANDLE_Engine( engine );
+
+
+ if ( !eng )
+ return TT_Err_Invalid_Argument;
+
+ /* currently, we only support one callback */
+ if (callback_id != TT_Callback_Glyph_Outline_Load)
+ return TT_Err_Invalid_Argument;
+
+ eng->glCallback = (TT_Glyph_Loader_Callback)callback_ptr;
+ return TT_Err_Ok;
+ }
+#endif /* 0 */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttcache.c b/xc/extras/FreeType/lib/ttcache.c
new file mode 100644
index 000000000..57aa7adc1
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttcache.c
@@ -0,0 +1,460 @@
+/*******************************************************************
+ *
+ * ttcache.c 1.1
+ *
+ * Generic object cache
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Changes between 1.1 and 1.0:
+ *
+ * - introduced the refresher and finalizer in the cache class
+ * definition/implementation.
+ *
+ ******************************************************************/
+
+#include "ttengine.h"
+#include "ttmemory.h"
+#include "ttcache.h"
+#include "ttobjs.h"
+#include "ttdebug.h"
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_cache
+
+#define ZERO_List( list ) list = NULL
+
+/* The macro FREE_Elements aliases the current engine instance's */
+/* free list_elements recycle list. */
+#define FREE_Elements ( engine->list_free_elements )
+
+/* Redefinition of LOCK and UNLOCK macros for New_Element and Done_Element */
+/* Note: The macros are redefined below for the cache functions */
+
+#undef LOCK
+#define LOCK() MUTEX_Lock ( engine->lock )
+
+#undef UNLOCK
+#define UNLOCK() MUTEX_Release( engine->lock )
+
+/*******************************************************************
+ *
+ * Function : Element_New
+ *
+ * Description : Gets a new (either fresh or recycled) list
+ * element. The element is unlisted.
+ *
+ * Input : None
+ *
+ * Output : List element address. NULL if out of memory.
+ *
+ ******************************************************************/
+
+ static
+ PList_Element Element_New( PEngine_Instance engine )
+ {
+ PList_Element element;
+
+
+ LOCK();
+ if ( FREE_Elements )
+ {
+ element = (PList_Element)FREE_Elements;
+ FREE_Elements = element->next;
+ }
+ else
+ {
+ if ( !MEM_Alloc( element, sizeof ( TList_Element ) ) )
+ {
+ element->next = NULL;
+ element->data = NULL;
+ }
+ }
+
+ /* Note: in case of failure, Alloc sets the pointer to NULL */
+ UNLOCK();
+
+ return element;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Element_Done
+ *
+ * Description : Recycles an unlinked list element.
+ *
+ * Input : The list element to recycle. It _must_ be unlisted.
+ *
+ * Output : none.
+ *
+ * Note : This function doesn't check the element.
+ *
+ ******************************************************************/
+
+ static
+ void Element_Done( PEngine_Instance engine,
+ PList_Element element )
+ {
+ LOCK();
+ /* Simply add the list element to the recycle list */
+ element->next = (PList_Element)FREE_Elements;
+ FREE_Elements = element;
+ UNLOCK();
+ }
+
+
+/* Redefinition of LOCK and UNLOCK macros for the cache functions */
+/* Note: The macros are defined above for the list element functions */
+
+#undef LOCK
+#define LOCK() MUTEX_Lock( *cache->lock )
+
+#undef UNLOCK
+#define UNLOCK() MUTEX_Release( *cache->lock )
+
+
+/*******************************************************************
+ *
+ * Function : Cache_Create
+ *
+ * Description : Creates a new cache that will be used to list
+ * and recycle several objects of the same class.
+ *
+ * Input : clazz a pointer to the cache's class. This is
+ * a simple structure that describes the
+ * the cache's object types and recycling
+ * limits.
+ *
+ * cache address of cache to create
+ *
+ * lock address of the mutex to use for this
+ * cache. The mutex will be used to protect
+ * the cache's lists. Use NULL for unprotected
+ * cache.
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Cache_Create( PEngine_Instance engine,
+ PCache_Class clazz,
+ TCache* cache,
+ TMutex* lock )
+ {
+ cache->engine = engine;
+ cache->clazz = clazz;
+ cache->lock = lock;
+ cache->idle_count = 0;
+
+ ZERO_List( cache->active );
+ ZERO_List( cache->idle );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Cache_Destroy
+ *
+ * Description : Destroys a cache and all its idle and active
+ * objects. This will call each object's destructor
+ * before freeing it.
+ *
+ * Input : cache address of cache to destroy
+ *
+ * Output : error code.
+ *
+ * Note: This function is not MT-Safe, as we assume that a client
+ * isn't stupid enough to use an object while destroying it.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Cache_Destroy( TCache* cache )
+ {
+ PDestructor destroy;
+ PList_Element current;
+ PList_Element next;
+
+
+ /* now destroy all active and idle listed objects */
+
+ /* get the destructor function */
+ destroy = cache->clazz->done;
+
+ /* destroy all elements in active list */
+ current = cache->active;
+ while ( current )
+ {
+ next = current->next;
+ destroy( current->data );
+ FREE( current->data );
+
+ Element_Done( cache->engine, current );
+ current = next;
+ }
+ ZERO_List(cache->active);
+
+ /* destroy all elements in idle list */
+ current = cache->idle;
+ while ( current )
+ {
+ next = current->next;
+ destroy( current->data );
+ FREE( current->data );
+
+ Element_Done( cache->engine, current );
+ current = next;
+ }
+ ZERO_List(cache->idle);
+
+ cache->clazz = NULL;
+ cache->idle_count = 0;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Cache_New
+ *
+ * Description : Extracts a new object from a cache. This will
+ * try to recycle an idle object, if any is found.
+ * Otherwise, a new object will be allocated and
+ * built (by calling its constructor).
+ *
+ * Input : cache address of cache to use
+ * new_object address of target pointer to the 'new'
+ * object
+ * parent_object this pointer is passed to a new object
+ * constructor (unused if object is
+ * recycled)
+ *
+ * Output : Error code.
+ *
+ * Note: This function is thread-safe, each cache list is protected
+ * through the cache's mutex, if there is one...
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Cache_New( TCache* cache,
+ void** new_object,
+ void* parent_object )
+ {
+ TT_Error error;
+ PList_Element current;
+ PConstructor build;
+ PRefresher reset;
+ void* object;
+
+
+ LOCK();
+ current = cache->idle;
+ if ( current )
+ {
+ cache->idle = current->next;
+ cache->idle_count--;
+ }
+ UNLOCK();
+
+ if ( current )
+ {
+ object = current->data;
+ reset = cache->clazz->reset;
+ if ( reset )
+ {
+ error = reset( object, parent_object );
+ if ( error )
+ {
+ LOCK();
+ current->next = cache->idle;
+ cache->idle = current;
+ cache->idle_count++;
+ UNLOCK();
+ goto Exit;
+ }
+ }
+ }
+ else
+ {
+ /* if no object was found in the cache, create a new one */
+ build = cache->clazz->init;
+
+ if ( MEM_Alloc( object, cache->clazz->object_size ) )
+ goto Memory_Fail;
+
+ current = Element_New( cache->engine );
+ if ( !current )
+ goto Memory_Fail;
+
+ current->data = object;
+
+ error = build( object, parent_object );
+ if ( error )
+ {
+ Element_Done( cache->engine, current );
+ goto Fail;
+ }
+ }
+
+ LOCK();
+ current->next = cache->active;
+ cache->active = current;
+ UNLOCK();
+
+ *new_object = current->data;
+ error = TT_Err_Ok;
+
+ Exit:
+ return error;
+
+ Memory_Fail:
+ error = TT_Err_Out_Of_Memory;
+
+ Fail:
+ FREE( object );
+ goto Exit;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Cache_Done
+ *
+ * Description : Releases an object to the cache. This will either
+ * recycle or destroy the object, based on the cache's
+ * class and state.
+ *
+ * Input : cache the cache to use
+ * data the object to recycle/discard
+ *
+ * Output : error code.
+ *
+ * Notes : The object's destructor is called only when
+ * the objectwill be effectively destroyed by this
+ * function. This will not happen during recycling.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Cache_Done( TCache* cache, void* data )
+ {
+ TT_Error error;
+ PList_Element element;
+ PList_Element prev;
+ PFinaliser finalise;
+ Long limit;
+ Bool destroy;
+
+
+ /* Look for object in active list */
+ LOCK();
+
+ element = cache->active;
+ prev = NULL;
+ while ( element )
+ {
+ if ( element->data == data )
+ {
+ if ( prev )
+ prev->next = element->next;
+ else
+ cache->active = element->next;
+ goto Suite;
+ }
+ prev = element;
+ element = element->next;
+ }
+
+ UNLOCK();
+ return TT_Err_Unlisted_Object;
+
+ Suite:
+
+ limit = cache->clazz->idle_limit;
+ destroy = (cache->idle_count >= limit);
+ UNLOCK();
+
+ if ( destroy )
+ {
+ /* destroy the object when the cache is full */
+ cache->clazz->done( element->data );
+ FREE( element->data );
+ Element_Done( cache->engine, element );
+ }
+ else
+ {
+ /* Finalise the object before adding it to the */
+ /* idle list. Return the error if any is found. */
+
+ finalise = cache->clazz->finalise;
+ if ( finalise )
+ {
+ error = finalise( element->data );
+ if ( error )
+ goto Exit;
+
+ /* Note: a failure at finalise time is a severe bug in */
+ /* the engine, which is why we allow ourselves to */
+ /* lose the object in this case. A finaliser should */
+ /* have its own error codes to spot this kind of */
+ /* problems easily. */
+ }
+
+ LOCK();
+ element->next = cache->idle;
+ cache->idle = element;
+ cache->idle_count++;
+ UNLOCK();
+ }
+
+ error = TT_Err_Ok;
+
+ Exit:
+ return error;
+ }
+
+
+ LOCAL_FUNC
+ TT_Error TTCache_Init( PEngine_Instance engine )
+ {
+ /* Create list elements mutex */
+ FREE_Elements = NULL;
+ return TT_Err_Ok;
+ }
+
+
+ LOCAL_FUNC
+ TT_Error TTCache_Done( PEngine_Instance engine )
+ {
+ /* We don't protect this function, as this is the end of the engine's */
+ /* execution.. */
+ PList_Element element, next;
+
+
+ /* frees the recycled list elements */
+ element = FREE_Elements;
+ while ( element )
+ {
+ next = element->next;
+ FREE( element );
+ element = next;
+ }
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttcache.h b/xc/extras/FreeType/lib/ttcache.h
new file mode 100644
index 000000000..6571698b0
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttcache.h
@@ -0,0 +1,216 @@
+/*******************************************************************
+ *
+ * ttcache.h 1.1
+ *
+ * Generic object cache
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * This component defines and implements object caches.
+ *
+ * An object class is a structure layout that encapsulate one
+ * given type of data used by the FreeType engine. Each object
+ * class is completely described by:
+ *
+ * - a 'root' or 'leading' structure containing the first
+ * important fields of the class. The root structure is
+ * always of fixed size.
+ *
+ * It is implemented as a simple C structure, and may
+ * contain several pointers to sub-tables that can be
+ * sized and allocated dynamically.
+ *
+ * Examples: TFace, TInstance, TGlyph & TExecution_Context
+ * (defined in 'ttobjs.h')
+ *
+ * - we make a difference between 'child' pointers and 'peer'
+ * pointers. A 'child' pointer points to a sub-table that is
+ * owned by the object, while a 'peer' pointer points to any
+ * other kind of data the object isn't responsible for.
+ *
+ * An object class is thus usually a 'tree' of 'child' tables.
+ *
+ * - each object class needs a constructor and a destructor.
+ *
+ * A constructor is a function which receives the address of
+ * freshly allocated and zeroed object root structure and
+ * 'builds' all the valid child data that must be associated
+ * to the object before it becomes 'valid'.
+ *
+ * A destructor does the inverse job: given the address of
+ * a valid object, it must discard all its child data and
+ * zero its main fields (essentially the pointers and array
+ * sizes found in the root fields).
+ *
+ *
+ * Important notes:
+ *
+ * When the constructor fails to allocate an object, it must
+ * return immediately with an error code, and not try to release
+ * what it has previously allocated before the error. The cache
+ * manager detects the error and calls the destructor on the
+ * partial object, before returning the error to the caller (along
+ * with a NULL pointer for the "new" object).
+ *
+ * The destructor must thus be able to deal with "partial objects",
+ * i.e., objects where only part of the child tables are allocated,
+ * and only release these ones. As the TT_Free() function accepts
+ * a NULL parameter (and returns successfuly in this case), no check
+ * is really necessary when using the macro 'FREE()'.
+ *
+ * Currently, there is no check in the cache manager to see if a
+ * destructor fails (double error state!).
+ *
+ * This scheme is more compact and more maintanable than the one
+ * where de-allocation code is duplicated in the constructor
+ * _and_ the destructor.
+ *
+ *
+ *
+ * Changes between 1.1 and 1.0:
+ *
+ * - introduced the refreshed and finalizer class definition/implementation
+ * - inserted an engine instance pointer in the cache structure
+ *
+ ******************************************************************/
+
+#ifndef TTCACHE_H
+#define TTCACHE_H
+
+#include "tttypes.h"
+#include "ttconfig.h"
+#include "ttmutex.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ typedef TT_Error TConstructor( void* object,
+ void* parent );
+
+ typedef TT_Error TDestructor ( void* object );
+
+ typedef TConstructor TRefresher;
+ typedef TDestructor TFinaliser;
+
+ typedef TConstructor* PConstructor;
+ typedef TDestructor* PDestructor;
+ typedef TRefresher* PRefresher;
+ typedef TFinaliser* PFinaliser;
+
+
+ /* A Cache class record holds the data necessary to define */
+ /* a cache kind. */
+ struct TCache_Class_
+ {
+ Long object_size;
+ Long idle_limit;
+ PConstructor init;
+ PDestructor done;
+ PRefresher reset;
+ PFinaliser finalise;
+ };
+
+ typedef struct TCache_Class_ TCache_Class;
+ typedef TCache_Class* PCache_Class;
+
+
+
+ /* Simple list node record. A list element is said to be 'unlinked' */
+ /* when it doesn't belong to any list. */
+ struct TList_Element_;
+
+ typedef struct TList_Element_ TList_Element;
+ typedef TList_Element* PList_Element;
+
+ struct TList_Element_
+ {
+ PList_Element next;
+ void* data;
+ };
+
+
+ /* Simple singly-linked list record - LIFO style, no tail field */
+ typedef PList_Element TSingle_List;
+
+ struct TCache_
+ {
+ PEngine_Instance engine;
+ PCache_Class clazz; /* 'class' is a reserved word in C++ */
+ TMutex* lock;
+ TSingle_List active;
+ TSingle_List idle;
+ Long idle_count;
+ };
+
+ typedef struct TCache_ TCache;
+ typedef TCache *PCache;
+
+ /* Returns a new list element, either fresh or recycled. */
+ /* Note: the returned element is unlinked. */
+
+ /* An object cache holds two lists tracking the active and */
+ /* idle objects that are currently created and used by the */
+ /* engine. It can also be 'protected' by a mutex. */
+
+ /* Initializes a new cache, of class 'clazz', pointed by 'cache', */
+ /* protected by the 'lock' mutex. Set 'lock' to NULL if the cache */
+ /* doesn't need protection */
+
+ LOCAL_DEF
+ TT_Error Cache_Create( PEngine_Instance engine,
+ PCache_Class clazz,
+ TCache* cache,
+ TMutex* lock );
+
+ /* Destroys a cache and all its listed objects */
+
+ LOCAL_DEF
+ TT_Error Cache_Destroy( TCache* cache );
+
+
+ /* Extracts a new object from the cache */
+
+ LOCAL_DEF
+ TT_Error Cache_New( TCache* cache,
+ void** new_object,
+ void* parent_object );
+
+
+ /* Returns an object to the cache, or discards it depending */
+ /* on the cache class' 'idle_limit' field */
+
+ LOCAL_DEF
+ TT_Error Cache_Done( TCache* cache, void* data );
+
+#define CACHE_New( _cache, _newobj, _parent ) \
+ Cache_New( (TCache*)_cache, (void**)&_newobj, (void*)_parent )
+
+#define CACHE_Done( _cache, _obj ) \
+ Cache_Done( (TCache*)_cache, (void*)_obj )
+
+
+
+ LOCAL_DEF
+ TT_Error TTCache_Init( PEngine_Instance engine );
+
+ LOCAL_DEF
+ TT_Error TTCache_Done( PEngine_Instance engine );
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTCACHE_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttcalc.c b/xc/extras/FreeType/lib/ttcalc.c
new file mode 100644
index 000000000..9948b8344
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttcalc.c
@@ -0,0 +1,458 @@
+/*******************************************************************
+ *
+ * ttcalc.c
+ *
+ * Arithmetic Computations (body).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "ttcalc.h"
+#include "ttdebug.h"
+#include "tttables.h"
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_calc
+
+
+/* Support for 1-complement arithmetic has been totally dropped in this */
+/* release. You can still write your own code if you need it... */
+
+ static const Long Roots[63] =
+ {
+ 1, 1, 2, 3, 4, 5, 8, 11,
+ 16, 22, 32, 45, 64, 90, 128, 181,
+ 256, 362, 512, 724, 1024, 1448, 2048, 2896,
+ 4096, 5892, 8192, 11585, 16384, 23170, 32768, 46340,
+
+ 65536, 92681, 131072, 185363, 262144, 370727,
+ 524288, 741455, 1048576, 1482910, 2097152, 2965820,
+ 4194304, 5931641, 8388608, 11863283, 16777216, 23726566,
+
+ 33554432, 47453132, 67108864, 94906265,
+ 134217728, 189812531, 268435456, 379625062,
+ 536870912, 759250125, 1073741824, 1518500250,
+ 2147483647
+ };
+
+
+#ifdef LONG64
+
+#if 0
+ LOCAL_FUNC
+ TT_Int32 MulDiv( TT_Int32 a, TT_Int32 b, TT_Int32 c )
+ {
+ TT_Int32 s;
+
+
+ s = a; a = ABS( a );
+ s ^= b; b = ABS( b );
+ s ^= c; c = ABS( c );
+
+ a = (TT_Int64)a * b / c;
+ return ( s < 0 ) ? -a : a;
+ }
+#endif
+
+ EXPORT_FUNC
+ TT_Long TT_MulDiv( TT_Long a, TT_Long b, TT_Long c )
+ {
+ Long s;
+
+
+ s = a; a = ABS( a );
+ s ^= b; b = ABS( b );
+ s ^= c; c = ABS( c );
+
+ a = ((TT_Int64)a * b + c/2) / c;
+ return ( s < 0 ) ? -a : a;
+ }
+
+
+ EXPORT_FUNC
+ TT_Long TT_MulFix( TT_Long a, TT_Long b )
+ {
+ Long s;
+
+
+ s = a; a = ABS( a );
+ s ^= b; b = ABS( b );
+
+ a = ((TT_Int64)a * b + 0x8000) / 0x10000;
+ return ( s < 0 ) ? -a : a;
+ }
+
+
+ LOCAL_FUNC
+ Int Order64( TT_Int64 z )
+ {
+ Int j = 0;
+
+
+ while ( z )
+ {
+ z = (unsigned INT64)z >> 1;
+ j++;
+ }
+ return j - 1;
+ }
+
+
+ LOCAL_FUNC
+ TT_Int32 Sqrt64( TT_Int64 l )
+ {
+ TT_Int64 r, s;
+
+
+ if ( l <= 0 ) return 0;
+ if ( l == 1 ) return 1;
+
+ r = Roots[Order64( l )];
+
+ do
+ {
+ s = r;
+ r = ( r + l/r ) >> 1;
+ }
+ while ( r > s || r*r > l );
+
+ return r;
+ }
+
+#else /* LONG64 */
+
+#if 0
+ LOCAL_FUNC
+ TT_Int32 MulDiv( TT_Int32 a, TT_Int32 b, TT_Int32 c )
+ {
+ TT_Int64 temp;
+ TT_Int32 s;
+
+
+ s = a; a = ABS( a );
+ s ^= b; b = ABS( b );
+ s ^= c; c = ABS( c );
+
+ MulTo64( a, b, &temp );
+ a = Div64by32( &temp, c );
+
+ return ( s < 0 ) ? -a : a;
+ }
+
+
+ LOCAL_FUNC
+ TT_Int32 MulDiv_Round( TT_Int32 a, TT_Int32 b, TT_Int32 c )
+ {
+ TT_Int64 temp, temp2;
+ TT_Int32 s;
+
+
+ s = a; a = ABS( a );
+ s ^= b; b = ABS( b );
+ s ^= c; c = ABS( c );
+
+ MulTo64( a, b, &temp );
+ temp2.hi = (TT_Int32)(c >> 31);
+ temp2.lo = (TT_Word32)(c / 2);
+ Add64( &temp, &temp2, &temp );
+ a = Div64by32( &temp, c );
+
+ return ( s < 0 ) ? -a : a;
+ }
+#endif
+
+ /* The TT_MulDiv function has been optimised thanks to ideas from */
+ /* Graham Asher. The trick is to optimise computation when everything */
+ /* fits within 32-bits (a rather common case). */
+ /* */
+ /* we compute 'a*b+c/2', then divide it by 'c'. (positive values) */
+ /* */
+ /* 46340 is FLOOR(SQRT(2^31-1)). */
+ /* */
+ /* if ( a <= 46340 && b <= 46340 ) then ( a*b <= 0x7FFEA810 ) */
+ /* */
+ /* 0x7FFFFFFF - 0x7FFEA810 = 0x157F0 */
+ /* */
+ /* if ( c < 0x157F0*2 ) then ( a*b+c/2 <= 0x7FFFFFFF ) */
+ /* */
+ /* and 2*0x157F0 = 176096 */
+ /* */
+
+ EXPORT_FUNC
+ TT_Long TT_MulDiv( TT_Long a, TT_Long b, TT_Long c )
+ {
+ long s;
+
+
+ if ( a == 0 || b == c )
+ return a;
+
+ s = a; a = ABS( a );
+ s ^= b; b = ABS( b );
+ s ^= c; c = ABS( c );
+
+ if ( a <= 46340 && b <= 46340 && c <= 176095 )
+ {
+ a = ( a*b + c/2 )/c;
+ }
+ else
+ {
+ TT_Int64 temp, temp2;
+
+ MulTo64( a, b, &temp );
+ temp2.hi = (TT_Int32)(c >> 31);
+ temp2.lo = (TT_Word32)(c / 2);
+ Add64( &temp, &temp2, &temp );
+ a = Div64by32( &temp, c );
+ }
+
+ return ( s < 0 ) ? -a : a;
+ }
+
+ /* The optimisation for TT_MulFix is different. We could simply be */
+ /* happy by applying the same principles than with TT_MulDiv, because */
+ /* */
+ /* c = 0x10000 < 176096 */
+ /* */
+ /* however, in most cases, we have a 'b' with a value around 0x10000 */
+ /* which is greater than 46340. */
+ /* */
+ /* According to Graham's testing, most cases have 'a' < 100, so a good */
+ /* idea is to use bounds like 1024 and 2097151 (= floor(2^31-1)/1024 ) */
+ /* for 'a' and 'b' respectively.. */
+ /* */
+
+ EXPORT_FUNC
+ TT_Long TT_MulFix( TT_Long a, TT_Long b )
+ {
+ long s;
+
+ if ( a == 0 || b == 0x10000 )
+ return a;
+
+ s = a; a = ABS( a );
+ s ^= b; b = ABS( b );
+
+ if ( a <= 1024 && b <= 2097151 )
+ {
+ a = ( a*b + 0x8000 ) >> 16;
+ }
+ else
+ {
+ TT_Int64 temp, temp2;
+
+ MulTo64( a, b, &temp );
+ temp2.hi = 0;
+ temp2.lo = 0x8000;
+ Add64( &temp, &temp2, &temp );
+ a = Div64by32( &temp, 0x10000 );
+ }
+
+ return ( s < 0 ) ? -a : a;
+ }
+
+
+ LOCAL_FUNC
+ void Neg64( TT_Int64* x )
+ {
+ /* Remember that -(0x80000000) == 0x80000000 with 2-complement! */
+ /* We take care of that here. */
+
+ x->hi ^= 0xFFFFFFFF;
+ x->lo ^= 0xFFFFFFFF;
+ x->lo++;
+
+ if ( !x->lo )
+ {
+ x->hi++;
+ if ( (TT_Int32)x->hi == 0x80000000 ) /* Check -MaxInt32 - 1 */
+ {
+ x->lo--;
+ x->hi--; /* We return 0x7FFFFFFF! */
+ }
+ }
+ }
+
+
+ LOCAL_FUNC
+ void Add64( TT_Int64* x, TT_Int64* y, TT_Int64* z )
+ {
+ register TT_Word32 lo, hi;
+
+
+ lo = x->lo + y->lo;
+ hi = x->hi + y->hi + ( lo < x->lo );
+
+ z->lo = lo;
+ z->hi = hi;
+ }
+
+
+ LOCAL_FUNC
+ void Sub64( TT_Int64* x, TT_Int64* y, TT_Int64* z )
+ {
+ register TT_Word32 lo, hi;
+
+
+ lo = x->lo - y->lo;
+ hi = x->hi - y->hi - ( (TT_Int32)lo < 0 );
+
+ z->lo = lo;
+ z->hi = hi;
+ }
+
+
+ LOCAL_FUNC
+ void MulTo64( TT_Int32 x, TT_Int32 y, TT_Int64* z )
+ {
+ TT_Int32 s;
+ TT_Word32 lo1, hi1, lo2, hi2, lo, hi, i1, i2;
+
+
+ s = x; x = ABS( x );
+ s ^= y; y = ABS( y );
+
+ lo1 = x & 0x0000FFFF; hi1 = x >> 16;
+ lo2 = y & 0x0000FFFF; hi2 = y >> 16;
+
+ lo = lo1*lo2;
+ i1 = lo1*hi2;
+ i2 = lo2*hi1;
+ hi = hi1*hi2;
+
+ /* Check carry overflow of i1 + i2 */
+
+ if ( i2 )
+ {
+ if ( i1 >= (TT_Word32)-(TT_Int32)i2 ) hi += 1 << 16;
+ i1 += i2;
+ }
+
+ i2 = i1 >> 16;
+ i1 = i1 << 16;
+
+ /* Check carry overflow of i1 + lo */
+ if ( i1 )
+ {
+ if ( lo >= (TT_Word32)-(TT_Int32)i1 ) hi++;
+ lo += i1;
+ }
+
+ hi += i2;
+
+ z->lo = lo;
+ z->hi = hi;
+
+ if ( s < 0 ) Neg64( z );
+ }
+
+
+ LOCAL_FUNC
+ TT_Int32 Div64by32( TT_Int64* x, TT_Int32 y )
+ {
+ TT_Int32 s;
+ TT_Word32 q, r, i, lo;
+
+
+ s = x->hi; if ( s < 0 ) Neg64( x );
+ s ^= y; y = ABS( y );
+
+ /* Shortcut */
+ if ( x->hi == 0 )
+ {
+ q = x->lo / y;
+ return ( s < 0 ) ? -(TT_Int32)q : (TT_Int32)q;
+ }
+
+ r = x->hi;
+ lo = x->lo;
+
+ if ( r >= (TT_Word32)y ) /* we know y is to be treated as unsigned here */
+ return ( s < 0 ) ? 0x80000001 : 0x7FFFFFFF;
+ /* Return Max/Min Int32 if divide overflow */
+ /* This includes division by zero! */
+ q = 0;
+ for ( i = 0; i < 32; i++ )
+ {
+ r <<= 1;
+ q <<= 1;
+ r |= lo >> 31;
+
+ if ( r >= (TT_Word32)y )
+ {
+ r -= y;
+ q |= 1;
+ }
+ lo <<= 1;
+ }
+
+ return ( s < 0 ) ? -(TT_Int32)q : (TT_Int32)q;
+ }
+
+
+ LOCAL_FUNC
+ Int Order64( TT_Int64* z )
+ {
+ TT_Word32 i;
+ Int j;
+
+
+ if ( z->hi )
+ {
+ i = z->hi;
+ j = 32;
+ }
+ else
+ {
+ i = z->lo;
+ j = 0;
+ }
+
+ while ( i > 0 )
+ {
+ i >>= 1;
+ j++;
+ }
+ return j-1;
+ }
+
+
+ LOCAL_FUNC
+ TT_Int32 Sqrt64( TT_Int64* l )
+ {
+ TT_Int64 l2;
+ TT_Int32 r, s;
+
+
+ if ( (TT_Int32)l->hi < 0 ||
+ (l->hi == 0 && l->lo == 0) ) return 0;
+
+ s = Order64( l );
+ if ( s == 0 ) return 1;
+
+ r = Roots[s];
+ do
+ {
+ s = r;
+ r = ( r + Div64by32(l,r) ) >> 1;
+ MulTo64( r, r, &l2 );
+ Sub64 ( l, &l2, &l2 );
+ }
+ while ( r > s || (TT_Int32)l2.hi < 0 );
+
+ return r;
+ }
+
+#endif /* LONG64 */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttcalc.h b/xc/extras/FreeType/lib/ttcalc.h
new file mode 100644
index 000000000..f2b3193a4
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttcalc.h
@@ -0,0 +1,102 @@
+/*******************************************************************
+ *
+ * ttcalc.h
+ *
+ * Arithmetic Computations (specification).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 TTCALC_H
+#define TTCALC_H
+
+#include "ttconfig.h"
+#include "freetype.h"
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifdef LONG64
+
+ typedef INT64 TT_Int64;
+
+#define ADD_64( x, y, z ) z = x + y
+#define SUB_64( x, y, z ) z = x - y
+#define MUL_64( x, y, z ) z = (TT_Int64)(x) * (y)
+
+#define DIV_64( x, y ) ( (x) / (y) )
+
+#define SQRT_64( x ) Sqrt64( x )
+#define SQRT_32( x ) Sqrt32( x )
+
+ LOCAL_DEF TT_Int32 Sqrt64( TT_Int64 l );
+
+#else /* LONG64 */
+
+ struct TT_Int64_
+ {
+ TT_Word32 lo;
+ TT_Word32 hi;
+ };
+
+ typedef struct TT_Int64_ TT_Int64;
+
+#define ADD_64( x, y, z ) Add64( &x, &y, &z )
+#define SUB_64( x, y, z ) Sub64( &x, &y, &z )
+#define MUL_64( x, y, z ) MulTo64( x, y, &z )
+
+#define DIV_64( x, y ) Div64by32( &x, y )
+
+#define SQRT_64( x ) Sqrt64( &x )
+#define SQRT_32( x ) Sqrt32( x )
+
+ LOCAL_DEF void Add64( TT_Int64* x, TT_Int64* y, TT_Int64* z );
+ LOCAL_DEF void Sub64( TT_Int64* x, TT_Int64* y, TT_Int64* z );
+
+ LOCAL_DEF void MulTo64( TT_Int32 x, TT_Int32 y, TT_Int64* z );
+
+ LOCAL_DEF TT_Int32 Div64by32( TT_Int64* x, TT_Int32 y );
+
+ LOCAL_DEF int Order64( TT_Int64* z );
+
+ LOCAL_DEF TT_Int32 Sqrt64( TT_Int64* l );
+
+#endif /* LONG64 */
+
+ /* The two following functions are exported, as they're now part */
+ /* of the API! */
+
+ EXPORT_DEF
+ TT_Long TT_MulDiv( TT_Long a, TT_Long b, TT_Long c );
+
+ EXPORT_DEF
+ TT_Long TT_MulFix( TT_Long a, TT_Long b );
+
+
+#define MUL_FIXED( a, b ) MulDiv_Round( (a), (b), 1 << 16 )
+#define INT_TO_F26DOT6( x ) ( (Long)(x) << 6 )
+#define INT_TO_F2DOT14( x ) ( (Long)(x) << 14 )
+#define INT_TO_FIXED( x ) ( (Long)(x) << 16 )
+#define F2DOT14_TO_FIXED( x ) ( (Long)(x) << 2 )
+#define FLOAT_TO_FIXED( x ) ( (Long)(x * 65536.0) )
+
+#define ROUND_F26DOT6( x ) ( x >= 0 ? ( ((x) + 32) & -64) \
+ : ( -((32 - (x)) & -64) ) )
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTCALC_H */
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttcmap.c b/xc/extras/FreeType/lib/ttcmap.c
new file mode 100644
index 000000000..a58d92d9a
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttcmap.c
@@ -0,0 +1,503 @@
+/*******************************************************************
+ *
+ * ttcmap.c 1.0
+ *
+ * TrueType Character Mappings
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "ttobjs.h"
+#include "ttdebug.h"
+#include "ttfile.h"
+#include "ttmemory.h"
+#include "ttload.h"
+#include "ttcmap.h"
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_cmap
+
+
+/*******************************************************************
+ *
+ * Function : CharMap_Load
+ *
+ * Description : Loads a given charmap into memory.
+ *
+ * Input : cmap pointer to cmap table
+ *
+ * Output : Error code.
+ *
+ * Notes : - Assumes the the stream is already used (opened).
+ *
+ * - In case of error, releases all partially allocated
+ * tables.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error CharMap_Load( PCMapTable cmap,
+ TT_Stream input )
+ {
+ DEFINE_LOAD_LOCALS(input);
+
+ UShort num_SH, num_Seg, i;
+
+ UShort u, l;
+
+ PCMap0 cmap0;
+ PCMap2 cmap2;
+ PCMap4 cmap4;
+ PCMap6 cmap6;
+
+ PCMap2SubHeader cmap2sub;
+ PCMap4Segment segments;
+
+
+ if ( cmap->loaded )
+ return TT_Err_Ok;
+
+ if ( FILE_Seek( cmap->offset ) )
+ return error;
+
+ switch ( cmap->format )
+ {
+ case 0:
+ cmap0 = &cmap->c.cmap0;
+
+ if ( ALLOC( cmap0->glyphIdArray, 256L ) ||
+ FILE_Read( (void*)cmap0->glyphIdArray, 256L ) )
+ goto Fail;
+
+ break;
+
+ case 2:
+ num_SH = 0;
+ cmap2 = &cmap->c.cmap2;
+
+ /* allocate subheader keys */
+
+ if ( ALLOC_ARRAY( cmap2->subHeaderKeys, 256, UShort ) ||
+ ACCESS_Frame( 512L ) )
+ goto Fail;
+
+ for ( i = 0; i < 256; i++ )
+ {
+ u = GET_UShort() / 8;
+ cmap2->subHeaderKeys[i] = u;
+
+ if ( num_SH < u )
+ num_SH = u;
+ }
+
+ FORGET_Frame();
+
+ /* load subheaders */
+
+ cmap2->numGlyphId = l =
+ ( ( cmap->length - 2L * (256 + 3) - num_SH * 8L ) & 0xffff) / 2;
+
+ if ( ALLOC_ARRAY( cmap2->subHeaders,
+ num_SH + 1,
+ TCMap2SubHeader ) ||
+ ACCESS_Frame( ( num_SH + 1 ) * 8L ) )
+ goto Fail;
+
+ cmap2sub = cmap2->subHeaders;
+
+ for ( i = 0; i <= num_SH; i++ )
+ {
+ cmap2sub->firstCode = GET_UShort();
+ cmap2sub->entryCount = GET_UShort();
+ cmap2sub->idDelta = GET_Short();
+ /* we apply the location offset immediately */
+ cmap2sub->idRangeOffset = GET_UShort() - ( num_SH - i ) * 8 - 2;
+
+ cmap2sub++;
+ }
+
+ FORGET_Frame();
+
+ /* load glyph ids */
+
+ if ( ALLOC_ARRAY( cmap2->glyphIdArray, l, UShort ) ||
+ ACCESS_Frame( l * 2L ) )
+ goto Fail;
+
+ for ( i = 0; i < l; i++ )
+ cmap2->glyphIdArray[i] = GET_UShort();
+
+ FORGET_Frame();
+ break;
+
+ case 4:
+ cmap4 = &cmap->c.cmap4;
+
+ /* load header */
+
+ if ( ACCESS_Frame( 8L ) )
+ goto Fail;
+
+ cmap4->segCountX2 = GET_UShort();
+ cmap4->searchRange = GET_UShort();
+ cmap4->entrySelector = GET_UShort();
+ cmap4->rangeShift = GET_UShort();
+
+ num_Seg = cmap4->segCountX2 / 2;
+
+ FORGET_Frame();
+
+ /* load segments */
+
+ if ( ALLOC_ARRAY( cmap4->segments,
+ num_Seg,
+ TCMap4Segment ) ||
+ ACCESS_Frame( (num_Seg * 4 + 1) * 2L ) )
+ goto Fail;
+
+ segments = cmap4->segments;
+
+ for ( i = 0; i < num_Seg; i++ )
+ segments[i].endCount = GET_UShort();
+
+ (void)GET_UShort();
+
+ for ( i = 0; i < num_Seg; i++ )
+ segments[i].startCount = GET_UShort();
+
+ for ( i = 0; i < num_Seg; i++ )
+ segments[i].idDelta = GET_Short();
+
+ for ( i = 0; i < num_Seg; i++ )
+ segments[i].idRangeOffset = GET_UShort();
+
+ FORGET_Frame();
+
+ cmap4->numGlyphId = l =
+ ( ( cmap->length - ( 16L + 8L * num_Seg ) ) & 0xffff ) / 2;
+
+ /* load ids */
+
+ if ( ALLOC_ARRAY( cmap4->glyphIdArray, l , UShort ) ||
+ ACCESS_Frame( l * 2L ) )
+ goto Fail;
+
+ for ( i = 0; i < l; i++ )
+ cmap4->glyphIdArray[i] = GET_UShort();
+
+ FORGET_Frame();
+ break;
+
+ case 6:
+ cmap6 = &cmap->c.cmap6;
+
+ if ( ACCESS_Frame( 4L ) )
+ goto Fail;
+
+ cmap6->firstCode = GET_UShort();
+ cmap6->entryCount = GET_UShort();
+
+ FORGET_Frame();
+
+ l = cmap6->entryCount;
+
+ if ( ALLOC_ARRAY( cmap6->glyphIdArray,
+ cmap6->entryCount,
+ Short ) ||
+ ACCESS_Frame( l * 2L ) )
+ goto Fail;
+
+ for ( i = 0; i < l; i++ )
+ cmap6->glyphIdArray[i] = GET_UShort();
+
+ FORGET_Frame();
+ break;
+
+ default: /* corrupt character mapping table */
+ return TT_Err_Invalid_CharMap_Format;
+
+ }
+ return TT_Err_Ok;
+
+ Fail:
+ CharMap_Free( cmap );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : CharMap_Free
+ *
+ * Description : Releases a given charmap table.
+ *
+ * Input : cmap pointer to cmap table
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error CharMap_Free( PCMapTable cmap )
+ {
+ if ( !cmap )
+ return TT_Err_Ok;
+
+ switch ( cmap->format )
+ {
+ case 0:
+ FREE( cmap->c.cmap0.glyphIdArray );
+ break;
+
+ case 2:
+ FREE( cmap->c.cmap2.subHeaderKeys );
+ FREE( cmap->c.cmap2.subHeaders );
+ FREE( cmap->c.cmap2.glyphIdArray );
+ break;
+
+ case 4:
+ FREE( cmap->c.cmap4.segments );
+ FREE( cmap->c.cmap4.glyphIdArray );
+ cmap->c.cmap4.segCountX2 = 0;
+ break;
+
+ case 6:
+ FREE( cmap->c.cmap6.glyphIdArray );
+ cmap->c.cmap6.entryCount = 0;
+ break;
+
+ default:
+ /* invalid table format, do nothing */
+ ;
+ }
+
+ cmap->loaded = FALSE;
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : CharMap_Index
+ *
+ * Description : Performs charcode->glyph index translation.
+ *
+ * Input : cmap pointer to cmap table
+ *
+ * Output : Glyph index, 0 in case of failure.
+ *
+ ******************************************************************/
+
+ static UShort code_to_index0( UShort charCode, PCMap0 cmap0 );
+ static UShort code_to_index2( UShort charCode, PCMap2 cmap2 );
+ static UShort code_to_index4( UShort charCode, PCMap4 cmap4 );
+ static UShort code_to_index6( UShort charCode, PCMap6 cmap6 );
+
+
+ LOCAL_FUNC
+ UShort CharMap_Index( PCMapTable cmap,
+ UShort charcode )
+ {
+ switch ( cmap->format )
+ {
+ case 0:
+ return code_to_index0( charcode, &cmap->c.cmap0 );
+ case 2:
+ return code_to_index2( charcode, &cmap->c.cmap2 );
+ case 4:
+ return code_to_index4( charcode, &cmap->c.cmap4 );
+ case 6:
+ return code_to_index6( charcode, &cmap->c.cmap6 );
+ default:
+ return 0;
+ }
+ }
+
+
+/*******************************************************************
+ *
+ * Function : code_to_index0
+ *
+ * Description : Converts the character code into a glyph index.
+ * Uses format 0.
+ * charCode will be masked to get a value in the range
+ * 0x00-0xFF.
+ *
+ * Input : charCode the wanted character code
+ * cmap0 a pointer to a cmap table in format 0
+ *
+ * Output : Glyph index into the glyphs array.
+ * 0 if the glyph does not exist.
+ *
+ ******************************************************************/
+
+ static UShort code_to_index0( UShort charCode,
+ PCMap0 cmap0 )
+ {
+ if ( charCode <= 0xFF )
+ return cmap0->glyphIdArray[charCode];
+ else
+ return 0;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : code_to_index2
+ *
+ * Description : Converts the character code into a glyph index.
+ * Uses format 2.
+ *
+ * Input : charCode the wanted character code
+ * cmap2 a pointer to a cmap table in format 2
+ *
+ * Output : Glyph index into the glyphs array.
+ * 0 if the glyph does not exist.
+ *
+ ******************************************************************/
+
+ static UShort code_to_index2( UShort charCode,
+ PCMap2 cmap2 )
+ {
+ UShort index1, idx, offset;
+ TCMap2SubHeader sh2;
+
+
+ index1 = cmap2->subHeaderKeys[charCode <= 0xFF ?
+ charCode : (charCode >> 8)];
+
+ if ( index1 == 0 )
+ {
+ if ( charCode <= 0xFF )
+ return cmap2->glyphIdArray[charCode]; /* 8bit character code */
+ else
+ return 0;
+ }
+ else /* 16bit character code */
+ {
+ if ( charCode <= 0xFF )
+ return 0;
+
+ sh2 = cmap2->subHeaders[index1];
+
+ if ( (charCode & 0xFF) < sh2.firstCode )
+ return 0;
+
+ if ( (charCode & 0xFF) >= (sh2.firstCode + sh2.entryCount) )
+ return 0;
+
+ offset = sh2.idRangeOffset / 2 + (charCode & 0xFF) - sh2.firstCode;
+ if ( offset < cmap2->numGlyphId )
+ idx = cmap2->glyphIdArray[offset];
+ else
+ return 0;
+
+ if ( idx )
+ return (idx + sh2.idDelta) & 0xFFFF;
+ else
+ return 0;
+ }
+ }
+
+
+/*******************************************************************
+ *
+ * Function : code_to_index4
+ *
+ * Description : Converts the character code into a glyph index.
+ * Uses format 4.
+ *
+ * Input : charCode the wanted character code
+ * cmap4 a pointer to a cmap table in format 4
+ *
+ * Output : Glyph index into the glyphs array.
+ * 0 if the glyph does not exist.
+ *
+ ******************************************************************/
+
+ static UShort code_to_index4( UShort charCode,
+ PCMap4 cmap4 )
+ {
+ UShort index1, segCount;
+ UShort i;
+ TCMap4Segment seg4;
+
+
+ segCount = cmap4->segCountX2 / 2;
+
+ for ( i = 0; i < segCount; i++ )
+ if ( charCode <= cmap4->segments[i].endCount )
+ break;
+
+ /* Safety check - even though the last endCount should be 0xFFFF */
+ if ( i >= segCount )
+ return 0;
+
+ seg4 = cmap4->segments[i];
+
+ if ( charCode < seg4.startCount )
+ return 0;
+
+ if ( seg4.idRangeOffset == 0 )
+ return ( charCode + seg4.idDelta ) & 0xFFFF;
+ else
+ {
+ index1 = seg4.idRangeOffset / 2 + (charCode - seg4.startCount) -
+ (segCount - i);
+
+ if ( index1 < cmap4->numGlyphId )
+ {
+ if ( cmap4->glyphIdArray[index1] == 0 )
+ return 0;
+ else
+ return ( cmap4->glyphIdArray[index1] + seg4.idDelta ) & 0xFFFF;
+ }
+ else
+ return 0;
+ }
+ }
+
+
+/*******************************************************************
+ *
+ * Function : code_to_index6
+ *
+ * Description : Converts the character code into a glyph index.
+ * Uses format 6.
+ *
+ * Input : charCode the wanted character code
+ * cmap6 a pointer to a cmap table in format 6
+ *
+ * Output : Glyph index into the glyphs array.
+ * 0 if the glyph does not exist (`missing character glyph').
+ *
+ ******************************************************************/
+
+ static UShort code_to_index6( UShort charCode,
+ PCMap6 cmap6 )
+ {
+ UShort firstCode;
+
+
+ firstCode = cmap6->firstCode;
+
+ if ( charCode < firstCode )
+ return 0;
+
+ if ( charCode >= (firstCode + cmap6->entryCount) )
+ return 0;
+
+ return cmap6->glyphIdArray[charCode - firstCode];
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttcmap.h b/xc/extras/FreeType/lib/ttcmap.h
new file mode 100644
index 000000000..577612175
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttcmap.h
@@ -0,0 +1,169 @@
+/*******************************************************************
+ *
+ * ttcmap.h 1.0
+ *
+ * TrueType Character Mappings
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ ******************************************************************/
+
+#ifndef TTCMAP_H
+#define TTCMAP_H
+
+#include "ttconfig.h"
+#include "tttypes.h"
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ /* format 0 */
+
+ struct TCMap0_
+ {
+ PByte glyphIdArray;
+ };
+
+ typedef struct TCMap0_ TCMap0;
+ typedef TCMap0* PCMap0;
+
+
+ /* format 2 */
+
+ struct TCMap2SubHeader_
+ {
+ UShort firstCode; /* first valid low byte */
+ UShort entryCount; /* number of valid low bytes */
+ Short idDelta; /* delta value to glyphIndex */
+ UShort idRangeOffset; /* offset from here to 1st code */
+ };
+
+ typedef struct TCMap2SubHeader_ TCMap2SubHeader;
+ typedef TCMap2SubHeader* PCMap2SubHeader;
+
+ struct TCMap2_
+ {
+ PUShort subHeaderKeys;
+ /* high byte mapping table */
+ /* value = subHeader index * 8 */
+
+ PCMap2SubHeader subHeaders;
+ PUShort glyphIdArray;
+ UShort numGlyphId; /* control value */
+ };
+
+ typedef struct TCMap2_ TCMap2;
+ typedef TCMap2* PCMap2;
+
+
+ /* format 4 */
+
+ struct TCMap4Segment_
+ {
+ UShort endCount;
+ UShort startCount;
+ Short idDelta; /* in the specs defined as UShort but the
+ example there gives negative values... */
+ UShort idRangeOffset;
+ };
+
+ typedef struct TCMap4Segment_ TCMap4Segment;
+ typedef TCMap4Segment* PCMap4Segment;
+
+ struct TCMap4_
+ {
+ UShort segCountX2; /* number of segments * 2 */
+ UShort searchRange; /* these parameters can be used */
+ UShort entrySelector; /* for a binary search */
+ UShort rangeShift;
+
+ PCMap4Segment segments;
+ PUShort glyphIdArray;
+ UShort numGlyphId; /* control value */
+ };
+
+ typedef struct TCMap4_ TCMap4;
+ typedef TCMap4* PCMap4;
+
+
+ /* format 6 */
+
+ struct TCMap6_
+ {
+ UShort firstCode; /* first character code of subrange */
+ UShort entryCount; /* number of character codes in subrange */
+
+ PUShort glyphIdArray;
+ };
+
+ typedef struct TCMap6_ TCMap6;
+ typedef TCMap6* PCMap6;
+
+
+ /* charmap table */
+
+ struct TCMapTable_
+ {
+ UShort platformID;
+ UShort platformEncodingID;
+ UShort format;
+ UShort length;
+ UShort version;
+
+ Bool loaded;
+ ULong offset;
+
+ union
+ {
+ TCMap0 cmap0;
+ TCMap2 cmap2;
+ TCMap4 cmap4;
+ TCMap6 cmap6;
+ } c;
+ };
+
+ typedef struct TCMapTable_ TCMapTable;
+ typedef TCMapTable* PCMapTable;
+
+
+
+ /* Load character mappings directory when face is loaded. */
+ /* The mappings themselves are only loaded on demand. */
+
+ LOCAL_DEF
+ TT_Error CharMap_Load( PCMapTable table,
+ TT_Stream input );
+
+
+ /* Destroy one character mapping table */
+
+ LOCAL_DEF
+ TT_Error CharMap_Free( PCMapTable table );
+
+
+ /* Use character mapping table to perform mapping */
+
+ LOCAL_DEF
+ UShort CharMap_Index( PCMapTable cmap,
+ UShort charCode );
+
+ /* NOTE: The PFace type isn't defined at this point */
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTCMAP_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttconfig.h b/xc/extras/FreeType/lib/ttconfig.h
new file mode 100644
index 000000000..405da60ae
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttconfig.h
@@ -0,0 +1,215 @@
+/*******************************************************************
+ *
+ * ttconfig.h 1.0
+ *
+ * Configuration settings header file (spec only).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Notes:
+ *
+ * All the configuration #define statements have been gathered in
+ * this file to allow easy check and modification.
+ *
+ ******************************************************************/
+
+#ifndef TTCONFIG_H
+#define TTCONFIG_H
+
+/* ------------ auto configuration ------------------------------------- */
+
+/*************************************************************************/
+/* Here we include the file ft_conf.h for system dependent stuff. */
+/* The specific makefile is responsible for providing the right path to */
+/* this file. */
+
+#include "ft_conf.h"
+
+
+/**************************************************************************/
+/* Define TT_CONFIG_THREAD_SAFE if you want to build a thread-safe */
+/* version of the library. */
+
+/* #define TT_CONFIG_OPTION_THREAD_SAFE */
+
+/* ------------ general debugging -------------------------------------- */
+
+/*************************************************************************/
+/* Define DEBUG if you want the program to output a series of messages */
+/* to stderr regarding its behaviour. Only useful during development. */
+/* */
+/* Note that you should link the engine with the 'ttdebug' component. */
+/* The latter can be ignored in normal compiles. */
+
+/* #define DEBUG */
+
+
+/*************************************************************************/
+/* Define this if you want to generate a debug version of the */
+/* rasterizer. This will progressively draw the glyphs while the */
+/* computations are done directly on the graphics screen... (with */
+/* inverted glyphs) */
+/* */
+/* IMPORTANT: This is reserved to developers willing to debug the */
+/* rasterizer, which seems working very well in its */
+/* current state... */
+
+/* #define DEBUG_RASTER */
+
+
+
+/* ------------ arithmetic and processor support ----------------------- */
+
+/*************************************************************************/
+/* Define TT_USE_LONG_LONG if you want to enable the use of the */
+/* 'long long' 64-bit type provided by gcc and other compilers. Note */
+/* that : */
+/* */
+/* 1. The type isn't ANSI, and thus will produce many warnings */
+/* during library compilation. */
+/* */
+/* 2. Though the generated object files are slightly smaller, the */
+/* resulting executables are bigger of about 4Kb! gcc must be */
+/* linking some extra code in there! */
+/* */
+/* 3. There is really no speed gain in doing so (but it may help */
+/* debug the ttcalc component). */
+/* */
+/* IMPORTANT NOTE: You don't need to define it on 64-bits machines! */
+/* */
+/* NOTE 2 : This flag used to be _GNUC_LONG64_ */
+
+/* #define TT_USE_LONG_LONG */
+
+
+/*************************************************************************/
+/* define ALIGNMENT to your processor/environment preferred alignment */
+/* size. A value of 8 should work on all current processors, even */
+/* 64-bits ones. */
+
+#define ALIGNMENT 8
+
+
+
+/* --------------- automatic setup -- don't touch ------------------ */
+
+/*********************************************************************/
+/* If HAVE_TT_TEXT is defined we don't provide a default typedef for */
+/* defining TT_Text. */
+
+#ifndef HAVE_TT_TEXT
+#define HAVE_TT_TEXT
+ typedef char TT_Text;
+#endif
+
+
+/*********************************************************************/
+/* We define NULL in case it's not defined yet. The default */
+/* location is stdlib.h. */
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+
+/*********************************************************************/
+/* Some systems can't use vfprintf for error messages on stderr; if */
+/* HAVE_PRINT_FUNCTION is defined, the Print macro must be supplied */
+/* externally (having the same parameters). */
+/* */
+/* This is only used by the "ttdebug" component, which should be */
+/* linked to the engine only in debug mode. */
+
+#ifdef DEBUG
+#ifndef HAVE_PRINT_FUNCTION
+#define Print( format, ap ) vfprintf( stderr, (format), (ap) )
+#endif
+
+#define FT_BIG_ENDIAN 4321
+#define FT_LITTLE_ENDIAN 1234
+
+#ifdef WORDS_BIGENDIAN
+#define FT_BYTE_ORDER FT_BIG_ENDIAN
+#else
+#define FT_BYTE_ORDER FT_LITTLE_ENDIAN
+#endif
+#endif
+
+
+/********************************************************************/
+/* */
+/* I have added the ability to compile the library into a single */
+/* object file. This gets rids of all the external symbols defined */
+/* in each component interface, and de-pollutes the name-space. */
+/* */
+/* I use two macros, namely LOCAL_FUNC and LOCAL_DEF, which only */
+/* apply to functions that are internal to the engine, and */
+/* should never be seen or linked by a client application. */
+/* */
+/* LOCAL_DEF used in header (.h) files, to define a function */
+/* that will be seen by other components. This */
+/* translates to "extern" in normal mode, and to */
+/* "static" in single-object mode. */
+/* */
+/* LOCAL_FUNC used in implementation (.c) files, just before */
+/* the function body. This translates to nothing */
+/* in normal mode, and to "static" in single-object */
+/* mode. */
+/* */
+/* Getting rid of un-necessary symbols makes the "ttcommon" */
+/* renaming macros hack unnecessary. Moreover, the stripped */
+/* single object file (freetype.o) is 52 Kb, instead of the */
+/* previous 57 Kb (size of all combined .o files), and gives */
+/* a better idea of the engine's real code size. */
+/* */
+/* It is called a "MAKE_OPTION" because the macro must be */
+/* defined in the Makefile, rather than this one. It allows */
+/* any developer to quickly switch from one mode to the other */
+/* without messing with "ttconfig.h" each time. */
+/* */
+#ifndef TT_MAKE_OPTION_SINGLE_OBJECT
+#define LOCAL_FUNC /* void */
+#define LOCAL_DEF extern
+#else
+#define LOCAL_FUNC static
+#define LOCAL_DEF static
+#endif
+
+
+/*************************************************************************/
+/* Define EXPORT_DEF and EXPORT_FUNC as needed to build e.g. a DLL. All */
+/* variables and functions visible from outside have these prefixes. */
+
+#ifndef EXPORT_DEF
+#define EXPORT_DEF extern
+#endif
+
+#ifndef EXPORT_FUNC
+#define EXPORT_FUNC /* void */
+#endif
+
+
+/* -------------- internal (developer) configuration toggles ------------ */
+
+#undef TT_STATIC_INTERPRETER
+/* Do not undefine this configuration macro. It is now a default that */
+/* must be kept in all release builds. */
+
+
+#undef TT_STATIC_RASTER
+/* Define this if you want to generate a static raster. This makes */
+/* a non re-entrant version of the scan-line converter, which is */
+/* about 10% faster and 50% bigger than an indirect one! */
+
+
+#endif /* TTCONFIG_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttdebug.c b/xc/extras/FreeType/lib/ttdebug.c
new file mode 100644
index 000000000..ca49be804
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttdebug.c
@@ -0,0 +1,396 @@
+/* Simple debugging component. Temporary */
+
+#include "ttdebug.h"
+#include "tttables.h"
+#include "ttobjs.h"
+
+
+#ifdef DEBUG_LEVEL_TRACE
+ Byte tt_trace_levels[trace_max];
+#endif
+
+#if defined(DEBUG_LEVEL_ERROR) || defined(DEBUG_LEVEL_TRACE)
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+
+
+ typedef Byte ByteStr[2];
+ typedef Byte WordStr[4];
+ typedef Byte LongStr[8];
+ typedef Byte DebugStr[128];
+
+ static DebugStr tempStr;
+
+ static const String* OpStr[256] = {
+ "SVTCA y", /* Set vectors to coordinate axis y */
+ "SVTCA x", /* Set vectors to coordinate axis x */
+ "SPvTCA y", /* Set Proj. vec. to coord. axis y */
+ "SPvTCA x", /* Set Proj. vec. to coord. axis x */
+ "SFvTCA y", /* Set Free. vec. to coord. axis y */
+ "SFvTCA x", /* Set Free. vec. to coord. axis x */
+ "SPvTL //", /* Set Proj. vec. parallel to segment */
+ "SPvTL +", /* Set Proj. vec. normal to segment */
+ "SFvTL //", /* Set Free. vec. parallel to segment */
+ "SFvTL +", /* Set Free. vec. normal to segment */
+ "SPvFS", /* Set Proj. vec. from stack */
+ "SFvFS", /* Set Free. vec. from stack */
+ "GPV", /* Get projection vector */
+ "GFV", /* Get freedom vector */
+ "SFvTPv", /* Set free. vec. to proj. vec. */
+ "ISECT", /* compute intersection */
+
+ "SRP0", /* Set reference point 0 */
+ "SRP1", /* Set reference point 1 */
+ "SRP2", /* Set reference point 2 */
+ "SZP0", /* Set Zone Pointer 0 */
+ "SZP1", /* Set Zone Pointer 1 */
+ "SZP2", /* Set Zone Pointer 2 */
+ "SZPS", /* Set all zone pointers */
+ "SLOOP", /* Set loop counter */
+ "RTG", /* Round to Grid */
+ "RTHG", /* Round to Half-Grid */
+ "SMD", /* Set Minimum Distance */
+ "ELSE", /* Else */
+ "JMPR", /* Jump Relative */
+ "SCvTCi", /* Set CVT */
+ "SSwCi", /* */
+ "SSW", /* */
+
+ "DUP",
+ "POP",
+ "CLEAR",
+ "SWAP",
+ "DEPTH",
+ "CINDEX",
+ "MINDEX",
+ "AlignPTS",
+ "INS_$28",
+ "UTP",
+ "LOOPCALL",
+ "CALL",
+ "FDEF",
+ "ENDF",
+ "MDAP[-]",
+ "MDAP[r]",
+
+ "IUP[y]",
+ "IUP[x]",
+ "SHP[0]",
+ "SHP[1]",
+ "SHC[0]",
+ "SHC[1]",
+ "SHZ[0]",
+ "SHZ[1]",
+ "SHPIX",
+ "IP",
+ "MSIRP[0]",
+ "MSIRP[1]",
+ "AlignRP",
+ "RTDG",
+ "MIAP[-]",
+ "MIAP[r]",
+
+ "NPushB",
+ "NPushW",
+ "WS",
+ "RS",
+ "WCvtP",
+ "RCvt",
+ "GC[0]",
+ "GC[1]",
+ "SCFS",
+ "MD[0]",
+ "MD[1]",
+ "MPPEM",
+ "MPS",
+ "FlipON",
+ "FlipOFF",
+ "DEBUG",
+
+ "LT",
+ "LTEQ",
+ "GT",
+ "GTEQ",
+ "EQ",
+ "NEQ",
+ "ODD",
+ "EVEN",
+ "IF",
+ "EIF",
+ "AND",
+ "OR",
+ "NOT",
+ "DeltaP1",
+ "SDB",
+ "SDS",
+
+ "ADD",
+ "SUB",
+ "DIV",
+ "MUL",
+ "ABS",
+ "NEG",
+ "FLOOR",
+ "CEILING",
+ "ROUND[G]",
+ "ROUND[B]",
+ "ROUND[W]",
+ "ROUND[?]",
+ "NROUND[G]",
+ "NROUND[B]",
+ "NROUND[W]",
+ "NROUND[?]",
+
+ "WCvtF",
+ "DeltaP2",
+ "DeltaP3",
+ "DeltaC1",
+ "DeltaC2",
+ "DeltaC3",
+ "SROUND",
+ "S45Round",
+ "JROT",
+ "JROF",
+ "ROFF",
+ "INS_$7B",
+ "RUTG",
+ "RDTG",
+ "SANGW",
+ "AA",
+
+ "FlipPT",
+ "FlipRgON",
+ "FlipRgOFF",
+ "INS_$83",
+ "INS_$84",
+ "ScanCTRL",
+ "SDPVTL[0]",
+ "SDPVTL[1]",
+ "GetINFO",
+ "IDEF",
+ "ROLL",
+ "MAX",
+ "MIN",
+ "ScanTYPE",
+ "IntCTRL",
+ "INS_$8F",
+
+ "INS_$90",
+ "INS_$91",
+ "INS_$92",
+ "INS_$93",
+ "INS_$94",
+ "INS_$95",
+ "INS_$96",
+ "INS_$97",
+ "INS_$98",
+ "INS_$99",
+ "INS_$9A",
+ "INS_$9B",
+ "INS_$9C",
+ "INS_$9D",
+ "INS_$9E",
+ "INS_$9F",
+
+ "INS_$A0",
+ "INS_$A1",
+ "INS_$A2",
+ "INS_$A3",
+ "INS_$A4",
+ "INS_$A5",
+ "INS_$A6",
+ "INS_$A7",
+ "INS_$A8",
+ "INS_$A9",
+ "INS_$AA",
+ "INS_$AB",
+ "INS_$AC",
+ "INS_$AD",
+ "INS_$AE",
+ "INS_$AF",
+
+ "PushB[0]",
+ "PushB[1]",
+ "PushB[2]",
+ "PushB[3]",
+ "PushB[4]",
+ "PushB[5]",
+ "PushB[6]",
+ "PushB[7]",
+ "PushW[0]",
+ "PushW[1]",
+ "PushW[2]",
+ "PushW[3]",
+ "PushW[4]",
+ "PushW[5]",
+ "PushW[6]",
+ "PushW[7]",
+
+ "MDRP[G]",
+ "MDRP[B]",
+ "MDRP[W]",
+ "MDRP[?]",
+ "MDRP[rG]",
+ "MDRP[rB]",
+ "MDRP[rW]",
+ "MDRP[r?]",
+ "MDRP[mG]",
+ "MDRP[mB]",
+ "MDRP[mW]",
+ "MDRP[m?]",
+ "MDRP[mrG]",
+ "MDRP[mrB]",
+ "MDRP[mrW]",
+ "MDRP[mr?]",
+ "MDRP[pG]",
+ "MDRP[pB]",
+
+ "MDRP[pW]",
+ "MDRP[p?]",
+ "MDRP[prG]",
+ "MDRP[prB]",
+ "MDRP[prW]",
+ "MDRP[pr?]",
+ "MDRP[pmG]",
+ "MDRP[pmB]",
+ "MDRP[pmW]",
+ "MDRP[pm?]",
+ "MDRP[pmrG]",
+ "MDRP[pmrB]",
+ "MDRP[pmrW]",
+ "MDRP[pmr?]",
+
+ "MIRP[G]",
+ "MIRP[B]",
+ "MIRP[W]",
+ "MIRP[?]",
+ "MIRP[rG]",
+ "MIRP[rB]",
+ "MIRP[rW]",
+ "MIRP[r?]",
+ "MIRP[mG]",
+ "MIRP[mB]",
+ "MIRP[mW]",
+ "MIRP[m?]",
+ "MIRP[mrG]",
+ "MIRP[mrB]",
+ "MIRP[mrW]",
+ "MIRP[mr?]",
+ "MIRP[pG]",
+ "MIRP[pB]",
+
+ "MIRP[pW]",
+ "MIRP[p?]",
+ "MIRP[prG]",
+ "MIRP[prB]",
+ "MIRP[prW]",
+ "MIRP[pr?]",
+ "MIRP[pmG]",
+ "MIRP[pmB]",
+ "MIRP[pmW]",
+ "MIRP[pm?]",
+ "MIRP[pmrG]",
+ "MIRP[pmrB]",
+ "MIRP[pmrW]",
+ "MIRP[pmr?]"
+ };
+
+
+ const String* Cur_U_Line( void* _exec )
+ {
+ String s[32];
+
+ Int op, i, n;
+
+ PExecution_Context exec;
+
+ exec = _exec;
+
+ op = exec->code[ exec->IP ];
+
+ sprintf( tempStr, "%04hx: %02hx %s", exec->IP, op, OpStr[op] );
+
+ if ( op == 0x40 )
+ {
+ n = exec->code[ exec->IP+1 ];
+ sprintf( s, "(%d)", n );
+ strncat( tempStr, s, 8 );
+
+ if ( n > 20 ) n = 20; /* limit output */
+
+ for ( i = 0; i < n; i++ )
+ {
+ sprintf( s, " $%02hx", exec->code[ exec->IP+i+2 ] );
+ strncat( tempStr, s, 8 );
+ }
+ }
+ else if ( op == 0x41 )
+ {
+ n = exec->code[ exec->IP+1 ];
+ sprintf( s, "(%d)", n );
+ strncat( tempStr, s, 8 );
+
+ if (n > 20) n = 20; /* limit output */
+
+ for ( i = 0; i < n; i++ )
+ {
+ sprintf( s, " $%02hx%02hx", exec->code[ exec->IP+i*2+2 ],
+ exec->code[ exec->IP+i*2+3 ] );
+ strncat( tempStr, s, 8 );
+ }
+ }
+ else if ( (op & 0xF8) == 0xB0 )
+ {
+ n = op-0xB0;
+
+ for ( i=0; i <= n; i++ )
+ {
+ sprintf( s, " $%02hx", exec->code[ exec->IP+i+1 ] );
+ strncat( tempStr, s, 8 );
+ }
+ }
+ else if ( (op & 0xF8) == 0xB8 )
+ {
+ n = op-0xB8;
+
+ for ( i = 0; i <= n; i++ )
+ {
+ sprintf( s, " $%02hx%02hx", exec->code[ exec->IP+i*2+1 ],
+ exec->code[ exec->IP+i*2+2 ] );
+ strncat( tempStr, s, 8 );
+ }
+ }
+
+ return (String*)tempStr;
+ }
+
+ /* the Print() function is defined in ttconfig.h */
+ /* it defaults to vprintf on systems which have it */
+
+ void TT_Message( const String* fmt, ... )
+ {
+ va_list ap;
+
+ va_start( ap, fmt );
+ Print( fmt, ap );
+ va_end( ap );
+ }
+
+
+ void TT_Panic( const String* fmt, ... )
+ {
+ va_list ap;
+
+ va_start( ap, fmt );
+ Print( fmt, ap );
+ va_end( ap );
+
+ exit( EXIT_FAILURE );
+ }
+
+#endif /* DEBUG */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttdebug.h b/xc/extras/FreeType/lib/ttdebug.h
new file mode 100644
index 000000000..8395d30c4
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttdebug.h
@@ -0,0 +1,141 @@
+/*******************************************************************
+ *
+ * ttdebug.h
+ *
+ * Debugging and Logging component (specification)
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * This component contains various macros and functions used to
+ * ease the debugging of the FreeType engine. Their main purpose
+ * is in assertion checking, tracing and error detection.
+ *
+ * There are now three debugging modes :
+ *
+ * - trace mode :
+ *
+ * error and trace messages are sent to the log file
+ * (which can be the standard error output)
+ *
+ * - error mode :
+ *
+ * only error messages are generated.
+ *
+ * - release mode :
+ *
+ * no error message is sent nor generated. The code is
+ * free from any debugging parts.
+ *
+ ******************************************************************/
+
+#ifndef TTDEBUG_H
+#define TTDEBUG_H
+
+#include "ttconfig.h"
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifdef DEBUG_LEVEL_TRACE
+
+ typedef enum Trace_Component_
+ {
+ trace_any = 0,
+ trace_api,
+ trace_interp,
+ trace_load,
+ trace_gload,
+ trace_memory,
+ trace_file,
+ trace_mutex,
+ trace_cache,
+ trace_calc,
+ trace_cmap,
+ trace_extend,
+ trace_objs,
+ trace_raster,
+
+ trace_max
+
+ } Trace_Component;
+
+ extern Byte tt_trace_levels[trace_max];
+
+ /* XXXX IMPORTANT XXXX : */
+ /* */
+ /* Each component must define the macro TT_COMPONENT */
+ /* to a valid Trace_Component value before using any */
+ /* TRACE macro. */
+ /* */
+
+#define PTRACE( level, varformat ) \
+ if ( tt_trace_levels[TT_COMPONENT] >= level ) TT_Message##varformat
+
+#elif defined(DEBUG_LEVEL_ERROR)
+
+#else /* RELEASE MODE */
+
+#define TT_Assert( condition, action ) /* nothing !! */
+
+#define PTRACE( level, varformat ) /* nothing */
+#define PERROR( varformat ) /* nothing */
+#define PANIC( varformat ) /* nothing */
+
+#endif
+
+
+
+
+/************************************************************************/
+/* */
+/* Define macros and fuctions that are common the the debug and trace */
+/* modes. */
+/* */
+/* You need vprintf to be able to compile ttdebug.c */
+/* */
+
+#if defined(DEBUG_LEVEL_TRACE) || defined(DEBUG_LEVEL_ERROR)
+
+#include <stdio.h>
+
+
+#define TT_Assert( condition, action ) if ( !(condition) ) ( action )
+
+ extern void TT_Message( const String* fmt, ... );
+ extern void TT_Panic ( const String* fmt, ... );
+ /* print a message and exit */
+
+ extern const String* Cur_U_Line( void* exec );
+
+#define PERROR( varformat ) TT_Message##varformat
+#define PANIC( varformat ) TT_Panic##varformat
+
+#endif
+
+
+#define PTRACE0( varformat ) PTRACE( 0, varformat )
+#define PTRACE1( varformat ) PTRACE( 1, varformat )
+#define PTRACE2( varformat ) PTRACE( 2, varformat )
+#define PTRACE3( varformat ) PTRACE( 3, varformat )
+#define PTRACE4( varformat ) PTRACE( 4, varformat )
+#define PTRACE5( varformat ) PTRACE( 5, varformat )
+#define PTRACE6( varformat ) PTRACE( 6, varformat )
+#define PTRACE7( varformat ) PTRACE( 7, varformat )
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+
+#endif /* TTDEBUG_H */
diff --git a/xc/extras/FreeType/lib/ttengine.h b/xc/extras/FreeType/lib/ttengine.h
new file mode 100644
index 000000000..dabddc20f
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttengine.h
@@ -0,0 +1,115 @@
+/*******************************************************************
+ *
+ * ttengine.h 1.1
+ *
+ * Engine instance structure definition.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * New in 1.1 :
+ *
+ * - added the 'raster_lock' mutex field to synchronize
+ * scan-line conversion in thread-safe and re-entrant builds.
+ *
+ ******************************************************************/
+
+#ifndef TTENGINE_H
+#define TTENGINE_H
+
+#include "tttypes.h"
+#include "ttconfig.h"
+#include "freetype.h"
+#include "ttmutex.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ /********************************************************************/
+ /* */
+ /* The freetype engine instance structure. */
+ /* */
+ /* This structure holds all the data that is necessary to run */
+ /* one instance of the freetype engine. It is needed to get a */
+ /* completely re-entrant version of the library. */
+ /* */
+ /* The goal is to move _all_ component-specific variables, either */
+ /* static or global in the structure; the component initializers */
+ /* and finalizers will all be called with the address of a valid */
+ /* TEngine_Instance. */
+ /* */
+ /********************************************************************/
+
+ struct TEngine_Instance_
+ {
+ TMutex lock; /* engine lock */
+
+ void* list_free_elements;
+
+ void* objs_face_class; /* the face cache class */
+ void* objs_instance_class; /* the instance cache class */
+ void* objs_execution_class; /* the context cache class */
+ void* objs_glyph_class; /* the glyph cache class */
+
+ void* objs_face_cache; /* these caches are used to track */
+ void* objs_exec_cache; /* the current face and execution */
+ /* context objects */
+
+ void* file_component; /* ttfile implementation dependent */
+
+ TMutex raster_lock; /* mutex for this engine's render pool */
+ void* raster_component; /* ttraster implementation depedent */
+ Byte raster_palette[5]; /* gray-levels palette for anti-aliasing */
+
+ void* extension_component; /* extensions dependent */
+
+#if 0
+ TT_Glyph_Loader_Callback glCallback; /* glyph loader callback, if any */
+#endif
+ };
+
+ /* NOTE : The raster's lock is only acquired by the Render_Glyph and */
+ /* Render_Gray_Glyph functions, which always release it on exit */
+ /* They do not lock the engine mutex. This means you shouldn't */
+ /* be concerned about deadlocks between the two mutexes, as these */
+ /* should never appear.. */
+
+ typedef struct TEngine_Instance_ TEngine_Instance;
+ typedef TEngine_Instance* PEngine_Instance;
+
+
+#ifdef TT_CONFIG_OPTION_THREAD_SAFE /* for re-entrant builds */
+
+#define ENGINE_ARG TEngine_Instance* _engine
+#define ENGINE_ARGS TEngine_Instance* _engine,
+
+#define ENGINE_VAR _engine
+#define ENGINE_VARS _engine,
+
+#define ENGINE _engine
+
+#else /* for thread-safe builds */
+
+#define ENGINE_ARG /* void */
+#define ENGINE_ARGS
+
+#define ENGINE_VAR
+#define ENGINE_VARS
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTENGINE_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttextend.c b/xc/extras/FreeType/lib/ttextend.c
new file mode 100644
index 000000000..1c4a3cd1e
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttextend.c
@@ -0,0 +1,209 @@
+/*******************************************************************
+ *
+ * ttextend.h 2.0
+ *
+ * Extensions Interface
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * This is an updated version of the extension component, now
+ * located in the main library's source directory. It allows
+ * the dynamic registration/use of various face object extensions
+ * through a simple API.
+ *
+ ******************************************************************/
+
+#include "ttextend.h"
+#include "ttengine.h"
+#include "ttmemory.h"
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_extend
+
+
+#define TT_MAX_EXTENSIONS 8
+
+ struct TExtension_Registry_
+ {
+ Int num_extensions;
+ Long cur_offset;
+ TExtension_Class classes[TT_MAX_EXTENSIONS];
+ };
+
+ typedef struct TExtension_Registry_ TExtension_Registry;
+ typedef TExtension_Registry* PExtension_Registry;
+
+
+
+ /* Initialize the extension component */
+
+ LOCAL_FUNC
+ TT_Error TTExtend_Init( PEngine_Instance engine )
+ {
+ TT_Error error;
+ PExtension_Registry exts;
+
+
+ if ( ALLOC( exts, sizeof ( TExtension_Registry ) ) )
+ return error;
+
+ exts->num_extensions = 0;
+ exts->cur_offset = 0;
+ engine->extension_component = (void*)exts;
+
+ return TT_Err_Ok;
+ }
+
+
+ /* Finalize the extension component */
+
+ LOCAL_FUNC
+ TT_Error TTExtend_Done( PEngine_Instance engine )
+ {
+ FREE( engine->extension_component );
+ return TT_Err_Ok;
+ }
+
+
+ /* Register a new extension - XXX : This function is now exported! */
+
+ TT_Error TT_Register_Extension( PEngine_Instance engine,
+ Long id,
+ Long size,
+ PExt_Constructor create,
+ PExt_Destructor destroy )
+ {
+ PExtension_Registry exts;
+ PExtension_Class clazz;
+ Int p;
+
+
+ exts = (PExtension_Registry)engine->extension_component;
+ if ( !exts )
+ return TT_Err_Ok;
+
+ p = exts->num_extensions;
+
+ if ( p >= TT_MAX_EXTENSIONS )
+ return TT_Err_Too_Many_Extensions;
+
+ clazz = exts->classes + p;
+ clazz->id = id;
+ clazz->size = size;
+ clazz->build = create;
+ clazz->destroy = destroy;
+
+ clazz->offset = exts->cur_offset;
+
+ exts->num_extensions++;
+ exts->cur_offset += ( size + ALIGNMENT-1 ) & -ALIGNMENT;
+
+ return TT_Err_Ok;
+ }
+
+
+ /* Query an extension block by extension_ID */
+
+ TT_Error TT_Extension_Get( PFace face,
+ Long extension_id,
+ void** extension_block )
+ {
+ PExtension_Registry registry;
+ PExtension_Class clazz;
+ Int n;
+
+
+ if ( !face->extension )
+ return TT_Err_Extensions_Unsupported;
+
+ registry = (PExtension_Registry)face->engine->extension_component;
+
+ for ( n = 0; n < face->n_extensions; n++ )
+ {
+ clazz = registry->classes + n;
+ if ( clazz->id == extension_id )
+ {
+ *extension_block = (PByte)face->extension + clazz->offset;
+ return TT_Err_Ok;
+ }
+ }
+
+ return TT_Err_Invalid_Extension_Id;
+ }
+
+
+ /* Destroy all extensions within a face object. Called by the */
+ /* face object destructor. */
+
+ LOCAL_FUNC
+ TT_Error Extension_Destroy( PFace face )
+ {
+ PEngine_Instance engine = face->engine;
+ PExtension_Registry registry;
+ PExtension_Class clazz;
+ Int n;
+ PByte ext;
+
+
+ registry = (PExtension_Registry)engine->extension_component;
+
+ for ( n = 0; n < face->n_extensions; n++ )
+ {
+ clazz = registry->classes + n;
+ ext = (PByte)face->extension + clazz->offset;
+
+ /* the destructor is optional */
+ if ( clazz->destroy )
+ clazz->destroy( (void*)ext, face );
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ /* Create an extension within a face object. Called by the */
+ /* face object constructor. */
+
+ LOCAL_FUNC
+ TT_Error Extension_Create( PFace face )
+ {
+ PEngine_Instance engine = face->engine;
+ PExtension_Registry registry;
+ PExtension_Class clazz;
+ TT_Error error;
+ Int n;
+ PByte ext;
+
+
+ registry = (PExtension_Registry)engine->extension_component;
+
+ face->n_extensions = registry->num_extensions;
+ if ( ALLOC( face->extension, registry->cur_offset ) )
+ return error;
+
+ for ( n = 0; n < face->n_extensions; n++ )
+ {
+ clazz = registry->classes + n;
+ ext = (PByte)face->extension + clazz->offset;
+ error = clazz->build( (void*)ext, face );
+ if ( error )
+ goto Fail;
+ }
+
+ return TT_Err_Ok;
+
+ Fail:
+ Extension_Destroy( face );
+ return error;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttextend.h b/xc/extras/FreeType/lib/ttextend.h
new file mode 100644
index 000000000..7f64fa314
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttextend.h
@@ -0,0 +1,168 @@
+/*******************************************************************
+ *
+ * ttextend.h 2.0
+ *
+ * Extensions Interface.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * This is an updated version of the extension component, now
+ * located in the main library's source directory. It allows
+ * the dynamic registration/use of various face object extensions
+ * through a simple API.
+ *
+ ******************************************************************/
+
+#ifndef TTEXTEND_H
+#define TTEXTEND_H
+
+#include "ttconfig.h"
+#include "tttypes.h"
+#include "ttobjs.h"
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ /* The extensions don't need to be integrated at compile time into */
+ /* the engine, only at link time. */
+
+
+ /* When a new face object is created, the face constructor calls */
+ /* the extension constructor with the following arguments: */
+ /* */
+ /* ext : typeless pointer to the face's extension block. */
+ /* Its size is the one given at registration time */
+ /* in the extension class's 'size' field. */
+ /* */
+ /* face : the parent face object. Note that the extension */
+ /* constructor is called when the face object is */
+ /* built. */
+
+ typedef TT_Error TExt_Constructor( void* ext, PFace face );
+
+
+ /* When a face object is destroyed, the face destructor calls */
+ /* the extension destructor with the following arguments. */
+ /* */
+ /* ext : typeless pointer to the face's extension block. */
+ /* Its size is the one given at registration time */
+ /* in the extension class's 'size' field. */
+ /* */
+ /* face : the parent face object. Note that the extension */
+ /* destructor is called before the actual face object */
+ /* is destroyed. */
+
+ typedef TT_Error TExt_Destructor ( void* ext, PFace face );
+
+ typedef TExt_Constructor* PExt_Constructor;
+ typedef TExt_Destructor* PExt_Destructor;
+
+
+ struct TExtension_Class_
+ {
+ Long id; /* extension id */
+ Long size; /* size in bytes of extension record */
+ PExt_Constructor build; /* the extension's class constructor */
+ PExt_Destructor destroy; /* the extension's class destructor */
+
+ Long offset; /* offset of ext. record in face obj */
+ /* (set by the engine) */
+ };
+
+ typedef struct TExtension_Class_ TExtension_Class;
+ typedef TExtension_Class* PExtension_Class;
+
+
+#define Build_Extension_ID( a, b, c, d ) \
+ ( ((ULong)(a) << 24) | \
+ ((ULong)(b) << 16) | \
+ ((ULong)(c) << 8 ) | \
+ (ULong)(d) )
+
+ /* A note regarding extensions and the single-object compilation */
+ /* mode : */
+ /* */
+ /* When the engine is compiled as a single object file, extensions */
+ /* must remain linkable *after* compile time. In order to do this, */
+ /* we need to export the functions that an extension may need. */
+ /* Fortunately, we can limit ourselves to : */
+ /* */
+ /* o TT_Register_Extension (previously called Extension_Register) */
+ /* which is to be called by each extension on within */
+ /* it TT_Init_XXXX_Extension initialiser. */
+ /* */
+ /* o File and frame access functions. Fortunately, these already */
+ /* have their names prefixed by "TT_", so no change was needed */
+ /* except replacing the LOCAL_DEF keyword with EXPORT_DEF */
+ /* */
+ /* o Memory access functions, i.e. TT_Alloc and TT_Free. Again, */
+ /* the change is minimal */
+ /* */
+ /* o the table-lookup function : TT_LookUp_Table, formerly known */
+ /* as Load_TrueType_Table in ttload.c. */
+ /* */
+ /* */
+ /* Other than that, an extension should be able to #include all */
+ /* relevant header files to get access to internal types, but */
+ /* should not call engine internal functions.. */
+ /* */
+ /* If there is a need for a specific internal function call, let */
+ /* me known to see if we need to export it by default.. */
+ /* - DavidT */
+ /* */
+
+ /* Register a new extension. Called by extension */
+ /* service initialisers. */
+ EXPORT_DEF
+ TT_Error TT_Register_Extension( PEngine_Instance engine,
+ Long id,
+ Long size,
+ PExt_Constructor create,
+ PExt_Destructor destroy );
+
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+ /* Initialize the extension component */
+ LOCAL_DEF
+ TT_Error TTExtend_Init( PEngine_Instance engine );
+
+ /* Finalize the extension component */
+ LOCAL_DEF
+ TT_Error TTExtend_Done( PEngine_Instance engine );
+
+ /* Create an extension within a face object. Called by the */
+ /* face object constructor. */
+ LOCAL_DEF
+ TT_Error Extension_Create( PFace face );
+
+ /* Destroy all extensions within a face object. Called by the */
+ /* face object destructor. */
+ LOCAL_DEF
+ TT_Error Extension_Destroy( PFace face );
+#endif
+
+ /* Query an extension block by extension_ID. Called by extension */
+ /* service routines. */
+ EXPORT_DEF
+ TT_Error TT_Extension_Get( PFace face,
+ Long extension_id,
+ void** extension_block );
+
+#ifdef __cplusplus
+ }
+#endif
+
+
+#endif /* TTEXTEND_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttfile.c b/xc/extras/FreeType/lib/ttfile.c
new file mode 100644
index 000000000..53f9d52cd
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttfile.c
@@ -0,0 +1,1179 @@
+/*******************************************************************
+ *
+ * ttfile.c (extended version) 2.1
+ *
+ * File I/O Component (body).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * NOTES:
+ *
+ * This implementation relies on the ANSI libc. You may wish to
+ * modify it to get rid of libc and go straight to the your
+ * platform's stream routines.
+ *
+ * The same source code can be used for thread-safe and re-entrant
+ * builds of the library.
+ *
+ * Changes between 2.0 and 2.1 :
+ *
+ * - it is now possible to close a stream's file handle explicitely
+ * through the new API "TT_Flush_Stream". This will simply close
+ * a stream's file handle (useful to save system resources when
+ * dealing with lots of opened fonts). Of course, the function
+ * "TT_Use_Stream" will automatically re-open a stream's handle if
+ * necessary.
+ *
+ * - added "TT_Stream_Size" to replace "TT_File_Size" which wasn't
+ * used anyway. This one returns the size of any stream, even
+ * flushed one (when the previous TT_File_Size could only return
+ * the size of the current working stream). This is used by the
+ * new "Load_TrueType_Any" function in the tables loader.
+ *
+ ******************************************************************/
+/* $XFree86: xc/extras/FreeType/lib/ttfile.c,v 1.2 1998/09/06 07:31:56 dawes Exp $ */
+
+#include "ttconfig.h"
+
+/* Removed for XFree86 Module support */
+#if 0
+#include <stdio.h>
+#include <string.h>
+
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#endif
+
+#include "freetype.h"
+#include "tttypes.h"
+#include "ttdebug.h"
+#include "ttengine.h"
+#include "ttmutex.h"
+#include "ttmemory.h"
+#include "ttfile.h" /* our prototypes */
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_file
+
+
+/* For now, we don't define additional error messages in the core library */
+/* to report open-on demand errors. Define these error as standard ones */
+
+#define TT_Err_Could_Not_ReOpen_File TT_Err_Could_Not_Open_File
+#define TT_Err_Could_Not_ReSeek_File TT_Err_Could_Not_Open_File
+
+ /* This definition is mandatory for each file component! */
+ EXPORT_FUNC
+ const TFileFrame TT_Null_FileFrame = { NULL, 0, 0 };
+
+/* It has proven useful to do some bounds checks during development phase. */
+/* They should probably be undefined for speed reasons in a later release. */
+
+#if 0
+#define CHECK_FRAME( frame, n ) \
+ do { \
+ if ( frame.cursor + n > frame.address + frame.size ) \
+ Panic( "Frame boundary error!\n" ); \
+ } while ( 0 )
+#else
+#define CHECK_FRAME( frame, n ) /* nothing */
+#endif
+
+ /* Because a stream can be flushed, i.e. its file handle can be */
+ /* closed to save system resources, we must keep the stream's file */
+ /* pathname to be able to re-open it on demand when it is flushed */
+
+ struct TStream_Rec_;
+ typedef struct TStream_Rec_ TStream_Rec;
+ typedef TStream_Rec* PStream_Rec;
+
+ struct TStream_Rec_
+ {
+ Bool opened; /* is the stream handle opened ? */
+ TT_Text* name; /* the file's pathname */
+ Long position; /* current position within the file */
+
+ FILE* file; /* file handle */
+ Long base; /* stream base in file */
+ Long size; /* stream size in file */
+ };
+
+ /* We support embedded TrueType files by allowing them to be */
+ /* inside any file, at any location, hence the 'base' argument. */
+ /* Note however that the current implementation does not allow you */
+ /* to specify a 'base' index when opening a file. */
+ /* (will come later) */
+ /* I still don't know if this will turn out useful ?? - DavidT */
+
+#define STREAM2REC( x ) ( (TStream_Rec*)HANDLE_Val( x ) )
+
+ static TT_Error Stream_Activate ( PStream_Rec stream );
+ static TT_Error Stream_Deactivate( PStream_Rec stream );
+
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /**** ****/
+ /**** N O N R E E N T R A N T I M P L E M E N T A T I O N ****/
+ /**** ****/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+ /* in non-rentrant builds, we allocate a single block where we'll */
+ /* place all the frames smaller than FRAME_CACHE_SIZE, rather than */
+ /* allocating a new block on each access. Bigger frames will be */
+ /* malloced normally in the heap. */
+ /* */
+ /* See TT_Access_Frame() and TT_Forget_Frame() for details. */
+
+#define FRAME_CACHE_SIZE 2048
+
+ /* The TFile_Component structure holds all the data that was */
+ /* previously declared static or global in this component. */
+ /* */
+ /* It is accessible through the 'engine.file_component' */
+ /* variable in re-entrant builds, or directly through the */
+ /* static 'files' variable in other builds. */
+
+ struct TFile_Component_
+ {
+ TMutex lock; /* used by the thread-safe build only */
+ Byte* frame_cache; /* frame cache */
+ PStream_Rec stream; /* current stream */
+ TFileFrame frame; /* current frame */
+ };
+
+ typedef struct TFile_Component_ TFile_Component;
+
+ static TFile_Component files;
+
+#define CUR_Stream files.stream
+#define CUR_Frame files.frame
+
+#define STREAM_VARS /* void */
+#define STREAM_VAR /* void */
+
+/* The macro CUR_Stream denotes the current input stream. */
+/* Note that for the re-entrant version, the 'stream' name has been */
+/* chosen according to the macro STREAM_ARGS. */
+
+/* The macro CUR_Frame denotes the current file frame. */
+/* Note that for the re-entrant version, the 'frame' name has been */
+/* chosen according to the macro FRAME_ARGS. */
+
+/* The macro STREAM_VAR is used when calling public functions */
+/* that need an 'optional' stream argument. */
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ TT_Error error;
+
+
+ MUTEX_Create( files.lock );
+ files.stream = NULL;
+ ZERO_Frame( files.frame );
+
+ if ( ALLOC( files.frame_cache, FRAME_CACHE_SIZE ) )
+ return error;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ FREE( files.frame_cache );
+ MUTEX_Destroy( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Copies or duplicates a given stream.
+ *
+ * Input : org_stream original stream
+ * stream target stream (copy or duplicate)
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream org_stream,
+ TT_Stream* stream )
+ {
+ MUTEX_Lock( files.lock ); /* lock file mutex */
+
+ *stream = org_stream; /* copy the stream */
+ files.stream = STREAM2REC(org_stream); /* set current stream */
+
+ Stream_Activate( files.stream );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream target stream
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ HANDLE_Set( *stream, NULL );
+ MUTEX_Release( files.lock );
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function fails if the byte range is not within the
+ * the file, or if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big in both cases).
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( size <= FRAME_CACHE_SIZE )
+ {
+ /* use the cache */
+ CUR_Frame.address = files.frame_cache;
+ CUR_Frame.size = FRAME_CACHE_SIZE;
+ }
+ else
+ {
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+ }
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if (error)
+ {
+ if ( size > FRAME_CACHE_SIZE )
+ FREE( CUR_Frame.address );
+ CUR_Frame.address = NULL;
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Check_And_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * `size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function truncates `size' if the byte range is not
+ * within the file.
+ *
+ * It will fail if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big).
+ *
+ * It will fail if you make two consecutive calls
+ * to TT_Access_Frame(), without a TT_Forget_Frame() between
+ * them.
+ *
+ * The only difference with TT_Access_Frame() is that we
+ * check that the frame is within the current file. We
+ * otherwise truncate it.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+ Long readBytes, requested;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( size <= FRAME_CACHE_SIZE )
+ {
+ /* use the cache */
+ CUR_Frame.address = files.frame_cache;
+ CUR_Frame.size = FRAME_CACHE_SIZE;
+ }
+ else
+ {
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+ }
+
+ requested = size;
+ readBytes = CUR_Stream->size - TT_File_Pos( STREAM_VAR );
+ if ( size > readBytes )
+ size = readBytes;
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if (error)
+ {
+ if ( requested > FRAME_CACHE_SIZE )
+ FREE( CUR_Frame.address );
+ CUR_Frame.address = NULL;
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Forget_Frame
+ *
+ * Description : Releases a cached frame after reading.
+ *
+ * Input : None
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Forget_Frame( FRAME_ARG )
+ {
+ if ( CUR_Frame.address == NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( CUR_Frame.size > FRAME_CACHE_SIZE )
+ FREE( CUR_Frame.address );
+
+ ZERO_Frame( CUR_Frame );
+
+ return TT_Err_Ok;
+ }
+
+
+#else /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /******** ********/
+ /******** R E E N T R A N T I M P L E M E N T A T I O N ********/
+ /******** ********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+/* a simple macro to access the file component's data */
+#define files ( *((TFile_Component*)engine.file_component) )
+
+#define CUR_Stream STREAM2REC( stream ) /* re-entrant macros */
+#define CUR_Frame (*frame)
+
+#define STREAM_VARS stream,
+#define STREAM_VAR stream
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Init
+ *
+ * Description : Initializes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Init( PEngine_Instance engine )
+ {
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTFile_Done
+ *
+ * Description : Finalizes the File component.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTFile_Done( PEngine_Instance engine )
+ {
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Use_Stream
+ *
+ * Description : Duplicates a stream for a new usage.
+ *
+ * Input : input_stream source stream to duplicate
+ * copy address of target duplicate stream
+ *
+ * Output : error code.
+ * The target stream is set to NULL in case of failure.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Use_Stream( TT_Stream input_stream,
+ TT_Stream* copy )
+ {
+ PStream_Rec rec = STREAM2REC( input_stream );
+
+ return TT_Open_Stream( rec->name, copy );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Done_Stream
+ *
+ * Description : Releases a given stream.
+ *
+ * Input : stream target stream
+ *
+ * Output :
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Done_Stream( TT_Stream* stream )
+ {
+ return TT_Close_Stream( stream );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * 'size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function fails if the byte range is not within the
+ * the file, or if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big in both cases).
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if ( error )
+ {
+ FREE( CUR_Frame.address );
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Check_And_Access_Frame
+ *
+ * Description : Notifies the component that we're going to read
+ * `size' bytes from the current file position.
+ * This function should load/cache/map these bytes
+ * so that they will be addressed by the GET_xxx
+ * functions easily.
+ *
+ * Input : size number of bytes to access.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Notes: The function truncates `size' if the byte range is not
+ * within the file.
+ *
+ * It will fail if there is not enough memory to cache
+ * the bytes properly (which usually means that `size' is
+ * too big).
+ *
+ * It will fail if you make two consecutive calls
+ * to TT_Access_Frame(), without a TT_Forget_Frame() between
+ * them.
+ *
+ * The only difference with TT_Access_Frame() is that we
+ * check that the frame is within the current file. We
+ * otherwise truncate it.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS Long size )
+ {
+ TT_Error error;
+ Long readBytes;
+
+
+ if ( CUR_Frame.address != NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ if ( ALLOC( CUR_Frame.address, size ) )
+ return error;
+ CUR_Frame.size = size;
+
+ readBytes = CUR_Stream->size - TT_File_Pos( STREAM_VAR );
+ if ( size > readBytes )
+ size = readBytes;
+
+ error = TT_Read_File( STREAM_VARS (void*)CUR_Frame.address, size );
+ if ( error )
+ {
+ FREE( CUR_Frame.address );
+ CUR_Frame.size = 0;
+ }
+
+ CUR_Frame.cursor = CUR_Frame.address;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Forget_Frame
+ *
+ * Description : Releases a cached frame after reading.
+ *
+ * Input : None
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Forget_Frame( FRAME_ARG )
+ {
+ if ( CUR_Frame.address == NULL )
+ return TT_Err_Nested_Frame_Access;
+
+ FREE( CUR_Frame.address );
+ ZERO_Frame( CUR_Frame );
+
+ return TT_Err_Ok;
+ }
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*********** ***********/
+ /*********** C O M M O N I M P L E M E N T A T I O N ***********/
+ /*********** ***********/
+ /*******************************************************************/
+ /*******************************************************************/
+ /*******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : Stream_Activate
+ *
+ * Description : activates a stream, this will either:
+ * - open a new file handle if the stream is closed
+ * - move the stream to the head of the linked list
+ *
+ * Input : stream the stream to activate
+ *
+ * Output : error condition.
+ *
+ * Note : This function is also called with fresh new streams
+ * created by TT_Open_Stream(). They have their 'size'
+ * field set to -1.
+ *
+ ******************************************************************/
+
+ static TT_Error Stream_Activate( PStream_Rec stream )
+ {
+ if ( !stream->opened )
+ {
+ if ( (stream->file = fopen( (TT_Text*)stream->name, "rb" )) == 0 )
+ return TT_Err_Could_Not_ReOpen_File;
+
+ stream->opened = TRUE;
+
+ /* A newly created stream has a size field of -1 */
+ if ( stream->size < 0 )
+ {
+ fseek( stream->file, 0, SEEK_END );
+ stream->size = ftell( stream->file );
+ fseek( stream->file, 0, SEEK_SET );
+ }
+
+ /* Reset cursor in file */
+ if ( stream->position )
+ {
+ if ( fseek( stream->file, stream->position, SEEK_SET ) != 0 )
+ {
+ /* error during seek */
+ fclose( stream->file );
+ stream->opened = FALSE;
+ return TT_Err_Could_Not_ReSeek_File;
+ }
+ }
+ }
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Stream_DeActivate
+ *
+ * Description : deactivates a stream, this will :
+ * - close its file handle if it was opened
+ * - remove it from the opened list if necessary
+ *
+ * Input : stream the stream to deactivate
+ *
+ * Output : Error condition
+ *
+ * Note : the function is called whenever a stream is deleted
+ * (_not_ when a stream handle's is closed due to an
+ * activation). However, the stream record isn't
+ * destroyed by it..
+ *
+ ******************************************************************/
+
+ static TT_Error Stream_Deactivate( PStream_Rec stream )
+ {
+ if ( stream->opened )
+ {
+ /* Save its current position within the file */
+ stream->position = ftell( stream->file );
+ fclose( stream->file );
+ stream->file = 0;
+ stream->opened = FALSE;
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Stream_Size
+ *
+ * Description : Returns the length of a given stream, even if it
+ * is flushed.
+ *
+ * Input : stream the stream
+ *
+ * Output : Length of stream in bytes.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_Stream_Size( TT_Stream stream )
+ {
+ PStream_Rec rec = STREAM2REC( stream );
+
+
+ if ( rec )
+ return rec->size;
+ else
+ return 0; /* invalid stream - return 0 */
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Open_Stream
+ *
+ * Description : Opens the font file and saves the total file size.
+ *
+ * Input : error address of stream's error variable
+ * (re-entrant build only)
+ * filepathname pathname of the file to open
+ * stream address of target TT_Stream structure
+ *
+ * Output : SUCCESS on sucess, FAILURE on error.
+ * The target stream is set to -1 in case of failure.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TT_Open_Stream( const TT_Text* filepathname,
+ TT_Stream* stream )
+ {
+ Int len;
+ TT_Error error;
+ PStream_Rec stream_rec;
+
+ if ( ALLOC( *stream, sizeof ( TStream_Rec ) ) )
+ return error;
+
+ stream_rec = STREAM2REC( *stream );
+
+ stream_rec->file = NULL;
+ stream_rec->size = -1L;
+ stream_rec->base = 0;
+ stream_rec->opened = FALSE;
+ stream_rec->position = 0;
+
+ len = strlen( filepathname ) + 1;
+ if ( ALLOC( stream_rec->name, len ) )
+ goto Fail;
+
+ strncpy( stream_rec->name, filepathname, len );
+
+ error = Stream_Activate( stream_rec );
+ if ( error )
+ goto Fail_Activate;
+
+#ifndef TT_CONFIG_OPTION_THREAD_SAFE
+ CUR_Stream = stream_rec;
+#endif
+
+ return TT_Err_Ok;
+
+ Fail_Activate:
+ FREE( stream_rec->name );
+ Fail:
+ FREE( stream_rec );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Close_Stream
+ *
+ * Description : Closes a stream.
+ *
+ * Input : stream address of target TT_Stream structure
+ *
+ * Output : SUCCESS (always).
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TT_Close_Stream( TT_Stream* stream )
+ {
+ PStream_Rec rec = STREAM2REC( *stream );
+
+
+ Stream_Deactivate( rec );
+ FREE( rec->name );
+ FREE( rec );
+
+ HANDLE_Set( *stream, NULL );
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Flush_Stream
+ *
+ * Description : Flushes a stream, i.e., closes its file handle.
+ *
+ * Input : stream address of target TT_Stream structure
+ *
+ * Output : Error code
+ *
+ * NOTE : Never flush the current opened stream. This means that
+ * you should _never_ call this function between a
+ * TT_Use_Stream() and a TT_Done_Stream()!
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Flush_Stream( TT_Stream* stream )
+ {
+ PStream_Rec rec = STREAM2REC( *stream );
+
+
+ if ( rec )
+ {
+ Stream_Deactivate( rec );
+ return TT_Err_Ok;
+ }
+ else
+ return TT_Err_Invalid_Argument;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Seek_File
+ *
+ * Description : Seeks the file cursor to a different position.
+ *
+ * Input : position new position in file
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Seek_File( STREAM_ARGS Long position )
+ {
+ position += CUR_Stream->base;
+
+ if ( fseek( CUR_Stream->file, position, SEEK_SET ) )
+ return TT_Err_Invalid_File_Offset;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Skip_File
+ *
+ * Description : Skips forward the file cursor.
+ *
+ * Input : distance number of bytes to skip
+ *
+ * Output : see TT_Seek_File()
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Skip_File( STREAM_ARGS Long distance )
+ {
+ return TT_Seek_File( STREAM_VARS ftell( CUR_Stream->file ) -
+ CUR_Stream->base + distance );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_File
+ *
+ * Description : Reads a chunk of the file and copies it to memory.
+ *
+ * Input : buffer target buffer
+ * count length in bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if out of range.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_File( STREAM_ARGS void* buffer, Long count )
+ {
+ if ( fread( buffer, 1, count, CUR_Stream->file ) != (ULong)count )
+ return TT_Err_Invalid_File_Read;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_Read_At_File
+ *
+ * Description : Reads file at a specified position.
+ *
+ * Input : position position to seek to before read
+ * buffer target buffer
+ * count number of bytes to read
+ *
+ * Output : SUCCESS on success. FAILURE if error.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Read_At_File( STREAM_ARGS Long position,
+ void* buffer,
+ Long count )
+ {
+ TT_Error error;
+
+
+ if ( (error = TT_Seek_File( STREAM_VARS position )) != TT_Err_Ok ||
+ (error = TT_Read_File( STREAM_VARS buffer, count )) != TT_Err_Ok )
+ return error;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TT_File_Pos
+ *
+ * Description : Returns current file seek pointer.
+ *
+ * Input : none
+ *
+ * Output : Current file position.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_File_Pos( STREAM_ARG )
+ {
+ return ftell( CUR_Stream->file ) - CUR_Stream->base;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Byte
+ *
+ * Description : Extracts a byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted Byte.
+ *
+ ******************************************************************/
+#if 0
+ EXPORT_FUNC
+ Byte TT_Get_Byte( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Byte)(*CUR_Frame.cursor++);
+ }
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : GET_Char
+ *
+ * Description : Extracts a signed byte from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted char.
+ *
+ ******************************************************************/
+ EXPORT_FUNC
+ Char TT_Get_Char( FRAME_ARG )
+ {
+ CHECK_FRAME( CUR_Frame, 1 );
+
+ return (Char)(*CUR_Frame.cursor++);
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_Short
+ *
+ * Description : Extracts a short from the current file frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted short.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Short TT_Get_Short( FRAME_ARG )
+ {
+ Short getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = (Short)((CUR_Frame.cursor[0] << 8) |
+ CUR_Frame.cursor[1]);
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_UShort
+ *
+ * Description : Extracts an unsigned short from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted ushort.
+ *
+ ******************************************************************/
+#if 0
+ EXPORT_FUNC
+ UShort TT_Get_UShort( FRAME_ARG )
+ {
+ UShort getshort;
+
+
+ CHECK_FRAME( CUR_Frame, 2 );
+
+ getshort = (UShort)((CUR_Frame.cursor[0] << 8) |
+ CUR_Frame.cursor[1]);
+
+ CUR_Frame.cursor += 2;
+
+ return getshort;
+ }
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : GET_Long
+ *
+ * Description : Extracts a long from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted long.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_Get_Long( FRAME_ARG )
+ {
+ Long getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ((Long)CUR_Frame.cursor[0] << 24) |
+ ((Long)CUR_Frame.cursor[1] << 16) |
+ ((Long)CUR_Frame.cursor[2] << 8 ) |
+ (Long)CUR_Frame.cursor[3];
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GET_ULong
+ *
+ * Description : Extracts an unsigned long from the frame.
+ *
+ * Input : None or current frame
+ *
+ * Output : Extracted ulong.
+ *
+ ******************************************************************/
+#if 0
+ EXPORT_FUNC
+ ULong TT_Get_ULong( FRAME_ARG )
+ {
+ ULong getlong;
+
+
+ CHECK_FRAME( CUR_Frame, 4 );
+
+ getlong = ( ((ULong)CUR_Frame.cursor[0] << 24) |
+ ((ULong)CUR_Frame.cursor[1] << 16) |
+ ((ULong)CUR_Frame.cursor[2] << 8 ) |
+ (ULong)CUR_Frame.cursor[3] );
+
+ CUR_Frame.cursor += 4;
+
+ return getlong;
+ }
+#endif
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttfile.h b/xc/extras/FreeType/lib/ttfile.h
new file mode 100644
index 000000000..12215be01
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttfile.h
@@ -0,0 +1,270 @@
+/*******************************************************************
+ *
+ * ttfile.h 1.3
+ *
+ * File I/O Component (specification).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Changes between 1.3 and 1.2:
+ *
+ * - all functions report error values now
+ *
+ * - the stream semantics have also changed
+ *
+ * Changes between 1.2 and 1.1:
+ *
+ * - added macros to support re-entrant builds
+ *
+ * - added the TT_Duplicate_File function to duplicate streams
+ * (re-entrant builds only)
+ *
+ ******************************************************************/
+
+/* #define TT_CONFIG_REENTRANT */
+
+#ifndef TTFILE_H
+#define TTFILE_H
+
+#include "ttconfig.h"
+#include "freetype.h"
+#include "ttengine.h"
+#include "ttdebug.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ /* Initialize file component */
+ LOCAL_DEF
+ TT_Error TTFile_Init( PEngine_Instance engine );
+
+ /* Done with file component */
+ LOCAL_DEF
+ TT_Error TTFile_Done( PEngine_Instance engine );
+
+
+ /**********************************************************************/
+ /* */
+ /* Stream functions. */
+ /* */
+ /**********************************************************************/
+
+ /* Open a file and return a stream handle for it. */
+ /* Should only be used for a new face object's main stream. */
+
+ LOCAL_DEF
+ TT_Error TT_Open_Stream( const TT_Text* name,
+ TT_Stream* stream );
+
+
+ /* Closes, then discards, a stream when it's no longer needed. */
+ /* Should only be used for a stream opend with TT_Open_Stream(). */
+
+ LOCAL_DEF
+ TT_Error TT_Close_Stream( TT_Stream* stream );
+
+
+ /* Informs the component that we're going to use the file */
+ /* opened in 'org_stream', and report errors to the 'error' */
+ /* variable. */
+
+ /* in non re-entrant builds, 'org_stream' is simply copied */
+ /* to 'stream'. Otherwise, the latter is a duplicate handle */
+ /* for the file opened with 'org_stream' */
+
+ EXPORT_DEF
+ TT_Error TT_Use_Stream( TT_Stream org_stream,
+ TT_Stream* stream );
+
+ /* Informs the component that we don't need to perform file */
+ /* operations on the stream 'stream' anymore. This must be */
+ /* used with streams "opened" with TT_Use_Stream() only! */
+
+ /* in re-entrant builds, this will really discard the stream */
+
+ EXPORT_DEF
+ TT_Error TT_Done_Stream( TT_Stream* stream );
+
+ /* Closes the stream's file handle to release system resources */
+ /* The function TT_Use_Stream automatically re-activates a */
+ /* flushed stream when it uses one */
+
+ EXPORT_DEF
+ TT_Error TT_Flush_Stream( TT_Stream* stream );
+
+/* The macros STREAM_ARGS and STREAM_ARG let us build a thread-safe */
+/* or re-entrant implementation depending on a single configuration */
+/*define. */
+
+#ifdef TT_CONFIG_OPTION_THREAD_SAFE
+
+#define STREAM_ARGS TT_Stream stream,
+#define STREAM_ARG TT_Stream stream
+
+#else
+
+#define STREAM_ARGS /* void */
+#define STREAM_ARG void
+
+#endif /* TT_CONFIG_REENTRANT */
+
+
+ /****************************************************************/
+ /* */
+ /* File Functions. */
+ /* */
+ /* The following functions perform file operations on the */
+ /* currently 'used' stream. In thread-safe builds, only one */
+ /* stream can be used at a time. Synchronisation is performed */
+ /* through the Use_Stream()/Done_Stream() functions. */
+ /* */
+ /****************************************************************/
+
+ /* Read 'count' bytes from file into 'buffer' */
+
+ EXPORT_DEF
+ TT_Error TT_Read_File( STREAM_ARGS void* buffer,
+ Long count );
+
+
+ /* Seek file cursor to a given position */
+
+ EXPORT_DEF
+ TT_Error TT_Seek_File( STREAM_ARGS Long position );
+
+
+ /* Skip the next 'distance' bytes in file */
+
+ EXPORT_DEF
+ TT_Error TT_Skip_File( STREAM_ARGS Long distance );
+
+
+ /* Read the 'count' bytes at 'position' into 'buffer' */
+
+ EXPORT_DEF
+ TT_Error TT_Read_At_File( STREAM_ARGS Long position,
+ void* buffer,
+ Long count );
+
+ /* Return current file position */
+
+ EXPORT_DEF
+ Long TT_File_Pos( STREAM_ARG );
+
+ /* Return length of a given stream, even if it is flushed */
+
+ EXPORT_DEF
+ Long TT_Stream_Size( TT_Stream stream );
+
+
+ /********************************************************************/
+ /* */
+ /* Frame operations. */
+ /* */
+ /* For a comprehensive explanation of frames, please refer to the */
+ /* documentation files. */
+ /* */
+ /********************************************************************/
+
+ /* Frame type declaration.*/
+
+ struct TFileFrame_
+ {
+ Byte* address; /* frame buffer */
+ Byte* cursor; /* current cursor position in frame */
+ Long size; /* frame size */
+ };
+
+ typedef struct TFileFrame_ TFileFrame;
+
+ EXPORT_DEF
+ const TFileFrame TT_Null_FileFrame;
+
+
+/* The macro ZERO_Frame is used to define and init a frame. */
+/* It is important to have a default frame of { NULL, NULL, 0 } */
+/* before a call to TT_Access_Frame(). Otherwise, the call will */
+/* fail with a TT_Err_Nested_Frame_Accesses error. */
+
+#define ZERO_Frame( frame ) \
+ { \
+ (frame).address = NULL; \
+ (frame).cursor = NULL; \
+ (frame).size = 0; \
+ }
+
+
+/* The macros FRAME_ARGS and FRAME_ARG let us build a thread-safe */
+/* or re-entrant implementation depending on a single configuration */
+/* define */
+
+#ifdef TT_CONFIG_OPTION_THREAD_SAFE
+
+#define FRAME_ARGS TFileFrame* frame,
+#define FRAME_ARG TFileFrame* frame
+
+#else
+
+#define FRAME_ARGS /* void */
+#define FRAME_ARG void
+
+#endif /* TT_CONFIG_REENTRANT */
+
+
+ /* Access the next 'size' bytes from current position. */
+ /* Fails if all bytes cannot be read/accessed. */
+
+ EXPORT_DEF
+ TT_Error TT_Access_Frame( STREAM_ARGS FRAME_ARGS Long size );
+
+
+ /* Access the bytes located in the next 'size' bytes of the file. */
+ /* Doesn't fail if less than 'size' bytes are accessible (like */
+ /* at the end of the file). */
+
+ EXPORT_DEF
+ TT_Error TT_Check_And_Access_Frame( STREAM_ARGS FRAME_ARGS Long size );
+
+ /* Forget frame */
+
+ EXPORT_DEF
+ TT_Error TT_Forget_Frame( FRAME_ARG );
+
+
+ /* primitive routines for data accessing */
+
+ EXPORT_DEF Char TT_Get_Char ( FRAME_ARG );
+ EXPORT_DEF Short TT_Get_Short ( FRAME_ARG );
+ EXPORT_DEF Long TT_Get_Long ( FRAME_ARG );
+
+#ifdef TT_CONFIG_OPTION_THREAD_SAFE
+
+#define TT_Get_Byte( frame ) ( (Byte )TT_Get_Char ( frame ) )
+#define TT_Get_UShort( frame ) ( (UShort)TT_Get_Short( frame ) )
+#define TT_Get_ULong( frame ) ( (ULong )TT_Get_Long ( frame ) )
+
+#else
+
+#define TT_Get_Byte() ((Byte )TT_Get_Char ())
+#define TT_Get_UShort() ((UShort)TT_Get_Short())
+#define TT_Get_ULong() ((ULong )TT_Get_Long ())
+
+#endif /* TT_CONFIG_REENTRANT */
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTFILE_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttgload.c b/xc/extras/FreeType/lib/ttgload.c
new file mode 100644
index 000000000..418715ea4
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttgload.c
@@ -0,0 +1,1321 @@
+/*******************************************************************
+ *
+ * ttgload.c 1.0
+ *
+ * TrueType Glyph Loader.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "tttypes.h"
+#include "ttdebug.h"
+#include "ttcalc.h"
+#include "ttfile.h"
+
+#include "tttables.h"
+#include "ttobjs.h"
+#include "ttgload.h"
+
+#include "ttmemory.h"
+#include "tttags.h"
+#include "ttload.h"
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_gload
+
+
+/* composite font flags */
+
+#define ARGS_ARE_WORDS 0x001
+#define ARGS_ARE_XY_VALUES 0x002
+#define ROUND_XY_TO_GRID 0x004
+#define WE_HAVE_A_SCALE 0x008
+/* reserved 0x010 */
+#define MORE_COMPONENTS 0x020
+#define WE_HAVE_AN_XY_SCALE 0x040
+#define WE_HAVE_A_2X2 0x080
+#define WE_HAVE_INSTR 0x100
+#define USE_MY_METRICS 0x200
+
+
+/********************************************************/
+/* Return horizontal or vertical metrics in font units */
+/* for a given glyph. The metrics are the left side */
+/* bearing (resp. top side bearing) and advance width */
+/* (resp. advance height). */
+/* */
+/* This function will much probably move to another */
+/* component in the short future, but I haven't decided */
+/* which yet... */
+
+ LOCAL_FUNC
+ void TT_Get_Metrics( TT_Horizontal_Header* header,
+ UShort index,
+ Short* bearing,
+ UShort* advance )
+ {
+ PLongMetrics longs_m;
+
+ UShort k = header->number_Of_HMetrics;
+
+
+ if ( index < k )
+ {
+ longs_m = (PLongMetrics)header->long_metrics + index;
+ *bearing = longs_m->bearing;
+ *advance = longs_m->advance;
+ }
+ else
+ {
+ *bearing = ((PShortMetrics)header->short_metrics)[index - k];
+ *advance = ((PLongMetrics)header->long_metrics)[k - 1].advance;
+ }
+ }
+
+
+/********************************************************/
+/* Return horizontal metrics in font units for a given */
+/* glyph. If "check" is true, take care of mono-spaced */
+/* fonts by returning the advance width max. */
+
+ static void Get_HMetrics( PFace face,
+ UShort index,
+ Bool check,
+ Short* lsb,
+ UShort* aw )
+ {
+ TT_Get_Metrics( &face->horizontalHeader, index, lsb, aw );
+
+ if ( check && face->postscript.isFixedPitch )
+ *aw = face->horizontalHeader.advance_Width_Max;
+ }
+
+
+/********************************************************/
+/* Return advance width table for a given pixel size */
+/* if it is found in the font's "hdmx" table (if any). */
+
+ static PByte Get_Advance_Widths( PFace face,
+ UShort ppem )
+ {
+ UShort n;
+
+
+ for ( n = 0; n < face->hdmx.num_records; n++ )
+ if ( face->hdmx.records[n].ppem == ppem )
+ return face->hdmx.records[n].widths;
+
+ return NULL;
+ }
+
+
+/********************************************************/
+/* Copy current glyph into original one. */
+
+#define cur_to_org( n, zone ) \
+ MEM_Copy( (zone)->org, (zone)->cur, (n) * sizeof ( TT_Vector ) )
+
+/********************************************************/
+/* copy original glyph into current one */
+
+#define org_to_cur( n, zone ) \
+ MEM_Copy( (zone)->cur, (zone)->org, (n) * sizeof ( TT_Vector ) )
+
+/********************************************************/
+/* translate an array of coordinates */
+
+ static void translate_array( UShort n,
+ TT_Vector* coords,
+ TT_Pos delta_x,
+ TT_Pos delta_y )
+ {
+ UShort k;
+
+
+ if ( delta_x )
+ for ( k = 0; k < n; k++ )
+ coords[k].x += delta_x;
+
+ if ( delta_y )
+ for ( k = 0; k < n; k++ )
+ coords[k].y += delta_y;
+ }
+
+
+/********************************************************/
+/* mount one zone on top of another */
+
+ static void mount_zone( PGlyph_Zone source,
+ PGlyph_Zone target )
+ {
+ UShort np;
+ Short nc;
+
+ np = source->n_points;
+ nc = source->n_contours;
+
+ target->org = source->org + np;
+ target->cur = source->cur + np;
+ target->touch = source->touch + np;
+
+ target->contours = source->contours + nc;
+
+ target->n_points = 0;
+ target->n_contours = 0;
+ }
+
+
+/*******************************************************************
+ *
+ * Function: Load_Simple_Glyph
+ *
+ ******************************************************************/
+
+ static TT_Error Load_Simple_Glyph( PExecution_Context exec,
+ TT_Stream input,
+ Short n_contours,
+ Short left_contours,
+ UShort left_points,
+ UShort load_flags,
+ PSubglyph_Record subg )
+ {
+ DEFINE_LOAD_LOCALS( input );
+
+ PGlyph_Zone pts;
+ Short k;
+ UShort j;
+ UShort n_points, n_ins;
+ PFace face;
+ Byte* flag;
+ TT_Vector* vec;
+ TT_F26Dot6 x, y;
+
+
+ face = exec->face;
+
+ /* simple check */
+ if ( n_contours > left_contours )
+ {
+ PTRACE0(( "ERROR: Glyph index %ld has %d contours > left %d\n",
+ subg->index, n_contours, left_contours ));
+ return TT_Err_Too_Many_Contours;
+ }
+
+
+ /* preparing the execution context */
+ mount_zone( &subg->zone, &exec->pts );
+
+ /* reading the contours endpoints */
+ if ( ACCESS_Frame( (n_contours + 1) * 2L ) )
+ return error;
+
+ for ( k = 0; k < n_contours; k++ )
+ {
+ PTRACE4(( "%d ", n_points ));
+ exec->pts.contours[k] = GET_UShort();
+ }
+
+ if ( n_contours > 0 )
+ n_points = exec->pts.contours[n_contours - 1] + 1;
+ else
+ n_points = 0;
+
+ n_ins = GET_UShort();
+
+ FORGET_Frame();
+
+ if ( n_points > left_points )
+ {
+ PTRACE0(( "ERROR: Too many points in glyph %ld\n", subg->index ));
+ return TT_Err_Too_Many_Points;
+ }
+
+ /* loading instructions */
+
+ PTRACE4(( "Instructions size : %d\n", n_ins ));
+
+ if ( n_ins > face->maxProfile.maxSizeOfInstructions )
+ {
+ PTRACE0(( "ERROR: Too many instructions!\n" ));
+ return TT_Err_Too_Many_Ins;
+ }
+
+ if ( FILE_Read( exec->glyphIns, n_ins ) )
+ return error;
+
+ if ( (error = Set_CodeRange( exec,
+ TT_CodeRange_Glyph,
+ exec->glyphIns,
+ n_ins )) != TT_Err_Ok )
+ return error;
+
+
+ /* read the flags */
+
+ if ( CHECK_ACCESS_Frame( n_points * 5L ) )
+ return error;
+
+ j = 0;
+ flag = exec->pts.touch;
+
+ while ( j < n_points )
+ {
+ Byte c, cnt;
+
+ flag[j] = c = GET_Byte();
+ j++;
+
+ if ( c & 8 )
+ {
+ cnt = GET_Byte();
+ while( cnt > 0 )
+ {
+ flag[j++] = c;
+ cnt--;
+ }
+ }
+ }
+
+ /* read the X */
+
+ x = 0;
+ vec = exec->pts.org;
+
+ for ( j = 0; j < n_points; j++ )
+ {
+ if ( flag[j] & 2 )
+ {
+ if ( flag[j] & 16 )
+ x += GET_Byte();
+ else
+ x -= GET_Byte();
+ }
+ else
+ {
+ if ( (flag[j] & 16) == 0 )
+ x += GET_Short();
+ }
+
+ vec[j].x = x;
+ }
+
+
+ /* read the Y */
+
+ y = 0;
+
+ for ( j = 0; j < n_points; j++ )
+ {
+ if ( flag[j] & 4 )
+ {
+ if ( flag[j] & 32 )
+ y += GET_Byte();
+ else
+ y -= GET_Byte();
+ }
+ else
+ {
+ if ( (flag[j] & 32) == 0 )
+ y += GET_Short();
+ }
+
+ vec[j].y = y;
+ }
+
+ FORGET_Frame();
+
+ /* Now add the two shadow points at n and n + 1. */
+ /* We need the left side bearing and advance width. */
+
+ /* pp1 = xMin - lsb */
+ vec[n_points].x = subg->metrics.bbox.xMin - subg->metrics.horiBearingX;
+ vec[n_points].y = 0;
+
+ /* pp2 = pp1 + aw */
+ vec[n_points+1].x = vec[n_points].x + subg->metrics.horiAdvance;
+ vec[n_points+1].y = 0;
+
+ /* clear the touch flags */
+
+ for ( j = 0; j < n_points; j++ )
+ exec->pts.touch[j] &= TT_Flag_On_Curve;
+
+ exec->pts.touch[n_points ] = 0;
+ exec->pts.touch[n_points + 1] = 0;
+
+ /* Note that we return two more points that are not */
+ /* part of the glyph outline. */
+
+ n_points += 2;
+
+ /* now eventually scale and hint the glyph */
+
+ pts = &exec->pts;
+ pts->n_points = n_points;
+ pts->n_contours = n_contours;
+
+ if ( (load_flags & TTLOAD_SCALE_GLYPH) == 0 )
+ {
+ /* no scaling, just copy the orig arrays into the cur ones */
+ org_to_cur( n_points, pts );
+ }
+ else
+ {
+ /* first scale the glyph points */
+
+ for ( j = 0; j < n_points; j++ )
+ {
+ pts->org[j].x = Scale_X( &exec->metrics, pts->org[j].x );
+ pts->org[j].y = Scale_Y( &exec->metrics, pts->org[j].y );
+ }
+
+ /* if hinting, round pp1, and shift the glyph accordingly */
+ if ( subg->is_hinted )
+ {
+ x = pts->org[n_points - 2].x;
+ x = ((x+32) & -64) - x;
+ translate_array( n_points, pts->org, x, 0 );
+
+ org_to_cur( n_points, pts );
+
+ pts->cur[n_points - 1].x = (pts->cur[n_points - 1].x + 32) & -64;
+
+ /* now consider hinting */
+ if ( n_ins > 0 )
+ {
+ exec->is_composite = FALSE;
+ if ( (error = Context_Run( exec, FALSE )) != TT_Err_Ok )
+ return error;
+ }
+ }
+ else
+ org_to_cur( n_points, pts );
+ }
+
+ /* save glyph phantom points */
+ if (!subg->preserve_pps)
+ {
+ subg->pp1 = pts->cur[n_points - 2];
+ subg->pp2 = pts->cur[n_points - 1];
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_Composite_End
+ *
+ ******************************************************************/
+
+ static
+ TT_Error Load_Composite_End( UShort n_points,
+ Short n_contours,
+ PExecution_Context exec,
+ PSubglyph_Record subg,
+ TT_Stream input )
+ {
+ DEFINE_LOAD_LOCALS( input );
+
+ UShort k, n_ins;
+ PGlyph_Zone pts;
+
+
+ if ( subg->is_hinted &&
+ subg->element_flag & WE_HAVE_INSTR )
+ {
+ if ( ACCESS_Frame( 2L ) )
+ return error;
+
+ n_ins = GET_UShort(); /* read size of instructions */
+ FORGET_Frame();
+
+ PTRACE4(( "Instructions size = %d\n", n_ins ));
+
+ if ( n_ins > exec->face->maxProfile.maxSizeOfInstructions )
+ {
+ PTRACE0(( "Too many instructions in composite glyph %ld\n",
+ subg->index ));
+ return TT_Err_Too_Many_Ins;
+ }
+
+ if ( FILE_Read( exec->glyphIns, n_ins ) )
+ return error;
+
+ error = Set_CodeRange( exec,
+ TT_CodeRange_Glyph,
+ exec->glyphIns,
+ n_ins );
+
+ if ( error )
+ return error;
+ }
+ else
+ n_ins = 0;
+
+
+ /* prepare the execution context */
+ n_points += 2;
+ exec->pts = subg->zone;
+ pts = &exec->pts;
+
+ pts->n_points = n_points;
+ pts->n_contours = n_contours;
+
+ /* add phantom points */
+ pts->cur[n_points - 2] = subg->pp1;
+ pts->cur[n_points - 1] = subg->pp2;
+
+ pts->touch[n_points - 1] = 0;
+ pts->touch[n_points - 2] = 0;
+
+ /* if hinting, round the phantom points */
+ if ( subg->is_hinted )
+ {
+ pts->cur[n_points - 2].x = (subg->pp1.x + 32) & -64;
+ pts->cur[n_points - 1].x = (subg->pp2.x + 32) & -64;
+ }
+
+ for ( k = 0; k < n_points; k++ )
+ pts->touch[k] &= TT_Flag_On_Curve;
+
+ cur_to_org( n_points, pts );
+
+ /* now consider hinting */
+ if ( subg->is_hinted && n_ins > 0 )
+ {
+ exec->is_composite = TRUE;
+ if ( (error = Context_Run( exec, FALSE )) != TT_Err_Ok )
+ return error;
+ }
+
+ /* save glyph origin and advance points */
+ subg->pp1 = pts->cur[n_points - 2];
+ subg->pp2 = pts->cur[n_points - 1];
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Init_Glyph_Component
+ *
+ ******************************************************************/
+
+ static
+ void Init_Glyph_Component( PSubglyph_Record element,
+ PSubglyph_Record original,
+ PExecution_Context exec )
+ {
+ element->index = -1;
+ element->is_scaled = FALSE;
+ element->is_hinted = FALSE;
+
+ if ( original )
+ mount_zone( &original->zone, &element->zone );
+ else
+ element->zone = exec->pts;
+
+ element->zone.n_contours = 0;
+ element->zone.n_points = 0;
+
+ element->arg1 = 0;
+ element->arg2 = 0;
+
+ element->element_flag = 0;
+ element->preserve_pps = FALSE;
+
+ element->transform.xx = 1 << 16;
+ element->transform.xy = 0;
+ element->transform.yx = 0;
+ element->transform.yy = 1 << 16;
+
+ element->transform.ox = 0;
+ element->transform.oy = 0;
+
+ element->metrics.horiBearingX = 0;
+ element->metrics.horiAdvance = 0;
+ }
+
+
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Glyph( PInstance instance,
+ PGlyph glyph,
+ UShort glyph_index,
+ UShort load_flags )
+ {
+ enum TPhases_
+ {
+ Load_Exit,
+ Load_Glyph,
+ Load_Header,
+ Load_Simple,
+ Load_Composite,
+ Load_End
+ };
+
+ typedef enum TPhases_ TPhases;
+
+ DEFINE_ALL_LOCALS;
+
+ PFace face;
+
+ UShort num_points;
+ Short num_contours;
+ UShort left_points;
+ Short left_contours;
+
+ Long table;
+ UShort load_top;
+ Long k, l;
+ UShort new_flags;
+ Long index;
+ UShort u, v;
+
+ Long glyph_offset, offset;
+
+ TT_F26Dot6 x, y, nx, ny;
+
+ Fixed xx, xy, yx, yy;
+
+ PExecution_Context exec;
+
+ PSubglyph_Record subglyph, subglyph2;
+
+ TGlyph_Zone base_pts;
+
+ TPhases phase;
+ PByte widths;
+
+/* TT_Glyph_Loader_Callback cacheCb; */
+/* TT_Outline cached_outline; */
+
+
+ /* first of all, check arguments */
+ if ( !glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ face = glyph->face;
+ if ( !face )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ if ( glyph_index >= face->numGlyphs )
+ return TT_Err_Invalid_Glyph_Index;
+
+ if ( instance && (load_flags & TTLOAD_SCALE_GLYPH) == 0 )
+ {
+ instance = 0;
+ load_flags &= ~( TTLOAD_SCALE_GLYPH | TTLOAD_HINT_GLYPH );
+ }
+
+ table = TT_LookUp_Table( face, TTAG_glyf );
+ if ( table < 0 )
+ {
+ PTRACE0(( "ERROR: there is no glyph table in this font file!\n" ));
+ return TT_Err_Table_Missing;
+ }
+
+ glyph_offset = face->dirTables[table].Offset;
+
+ /* query new execution context */
+
+ if ( instance && instance->debug )
+ exec = instance->context;
+ else
+ exec = New_Context( face );
+
+ if ( !exec )
+ return TT_Err_Could_Not_Find_Context;
+
+ Context_Load( exec, face, instance );
+
+ if ( instance )
+ {
+ if ( instance->GS.instruct_control & 2 )
+ exec->GS = Default_GraphicsState;
+ else
+ exec->GS = instance->GS;
+ /* load default graphics state */
+
+ glyph->outline.high_precision = ( instance->metrics.y_ppem < 24 );
+ }
+
+ /* save its critical pointers, as they'll be modified during load */
+ base_pts = exec->pts;
+
+ /* init variables */
+ left_points = face->maxPoints;
+ left_contours = face->maxContours;
+
+ num_points = 0;
+ num_contours = 0;
+
+ load_top = 0;
+ subglyph = exec->loadStack;
+
+ Init_Glyph_Component( subglyph, NULL, exec );
+
+ subglyph->index = glyph_index;
+ subglyph->is_hinted = load_flags & TTLOAD_HINT_GLYPH;
+
+ /* when the cvt program has disabled hinting, the argument */
+ /* is ignored. */
+ if ( instance && instance->GS.instruct_control & 1 )
+ subglyph->is_hinted = FALSE;
+
+
+ /* now access stream */
+
+ if ( USE_Stream( face->stream, stream ) )
+ goto Fin;
+
+ /* Main loading loop */
+
+ phase = Load_Glyph;
+ index = 0;
+
+ while ( phase != Load_Exit )
+ {
+ subglyph = exec->loadStack + load_top;
+
+ switch ( phase )
+ {
+ /************************************************************/
+ /* */
+ /* Load_Glyph state */
+ /* */
+ /* reading a glyph's generic header to determine */
+ /* wether it's simple or composite */
+ /* */
+ /* exit states: Load_Header and Load_End */
+
+ case Load_Glyph:
+ /* check glyph index and table */
+
+ index = subglyph->index;
+ if ( index < 0 || index >= face->numGlyphs )
+ {
+ error = TT_Err_Invalid_Glyph_Index;
+ goto Fail;
+ }
+
+ /* get horizontal metrics */
+
+ {
+ Short left_bearing;
+ UShort advance_width;
+
+
+ Get_HMetrics( face, index, TRUE,
+ &left_bearing,
+ &advance_width );
+
+ subglyph->metrics.horiBearingX = left_bearing;
+ subglyph->metrics.horiAdvance = advance_width;
+ }
+
+ phase = Load_Header;
+
+
+ /* The cache callback isn't part of the FreeType release yet */
+ /* It is discarded for the moment.. */
+ /* */
+#if 0
+ if ( instance )
+ {
+ /* is the glyph in an outline cache ? */
+ cacheCb = instance->owner->engine->glCallback;
+ if ( cacheCb && 0 ) /* disabled */
+ {
+ /* we have a callback */
+ error = cacheCb( instance->generic,
+ index, &cached_outline, &x, &y );
+ if ( !error )
+ {
+ /* no error, then append the outline to the current subglyph */
+ /* error = Append_Outline( subglyph,
+ &left_points,
+ &left_contours,
+ &cached_outline ); */
+ phase = Load_End;
+ }
+ }
+ }
+#endif
+ break;
+
+
+ /************************************************************/
+ /* */
+ /* Load_Header state */
+ /* */
+ /* reading a glyph's generic header to determine */
+ /* wether it's simple or composite */
+ /* */
+ /* exit states: Load_Simple and Load_Composite */
+
+ case Load_Header : /* load glyph */
+
+ if ( index + 1 < face->numLocations &&
+ face->glyphLocations[index] == face->glyphLocations[index + 1] )
+ {
+ /* as described by Frederic Loyer, these are spaces, and */
+ /* not the unknown glyph. */
+
+ num_contours = 0;
+ num_points = 0;
+
+ subglyph->metrics.bbox.xMin = 0;
+ subglyph->metrics.bbox.xMax = 0;
+ subglyph->metrics.bbox.yMin = 0;
+ subglyph->metrics.bbox.yMax = 0;
+
+ subglyph->pp1.x = 0;
+ subglyph->pp2.x = subglyph->metrics.horiAdvance;
+ if (load_flags & TTLOAD_SCALE_GLYPH)
+ subglyph->pp2.x = Scale_X( &exec->metrics, subglyph->pp2.x );
+
+ exec->glyphSize = 0;
+ phase = Load_End;
+ break;
+ }
+
+ offset = glyph_offset + face->glyphLocations[index];
+
+ /* read first glyph header */
+ if ( FILE_Seek( offset ) ||
+ ACCESS_Frame( 10L ) )
+ goto Fail_File;
+
+ num_contours = GET_Short();
+
+ subglyph->metrics.bbox.xMin = GET_Short();
+ subglyph->metrics.bbox.yMin = GET_Short();
+ subglyph->metrics.bbox.xMax = GET_Short();
+ subglyph->metrics.bbox.yMax = GET_Short();
+
+ FORGET_Frame();
+
+ PTRACE6(( "Glyph %ld\n", index ));
+ PTRACE6(( " # of contours : %d\n", num_contours ));
+ PTRACE6(( " xMin: %4d xMax: %4d\n",
+ subglyph->metrics.bbox.xMin,
+ subglyph->metrics.bbox.xMax ));
+ PTRACE6(( " yMin: %4d yMax: %4d\n",
+ subglyph->metrics.bbox.yMin,
+ subglyph->metrics.bbox.yMax ));
+ PTRACE6(( "-" ));
+
+ if ( num_contours > left_contours )
+ {
+ PTRACE0(( "ERROR: Too many contours for glyph %ld\n", index ));
+ error = TT_Err_Too_Many_Contours;
+ goto Fail;
+ }
+
+ subglyph->pp1.x = subglyph->metrics.bbox.xMin -
+ subglyph->metrics.horiBearingX;
+ subglyph->pp1.y = 0;
+ subglyph->pp2.x = subglyph->pp1.x + subglyph->metrics.horiAdvance;
+ if (load_flags & TTLOAD_SCALE_GLYPH)
+ {
+ subglyph->pp1.x = Scale_X( &exec->metrics, subglyph->pp1.x );
+ subglyph->pp2.x = Scale_X( &exec->metrics, subglyph->pp2.x );
+ }
+
+ /* is it a simple glyph ? */
+ if ( num_contours > 0 )
+ phase = Load_Simple;
+ else
+ phase = Load_Composite;
+
+ break;
+
+
+ /************************************************************/
+ /* */
+ /* Load_Simple state */
+ /* */
+ /* reading a simple glyph (num_contours must be set to */
+ /* the glyph's number of contours.) */
+ /* */
+ /* exit states : Load_End */
+ /* */
+
+ case Load_Simple:
+ new_flags = load_flags;
+
+ /* disable hinting when scaling */
+ if ( !subglyph->is_hinted )
+ new_flags &= ~TTLOAD_HINT_GLYPH;
+
+ error = Load_Simple_Glyph( exec,
+ stream,
+ num_contours,
+ left_contours,
+ left_points,
+ new_flags,
+ subglyph );
+ if ( error )
+ goto Fail;
+
+ /* Note: We could have put the simple loader source there */
+ /* but the code is fat enough already :-) */
+
+ num_points = exec->pts.n_points - 2;
+
+ phase = Load_End;
+
+ break;
+
+
+ /************************************************************/
+ /* */
+ /* Load_Composite state */
+ /* */
+ /* reading a composite glyph header a pushing a new */
+ /* load element on the stack. */
+ /* */
+ /* exit states: Load_Glyph */
+ /* */
+
+ case Load_Composite:
+
+ /* create a new element on the stack */
+ load_top++;
+
+ if ( load_top > face->maxComponents )
+ {
+ error = TT_Err_Invalid_Composite;
+ goto Fail;
+ }
+
+ subglyph2 = exec->loadStack + load_top;
+
+ Init_Glyph_Component( subglyph2, subglyph, NULL );
+ subglyph2->is_hinted = subglyph->is_hinted;
+
+ /* now read composite header */
+
+ if ( ACCESS_Frame( 4L ) )
+ goto Fail_File;
+
+ subglyph->element_flag = new_flags = GET_UShort();
+
+ subglyph2->index = GET_UShort();
+
+ FORGET_Frame();
+
+ k = 2;
+
+ if ( new_flags & ARGS_ARE_WORDS )
+ k += 2;
+
+ if ( new_flags & WE_HAVE_A_SCALE )
+ k += 2;
+
+ if ( new_flags & WE_HAVE_AN_XY_SCALE )
+ k += 4;
+
+ if ( new_flags & WE_HAVE_A_2X2 )
+ k += 8;
+
+ if ( ACCESS_Frame( k ) )
+ goto Fail_File;
+
+ if ( new_flags & ARGS_ARE_WORDS )
+ {
+ k = GET_Short();
+ l = GET_Short();
+ }
+ else
+ {
+ l = GET_UShort();
+ k = (Char)(l >> 8);
+ l = (Char)(l & 0xFF);
+ }
+
+ subglyph->arg1 = k;
+ subglyph->arg2 = l;
+
+ if ( new_flags & ARGS_ARE_XY_VALUES )
+ {
+ subglyph->transform.ox = k;
+ subglyph->transform.oy = l;
+ }
+
+ xx = 1 << 16;
+ xy = 0;
+ yx = 0;
+ yy = 1 << 16;
+
+ if ( new_flags & WE_HAVE_A_SCALE )
+ {
+ xx = (Fixed)GET_Short() << 2;
+ yy = xx;
+ subglyph2->is_scaled = TRUE;
+ }
+ else if ( new_flags & WE_HAVE_AN_XY_SCALE )
+ {
+ xx = (Fixed)GET_Short() << 2;
+ yy = (Fixed)GET_Short() << 2;
+ subglyph2->is_scaled = TRUE;
+ }
+ else if ( new_flags & WE_HAVE_A_2X2 )
+ {
+ xx = (Fixed)GET_Short() << 2;
+ xy = (Fixed)GET_Short() << 2;
+ yx = (Fixed)GET_Short() << 2;
+ yy = (Fixed)GET_Short() << 2;
+ subglyph2->is_scaled = TRUE;
+ }
+
+ FORGET_Frame();
+
+ subglyph->transform.xx = xx;
+ subglyph->transform.xy = xy;
+ subglyph->transform.yx = yx;
+ subglyph->transform.yy = yy;
+
+ k = TT_MulFix( xx, yy ) - TT_MulFix( xy, yx );
+
+ /* disable hinting in case of scaling/slanting */
+ if ( ABS( k ) != (1 << 16) )
+ subglyph2->is_hinted = FALSE;
+
+ subglyph->file_offset = FILE_Pos();
+
+ phase = Load_Glyph;
+
+ break;
+
+
+ /************************************************************/
+ /* */
+ /* Load_End state */
+ /* */
+ /* after loading a glyph, apply transformation and offset */
+ /* where necessary, pops element and continue or */
+ /* stop process. */
+ /* */
+ /* exit states : Load_Composite and Load_Exit */
+ /* */
+
+ case Load_End:
+ if ( load_top > 0 )
+ {
+ subglyph2 = subglyph;
+
+ load_top--;
+ subglyph = exec->loadStack + load_top;
+
+ /* check advance width and left side bearing */
+
+ if ( !subglyph->preserve_pps &&
+ subglyph->element_flag & USE_MY_METRICS )
+ {
+ subglyph->metrics.horiBearingX = subglyph2->metrics.horiBearingX;
+ subglyph->metrics.horiAdvance = subglyph2->metrics.horiAdvance;
+
+ subglyph->pp1 = subglyph2->pp1;
+ subglyph->pp2 = subglyph2->pp2;
+
+ subglyph->preserve_pps = TRUE;
+ }
+
+ /* apply scale */
+
+ if ( subglyph2->is_scaled )
+ {
+ TT_Vector* cur = subglyph2->zone.cur;
+ TT_Vector* org = subglyph2->zone.org;
+
+ for ( u = 0; u < num_points; u++ )
+ {
+ nx = TT_MulFix( cur->x, subglyph->transform.xx ) +
+ TT_MulFix( cur->y, subglyph->transform.yx );
+
+ ny = TT_MulFix( cur->x, subglyph->transform.xy ) +
+ TT_MulFix( cur->y, subglyph->transform.yy );
+
+ cur->x = nx;
+ cur->y = ny;
+
+ nx = TT_MulFix( org->x, subglyph->transform.xx ) +
+ TT_MulFix( org->y, subglyph->transform.yx );
+
+ ny = TT_MulFix( org->x, subglyph->transform.xy ) +
+ TT_MulFix( org->y, subglyph->transform.yy );
+
+ org->x = nx;
+ org->y = ny;
+
+ cur++;
+ org++;
+ }
+ }
+
+ /* adjust counts */
+
+ for ( k = 0; k < num_contours; k++ )
+ subglyph2->zone.contours[k] += subglyph->zone.n_points;
+
+ subglyph->zone.n_points += num_points;
+ subglyph->zone.n_contours += num_contours;
+
+ left_points -= num_points;
+ left_contours -= num_contours;
+
+ /* apply offset */
+
+ if ( !(subglyph->element_flag & ARGS_ARE_XY_VALUES) )
+ {
+ u = subglyph->arg1;
+ v = subglyph->arg2;
+
+ if ( u >= subglyph->zone.n_points ||
+ v >= subglyph->zone.n_points )
+ {
+ error = TT_Err_Invalid_Composite;
+ goto Fail;
+ }
+
+ x = subglyph->zone.org[v].x - subglyph->zone.org[u].x;
+ y = subglyph->zone.org[v].y - subglyph->zone.org[u].y;
+ }
+ else
+ {
+ x = subglyph->transform.ox;
+ y = subglyph->transform.oy;
+
+ if ( load_flags & TTLOAD_SCALE_GLYPH )
+ {
+ x = Scale_X( &exec->metrics, x );
+ y = Scale_Y( &exec->metrics, y );
+
+ if ( subglyph->element_flag & ROUND_XY_TO_GRID )
+ {
+ x = (x+32) & -64;
+ y = (y+32) & -64;
+ }
+ }
+ }
+
+ translate_array( num_points, subglyph2->zone.cur, x, y );
+
+ cur_to_org( num_points, &subglyph2->zone );
+
+ num_points = subglyph->zone.n_points;
+ num_contours = subglyph->zone.n_contours;
+
+ /* check for last component */
+
+ if ( FILE_Seek( subglyph->file_offset ) )
+ goto Fail_File;
+
+ if ( subglyph->element_flag & MORE_COMPONENTS )
+ phase = Load_Composite;
+ else
+ {
+ error = Load_Composite_End( num_points,
+ num_contours,
+ exec,
+ subglyph,
+ stream );
+ if ( error )
+ goto Fail;
+
+ phase = Load_End;
+ }
+ }
+ else
+ phase = Load_Exit;
+
+ break;
+
+
+ case Load_Exit:
+ break;
+ }
+ }
+
+ /* finally, copy the points arrays to the glyph object */
+
+ exec->pts = base_pts;
+
+ for ( u = 0; u < num_points + 2; u++ )
+ {
+ glyph->outline.points[u] = exec->pts.cur[u];
+ glyph->outline.flags [u] = exec->pts.touch[u];
+ }
+
+ for ( k = 0; k < num_contours; k++ )
+ glyph->outline.contours[k] = exec->pts.contours[k];
+
+ glyph->outline.n_points = num_points;
+ glyph->outline.n_contours = num_contours;
+ glyph->outline.second_pass = TRUE;
+
+ /* translate array so that (0,0) is the glyph's origin */
+ translate_array( num_points + 2,
+ glyph->outline.points,
+ -subglyph->pp1.x,
+ 0 );
+
+ TT_Get_Outline_BBox( &glyph->outline, &glyph->metrics.bbox );
+
+ if ( subglyph->is_hinted )
+ {
+ /* grid-fit the bounding box */
+ glyph->metrics.bbox.xMin &= -64;
+ glyph->metrics.bbox.yMin &= -64;
+ glyph->metrics.bbox.xMax = (glyph->metrics.bbox.xMax+63) & -64;
+ glyph->metrics.bbox.yMax = (glyph->metrics.bbox.yMax+63) & -64;
+ }
+
+ /* get the device-independent scaled horizontal metrics */
+ /* take care of fixed-pitch fonts... */
+ {
+ TT_Pos left_bearing;
+ TT_Pos advance;
+
+
+ left_bearing = subglyph->metrics.horiBearingX;
+ advance = subglyph->metrics.horiAdvance;
+
+ if ( face->postscript.isFixedPitch )
+ advance = face->horizontalHeader.advance_Width_Max;
+
+ if ( load_flags & TTLOAD_SCALE_GLYPH )
+ {
+ left_bearing = Scale_X( &exec->metrics, left_bearing );
+ advance = Scale_X( &exec->metrics, advance );
+ }
+
+ glyph->metrics.linearHoriBearingX = left_bearing;
+ glyph->metrics.linearHoriAdvance = advance;
+ }
+
+ glyph->metrics.horiBearingX = glyph->metrics.bbox.xMin;
+ glyph->metrics.horiBearingY = glyph->metrics.bbox.yMax;
+ glyph->metrics.horiAdvance = subglyph->pp2.x - subglyph->pp1.x;
+
+ /* Now take care of vertical metrics. In the case where there is */
+ /* no vertical information within the font (relatively common), make */
+ /* up some metrics by "hand"... */
+
+ {
+ Short top_bearing; /* vertical top side bearing (EM units) */
+ UShort advance_height; /* vertical advance height (EM units) */
+
+ TT_Pos left; /* scaled vertical left side bearing */
+ TT_Pos top; /* scaled vertical top side bearing */
+ TT_Pos advance; /* scaled vertical advance height */
+
+
+ /* Get the unscaled "tsb" and "ah" */
+ if ( face->verticalInfo &&
+ face->verticalHeader.number_Of_VMetrics > 0 )
+ {
+ /* Don't assume that both the vertical header and vertical */
+ /* metrics are present in the same font :-) */
+
+ TT_Get_Metrics( (TT_Horizontal_Header*)&face->verticalHeader,
+ glyph_index,
+ &top_bearing,
+ &advance_height );
+ }
+ else
+ {
+ /* Make up the distances from the horizontal header.. */
+
+ /* NOTE: The OS/2 values are the only 'portable' ones, */
+ /* which is why we use them... */
+ /* */
+ /* NOTE2: The sTypoDescender is negative, which is why */
+ /* we compute the baseline-to-baseline distance */
+ /* here with : */
+ /* ascender - descender + linegap */
+ /* */
+ top_bearing = (Short) (face->os2.sTypoLineGap/2);
+ advance_height = (UShort)(face->os2.sTypoAscender -
+ face->os2.sTypoDescender +
+ face->os2.sTypoLineGap);
+ }
+
+ /* scale the metrics */
+ if (load_flags & TTLOAD_SCALE_GLYPH)
+ {
+ top = Scale_Y( &exec->metrics, top_bearing );
+ advance = Scale_Y( &exec->metrics, advance_height );
+ }
+ else
+ {
+ top = top_bearing;
+ advance = advance_height;
+ }
+
+ glyph->metrics.linearVertBearingY = top;
+ glyph->metrics.linearVertAdvance = advance;
+
+ /* XXX : for now, we have no better algo for the lsb, but it should */
+ /* work ok.. */
+ /* */
+ left = (glyph->metrics.bbox.xMin - glyph->metrics.bbox.xMax)/2;
+
+ /* grid-fit them if necessary */
+ if ( subglyph->is_hinted )
+ {
+ left &= -64;
+ top = (top + 63) & -64;
+ advance = (advance + 32) & -64;
+ }
+
+ glyph->metrics.vertBearingX = left;
+ glyph->metrics.vertBearingY = top;
+ glyph->metrics.vertAdvance = advance;
+ }
+
+ /* Adjust advance width to the value contained in the hdmx table. */
+ if ( !exec->face->postscript.isFixedPitch && instance &&
+ subglyph->is_hinted )
+ {
+ widths = Get_Advance_Widths( exec->face,
+ exec->instance->metrics.x_ppem );
+ if ( widths )
+ glyph->metrics.horiAdvance = widths[glyph_index] << 6;
+ }
+
+ glyph->outline.dropout_mode = (Char)exec->GS.scan_type;
+
+ error = TT_Err_Ok;
+
+ Fail_File:
+ Fail:
+ DONE_Stream( stream );
+
+ Fin:
+
+ /* reset the execution context */
+ exec->pts = base_pts;
+
+ if ( !instance || !instance->debug )
+ Done_Context( exec );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttgload.h b/xc/extras/FreeType/lib/ttgload.h
new file mode 100644
index 000000000..49232f077
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttgload.h
@@ -0,0 +1,50 @@
+/*******************************************************************
+ *
+ * ttgload.h 1.0
+ *
+ * TrueType Glyph Loader.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ ******************************************************************/
+
+#ifndef TTGLOAD_H
+#define TTGLOAD_H
+
+#include "ttconfig.h"
+#include "ttobjs.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+ LOCAL_DEF
+ void TT_Get_Metrics( TT_Horizontal_Header* header,
+ UShort index,
+ Short* bearing,
+ UShort* advance );
+
+
+ LOCAL_DEF
+ TT_Error Load_TrueType_Glyph( PInstance instance,
+ PGlyph glyph,
+ UShort glyph_index,
+ UShort load_flags );
+
+#ifdef __cplusplus
+ }
+#endif
+
+
+#endif /* TTGLOAD_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttinterp.c b/xc/extras/FreeType/lib/ttinterp.c
new file mode 100644
index 000000000..123c96dce
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttinterp.c
@@ -0,0 +1,6389 @@
+/*******************************************************************
+ *
+ * ttinterp.c 3.0
+ *
+ * TrueType bytecode intepreter.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * Changes between 3.0 and 2.3:
+ *
+ * - Introduced the *big* switch statement to improve performance
+ * and code size, depending highly on the compiler you're using
+ *
+ * - added an opcode counter in RunIns to detect infinite loop
+ * the function will return TT_Err_Execution_Too_Long
+ *
+ * - some bug fixes and new obscure "features"
+ *
+ *
+ * Changes between 2.3 and 2.2:
+ *
+ * - added support for rotation, stretching, instruction control
+ *
+ * - added support for non-square pixels. However, this doesn't
+ * work perfectly yet...
+ *
+ ******************************************************************/
+
+#include "freetype.h"
+#include "tttypes.h"
+#include "ttdebug.h"
+#include "ttcalc.h"
+#include "ttmemory.h"
+#include "ttinterp.h"
+
+#ifdef DEBUG_INTERPRETER
+#include <memory.h>
+#include "ttdebug.h"
+
+#ifdef HAVE_CONIO_H
+#include <conio.h>
+#endif
+
+#endif /* DEBUG_INTEPRETER */
+
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_interp
+
+
+/* In order to detect infinite loops in the code, we set-up */
+/* a counter within the run loop. a singly stroke of interpretation */
+/* is now limited to a maximum number of opcodes defined below.. */
+/* */
+#define MAX_RUNNABLE_OPCODES 1000000
+
+
+/* There are two kinds of implementations there: */
+/* */
+/* a. static implementation: */
+/* */
+/* The current execution context is a static variable, */
+/* which fields are accessed directly by the interpreter */
+/* during execution. The context is named 'cur'. */
+/* */
+/* This version is non-reentrant, of course. */
+/* */
+/* */
+/* b. indirect implementation: */
+/* */
+/* The current execution context is passed to _each_ */
+/* function as its first argument, and each field is */
+/* thus accessed indirectly. */
+/* */
+/* This version is, however, fully re-entrant. */
+/* */
+/* */
+/* The idea is that an indirect implementation may be */
+/* slower to execute on the low-end processors that are */
+/* used in some systems (like 386s or even 486s). */
+/* */
+/* When the interpreter started, we had no idea of the */
+/* time that glyph hinting (i.e. executing instructions) */
+/* could take in the whole process of rendering a glyph, */
+/* and a 10 to 30% performance penalty on low-end systems */
+/* didn't seem much of a good idea. This question led us */
+/* to provide two distinct builds of the C version from */
+/* a single source, with the use of macros (again). */
+/* */
+/* Now that the engine is working (and working really */
+/* well!), it seems that the greatest time-consuming */
+/* factors are: file i/o, glyph loading, rasterizing and */
+/* _then_ glyph hinting! */
+/* */
+/* Tests performed with two versions of the 'fttimer' */
+/* program seem to indicate that hinting takes less than 5% */
+/* of the rendering process, which is dominated by glyph */
+/* loading and scan-line conversion by an high order of */
+/* magnitude. */
+/* */
+/* As a consequence, the indirect implementation is now the */
+/* default, as its performance costs can be considered */
+/* negligible in our context. Note, however, that we */
+/* kept the same source with macros because: */
+/* */
+/* - the code is kept very close in design to the */
+/* Pascal one used for development. */
+/* */
+/* - it's much more readable that way! */
+/* */
+/* - it's still open to later experimentation and tuning */
+
+
+
+#ifndef TT_STATIC_INTERPRETER /* indirect implementation */
+
+#define CUR (*exc) /* see ttobjs.h */
+
+#else /* static implementation */
+
+#define CUR cur
+
+ static TExecution_Context cur; /* static exec. context variable */
+
+ /* apparently, we have a _lot_ of direct indexing when accessing */
+ /* the static 'cur', which makes the code bigger (due to all the */
+ /* four bytes addresses). */
+
+#endif
+
+
+#define INS_ARG EXEC_OPS PStorage args /* see ttexec.h */
+
+#define SKIP_Code() SkipCode( EXEC_ARG )
+
+#define GET_ShortIns() GetShortIns( EXEC_ARG )
+
+#define COMPUTE_Funcs() Compute_Funcs( EXEC_ARG )
+
+#define NORMalize( x, y, v ) Normalize( EXEC_ARGS x, y, v )
+
+#define SET_SuperRound( scale, flags ) \
+ SetSuperRound( EXEC_ARGS scale, flags )
+
+#define INS_Goto_CodeRange( range, ip ) \
+ Ins_Goto_CodeRange( EXEC_ARGS range, ip )
+
+#define CUR_Func_project( x, y ) CUR.func_project( EXEC_ARGS x, y )
+#define CUR_Func_move( z, p, d ) CUR.func_move( EXEC_ARGS z, p, d )
+#define CUR_Func_dualproj( x, y ) CUR.func_dualproj( EXEC_ARGS x, y )
+#define CUR_Func_freeProj( x, y ) CUR.func_freeProj( EXEC_ARGS x, y )
+#define CUR_Func_round( d, c ) CUR.func_round( EXEC_ARGS d, c )
+
+#define CUR_Func_read_cvt( index ) \
+ CUR.func_read_cvt( EXEC_ARGS index )
+
+#define CUR_Func_write_cvt( index, val ) \
+ CUR.func_write_cvt( EXEC_ARGS index, val )
+
+#define CUR_Func_move_cvt( index, val ) \
+ CUR.func_move_cvt( EXEC_ARGS index, val )
+
+#define CURRENT_Ratio() Current_Ratio( EXEC_ARG )
+#define CURRENT_Ppem() Current_Ppem( EXEC_ARG )
+
+#define CALC_Length() Calc_Length( EXEC_ARG )
+
+#define INS_SxVTL( a, b, c, d ) Ins_SxVTL( EXEC_ARGS a, b, c, d )
+
+#define COMPUTE_Point_Displacement( a, b, c, d ) \
+ Compute_Point_Displacement( EXEC_ARGS a, b, c, d )
+
+#define MOVE_Zp2_Point( a, b, c, t ) Move_Zp2_Point( EXEC_ARGS a, b, c, t )
+
+#define CUR_Ppem() Cur_PPEM( EXEC_ARG )
+
+ /* Instruction dispatch function, as used by the interpreter */
+ typedef void (*TInstruction_Function)( INS_ARG );
+
+#define BOUNDS( x, n ) ( (x) >= (n) )
+
+
+
+/*********************************************************************/
+/* */
+/* Before an opcode is executed, the interpreter verifies that */
+/* there are enough arguments on the stack, with the help of */
+/* the Pop_Push_Count table. */
+/* */
+/* For each opcode, the first column gives the number of arguments */
+/* that are popped from the stack; the second one gives the number */
+/* of those that are pushed in result. */
+/* */
+/* Note that for opcodes with a varying number of parameters, */
+/* either 0 or 1 arg is verified before execution, depending */
+/* on the nature of the instruction: */
+/* */
+/* - if the number of arguments is given by the bytecode */
+/* stream or the loop variable, 0 is chosen. */
+/* */
+/* - if the first argument is a count n that is followed */
+/* by arguments a1..an, then 1 is chosen. */
+/* */
+/*********************************************************************/
+
+#undef PACK
+#define PACK( x, y ) ((x << 4) | y)
+
+ static const Byte Pop_Push_Count[256] =
+ {
+ /* opcodes are gathered in groups of 16 */
+ /* please keep the spaces as they are */
+
+ /* SVTCA y */ PACK( 0, 0 ),
+ /* SVTCA x */ PACK( 0, 0 ),
+ /* SPvTCA y */ PACK( 0, 0 ),
+ /* SPvTCA x */ PACK( 0, 0 ),
+ /* SFvTCA y */ PACK( 0, 0 ),
+ /* SFvTCA x */ PACK( 0, 0 ),
+ /* SPvTL // */ PACK( 2, 0 ),
+ /* SPvTL + */ PACK( 2, 0 ),
+ /* SFvTL // */ PACK( 2, 0 ),
+ /* SFvTL + */ PACK( 2, 0 ),
+ /* SPvFS */ PACK( 2, 0 ),
+ /* SFvFS */ PACK( 2, 0 ),
+ /* GPV */ PACK( 0, 2 ),
+ /* GFV */ PACK( 0, 2 ),
+ /* SFvTPv */ PACK( 0, 0 ),
+ /* ISECT */ PACK( 5, 0 ),
+
+ /* SRP0 */ PACK( 1, 0 ),
+ /* SRP1 */ PACK( 1, 0 ),
+ /* SRP2 */ PACK( 1, 0 ),
+ /* SZP0 */ PACK( 1, 0 ),
+ /* SZP1 */ PACK( 1, 0 ),
+ /* SZP2 */ PACK( 1, 0 ),
+ /* SZPS */ PACK( 1, 0 ),
+ /* SLOOP */ PACK( 1, 0 ),
+ /* RTG */ PACK( 0, 0 ),
+ /* RTHG */ PACK( 0, 0 ),
+ /* SMD */ PACK( 1, 0 ),
+ /* ELSE */ PACK( 0, 0 ),
+ /* JMPR */ PACK( 1, 0 ),
+ /* SCvTCi */ PACK( 1, 0 ),
+ /* SSwCi */ PACK( 1, 0 ),
+ /* SSW */ PACK( 1, 0 ),
+
+ /* DUP */ PACK( 1, 2 ),
+ /* POP */ PACK( 1, 0 ),
+ /* CLEAR */ PACK( 0, 0 ),
+ /* SWAP */ PACK( 2, 2 ),
+ /* DEPTH */ PACK( 0, 1 ),
+ /* CINDEX */ PACK( 1, 1 ),
+ /* MINDEX */ PACK( 1, 0 ),
+ /* AlignPTS */ PACK( 2, 0 ),
+ /* INS_$28 */ PACK( 0, 0 ),
+ /* UTP */ PACK( 1, 0 ),
+ /* LOOPCALL */ PACK( 2, 0 ),
+ /* CALL */ PACK( 1, 0 ),
+ /* FDEF */ PACK( 1, 0 ),
+ /* ENDF */ PACK( 0, 0 ),
+ /* MDAP[0] */ PACK( 1, 0 ),
+ /* MDAP[1] */ PACK( 1, 0 ),
+
+ /* IUP[0] */ PACK( 0, 0 ),
+ /* IUP[1] */ PACK( 0, 0 ),
+ /* SHP[0] */ PACK( 0, 0 ),
+ /* SHP[1] */ PACK( 0, 0 ),
+ /* SHC[0] */ PACK( 1, 0 ),
+ /* SHC[1] */ PACK( 1, 0 ),
+ /* SHZ[0] */ PACK( 1, 0 ),
+ /* SHZ[1] */ PACK( 1, 0 ),
+ /* SHPIX */ PACK( 1, 0 ),
+ /* IP */ PACK( 0, 0 ),
+ /* MSIRP[0] */ PACK( 2, 0 ),
+ /* MSIRP[1] */ PACK( 2, 0 ),
+ /* AlignRP */ PACK( 0, 0 ),
+ /* RTDG */ PACK( 0, 0 ),
+ /* MIAP[0] */ PACK( 2, 0 ),
+ /* MIAP[1] */ PACK( 2, 0 ),
+
+ /* NPushB */ PACK( 0, 0 ),
+ /* NPushW */ PACK( 0, 0 ),
+ /* WS */ PACK( 2, 0 ),
+ /* RS */ PACK( 1, 1 ),
+ /* WCvtP */ PACK( 2, 0 ),
+ /* RCvt */ PACK( 1, 1 ),
+ /* GC[0] */ PACK( 1, 1 ),
+ /* GC[1] */ PACK( 1, 1 ),
+ /* SCFS */ PACK( 2, 0 ),
+ /* MD[0] */ PACK( 2, 1 ),
+ /* MD[1] */ PACK( 2, 1 ),
+ /* MPPEM */ PACK( 0, 1 ),
+ /* MPS */ PACK( 0, 1 ),
+ /* FlipON */ PACK( 0, 0 ),
+ /* FlipOFF */ PACK( 0, 0 ),
+ /* DEBUG */ PACK( 1, 0 ),
+
+ /* LT */ PACK( 2, 1 ),
+ /* LTEQ */ PACK( 2, 1 ),
+ /* GT */ PACK( 2, 1 ),
+ /* GTEQ */ PACK( 2, 1 ),
+ /* EQ */ PACK( 2, 1 ),
+ /* NEQ */ PACK( 2, 1 ),
+ /* ODD */ PACK( 1, 1 ),
+ /* EVEN */ PACK( 1, 1 ),
+ /* IF */ PACK( 1, 0 ),
+ /* EIF */ PACK( 0, 0 ),
+ /* AND */ PACK( 2, 1 ),
+ /* OR */ PACK( 2, 1 ),
+ /* NOT */ PACK( 1, 1 ),
+ /* DeltaP1 */ PACK( 1, 0 ),
+ /* SDB */ PACK( 1, 0 ),
+ /* SDS */ PACK( 1, 0 ),
+
+ /* ADD */ PACK( 2, 1 ),
+ /* SUB */ PACK( 2, 1 ),
+ /* DIV */ PACK( 2, 1 ),
+ /* MUL */ PACK( 2, 1 ),
+ /* ABS */ PACK( 1, 1 ),
+ /* NEG */ PACK( 1, 1 ),
+ /* FLOOR */ PACK( 1, 1 ),
+ /* CEILING */ PACK( 1, 1 ),
+ /* ROUND[0] */ PACK( 1, 1 ),
+ /* ROUND[1] */ PACK( 1, 1 ),
+ /* ROUND[2] */ PACK( 1, 1 ),
+ /* ROUND[3] */ PACK( 1, 1 ),
+ /* NROUND[0] */ PACK( 1, 1 ),
+ /* NROUND[1] */ PACK( 1, 1 ),
+ /* NROUND[2] */ PACK( 1, 1 ),
+ /* NROUND[3] */ PACK( 1, 1 ),
+
+ /* WCvtF */ PACK( 2, 0 ),
+ /* DeltaP2 */ PACK( 1, 0 ),
+ /* DeltaP3 */ PACK( 1, 0 ),
+ /* DeltaCn[0] */ PACK( 1, 0 ),
+ /* DeltaCn[1] */ PACK( 1, 0 ),
+ /* DeltaCn[2] */ PACK( 1, 0 ),
+ /* SROUND */ PACK( 1, 0 ),
+ /* S45Round */ PACK( 1, 0 ),
+ /* JROT */ PACK( 2, 0 ),
+ /* JROF */ PACK( 2, 0 ),
+ /* ROFF */ PACK( 0, 0 ),
+ /* INS_$7B */ PACK( 0, 0 ),
+ /* RUTG */ PACK( 0, 0 ),
+ /* RDTG */ PACK( 0, 0 ),
+ /* SANGW */ PACK( 1, 0 ),
+ /* AA */ PACK( 1, 0 ),
+
+ /* FlipPT */ PACK( 0, 0 ),
+ /* FlipRgON */ PACK( 2, 0 ),
+ /* FlipRgOFF */ PACK( 2, 0 ),
+ /* INS_$83 */ PACK( 0, 0 ),
+ /* INS_$84 */ PACK( 0, 0 ),
+ /* ScanCTRL */ PACK( 1, 0 ),
+ /* SDVPTL[0] */ PACK( 2, 0 ),
+ /* SDVPTL[1] */ PACK( 2, 0 ),
+ /* GetINFO */ PACK( 1, 1 ),
+ /* IDEF */ PACK( 1, 0 ),
+ /* ROLL */ PACK( 3, 3 ),
+ /* MAX */ PACK( 2, 1 ),
+ /* MIN */ PACK( 2, 1 ),
+ /* ScanTYPE */ PACK( 1, 0 ),
+ /* InstCTRL */ PACK( 2, 0 ),
+ /* INS_$8F */ PACK( 0, 0 ),
+
+ /* INS_$90 */ PACK( 0, 0 ),
+ /* INS_$91 */ PACK( 0, 0 ),
+ /* INS_$92 */ PACK( 0, 0 ),
+ /* INS_$93 */ PACK( 0, 0 ),
+ /* INS_$94 */ PACK( 0, 0 ),
+ /* INS_$95 */ PACK( 0, 0 ),
+ /* INS_$96 */ PACK( 0, 0 ),
+ /* INS_$97 */ PACK( 0, 0 ),
+ /* INS_$98 */ PACK( 0, 0 ),
+ /* INS_$99 */ PACK( 0, 0 ),
+ /* INS_$9A */ PACK( 0, 0 ),
+ /* INS_$9B */ PACK( 0, 0 ),
+ /* INS_$9C */ PACK( 0, 0 ),
+ /* INS_$9D */ PACK( 0, 0 ),
+ /* INS_$9E */ PACK( 0, 0 ),
+ /* INS_$9F */ PACK( 0, 0 ),
+
+ /* INS_$A0 */ PACK( 0, 0 ),
+ /* INS_$A1 */ PACK( 0, 0 ),
+ /* INS_$A2 */ PACK( 0, 0 ),
+ /* INS_$A3 */ PACK( 0, 0 ),
+ /* INS_$A4 */ PACK( 0, 0 ),
+ /* INS_$A5 */ PACK( 0, 0 ),
+ /* INS_$A6 */ PACK( 0, 0 ),
+ /* INS_$A7 */ PACK( 0, 0 ),
+ /* INS_$A8 */ PACK( 0, 0 ),
+ /* INS_$A9 */ PACK( 0, 0 ),
+ /* INS_$AA */ PACK( 0, 0 ),
+ /* INS_$AB */ PACK( 0, 0 ),
+ /* INS_$AC */ PACK( 0, 0 ),
+ /* INS_$AD */ PACK( 0, 0 ),
+ /* INS_$AE */ PACK( 0, 0 ),
+ /* INS_$AF */ PACK( 0, 0 ),
+
+ /* PushB[0] */ PACK( 0, 1 ),
+ /* PushB[1] */ PACK( 0, 2 ),
+ /* PushB[2] */ PACK( 0, 3 ),
+ /* PushB[3] */ PACK( 0, 4 ),
+ /* PushB[4] */ PACK( 0, 5 ),
+ /* PushB[5] */ PACK( 0, 6 ),
+ /* PushB[6] */ PACK( 0, 7 ),
+ /* PushB[7] */ PACK( 0, 8 ),
+ /* PushW[0] */ PACK( 0, 1 ),
+ /* PushW[1] */ PACK( 0, 2 ),
+ /* PushW[2] */ PACK( 0, 3 ),
+ /* PushW[3] */ PACK( 0, 4 ),
+ /* PushW[4] */ PACK( 0, 5 ),
+ /* PushW[5] */ PACK( 0, 6 ),
+ /* PushW[6] */ PACK( 0, 7 ),
+ /* PushW[7] */ PACK( 0, 8 ),
+
+ /* MDRP[00] */ PACK( 1, 0 ),
+ /* MDRP[01] */ PACK( 1, 0 ),
+ /* MDRP[02] */ PACK( 1, 0 ),
+ /* MDRP[03] */ PACK( 1, 0 ),
+ /* MDRP[04] */ PACK( 1, 0 ),
+ /* MDRP[05] */ PACK( 1, 0 ),
+ /* MDRP[06] */ PACK( 1, 0 ),
+ /* MDRP[07] */ PACK( 1, 0 ),
+ /* MDRP[08] */ PACK( 1, 0 ),
+ /* MDRP[09] */ PACK( 1, 0 ),
+ /* MDRP[10] */ PACK( 1, 0 ),
+ /* MDRP[11] */ PACK( 1, 0 ),
+ /* MDRP[12] */ PACK( 1, 0 ),
+ /* MDRP[13] */ PACK( 1, 0 ),
+ /* MDRP[14] */ PACK( 1, 0 ),
+ /* MDRP[15] */ PACK( 1, 0 ),
+
+ /* MDRP[16] */ PACK( 1, 0 ),
+ /* MDRP[17] */ PACK( 1, 0 ),
+ /* MDRP[18] */ PACK( 1, 0 ),
+ /* MDRP[19] */ PACK( 1, 0 ),
+ /* MDRP[20] */ PACK( 1, 0 ),
+ /* MDRP[21] */ PACK( 1, 0 ),
+ /* MDRP[22] */ PACK( 1, 0 ),
+ /* MDRP[23] */ PACK( 1, 0 ),
+ /* MDRP[24] */ PACK( 1, 0 ),
+ /* MDRP[25] */ PACK( 1, 0 ),
+ /* MDRP[26] */ PACK( 1, 0 ),
+ /* MDRP[27] */ PACK( 1, 0 ),
+ /* MDRP[28] */ PACK( 1, 0 ),
+ /* MDRP[29] */ PACK( 1, 0 ),
+ /* MDRP[30] */ PACK( 1, 0 ),
+ /* MDRP[31] */ PACK( 1, 0 ),
+
+ /* MIRP[00] */ PACK( 2, 0 ),
+ /* MIRP[01] */ PACK( 2, 0 ),
+ /* MIRP[02] */ PACK( 2, 0 ),
+ /* MIRP[03] */ PACK( 2, 0 ),
+ /* MIRP[04] */ PACK( 2, 0 ),
+ /* MIRP[05] */ PACK( 2, 0 ),
+ /* MIRP[06] */ PACK( 2, 0 ),
+ /* MIRP[07] */ PACK( 2, 0 ),
+ /* MIRP[08] */ PACK( 2, 0 ),
+ /* MIRP[09] */ PACK( 2, 0 ),
+ /* MIRP[10] */ PACK( 2, 0 ),
+ /* MIRP[11] */ PACK( 2, 0 ),
+ /* MIRP[12] */ PACK( 2, 0 ),
+ /* MIRP[13] */ PACK( 2, 0 ),
+ /* MIRP[14] */ PACK( 2, 0 ),
+ /* MIRP[15] */ PACK( 2, 0 ),
+
+ /* MIRP[16] */ PACK( 2, 0 ),
+ /* MIRP[17] */ PACK( 2, 0 ),
+ /* MIRP[18] */ PACK( 2, 0 ),
+ /* MIRP[19] */ PACK( 2, 0 ),
+ /* MIRP[20] */ PACK( 2, 0 ),
+ /* MIRP[21] */ PACK( 2, 0 ),
+ /* MIRP[22] */ PACK( 2, 0 ),
+ /* MIRP[23] */ PACK( 2, 0 ),
+ /* MIRP[24] */ PACK( 2, 0 ),
+ /* MIRP[25] */ PACK( 2, 0 ),
+ /* MIRP[26] */ PACK( 2, 0 ),
+ /* MIRP[27] */ PACK( 2, 0 ),
+ /* MIRP[28] */ PACK( 2, 0 ),
+ /* MIRP[29] */ PACK( 2, 0 ),
+ /* MIRP[30] */ PACK( 2, 0 ),
+ /* MIRP[31] */ PACK( 2, 0 )
+ };
+
+ static const TT_Vector Null_Vector = {0,0};
+
+#undef NULL_Vector
+#define NULL_Vector (TT_Vector*)&Null_Vector
+
+/*******************************************************************
+ *
+ * Function : Norm
+ *
+ * Description : Returns the norm (length) of a vector.
+ *
+ * Input : X, Y vector
+ *
+ * Output : Returns length in F26dot6.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Norm( TT_F26Dot6 X, TT_F26Dot6 Y )
+ {
+ TT_Int64 T1, T2;
+
+
+ MUL_64( X, X, T1 );
+ MUL_64( Y, Y, T2 );
+
+ ADD_64( T1, T2, T1 );
+
+ return (TT_F26Dot6)SQRT_64( T1 );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : FUnits_To_Pixels
+ *
+ * Description : Scale a distance in FUnits to pixel coordinates.
+ *
+ * Input : Distance in FUnits
+ *
+ * Output : Distance in 26.6 format.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 FUnits_To_Pixels( EXEC_OPS Short distance )
+ {
+ return TT_MulDiv( distance,
+ CUR.metrics.scale1,
+ CUR.metrics.scale2 );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Current_Ratio
+ *
+ * Description : Return the current aspect ratio scaling factor
+ * depending on the projection vector's state and
+ * device resolutions.
+ *
+ * Input : None
+ *
+ * Output : Aspect ratio in 16.16 format, always <= 1.0 .
+ *
+ *****************************************************************/
+
+ static Long Current_Ratio( EXEC_OP )
+ {
+ if ( CUR.metrics.ratio )
+ return CUR.metrics.ratio;
+
+ if ( CUR.GS.projVector.y == 0 )
+ CUR.metrics.ratio = CUR.metrics.x_ratio;
+
+ else if ( CUR.GS.projVector.x == 0 )
+ CUR.metrics.ratio = CUR.metrics.y_ratio;
+
+ else
+ {
+ Long x, y;
+
+
+ x = TT_MulDiv( CUR.GS.projVector.x, CUR.metrics.x_ratio, 0x4000 );
+ y = TT_MulDiv( CUR.GS.projVector.y, CUR.metrics.y_ratio, 0x4000 );
+ CUR.metrics.ratio = Norm( x, y );
+ }
+
+ return CUR.metrics.ratio;
+ }
+
+
+ static Long Current_Ppem( EXEC_OP )
+ {
+ return TT_MulFix( CUR.metrics.ppem, CURRENT_Ratio() );
+ }
+
+
+ static TT_F26Dot6 Read_CVT( EXEC_OPS ULong index )
+ {
+ return CUR.cvt[index];
+ }
+
+
+ static TT_F26Dot6 Read_CVT_Stretched( EXEC_OPS ULong index )
+ {
+ return TT_MulFix( CUR.cvt[index], CURRENT_Ratio() );
+ }
+
+
+ static void Write_CVT( EXEC_OPS ULong index, TT_F26Dot6 value )
+ {
+ CUR.cvt[index] = value;
+ }
+
+ static void Write_CVT_Stretched( EXEC_OPS ULong index, TT_F26Dot6 value )
+ {
+ CUR.cvt[index] = TT_MulDiv( value, 0x10000, CURRENT_Ratio() );
+ }
+
+
+ static void Move_CVT( EXEC_OPS ULong index, TT_F26Dot6 value )
+ {
+ CUR.cvt[index] += value;
+ }
+
+ static void Move_CVT_Stretched( EXEC_OPS ULong index, TT_F26Dot6 value )
+ {
+ CUR.cvt[index] += TT_MulDiv( value, 0x10000, CURRENT_Ratio() );
+ }
+
+
+/******************************************************************
+ *
+ * Function : Calc_Length
+ *
+ * Description : Computes the length in bytes of current opcode.
+ *
+ *****************************************************************/
+
+ static Bool Calc_Length( EXEC_OP )
+ {
+ CUR.opcode = CUR.code[CUR.IP];
+
+ switch ( CUR.opcode )
+ {
+ case 0x40:
+ if ( CUR.IP + 1 >= CUR.codeSize )
+ return FAILURE;
+
+ CUR.length = CUR.code[CUR.IP + 1] + 2;
+ break;
+
+ case 0x41:
+ if ( CUR.IP + 1 >= CUR.codeSize )
+ return FAILURE;
+
+ CUR.length = CUR.code[CUR.IP + 1] * 2 + 2;
+ break;
+
+ case 0xB0:
+ case 0xB1:
+ case 0xB2:
+ case 0xB3:
+ case 0xB4:
+ case 0xB5:
+ case 0xB6:
+ case 0xB7:
+ CUR.length = CUR.opcode - 0xB0 + 2;
+ break;
+
+ case 0xB8:
+ case 0xB9:
+ case 0xBA:
+ case 0xBB:
+ case 0xBC:
+ case 0xBD:
+ case 0xBE:
+ case 0xBF:
+ CUR.length = (CUR.opcode - 0xB8) * 2 + 3;
+ break;
+
+ default:
+ CUR.length = 1;
+ break;
+ }
+
+ /* make sure result is in range */
+
+ if ( CUR.IP + CUR.length > CUR.codeSize )
+ return FAILURE;
+
+ return SUCCESS;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : GetShortIns
+ *
+ * Description : Returns a short integer taken from the instruction
+ * stream at address IP.
+ *
+ * Input : None
+ *
+ * Output : Short read at Code^[IP..IP+1]
+ *
+ * Notes : This one could become a Macro in the C version.
+ *
+ *****************************************************************/
+
+ static Short GetShortIns( EXEC_OP )
+ {
+ /* Reading a byte stream so there is no endianess (DaveP) */
+ CUR.IP += 2;
+ return (Short)((CUR.code[CUR.IP - 2] << 8) + CUR.code[CUR.IP - 1]);
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Ins_Goto_CodeRange
+ *
+ * Description : Goes to a certain code range in the instruction
+ * stream.
+ *
+ *
+ * Input : aRange
+ * aIP
+ *
+ * Output : SUCCESS or FAILURE.
+ *
+ *****************************************************************/
+
+ static Bool Ins_Goto_CodeRange( EXEC_OPS Int aRange, ULong aIP )
+ {
+ TCodeRange* WITH;
+
+
+ if ( aRange < 1 || aRange > 3 )
+ {
+ CUR.error = TT_Err_Bad_Argument;
+ return FAILURE;
+ }
+
+ WITH = &CUR.codeRangeTable[aRange - 1];
+
+ if ( WITH->Base == NULL ) /* invalid coderange */
+ {
+ CUR.error = TT_Err_Invalid_CodeRange;
+ return FAILURE;
+ }
+
+ /* NOTE: Because the last instruction of a program may be a CALL */
+ /* which will return to the first byte *after* the code */
+ /* range, we test for AIP <= Size, instead of AIP < Size. */
+
+ if ( aIP > WITH->Size )
+ {
+ CUR.error = TT_Err_Code_Overflow;
+ return FAILURE;
+ }
+
+ CUR.code = WITH->Base;
+ CUR.codeSize = WITH->Size;
+ CUR.IP = aIP;
+ CUR.curRange = aRange;
+
+ return SUCCESS;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Direct_Move
+ *
+ * Description : Moves a point by a given distance along the
+ * freedom vector.
+ *
+ * Input : Vx, Vy point coordinates to move
+ * touch touch flag to modify
+ * distance
+ *
+ * Output : None
+ *
+ *****************************************************************/
+
+ static void Direct_Move( EXEC_OPS PGlyph_Zone zone,
+ UShort point,
+ TT_F26Dot6 distance )
+ {
+ TT_F26Dot6 v;
+
+
+ v = CUR.GS.freeVector.x;
+
+ if ( v != 0 )
+ {
+ zone->cur[point].x += TT_MulDiv( distance,
+ v * 0x10000L,
+ CUR.F_dot_P );
+
+ zone->touch[point] |= TT_Flag_Touched_X;
+ }
+
+ v = CUR.GS.freeVector.y;
+
+ if ( v != 0 )
+ {
+ zone->cur[point].y += TT_MulDiv( distance,
+ v * 0x10000L,
+ CUR.F_dot_P );
+
+ zone->touch[point] |= TT_Flag_Touched_Y;
+ }
+ }
+
+
+/******************************************************************/
+/* */
+/* The following versions are used whenever both vectors are both */
+/* along one of the coordinate unit vectors, i.e. in 90% cases. */
+/* */
+/******************************************************************/
+
+/*******************************************************************
+ * Direct_Move_X
+ *
+ *******************************************************************/
+
+ static void Direct_Move_X( EXEC_OPS PGlyph_Zone zone,
+ UShort point,
+ TT_F26Dot6 distance )
+ {
+ zone->cur[point].x += distance;
+ zone->touch[point] |= TT_Flag_Touched_X;
+ }
+
+
+/*******************************************************************
+ * Direct_Move_Y
+ *
+ *******************************************************************/
+
+ static void Direct_Move_Y( EXEC_OPS PGlyph_Zone zone,
+ UShort point,
+ TT_F26Dot6 distance )
+ {
+ zone->cur[point].y += distance;
+ zone->touch[point] |= TT_Flag_Touched_Y;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_None
+ *
+ * Description : Does not round, but adds engine compensation.
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : rounded distance.
+ *
+ * NOTE : The spec says very few about the relationship between
+ * rounding and engine compensation. However, it seems
+ * from the description of super round that we should
+ * should add the compensation before rounding.
+ *
+ ******************************************************************/
+
+ static TT_F26Dot6 Round_None( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation;
+ if ( val < 0 )
+ val = 0;
+ }
+ else {
+ val = distance - compensation;
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_To_Grid
+ *
+ * Description : Rounds value to grid after adding engine
+ * compensation
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : Rounded distance.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Round_To_Grid( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 32;
+ if ( val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -( (compensation - distance + 32) & (-64) );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_To_Half_Grid
+ *
+ * Description : Rounds value to half grid after adding engine
+ * compensation.
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : Rounded distance.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Round_To_Half_Grid( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = ((distance + compensation) & (-64)) + 32;
+ if ( val < 0 )
+ val = 0;
+ }
+ else
+ {
+ val = -( ((compensation - distance) & (-64)) + 32 );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_Down_To_Grid
+ *
+ * Description : Rounds value down to grid after adding engine
+ * compensation.
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : Rounded distance.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Round_Down_To_Grid( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation;
+ if ( val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -( (compensation - distance) & (-64) );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_Up_To_Grid
+ *
+ * Description : Rounds value up to grid after adding engine
+ * compensation.
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : Rounded distance.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Round_Up_To_Grid( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 63;
+ if ( val > 0 )
+ val &= ~63;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -( (compensation - distance + 63) & (-64) );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_To_Double_Grid
+ *
+ * Description : Rounds value to double grid after adding engine
+ * compensation.
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : Rounded distance.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Round_To_Double_Grid( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = distance + compensation + 16;
+ if ( val > 0 )
+ val &= ~31;
+ else
+ val = 0;
+ }
+ else
+ {
+ val = -( (compensation - distance + 16) & (-32) );
+ if ( val > 0 )
+ val = 0;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_Super
+ *
+ * Description : Super-rounds value to grid after adding engine
+ * compensation.
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : Rounded distance.
+ *
+ * NOTE : The spec says very few about the relationship between
+ * rounding and engine compensation. However, it seems
+ * from the description of super round that we should
+ * should add the compensation before rounding.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Round_Super( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = (distance - CUR.phase + CUR.threshold + compensation) &
+ (-CUR.period);
+ if ( val < 0 )
+ val = 0;
+ val += CUR.phase;
+ }
+ else
+ {
+ val = -( (CUR.threshold - CUR.phase - distance + compensation) &
+ (-CUR.period) );
+ if ( val > 0 )
+ val = 0;
+ val -= CUR.phase;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Round_Super_45
+ *
+ * Description : Super-rounds value to grid after adding engine
+ * compensation.
+ *
+ * Input : distance : distance to round
+ * compensation : engine compensation
+ *
+ * Output : Rounded distance.
+ *
+ * NOTE : There is a separate function for Round_Super_45 as we
+ * may need a greater precision.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Round_Super_45( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation )
+ {
+ TT_F26Dot6 val;
+
+
+ if ( distance >= 0 )
+ {
+ val = ( (distance - CUR.phase + CUR.threshold + compensation) /
+ CUR.period ) * CUR.period;
+ if ( val < 0 )
+ val = 0;
+ val += CUR.phase;
+ }
+ else
+ {
+ val = -( ( (CUR.threshold - CUR.phase - distance + compensation) /
+ CUR.period ) * CUR.period );
+ if ( val > 0 )
+ val = 0;
+ val -= CUR.phase;
+ }
+
+ return val;
+ }
+
+
+/*******************************************************************
+ * Compute_Round
+ *
+ *****************************************************************/
+
+ static void Compute_Round( EXEC_OPS Byte round_mode )
+ {
+ switch ( round_mode )
+ {
+ case TT_Round_Off:
+ CUR.func_round = (TRound_Function)Round_None;
+ break;
+
+ case TT_Round_To_Grid:
+ CUR.func_round = (TRound_Function)Round_To_Grid;
+ break;
+
+ case TT_Round_Up_To_Grid:
+ CUR.func_round = (TRound_Function)Round_Up_To_Grid;
+ break;
+
+ case TT_Round_Down_To_Grid:
+ CUR.func_round = (TRound_Function)Round_Down_To_Grid;
+ break;
+
+ case TT_Round_To_Half_Grid:
+ CUR.func_round = (TRound_Function)Round_To_Half_Grid;
+ break;
+
+ case TT_Round_To_Double_Grid:
+ CUR.func_round = (TRound_Function)Round_To_Double_Grid;
+ break;
+
+ case TT_Round_Super:
+ CUR.func_round = (TRound_Function)Round_Super;
+ break;
+
+ case TT_Round_Super_45:
+ CUR.func_round = (TRound_Function)Round_Super_45;
+ break;
+ }
+ }
+
+
+/*******************************************************************
+ *
+ * Function : SetSuperRound
+ *
+ * Description : Sets Super Round parameters.
+ *
+ * Input : GridPeriod Grid period
+ * OpCode SROUND opcode
+ *
+ * Output : None.
+ *
+ *****************************************************************/
+
+ static void SetSuperRound( EXEC_OPS TT_F26Dot6 GridPeriod,
+ Long selector )
+ {
+ switch ( selector & 0xC0 )
+ {
+ case 0:
+ CUR.period = GridPeriod / 2;
+ break;
+
+ case 0x40:
+ CUR.period = GridPeriod;
+ break;
+
+ case 0x80:
+ CUR.period = GridPeriod * 2;
+ break;
+
+ /* This opcode is reserved, but... */
+
+ case 0xC0:
+ CUR.period = GridPeriod;
+ break;
+ }
+
+ switch ( selector & 0x30 )
+ {
+ case 0:
+ CUR.phase = 0;
+ break;
+
+ case 0x10:
+ CUR.phase = CUR.period / 4;
+ break;
+
+ case 0x20:
+ CUR.phase = CUR.period / 2;
+ break;
+
+ case 0x30:
+ CUR.phase = GridPeriod * 3 / 4;
+ break;
+ }
+
+ if ( (selector & 0x0F) == 0 )
+ CUR.threshold = CUR.period - 1;
+ else
+ CUR.threshold = ( (Int)(selector & 0x0F) - 4L ) * CUR.period / 8;
+
+ CUR.period /= 256;
+ CUR.phase /= 256;
+ CUR.threshold /= 256;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Project
+ *
+ * Description : Computes the projection of (Vx,Vy) along the
+ * current projection vector.
+ *
+ * Input : Vx, Vy input vector
+ *
+ * Output : Returns distance in F26dot6.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Project( EXEC_OPS TT_Vector* v1,
+ TT_Vector* v2 )
+ {
+ TT_Int64 T1, T2;
+
+
+ MUL_64( v1->x - v2->x, CUR.GS.projVector.x, T1 );
+ MUL_64( v1->y - v2->y, CUR.GS.projVector.y, T2 );
+
+ ADD_64( T1, T2, T1 );
+
+ return (TT_F26Dot6)DIV_64( T1, 0x4000L );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Dual_Project
+ *
+ * Description : Computes the projection of (Vx,Vy) along the
+ * current dual vector.
+ *
+ * Input : Vx, Vy input vector
+ *
+ * Output : Returns distance in F26dot6.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Dual_Project( EXEC_OPS TT_Vector* v1,
+ TT_Vector* v2 )
+ {
+ TT_Int64 T1, T2;
+
+
+ MUL_64( v1->x - v2->x, CUR.GS.dualVector.x, T1 );
+ MUL_64( v1->y - v2->y, CUR.GS.dualVector.y, T2 );
+
+ ADD_64( T1, T2, T1 );
+
+ return (TT_F26Dot6)DIV_64( T1, 0x4000L );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Free_Project
+ *
+ * Description : Computes the projection of (Vx,Vy) along the
+ * current freedom vector.
+ *
+ * Input : Vx, Vy input vector
+ *
+ * Output : Returns distance in F26dot6.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Free_Project( EXEC_OPS TT_Vector* v1,
+ TT_Vector* v2 )
+ {
+ TT_Int64 T1, T2;
+
+
+ MUL_64( v1->x - v2->x, CUR.GS.freeVector.x, T1 );
+ MUL_64( v1->y - v2->y, CUR.GS.freeVector.y, T2 );
+
+ ADD_64( T1, T2, T1 );
+
+ return (TT_F26Dot6)DIV_64( T1, 0x4000L );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Project_x
+ *
+ * Input : Vx, Vy input vector
+ *
+ * Output : Returns Vx.
+ *
+ * Note : Used as a dummy function.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Project_x( EXEC_OPS TT_Vector* v1,
+ TT_Vector* v2 )
+ {
+ return (v1->x - v2->x);
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Project_y
+ *
+ * Input : Vx, Vy input vector
+ *
+ * Output : Returns Vy.
+ *
+ * Note : Used as a dummy function.
+ *
+ *****************************************************************/
+
+ static TT_F26Dot6 Project_y( EXEC_OPS TT_Vector* v1,
+ TT_Vector* v2 )
+ {
+ return (v1->y - v2->y);
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Compute_Funcs
+ *
+ * Description : Computes the projections and movement function
+ * pointers according to the current graphics state.
+ *
+ * Input : None
+ *
+ *****************************************************************/
+
+ static void Compute_Funcs( EXEC_OP )
+ {
+ if ( CUR.GS.freeVector.x == 0x4000 )
+ {
+ CUR.func_freeProj = (TProject_Function)Project_x;
+ CUR.F_dot_P = CUR.GS.projVector.x * 0x10000L;
+ }
+ else
+ {
+ if ( CUR.GS.freeVector.y == 0x4000 )
+ {
+ CUR.func_freeProj = (TProject_Function)Project_y;
+ CUR.F_dot_P = CUR.GS.projVector.y * 0x10000L;
+ }
+ else
+ {
+ CUR.func_freeProj = (TProject_Function)Free_Project;
+ CUR.F_dot_P = (Long)CUR.GS.projVector.x * CUR.GS.freeVector.x * 4 +
+ (Long)CUR.GS.projVector.y * CUR.GS.freeVector.y * 4;
+ }
+ }
+
+ CUR.cached_metrics = FALSE;
+
+ if ( CUR.GS.projVector.x == 0x4000 )
+ CUR.func_project = (TProject_Function)Project_x;
+ else
+ {
+ if ( CUR.GS.projVector.y == 0x4000 )
+ CUR.func_project = (TProject_Function)Project_y;
+ else
+ CUR.func_project = (TProject_Function)Project;
+ }
+
+ if ( CUR.GS.dualVector.x == 0x4000 )
+ CUR.func_dualproj = (TProject_Function)Project_x;
+ else
+ {
+ if ( CUR.GS.dualVector.y == 0x4000 )
+ CUR.func_dualproj = (TProject_Function)Project_y;
+ else
+ CUR.func_dualproj = (TProject_Function)Dual_Project;
+ }
+
+ CUR.func_move = (TMove_Function)Direct_Move;
+
+ if ( CUR.F_dot_P == 0x40000000L )
+ {
+ if ( CUR.GS.freeVector.x == 0x4000 )
+ CUR.func_move = (TMove_Function)Direct_Move_X;
+ else
+ {
+ if ( CUR.GS.freeVector.y == 0x4000 )
+ CUR.func_move = (TMove_Function)Direct_Move_Y;
+ }
+ }
+
+ /* at small sizes, F_dot_P can become too small, resulting */
+ /* in overflows and 'spikes' in a number of glyphs like 'w'. */
+
+ if ( ABS( CUR.F_dot_P ) < 0x4000000L )
+ CUR.F_dot_P = 0x40000000L;
+
+ /* Disable cached aspect ratio */
+ CUR.metrics.ratio = 0;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Normalize
+ *
+ * Description : Norms a vector
+ *
+ * Input : Vx, Vy input vector
+ * R unit vector
+ *
+ * Output : Returns FAILURE if a vector parameter is zero.
+ *
+ *****************************************************************/
+
+ static Bool Normalize( EXEC_OPS TT_F26Dot6 Vx,
+ TT_F26Dot6 Vy,
+ TT_UnitVector* R )
+ {
+ TT_F26Dot6 W;
+ Bool S1, S2;
+
+
+ if ( ABS( Vx ) < 0x10000L && ABS( Vy ) < 0x10000L )
+ {
+ Vx *= 0x100;
+ Vy *= 0x100;
+
+ W = Norm( Vx, Vy );
+
+ if ( W == 0 )
+ {
+ /* XXX : UNDOCUMENTED! It seems that it's possible to try */
+ /* to normalize the vector (0,0). Return immediately */
+ return SUCCESS;
+ }
+
+ R->x = (TT_F2Dot14)TT_MulDiv( Vx, 0x4000L, W );
+ R->y = (TT_F2Dot14)TT_MulDiv( Vy, 0x4000L, W );
+
+ return SUCCESS;
+ }
+
+ W = Norm( Vx, Vy );
+
+ Vx = TT_MulDiv( Vx, 0x4000L, W );
+ Vy = TT_MulDiv( Vy, 0x4000L, W );
+
+ W = Vx * Vx + Vy * Vy;
+
+ /* Now, we want that Sqrt( W ) = 0x4000 */
+ /* Or 0x1000000 <= W < 0x1004000 */
+
+ if ( Vx < 0 )
+ {
+ Vx = -Vx;
+ S1 = TRUE;
+ }
+ else
+ S1 = FALSE;
+
+ if ( Vy < 0 )
+ {
+ Vy = -Vy;
+ S2 = TRUE;
+ }
+ else
+ S2 = FALSE;
+
+ while ( W < 0x1000000L )
+ {
+ /* We need to increase W, by a minimal amount */
+ if ( Vx < Vy )
+ Vx++;
+ else
+ Vy++;
+
+ W = Vx * Vx + Vy * Vy;
+ }
+
+ while ( W >= 0x1004000L )
+ {
+ /* We need to decrease W, by a minimal amount */
+ if ( Vx < Vy )
+ Vx--;
+ else
+ Vy--;
+
+ W = Vx * Vx + Vy * Vy;
+ }
+
+ /* Note that in various cases, we can only */
+ /* compute a Sqrt(W) of 0x3FFF, eg. Vx = Vy */
+
+ if ( S1 )
+ Vx = -Vx;
+
+ if ( S2 )
+ Vy = -Vy;
+
+ R->x = (TT_F2Dot14)Vx; /* Type conversion */
+ R->y = (TT_F2Dot14)Vy; /* Type conversion */
+
+ return SUCCESS;
+ }
+
+
+
+
+
+ static Bool Ins_SxVTL( EXEC_OPS UShort aIdx1,
+ UShort aIdx2,
+ Int aOpc,
+ TT_UnitVector* Vec )
+ {
+ Long A, B, C;
+ TT_Vector* p1;
+ TT_Vector* p2;
+
+
+ if ( BOUNDS( aIdx1, CUR.zp2.n_points ) ||
+ BOUNDS( aIdx2, CUR.zp1.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return FAILURE;
+ }
+
+ p1 = CUR.zp1.cur + aIdx2;
+ p2 = CUR.zp2.cur + aIdx1;
+
+ A = p1->x - p2->x;
+ B = p1->y - p2->y;
+
+ if ( (aOpc & 1) != 0 )
+ {
+ C = B; /* CounterClockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, Vec );
+ return SUCCESS;
+ }
+
+
+/* When not using the big switch statements, the interpreter uses a */
+/* call table defined later below in this source. Each opcode must */
+/* thus have a corresponding function, even trivial ones. */
+/* */
+/* They're all defined there. */
+
+#define DO_SVTCA \
+ { \
+ Short A, B; \
+ \
+ \
+ A = (Short)(CUR.opcode & 1) << 14; \
+ B = A ^ (Short)0x4000; \
+ \
+ CUR.GS.freeVector.x = A; \
+ CUR.GS.projVector.x = A; \
+ CUR.GS.dualVector.x = A; \
+ \
+ CUR.GS.freeVector.y = B; \
+ CUR.GS.projVector.y = B; \
+ CUR.GS.dualVector.y = B; \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SPVTCA \
+ { \
+ Short A, B; \
+ \
+ \
+ A = (Short)(CUR.opcode & 1) << 14; \
+ B = A ^ (Short)0x4000; \
+ \
+ CUR.GS.projVector.x = A; \
+ CUR.GS.dualVector.x = A; \
+ \
+ CUR.GS.projVector.y = B; \
+ CUR.GS.dualVector.y = B; \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVTCA \
+ { \
+ Short A, B; \
+ \
+ \
+ A = (Short)(CUR.opcode & 1) << 14; \
+ B = A ^ (Short)0x4000; \
+ \
+ CUR.GS.freeVector.x = A; \
+ CUR.GS.freeVector.y = B; \
+ \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SPVTL \
+ if ( INS_SxVTL( args[1], \
+ args[0], \
+ CUR.opcode, \
+ &CUR.GS.projVector) == SUCCESS ) \
+ { \
+ CUR.GS.dualVector = CUR.GS.projVector; \
+ COMPUTE_Funcs(); \
+ }
+
+#define DO_SFVTL \
+ if ( INS_SxVTL( (Int)(args[1]), \
+ (Int)(args[0]), \
+ CUR.opcode, \
+ &CUR.GS.freeVector) == SUCCESS ) \
+ COMPUTE_Funcs();
+
+
+#define DO_SFVTPV \
+ CUR.GS.freeVector = CUR.GS.projVector; \
+ COMPUTE_Funcs();
+
+
+#define DO_SPVFS \
+ { \
+ Short S; \
+ Long X, Y; \
+ \
+ \
+ /* Only use low 16bits, then sign extend */ \
+ S = (Short)args[1]; \
+ Y = (Long)S; \
+ S = (Short)args[0]; \
+ X = (Long)S; \
+ \
+ NORMalize( X, Y, &CUR.GS.projVector ); \
+ \
+ CUR.GS.dualVector = CUR.GS.projVector; \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_SFVFS \
+ { \
+ Short S; \
+ Long X, Y; \
+ \
+ \
+ /* Only use low 16bits, then sign extend */ \
+ S = (Short)args[1]; \
+ Y = (Long)S; \
+ S = (Short)args[0]; \
+ X = S; \
+ \
+ NORMalize( X, Y, &CUR.GS.freeVector ); \
+ COMPUTE_Funcs(); \
+ }
+
+
+#define DO_GPV \
+ args[0] = CUR.GS.projVector.x; \
+ args[1] = CUR.GS.projVector.y;
+
+
+#define DO_GFV \
+ args[0] = CUR.GS.freeVector.x; \
+ args[1] = CUR.GS.freeVector.y;
+
+
+#define DO_SRP0 \
+ CUR.GS.rp0 = (UShort)(args[0]);
+
+
+#define DO_SRP1 \
+ CUR.GS.rp1 = (UShort)(args[0]);
+
+
+#define DO_SRP2 \
+ CUR.GS.rp2 = (UShort)(args[0]);
+
+
+#define DO_RTHG \
+ CUR.GS.round_state = TT_Round_To_Half_Grid; \
+ CUR.func_round = (TRound_Function)Round_To_Half_Grid;
+
+
+#define DO_RTG \
+ CUR.GS.round_state = TT_Round_To_Grid; \
+ CUR.func_round = (TRound_Function)Round_To_Grid;
+
+
+#define DO_RTDG \
+ CUR.GS.round_state = TT_Round_To_Double_Grid; \
+ CUR.func_round = (TRound_Function)Round_To_Double_Grid;
+
+
+#define DO_RUTG \
+ CUR.GS.round_state = TT_Round_Up_To_Grid; \
+ CUR.func_round = (TRound_Function)Round_Up_To_Grid;
+
+
+#define DO_RDTG \
+ CUR.GS.round_state = TT_Round_Down_To_Grid; \
+ CUR.func_round = (TRound_Function)Round_Down_To_Grid;
+
+
+#define DO_ROFF \
+ CUR.GS.round_state = TT_Round_Off; \
+ CUR.func_round = (TRound_Function)Round_None;
+
+
+#define DO_SROUND \
+ SET_SuperRound( 0x4000L, args[0] ); \
+ CUR.GS.round_state = TT_Round_Super; \
+ CUR.func_round = (TRound_Function)Round_Super;
+
+
+#define DO_S45ROUND \
+ SET_SuperRound( 0x2D41L, args[0] ); \
+ CUR.GS.round_state = TT_Round_Super_45; \
+ CUR.func_round = (TRound_Function)Round_Super_45;
+
+
+#define DO_SLOOP \
+ if ( args[0] < 0 ) \
+ CUR.error = TT_Err_Bad_Argument; \
+ else \
+ CUR.GS.loop = args[0];
+
+
+#define DO_SMD \
+ CUR.GS.minimum_distance = args[0];
+
+
+#define DO_SCVTCI \
+ CUR.GS.control_value_cutin = (TT_F26Dot6)args[0];
+
+
+#define DO_SSWCI \
+ CUR.GS.single_width_cutin = (TT_F26Dot6)args[0];
+
+
+ /* XXX : UNDOCUMENTED! or bug in the Windows engine? */
+ /* */
+ /* It seems that the value that is read here is */
+ /* expressed in 16.16 format, rather than in */
+ /* font units.. */
+ /* */
+#define DO_SSW \
+ CUR.GS.single_width_value = (TT_F26Dot6)(args[0] >> 10);
+
+
+#define DO_FLIPON \
+ CUR.GS.auto_flip = TRUE;
+
+
+#define DO_FLIPOFF \
+ CUR.GS.auto_flip = FALSE;
+
+
+#define DO_SDB \
+ CUR.GS.delta_base = (Short)args[0];
+
+
+#define DO_SDS \
+ CUR.GS.delta_shift = (Short)args[0];
+
+
+#define DO_MD /* nothing */
+
+
+#define DO_MPPEM \
+ args[0] = CURRENT_Ppem();
+
+
+#define DO_MPS \
+ args[0] = CUR.metrics.pointSize;
+
+
+#define DO_DUP \
+ args[1] = args[0];
+
+
+#define DO_CLEAR \
+ CUR.new_top = 0;
+
+
+#define DO_SWAP \
+ { \
+ Long L; \
+ \
+ \
+ L = args[0]; \
+ args[0] = args[1]; \
+ args[1] = L; \
+ }
+
+
+#define DO_DEPTH \
+ args[0] = CUR.top;
+
+
+#define DO_CINDEX \
+ { \
+ Long L; \
+ \
+ \
+ L = args[0]; \
+ \
+ if ( L <= 0 || L > CUR.args ) \
+ CUR.error = TT_Err_Invalid_Reference; \
+ else \
+ args[0] = CUR.stack[CUR.args - L]; \
+ }
+
+
+#define DO_JROT \
+ if ( args[1] != 0 ) \
+ { \
+ CUR.IP += (Int)(args[0]); \
+ CUR.step_ins = FALSE; \
+ }
+
+
+#define DO_JMPR \
+ CUR.IP += (Int)(args[0]); \
+ CUR.step_ins = FALSE;
+
+
+#define DO_JROF \
+ if ( args[1] == 0 ) \
+ { \
+ CUR.IP += (Int)(args[0]); \
+ CUR.step_ins = FALSE; \
+ }
+
+
+#define DO_LT \
+ args[0] = (args[0] < args[1]);
+
+
+#define DO_LTEQ \
+ args[0] = (args[0] <= args[1]);
+
+
+#define DO_GT \
+ args[0] = (args[0] > args[1]);
+
+
+#define DO_GTEQ \
+ args[0] = (args[0] >= args[1]);
+
+
+#define DO_EQ \
+ args[0] = (args[0] == args[1]);
+
+
+#define DO_NEQ \
+ args[0] = (args[0] != args[1]);
+
+
+#define DO_ODD \
+ args[0] = ( (CUR_Func_round( args[0], 0 ) & 127) == 64 );
+
+
+#define DO_EVEN \
+ args[0] = ( (CUR_Func_round( args[0], 0 ) & 127) == 0 );
+
+
+#define DO_AND \
+ args[0] = ( args[0] && args[1] );
+
+
+#define DO_OR \
+ args[0] = ( args[0] || args[1] );
+
+
+#define DO_NOT \
+ args[0] = !args[0];
+
+
+#define DO_ADD \
+ args[0] += args[1];
+
+
+#define DO_SUB \
+ args[0] -= args[1];
+
+
+#define DO_DIV \
+ if ( args[1] == 0 ) \
+ CUR.error = TT_Err_Divide_By_Zero; \
+ else \
+ args[0] = TT_MulDiv( args[0], 64L, args[1] );
+
+
+#define DO_MUL \
+ args[0] = TT_MulDiv( args[0], args[1], 64L );
+
+
+#define DO_ABS \
+ args[0] = ABS( args[0] );
+
+
+#define DO_NEG \
+ args[0] = -args[0];
+
+
+#define DO_FLOOR \
+ args[0] &= -64;
+
+
+#define DO_CEILING \
+ args[0] = (args[0] + 63) & (-64);
+
+
+/* Utility macro for DO_{RS,WS} and DO_{RCVT,WCVTP,WCVTF} */
+
+#define CHECKED_INDEX( arg, lim ) \
+ ULong I = (ULong) arg; \
+ CHECK_BOUNDS( I, lim )
+
+
+#define DO_RS \
+ { \
+ CHECKED_INDEX( args[0], CUR.storeSize ); \
+ args[0] = CUR.storage[I]; \
+ }
+
+
+#define DO_WS \
+ { \
+ CHECKED_INDEX( args[0], CUR.storeSize ); \
+ CUR.storage[I] = args[1]; \
+ }
+
+
+#define DO_RCVT \
+ { \
+ CHECKED_INDEX( args[0], CUR.cvtSize ); \
+ args[0] = CUR_Func_read_cvt( I ); \
+ }
+
+
+#define DO_WCVTP \
+ { \
+ CHECKED_INDEX( args[0], CUR.cvtSize ); \
+ CUR_Func_write_cvt( I, args[1] ); \
+ }
+
+
+#define DO_WCVTF \
+ { \
+ CHECKED_INDEX( args[0], CUR.cvtSize ); \
+ CUR.cvt[I] = FUnits_To_Pixels( EXEC_ARGS args[1] ); \
+ }
+
+
+#define DO_DEBUG \
+ CUR.error = TT_Err_Debug_OpCode;
+
+
+#define DO_ROUND \
+ args[0] = CUR_Func_round( args[0], \
+ CUR.metrics.compensations[CUR.opcode-0x68] );
+
+
+#define DO_NROUND \
+ args[0] = Round_None( EXEC_ARGS \
+ args[0], \
+ CUR.metrics.compensations[CUR.opcode - 0x6C] );
+
+#define DO_MAX \
+ if ( args[1] > args[0] ) \
+ args[0] = args[1];
+
+
+#define DO_MIN \
+ if ( args[1] < args[0] ) \
+ args[0] = args[1];
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+
+#undef CHECK_BOUNDS
+#define CHECK_BOUNDS( val, limit ) \
+ if ( BOUNDS( val, limit ) ) \
+ { \
+ CUR.error = TT_Err_Invalid_Reference; \
+ return; \
+ }
+
+
+/*******************************************/
+/* SVTCA[a] : Set F and P vectors to axis */
+/* CodeRange : $00-$01 */
+/* Stack : --> */
+
+ static void Ins_SVTCA( INS_ARG )
+ {
+ DO_SVTCA
+ }
+
+
+/*******************************************/
+/* SPVTCA[a] : Set PVector to Axis */
+/* CodeRange : $02-$03 */
+/* Stack : --> */
+
+ static void Ins_SPVTCA( INS_ARG )
+ {
+ DO_SPVTCA
+ }
+
+
+/*******************************************/
+/* SFVTCA[a] : Set FVector to Axis */
+/* CodeRange : $04-$05 */
+/* Stack : --> */
+
+ static void Ins_SFVTCA( INS_ARG )
+ {
+ DO_SFVTCA
+ }
+
+/*******************************************/
+/* SPVTL[a] : Set PVector to Line */
+/* CodeRange : $06-$07 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_SPVTL( INS_ARG )
+ {
+ DO_SPVTL
+ }
+
+
+/*******************************************/
+/* SFVTL[a] : Set FVector to Line */
+/* CodeRange : $08-$09 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_SFVTL( INS_ARG )
+ {
+ DO_SFVTL
+ }
+
+
+/*******************************************/
+/* SFVTPV[] : Set FVector to PVector */
+/* CodeRange : $0E */
+/* Stack : --> */
+
+ static void Ins_SFVTPV( INS_ARG )
+ {
+ DO_SFVTPV
+ }
+
+
+/*******************************************/
+/* SPVFS[] : Set PVector From Stack */
+/* CodeRange : $0A */
+/* Stack : f2.14 f2.14 --> */
+
+ static void Ins_SPVFS( INS_ARG )
+ {
+ DO_SPVFS
+ }
+
+
+/*******************************************/
+/* SFVFS[] : Set FVector From Stack */
+/* CodeRange : $0B */
+/* Stack : f2.14 f2.14 --> */
+
+ static void Ins_SFVFS( INS_ARG )
+ {
+ DO_SFVFS
+ }
+
+
+/*******************************************/
+/* GPV[] : Get Projection Vector */
+/* CodeRange : $0C */
+/* Stack : ef2.14 --> ef2.14 */
+
+ static void Ins_GPV( INS_ARG )
+ {
+ DO_GPV
+ }
+
+
+/*******************************************/
+/* GFV[] : Get Freedom Vector */
+/* CodeRange : $0D */
+/* Stack : ef2.14 --> ef2.14 */
+
+ static void Ins_GFV( INS_ARG )
+ {
+ DO_GFV
+ }
+
+
+/*******************************************/
+/* SRP0[] : Set Reference Point 0 */
+/* CodeRange : $10 */
+/* Stack : uint32 --> */
+
+ static void Ins_SRP0( INS_ARG )
+ {
+ DO_SRP0
+ }
+
+
+/*******************************************/
+/* SRP1[] : Set Reference Point 1 */
+/* CodeRange : $11 */
+/* Stack : uint32 --> */
+
+ static void Ins_SRP1( INS_ARG )
+ {
+ DO_SRP1
+ }
+
+
+/*******************************************/
+/* SRP2[] : Set Reference Point 2 */
+/* CodeRange : $12 */
+/* Stack : uint32 --> */
+
+ static void Ins_SRP2( INS_ARG )
+ {
+ DO_SRP2
+ }
+
+
+/*******************************************/
+/* RTHG[] : Round To Half Grid */
+/* CodeRange : $19 */
+/* Stack : --> */
+
+ static void Ins_RTHG( INS_ARG )
+ {
+ DO_RTHG
+ }
+
+
+/*******************************************/
+/* RTG[] : Round To Grid */
+/* CodeRange : $18 */
+/* Stack : --> */
+
+ static void Ins_RTG( INS_ARG )
+ {
+ DO_RTG
+ }
+
+
+/*******************************************/
+/* RTDG[] : Round To Double Grid */
+/* CodeRange : $3D */
+/* Stack : --> */
+
+ static void Ins_RTDG( INS_ARG )
+ {
+ DO_RTDG
+ }
+
+
+/*******************************************/
+/* RUTG[] : Round Up To Grid */
+/* CodeRange : $7C */
+/* Stack : --> */
+
+ static void Ins_RUTG( INS_ARG )
+ {
+ DO_RUTG
+ }
+
+
+/*******************************************/
+/* RDTG[] : Round Down To Grid */
+/* CodeRange : $7D */
+/* Stack : --> */
+
+ static void Ins_RDTG( INS_ARG )
+ {
+ DO_RDTG
+ }
+
+
+/*******************************************/
+/* ROFF[] : Round OFF */
+/* CodeRange : $7A */
+/* Stack : --> */
+
+ static void Ins_ROFF( INS_ARG )
+ {
+ DO_ROFF
+ }
+
+
+/*******************************************/
+/* SROUND[] : Super ROUND */
+/* CodeRange : $76 */
+/* Stack : Eint8 --> */
+
+ static void Ins_SROUND( INS_ARG )
+ {
+ DO_SROUND
+ }
+
+
+/*******************************************/
+/* S45ROUND[]: Super ROUND 45 degrees */
+/* CodeRange : $77 */
+/* Stack : uint32 --> */
+
+ static void Ins_S45ROUND( INS_ARG )
+ {
+ DO_S45ROUND
+ }
+
+
+/*******************************************/
+/* SLOOP[] : Set LOOP variable */
+/* CodeRange : $17 */
+/* Stack : int32? --> */
+
+ static void Ins_SLOOP( INS_ARG )
+ {
+ DO_SLOOP
+ }
+
+
+/*******************************************/
+/* SMD[] : Set Minimum Distance */
+/* CodeRange : $1A */
+/* Stack : f26.6 --> */
+
+ static void Ins_SMD( INS_ARG )
+ {
+ DO_SMD
+ }
+
+
+/**********************************************/
+/* SCVTCI[] : Set Control Value Table Cut In */
+/* CodeRange : $1D */
+/* Stack : f26.6 --> */
+
+ static void Ins_SCVTCI( INS_ARG )
+ {
+ DO_SCVTCI
+ }
+
+
+/**********************************************/
+/* SSWCI[] : Set Single Width Cut In */
+/* CodeRange : $1E */
+/* Stack : f26.6 --> */
+
+ static void Ins_SSWCI( INS_ARG )
+ {
+ DO_SSWCI
+ }
+
+
+/**********************************************/
+/* SSW[] : Set Single Width */
+/* CodeRange : $1F */
+/* Stack : int32? --> */
+
+ static void Ins_SSW( INS_ARG )
+ {
+ DO_SSW
+ }
+
+
+/**********************************************/
+/* FLIPON[] : Set Auto_flip to On */
+/* CodeRange : $4D */
+/* Stack : --> */
+
+ static void Ins_FLIPON( INS_ARG )
+ {
+ DO_FLIPON
+ }
+
+
+/**********************************************/
+/* FLIPOFF[] : Set Auto_flip to Off */
+/* CodeRange : $4E */
+/* Stack : --> */
+
+ static void Ins_FLIPOFF( INS_ARG )
+ {
+ DO_FLIPOFF
+ }
+
+
+/**********************************************/
+/* SANGW[] : Set Angle Weight */
+/* CodeRange : $7E */
+/* Stack : uint32 --> */
+
+ static void Ins_SANGW( INS_ARG )
+ {
+ /* instruction not supported anymore */
+ }
+
+
+/**********************************************/
+/* SDB[] : Set Delta Base */
+/* CodeRange : $5E */
+/* Stack : uint32 --> */
+
+ static void Ins_SDB( INS_ARG )
+ {
+ DO_SDB
+ }
+
+
+/**********************************************/
+/* SDS[] : Set Delta Shift */
+/* CodeRange : $5F */
+/* Stack : uint32 --> */
+
+ static void Ins_SDS( INS_ARG )
+ {
+ DO_SDS
+ }
+
+
+/**********************************************/
+/* MPPEM[] : Measure Pixel Per EM */
+/* CodeRange : $4B */
+/* Stack : --> Euint16 */
+
+ static void Ins_MPPEM( INS_ARG )
+ {
+ DO_MPPEM
+ }
+
+
+/**********************************************/
+/* MPS[] : Measure PointSize */
+/* CodeRange : $4C */
+/* Stack : --> Euint16 */
+
+ static void Ins_MPS( INS_ARG )
+ {
+ DO_MPS
+ }
+
+/*******************************************/
+/* DUP[] : Duplicate top stack element */
+/* CodeRange : $20 */
+/* Stack : StkElt --> StkElt StkElt */
+
+ static void Ins_DUP( INS_ARG )
+ {
+ DO_DUP
+ }
+
+
+/*******************************************/
+/* POP[] : POPs the stack's top elt. */
+/* CodeRange : $21 */
+/* Stack : StkElt --> */
+
+ static void Ins_POP( INS_ARG )
+ {
+ /* nothing to do */
+ }
+
+
+/*******************************************/
+/* CLEAR[] : Clear the entire stack */
+/* CodeRange : $22 */
+/* Stack : StkElt... --> */
+
+ static void Ins_CLEAR( INS_ARG )
+ {
+ DO_CLEAR
+ }
+
+
+/*******************************************/
+/* SWAP[] : Swap the top two elements */
+/* CodeRange : $23 */
+/* Stack : 2 * StkElt --> 2 * StkElt */
+
+ static void Ins_SWAP( INS_ARG )
+ {
+ DO_SWAP
+ }
+
+
+/*******************************************/
+/* DEPTH[] : return the stack depth */
+/* CodeRange : $24 */
+/* Stack : --> uint32 */
+
+ static void Ins_DEPTH( INS_ARG )
+ {
+ DO_DEPTH
+ }
+
+
+/*******************************************/
+/* CINDEX[] : copy indexed element */
+/* CodeRange : $25 */
+/* Stack : int32 --> StkElt */
+
+ static void Ins_CINDEX( INS_ARG )
+ {
+ DO_CINDEX
+ }
+
+
+/*******************************************/
+/* EIF[] : End IF */
+/* CodeRange : $59 */
+/* Stack : --> */
+
+ static void Ins_EIF( INS_ARG )
+ {
+ /* nothing to do */
+ }
+
+
+/*******************************************/
+/* JROT[] : Jump Relative On True */
+/* CodeRange : $78 */
+/* Stack : StkElt int32 --> */
+
+ static void Ins_JROT( INS_ARG )
+ {
+ DO_JROT
+ }
+
+
+/*******************************************/
+/* JMPR[] : JuMP Relative */
+/* CodeRange : $1C */
+/* Stack : int32 --> */
+
+ static void Ins_JMPR( INS_ARG )
+ {
+ DO_JMPR
+ }
+
+
+/*******************************************/
+/* JROF[] : Jump Relative On False */
+/* CodeRange : $79 */
+/* Stack : StkElt int32 --> */
+
+ static void Ins_JROF( INS_ARG )
+ {
+ DO_JROF
+ }
+
+
+/*******************************************/
+/* LT[] : Less Than */
+/* CodeRange : $50 */
+/* Stack : int32? int32? --> bool */
+
+ static void Ins_LT( INS_ARG )
+ {
+ DO_LT
+ }
+
+
+/*******************************************/
+/* LTEQ[] : Less Than or EQual */
+/* CodeRange : $51 */
+/* Stack : int32? int32? --> bool */
+
+ static void Ins_LTEQ( INS_ARG )
+ {
+ DO_LTEQ
+ }
+
+
+/*******************************************/
+/* GT[] : Greater Than */
+/* CodeRange : $52 */
+/* Stack : int32? int32? --> bool */
+
+ static void Ins_GT( INS_ARG )
+ {
+ DO_GT
+ }
+
+
+/*******************************************/
+/* GTEQ[] : Greater Than or EQual */
+/* CodeRange : $53 */
+/* Stack : int32? int32? --> bool */
+
+ static void Ins_GTEQ( INS_ARG )
+ {
+ DO_GTEQ
+ }
+
+
+/*******************************************/
+/* EQ[] : EQual */
+/* CodeRange : $54 */
+/* Stack : StkElt StkElt --> bool */
+
+ static void Ins_EQ( INS_ARG )
+ {
+ DO_EQ
+ }
+
+
+/*******************************************/
+/* NEQ[] : Not EQual */
+/* CodeRange : $55 */
+/* Stack : StkElt StkElt --> bool */
+
+ static void Ins_NEQ( INS_ARG )
+ {
+ DO_NEQ
+ }
+
+
+/*******************************************/
+/* ODD[] : Odd */
+/* CodeRange : $56 */
+/* Stack : f26.6 --> bool */
+
+ static void Ins_ODD( INS_ARG )
+ {
+ DO_ODD
+ }
+
+
+/*******************************************/
+/* EVEN[] : Even */
+/* CodeRange : $57 */
+/* Stack : f26.6 --> bool */
+
+ static void Ins_EVEN( INS_ARG )
+ {
+ DO_EVEN
+ }
+
+
+/*******************************************/
+/* AND[] : logical AND */
+/* CodeRange : $5A */
+/* Stack : uint32 uint32 --> uint32 */
+
+ static void Ins_AND( INS_ARG )
+ {
+ DO_AND
+ }
+
+
+/*******************************************/
+/* OR[] : logical OR */
+/* CodeRange : $5B */
+/* Stack : uint32 uint32 --> uint32 */
+
+ static void Ins_OR( INS_ARG )
+ {
+ DO_OR
+ }
+
+
+/*******************************************/
+/* NOT[] : logical NOT */
+/* CodeRange : $5C */
+/* Stack : StkElt --> uint32 */
+
+ static void Ins_NOT( INS_ARG )
+ {
+ DO_NOT
+ }
+
+
+/*******************************************/
+/* ADD[] : ADD */
+/* CodeRange : $60 */
+/* Stack : f26.6 f26.6 --> f26.6 */
+
+ static void Ins_ADD( INS_ARG )
+ {
+ DO_ADD
+ }
+
+
+/*******************************************/
+/* SUB[] : SUBstract */
+/* CodeRange : $61 */
+/* Stack : f26.6 f26.6 --> f26.6 */
+
+ static void Ins_SUB( INS_ARG )
+ {
+ DO_SUB
+ }
+
+
+/*******************************************/
+/* DIV[] : DIVide */
+/* CodeRange : $62 */
+/* Stack : f26.6 f26.6 --> f26.6 */
+
+ static void Ins_DIV( INS_ARG )
+ {
+ DO_DIV
+ }
+
+
+/*******************************************/
+/* MUL[] : MULtiply */
+/* CodeRange : $63 */
+/* Stack : f26.6 f26.6 --> f26.6 */
+
+ static void Ins_MUL( INS_ARG )
+ {
+ DO_MUL
+ }
+
+
+/*******************************************/
+/* ABS[] : ABSolute value */
+/* CodeRange : $64 */
+/* Stack : f26.6 --> f26.6 */
+
+ static void Ins_ABS( INS_ARG )
+ {
+ DO_ABS
+ }
+
+
+/*******************************************/
+/* NEG[] : NEGate */
+/* CodeRange : $65 */
+/* Stack : f26.6 --> f26.6 */
+
+ static void Ins_NEG( INS_ARG )
+ {
+ DO_NEG
+ }
+
+
+/*******************************************/
+/* FLOOR[] : FLOOR */
+/* CodeRange : $66 */
+/* Stack : f26.6 --> f26.6 */
+
+ static void Ins_FLOOR( INS_ARG )
+ {
+ DO_FLOOR
+ }
+
+
+/*******************************************/
+/* CEILING[] : CEILING */
+/* CodeRange : $67 */
+/* f26.6 --> f26.6 */
+
+ static void Ins_CEILING( INS_ARG )
+ {
+ DO_CEILING
+ }
+
+/*******************************************/
+/* RS[] : Read Store */
+/* CodeRange : $43 */
+/* Stack : uint32 --> uint32 */
+
+ static void Ins_RS( INS_ARG )
+ {
+ DO_RS
+ }
+
+
+/*******************************************/
+/* WS[] : Write Store */
+/* CodeRange : $42 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_WS( INS_ARG )
+ {
+ DO_WS
+ }
+
+
+/*******************************************/
+/* WCVTP[] : Write CVT in Pixel units */
+/* CodeRange : $44 */
+/* Stack : f26.6 uint32 --> */
+
+ static void Ins_WCVTP( INS_ARG )
+ {
+ DO_WCVTP
+ }
+
+
+/*******************************************/
+/* WCVTF[] : Write CVT in FUnits */
+/* CodeRange : $70 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_WCVTF( INS_ARG )
+ {
+ DO_WCVTF
+ }
+
+
+/*******************************************/
+/* RCVT[] : Read CVT */
+/* CodeRange : $45 */
+/* Stack : uint32 --> f26.6 */
+
+ static void Ins_RCVT( INS_ARG )
+ {
+ DO_RCVT
+ }
+
+
+/********************************************/
+/* AA[] : Adjust Angle */
+/* CodeRange : $7F */
+/* Stack : uint32 --> */
+
+ static void Ins_AA( INS_ARG )
+ {
+ /* Intentional - no longer supported */
+ }
+
+
+/********************************************/
+/* DEBUG[] : DEBUG. Unsupported */
+/* CodeRange : $4F */
+/* Stack : uint32 --> */
+
+/* NOTE : The original instruction pops a value from the stack */
+
+ static void Ins_DEBUG( INS_ARG )
+ {
+ DO_DEBUG
+ }
+
+/*******************************************/
+/* ROUND[ab] : ROUND value */
+/* CodeRange : $68-$6B */
+/* Stack : f26.6 --> f26.6 */
+
+ static void Ins_ROUND( INS_ARG )
+ {
+ DO_ROUND
+ }
+
+/*******************************************/
+/* NROUND[ab]: No ROUNDing of value */
+/* CodeRange : $6C-$6F */
+/* Stack : f26.6 --> f26.6 */
+
+ static void Ins_NROUND( INS_ARG )
+ {
+ DO_NROUND
+ }
+
+
+
+/*******************************************/
+/* MAX[] : MAXimum */
+/* CodeRange : $68 */
+/* Stack : int32? int32? --> int32 */
+
+ static void Ins_MAX( INS_ARG )
+ {
+ DO_MAX
+ }
+
+
+/*******************************************/
+/* MIN[] : MINimum */
+/* CodeRange : $69 */
+/* Stack : int32? int32? --> int32 */
+
+ static void Ins_MIN( INS_ARG )
+ {
+ DO_MIN
+ }
+
+
+#endif /* !TT_CONFIG_OPTION_INTERPRETER_SWITCH */
+
+
+/* The following functions are called as is within the switch statement */
+
+/*******************************************/
+/* MINDEX[] : move indexed element */
+/* CodeRange : $26 */
+/* Stack : int32? --> StkElt */
+
+ static void Ins_MINDEX( INS_ARG )
+ {
+ Long L, K;
+
+
+ L = args[0];
+
+ if ( L <= 0 || L > CUR.args )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ K = CUR.stack[CUR.args - L];
+
+ MEM_Move( (&CUR.stack[CUR.args - L ]),
+ (&CUR.stack[CUR.args - L + 1]),
+ (L - 1) * sizeof ( Long ) );
+
+ CUR.stack[CUR.args - 1] = K;
+ }
+
+
+/*******************************************/
+/* ROLL[] : roll top three elements */
+/* CodeRange : $8A */
+/* Stack : 3 * StkElt --> 3 * StkElt */
+
+ static void Ins_ROLL( INS_ARG )
+ {
+ Long A, B, C;
+
+
+ A = args[2];
+ B = args[1];
+ C = args[0];
+
+ args[2] = C;
+ args[1] = A;
+ args[0] = B;
+ }
+
+
+
+/****************************************************************/
+/* */
+/* MANAGING THE FLOW OF CONTROL */
+/* */
+/* Instructions appear in the specs' order. */
+/* */
+/****************************************************************/
+
+ static Bool SkipCode( EXEC_OP )
+ {
+ CUR.IP += CUR.length;
+
+ if ( CUR.IP < CUR.codeSize )
+ if ( CALC_Length() == SUCCESS )
+ return SUCCESS;
+
+ CUR.error = TT_Err_Code_Overflow;
+ return FAILURE;
+ }
+
+
+/*******************************************/
+/* IF[] : IF test */
+/* CodeRange : $58 */
+/* Stack : StkElt --> */
+
+ static void Ins_IF( INS_ARG )
+ {
+ Int nIfs;
+ Bool Out;
+
+
+ if ( args[0] != 0 )
+ return;
+
+ nIfs = 1;
+ Out = 0;
+
+ do
+ {
+ if ( SKIP_Code() == FAILURE )
+ return;
+
+ switch ( CUR.opcode )
+ {
+ case 0x58: /* IF */
+ nIfs++;
+ break;
+
+ case 0x1b: /* ELSE */
+ Out = (nIfs == 1);
+ break;
+
+ case 0x59: /* EIF */
+ nIfs--;
+ Out = (nIfs == 0);
+ break;
+ }
+ } while ( Out == 0 );
+ }
+
+
+/*******************************************/
+/* ELSE[] : ELSE */
+/* CodeRange : $1B */
+/* Stack : --> */
+
+ static void Ins_ELSE( INS_ARG )
+ {
+ Int nIfs;
+
+
+ nIfs = 1;
+
+ do
+ {
+ if ( SKIP_Code() == FAILURE )
+ return;
+
+ switch ( CUR.opcode )
+ {
+ case 0x58: /* IF */
+ nIfs++;
+ break;
+
+ case 0x59: /* EIF */
+ nIfs--;
+ break;
+ }
+ } while ( nIfs != 0 );
+ }
+
+
+/****************************************************************/
+/* */
+/* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */
+/* */
+/* Instructions appear in the specs' order. */
+/* */
+/****************************************************************/
+
+/*******************************************/
+/* FDEF[] : Function DEFinition */
+/* CodeRange : $2C */
+/* Stack : uint32 --> */
+
+ static void Ins_FDEF( INS_ARG )
+ {
+ ULong n;
+ PDefRecord pRec;
+
+
+ n = args[0];
+
+ if ( BOUNDS( n, CUR.numFDefs ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ pRec = &CUR.FDefs[n];
+
+ pRec->Range = CUR.curRange;
+ pRec->Opc = (Byte)n;
+ pRec->Start = CUR.IP + 1;
+ pRec->Active = TRUE;
+
+ /* Now skip the whole function definition. */
+ /* We don't allow nested IDEFS & FDEFs. */
+
+ while ( SKIP_Code() == SUCCESS )
+ {
+ switch ( CUR.opcode )
+ {
+ case 0x89: /* IDEF */
+ case 0x2c: /* FDEF */
+ CUR.error = TT_Err_Nested_DEFS;
+ return;
+
+ case 0x2d: /* ENDF */
+ return;
+ }
+ }
+ }
+
+
+/*******************************************/
+/* ENDF[] : END Function definition */
+/* CodeRange : $2D */
+/* Stack : --> */
+
+ static void Ins_ENDF( INS_ARG )
+ {
+ PCallRecord pRec;
+
+
+ if ( CUR.callTop <= 0 ) /* We encountered an ENDF without a call */
+ {
+ CUR.error = TT_Err_ENDF_In_Exec_Stream;
+ return;
+ }
+
+ CUR.callTop--;
+
+ pRec = &CUR.callStack[CUR.callTop];
+
+ pRec->Cur_Count--;
+
+ CUR.step_ins = FALSE;
+
+ if ( pRec->Cur_Count > 0 )
+ {
+ CUR.callTop++;
+ CUR.IP = pRec->Cur_Restart;
+ }
+ else
+ /* Loop through the current function */
+ INS_Goto_CodeRange( pRec->Caller_Range,
+ pRec->Caller_IP );
+
+ /* Exit the current call frame. */
+
+ /* NOTE: When the last intruction of a program */
+ /* is a CALL or LOOPCALL, the return address */
+ /* is always out of the code range. This is */
+ /* a valid address, and it's why we do not test */
+ /* the result of Ins_Goto_CodeRange() here! */
+ }
+
+
+/*******************************************/
+/* CALL[] : CALL function */
+/* CodeRange : $2B */
+/* Stack : uint32? --> */
+
+ static void Ins_CALL( INS_ARG )
+ {
+ ULong F;
+ PCallRecord pCrec;
+
+
+ F = (ULong) args[0];
+
+ if ( BOUNDS( F, CUR.numFDefs ) || !CUR.FDefs[F].Active )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = TT_Err_Stack_Overflow;
+ return;
+ }
+
+ pCrec = &CUR.callStack[CUR.callTop];
+
+ pCrec->Caller_Range = CUR.curRange;
+ pCrec->Caller_IP = CUR.IP + 1;
+ pCrec->Cur_Count = 1;
+ pCrec->Cur_Restart = CUR.FDefs[F].Start;
+
+ CUR.callTop++;
+
+ INS_Goto_CodeRange( CUR.FDefs[F].Range,
+ CUR.FDefs[F].Start );
+
+ CUR.step_ins = FALSE;
+ }
+
+
+/*******************************************/
+/* LOOPCALL[]: LOOP and CALL function */
+/* CodeRange : $2A */
+/* Stack : uint32? Eint16? --> */
+
+ static void Ins_LOOPCALL( INS_ARG )
+ {
+ ULong F;
+ PCallRecord pTCR;
+
+
+ F = (ULong) args[1];
+
+ if ( BOUNDS( F, CUR.numFDefs ) || !CUR.FDefs[F].Active )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = TT_Err_Stack_Overflow;
+ return;
+ }
+
+ if ( args[0] > 0 )
+ {
+ pTCR = &CUR.callStack[CUR.callTop];
+
+ pTCR->Caller_Range = CUR.curRange;
+ pTCR->Caller_IP = CUR.IP + 1;
+ pTCR->Cur_Count = (Int)(args[0]);
+ pTCR->Cur_Restart = CUR.FDefs[F].Start;
+
+ CUR.callTop++;
+
+ INS_Goto_CodeRange( CUR.FDefs[F].Range,
+ CUR.FDefs[F].Start );
+
+ CUR.step_ins = FALSE;
+ }
+ }
+
+
+/*******************************************/
+/* IDEF[] : Instruction DEFinition */
+/* CodeRange : $89 */
+/* Stack : Eint8 --> */
+
+ static void Ins_IDEF( INS_ARG )
+ {
+ UShort A;
+ PDefRecord pTDR;
+
+
+ A = 0;
+
+ while ( A < CUR.numIDefs )
+ {
+ pTDR = &CUR.IDefs[A];
+
+ if ( pTDR->Active == 0 )
+ {
+ pTDR->Opc = (Byte)(args[0]);
+ pTDR->Start = CUR.IP + 1;
+ pTDR->Range = CUR.curRange;
+ pTDR->Active = TRUE;
+
+ A = CUR.numIDefs;
+
+ /* Now skip the whole function definition */
+ /* We don't allow nested IDEFs & FDEFs. */
+
+ while ( SKIP_Code() == SUCCESS )
+ {
+ switch ( CUR.opcode )
+ {
+ case 0x89: /* IDEF */
+ case 0x2c: /* FDEF */
+ CUR.error = TT_Err_Nested_DEFS;
+ return;
+ case 0x2d: /* ENDF */
+ return;
+ }
+ }
+ }
+ else
+ A++;
+ }
+ }
+
+
+
+/****************************************************************/
+/* */
+/* PUSHING DATA ONTO THE INTERPRETER STACK */
+/* */
+/* Instructions appear in the specs' order. */
+/* */
+/****************************************************************/
+
+/*******************************************/
+/* NPUSHB[] : PUSH N Bytes */
+/* CodeRange : $40 */
+/* Stack : --> uint32... */
+
+ static void Ins_NPUSHB( INS_ARG )
+ {
+ Int L, K;
+
+
+ L = (Int)CUR.code[CUR.IP + 1];
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = TT_Err_Stack_Overflow;
+ return;
+ }
+
+ for ( K = 1; K <= L; K++ )
+ args[K - 1] = CUR.code[CUR.IP + K + 1];
+
+ CUR.new_top += L;
+ }
+
+
+/*******************************************/
+/* NPUSHW[] : PUSH N Words */
+/* CodeRange : $41 */
+/* Stack : --> int32... */
+
+ static void Ins_NPUSHW( INS_ARG )
+ {
+ Int L, K;
+
+
+ L = (Int)CUR.code[CUR.IP + 1];
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = TT_Err_Stack_Overflow;
+ return;
+ }
+
+ CUR.IP += 2;
+
+ for ( K = 0; K < L; K++ )
+ args[K] = GET_ShortIns();
+
+ CUR.step_ins = FALSE;
+ CUR.new_top += L;
+ }
+
+
+/*******************************************/
+/* PUSHB[abc]: PUSH Bytes */
+/* CodeRange : $B0-$B7 */
+/* Stack : --> uint32... */
+
+ static void Ins_PUSHB( INS_ARG )
+ {
+ Int L, K;
+
+
+ L = ((Int)CUR.opcode - 0xB0 + 1);
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = TT_Err_Stack_Overflow;
+ return;
+ }
+
+ for ( K = 1; K <= L; K++ )
+ args[K - 1] = CUR.code[CUR.IP + K];
+ }
+
+
+/*******************************************/
+/* PUSHW[abc]: PUSH Words */
+/* CodeRange : $B8-$BF */
+/* Stack : --> int32... */
+
+ static void Ins_PUSHW( INS_ARG )
+ {
+ Int L, K;
+
+
+ L = CUR.opcode - 0xB8 + 1;
+
+ if ( BOUNDS( L, CUR.stackSize + 1 - CUR.top ) )
+ {
+ CUR.error = TT_Err_Stack_Overflow;
+ return;
+ }
+
+ CUR.IP++;
+
+ for ( K = 0; K < L; K++ )
+ args[K] = GET_ShortIns();
+
+ CUR.step_ins = FALSE;
+ }
+
+
+
+/****************************************************************/
+/* */
+/* MANAGING THE GRAPHICS STATE */
+/* */
+/* Instructions appear in the specs' order. */
+/* */
+/****************************************************************/
+
+/**********************************************/
+/* GC[a] : Get Coordinate projected onto */
+/* CodeRange : $46-$47 */
+/* Stack : uint32 --> f26.6 */
+
+/* BULLSHIT: Measures from the original glyph must be taken */
+/* along the dual projection vector! */
+
+ static void Ins_GC( INS_ARG )
+ {
+ ULong L;
+ TT_F26Dot6 R;
+
+
+ L = (ULong) args[0];
+
+ if ( BOUNDS( L, CUR.zp2.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( CUR.opcode & 1 )
+ R = CUR_Func_dualproj( CUR.zp2.org + L, NULL_Vector );
+ else
+ R = CUR_Func_project( CUR.zp2.cur + L, NULL_Vector );
+
+ args[0] = R;
+ }
+
+
+/**********************************************/
+/* SCFS[] : Set Coordinate From Stack */
+/* CodeRange : $48 */
+/* Stack : f26.6 uint32 --> */
+/* */
+/* Formula: */
+/* */
+/* OA := OA + ( value - OA.p )/( f.p ) * f */
+/* */
+
+ static void Ins_SCFS( INS_ARG )
+ {
+ Long K;
+ ULong L;
+
+
+ L = (ULong) args[0];
+
+ if ( BOUNDS( L, CUR.zp2.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ K = CUR_Func_project( CUR.zp2.cur+L, NULL_Vector );
+
+ CUR_Func_move( &CUR.zp2, L, args[1] - K );
+
+ /* not part of the specs, but here for safety */
+
+ if ( CUR.GS.gep2 == 0 )
+ CUR.zp2.org[L] = CUR.zp2.cur[L];
+ }
+
+
+/**********************************************/
+/* MD[a] : Measure Distance */
+/* CodeRange : $49-$4A */
+/* Stack : uint32 uint32 --> f26.6 */
+
+/* BULLSHIT: Measure taken in the original glyph must be along */
+/* the dual projection vector. */
+
+/* Second BULLSHIT: Flag attributes are inverted! */
+/* 0 => measure distance in original outline */
+/* 1 => measure distance in grid-fitted outline */
+
+/* Third one !! : zp0 - zp1, and not "zp2 - zp1" !!! */
+/* */
+
+ static void Ins_MD( INS_ARG )
+ {
+ ULong K, L;
+ TT_F26Dot6 D;
+
+
+ K = (ULong) args[1];
+ L = (ULong) args[0];
+
+ if( BOUNDS( L, CUR.zp0.n_points ) ||
+ BOUNDS( K, CUR.zp1.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( CUR.opcode & 1 )
+ D = CUR_Func_project( CUR.zp0.cur + L, CUR.zp1.cur + K );
+ else
+ D = CUR_Func_dualproj( CUR.zp0.org + L, CUR.zp1.org + K );
+
+ args[0] = D;
+ }
+
+
+/*******************************************/
+/* SDPVTL[a] : Set Dual PVector to Line */
+/* CodeRange : $86-$87 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_SDPVTL( INS_ARG )
+ {
+ Long A, B, C;
+ ULong p1, p2; /* was Int in pas type ERROR */
+
+
+ p1 = (ULong) args[1];
+ p2 = (ULong) args[0];
+
+ if ( BOUNDS( p2, CUR.zp1.n_points ) ||
+ BOUNDS( p1, CUR.zp2.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ {
+ TT_Vector* v1 = CUR.zp1.org + p2;
+ TT_Vector* v2 = CUR.zp2.org + p1;
+
+
+ A = v1->x - v2->x;
+ B = v1->y - v2->y;
+ }
+
+ if ( (CUR.opcode & 1) != 0 )
+ {
+ C = B; /* CounterClockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, &CUR.GS.dualVector );
+
+ {
+ TT_Vector* v1 = CUR.zp1.cur + p2;
+ TT_Vector* v2 = CUR.zp2.cur + p1;
+
+
+ A = v1->x - v2->x;
+ B = v1->y - v2->y;
+ }
+
+ if ( (CUR.opcode & 1) != 0 )
+ {
+ C = B; /* CounterClockwise rotation */
+ B = A;
+ A = -C;
+ }
+
+ NORMalize( A, B, &CUR.GS.projVector );
+
+ COMPUTE_Funcs();
+ }
+
+
+/*******************************************/
+/* SZP0[] : Set Zone Pointer 0 */
+/* CodeRange : $13 */
+/* Stack : uint32 --> */
+
+ static void Ins_SZP0( INS_ARG )
+ {
+ switch ( args[0] )
+ {
+ case 0:
+ CUR.zp0 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp0 = CUR.pts;
+ break;
+
+ default:
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ CUR.GS.gep0 = (UShort)(args[0]);
+ }
+
+
+/*******************************************/
+/* SZP1[] : Set Zone Pointer 1 */
+/* CodeRange : $14 */
+/* Stack : uint32 --> */
+
+ static void Ins_SZP1( INS_ARG )
+ {
+ switch ( args[0] )
+ {
+ case 0:
+ CUR.zp1 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp1 = CUR.pts;
+ break;
+
+ default:
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ CUR.GS.gep1 = (UShort)(args[0]);
+ }
+
+
+/*******************************************/
+/* SZP2[] : Set Zone Pointer 2 */
+/* CodeRange : $15 */
+/* Stack : uint32 --> */
+
+ static void Ins_SZP2( INS_ARG )
+ {
+ switch ( args[0] )
+ {
+ case 0:
+ CUR.zp2 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp2 = CUR.pts;
+ break;
+
+ default:
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ CUR.GS.gep2 = (UShort)(args[0]);
+ }
+
+
+/*******************************************/
+/* SZPS[] : Set Zone Pointers */
+/* CodeRange : $16 */
+/* Stack : uint32 --> */
+
+ static void Ins_SZPS( INS_ARG )
+ {
+ switch ( args[0] )
+ {
+ case 0:
+ CUR.zp0 = CUR.twilight;
+ break;
+
+ case 1:
+ CUR.zp0 = CUR.pts;
+ break;
+
+ default:
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ CUR.zp1 = CUR.zp0;
+ CUR.zp2 = CUR.zp0;
+
+ CUR.GS.gep0 = (UShort)(args[0]);
+ CUR.GS.gep1 = (UShort)(args[0]);
+ CUR.GS.gep2 = (UShort)(args[0]);
+ }
+
+
+/*******************************************/
+/* INSTCTRL[]: INSTruction ConTRol */
+/* CodeRange : $8e */
+/* Stack : int32 int32 --> */
+
+ static void Ins_INSTCTRL( INS_ARG )
+ {
+ Long K, L;
+
+
+ K = args[1];
+ L = args[0];
+
+ if ( K < 1 || K > 2 )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if( L != 0 )
+ L = K;
+
+ CUR.GS.instruct_control = (Byte)
+ ( CUR.GS.instruct_control & ~(Byte)K ) | (Byte) L;
+ }
+
+
+/*******************************************/
+/* SCANCTRL[]: SCAN ConTRol */
+/* CodeRange : $85 */
+/* Stack : uint32? --> */
+
+ static void Ins_SCANCTRL( INS_ARG )
+ {
+ Int A;
+
+
+ /* Get Threshold */
+ A = (Int)(args[0] & 0xFF);
+
+ if ( A == 0xFF )
+ {
+ CUR.GS.scan_control = TRUE;
+ return;
+ }
+ else if ( A == 0 )
+ {
+ CUR.GS.scan_control = FALSE;
+ return;
+ }
+
+ A *= 64;
+
+ if ( (args[0] & 0x100) != 0 && CUR.metrics.pointSize <= A )
+ CUR.GS.scan_control = TRUE;
+
+ if ( (args[0] & 0x200) != 0 && CUR.metrics.rotated )
+ CUR.GS.scan_control = TRUE;
+
+ if ( (args[0] & 0x400) != 0 && CUR.metrics.stretched )
+ CUR.GS.scan_control = TRUE;
+
+ if ( (args[0] & 0x800) != 0 && CUR.metrics.pointSize > A )
+ CUR.GS.scan_control = FALSE;
+
+ if ( (args[0] & 0x1000) != 0 && CUR.metrics.rotated )
+ CUR.GS.scan_control = FALSE;
+
+ if ( (args[0] & 0x2000) != 0 && CUR.metrics.stretched )
+ CUR.GS.scan_control = FALSE;
+}
+
+
+/*******************************************/
+/* SCANTYPE[]: SCAN TYPE */
+/* CodeRange : $8D */
+/* Stack : uint32? --> */
+
+ static void Ins_SCANTYPE( INS_ARG )
+ {
+ /* For compatibility with future enhancements, */
+ /* we must ignore new modes */
+
+ if ( args[0] >= 0 && args[0] <= 5 )
+ {
+ if ( args[0] == 3 )
+ args[0] = 2;
+
+ CUR.GS.scan_type = (Int)args[0];
+ }
+ }
+
+
+
+/****************************************************************/
+/* */
+/* MANAGING OUTLINES */
+/* */
+/* Instructions appear in the specs' order. */
+/* */
+/****************************************************************/
+
+/**********************************************/
+/* FLIPPT[] : FLIP PoinT */
+/* CodeRange : $80 */
+/* Stack : uint32... --> */
+
+ static void Ins_FLIPPT( INS_ARG )
+ {
+ UShort point;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ CUR.error = TT_Err_Too_Few_Arguments;
+ return;
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.pts.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ CUR.pts.touch[point] ^= TT_Flag_On_Curve;
+
+ CUR.GS.loop--;
+ }
+
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+/**********************************************/
+/* FLIPRGON[]: FLIP RanGe ON */
+/* CodeRange : $81 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_FLIPRGON( INS_ARG )
+ {
+ ULong I, K, L;
+
+
+ K = (ULong) args[1];
+ L = (ULong) args[0];
+
+ if ( BOUNDS( K, CUR.pts.n_points ) ||
+ BOUNDS( L, CUR.pts.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ for ( I = L; I <= K; I++ )
+ CUR.pts.touch[I] |= TT_Flag_On_Curve;
+ }
+
+
+/**********************************************/
+/* FLIPRGOFF : FLIP RanGe OFF */
+/* CodeRange : $82 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_FLIPRGOFF( INS_ARG )
+ {
+ ULong I, K, L;
+
+
+ K = (ULong) args[1];
+ L = (ULong) args[0];
+
+ if ( BOUNDS( K, CUR.pts.n_points ) ||
+ BOUNDS( L, CUR.pts.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ for ( I = L; I <= K; I++ )
+ CUR.pts.touch[I] &= ~TT_Flag_On_Curve;
+ }
+
+
+ static Bool Compute_Point_Displacement( EXEC_OPS
+ PCoordinates x,
+ PCoordinates y,
+ PGlyph_Zone zone,
+ UShort* refp )
+ {
+ TGlyph_Zone zp;
+ UShort p;
+ TT_F26Dot6 d;
+
+
+ if ( CUR.opcode & 1 )
+ {
+ zp = CUR.zp0;
+ p = CUR.GS.rp1;
+ }
+ else
+ {
+ zp = CUR.zp1;
+ p = CUR.GS.rp2;
+ }
+
+ if ( BOUNDS( p, zp.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Displacement;
+ return FAILURE;
+ }
+
+ *zone = zp;
+ *refp = p;
+
+ d = CUR_Func_project( zp.cur + p, zp.org + p );
+
+ *x = TT_MulDiv(d, (Long)CUR.GS.freeVector.x * 0x10000L, CUR.F_dot_P );
+ *y = TT_MulDiv(d, (Long)CUR.GS.freeVector.y * 0x10000L, CUR.F_dot_P );
+
+ return SUCCESS;
+ }
+
+
+ static void Move_Zp2_Point( EXEC_OPS
+ UShort point,
+ TT_F26Dot6 dx,
+ TT_F26Dot6 dy,
+ Bool touch )
+ {
+ if ( CUR.GS.freeVector.x != 0 )
+ {
+ CUR.zp2.cur[point].x += dx;
+ if ( touch )
+ CUR.zp2.touch[point] |= TT_Flag_Touched_X;
+ }
+
+ if ( CUR.GS.freeVector.y != 0 )
+ {
+ CUR.zp2.cur[point].y += dy;
+ if ( touch )
+ CUR.zp2.touch[point] |= TT_Flag_Touched_Y;
+ }
+ }
+
+
+/**********************************************/
+/* SHP[a] : SHift Point by the last point */
+/* CodeRange : $32-33 */
+/* Stack : uint32... --> */
+
+ static void Ins_SHP( INS_ARG )
+ {
+ TGlyph_Zone zp;
+ UShort refp;
+
+ TT_F26Dot6 dx,
+ dy;
+ UShort point;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+ point = (UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ /* UNDOCUMENTED! SHP touches the points */
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+ CUR.GS.loop--;
+ }
+
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+/**********************************************/
+/* SHC[a] : SHift Contour */
+/* CodeRange : $34-35 */
+/* Stack : uint32 --> */
+
+ static void Ins_SHC( INS_ARG )
+ {
+ TGlyph_Zone zp;
+ UShort refp;
+ TT_F26Dot6 dx,
+ dy;
+
+ ULong contour, i;
+ UShort first_point, last_point;
+
+
+ contour = args[0];
+
+ if ( BOUNDS( contour, CUR.pts.n_contours ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ if ( contour == 0 )
+ first_point = 0;
+ else
+ first_point = CUR.pts.contours[contour - 1] + 1;
+
+ last_point = CUR.pts.contours[contour];
+
+ /* XXX: this is probably wrong... at least it prevents memory */
+ /* corruption when zp2 is the twilight zone */
+ if ( last_point > CUR.zp2.n_points )
+ {
+ if ( CUR.zp2.n_points > 0 )
+ last_point = CUR.zp2.n_points - 1;
+ else
+ last_point = 0;
+ }
+
+ /* UNDOCUMENTED! SHC doesn't touch the points */
+ for ( i = first_point; i <= last_point; i++ )
+ {
+ if ( zp.cur != CUR.zp2.cur || refp != i )
+ MOVE_Zp2_Point( i, dx, dy, FALSE );
+ }
+ }
+
+
+/**********************************************/
+/* SHZ[a] : SHift Zone */
+/* CodeRange : $36-37 */
+/* Stack : uint32 --> */
+
+ static void Ins_SHZ( INS_ARG )
+ {
+ TGlyph_Zone zp;
+ UShort refp;
+ TT_F26Dot6 dx,
+ dy;
+
+ UShort last_point;
+ Long i;
+
+
+ if ( BOUNDS( args[0], 2 ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( COMPUTE_Point_Displacement( &dx, &dy, &zp, &refp ) )
+ return;
+
+ if ( CUR.zp2.n_points > 0 )
+ last_point = CUR.zp2.n_points - 1;
+ else
+ last_point = 0;
+
+ /* UNDOCUMENTED! SHZ doesn't touch the points */
+ for ( i = 0; i <= last_point; i++ )
+ {
+ if ( zp.cur != CUR.zp2.cur || refp != i )
+ MOVE_Zp2_Point( i, dx, dy, FALSE );
+ }
+ }
+
+
+/**********************************************/
+/* SHPIX[] : SHift points by a PIXel amount */
+/* CodeRange : $38 */
+/* Stack : f26.6 uint32... --> */
+
+ static void Ins_SHPIX( INS_ARG )
+ {
+ TT_F26Dot6 dx, dy;
+ UShort point;
+
+
+ if ( CUR.top < CUR.GS.loop + 1 )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ dx = TT_MulDiv( args[0],
+ (Long)CUR.GS.freeVector.x,
+ 0x4000 );
+ dy = TT_MulDiv( args[0],
+ (Long)CUR.GS.freeVector.y,
+ 0x4000 );
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (UShort)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ MOVE_Zp2_Point( point, dx, dy, TRUE );
+
+ CUR.GS.loop--;
+ }
+
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+/**********************************************/
+/* MSIRP[a] : Move Stack Indirect Relative */
+/* CodeRange : $3A-$3B */
+/* Stack : f26.6 uint32 --> */
+
+ static void Ins_MSIRP( INS_ARG )
+ {
+ UShort point;
+ TT_F26Dot6 distance;
+
+
+ point = (UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ /* XXX: UNDOCUMENTED! behaviour */
+ if ( CUR.GS.gep0 == 0 ) /* if in twilight zone */
+ {
+ CUR.zp1.org[point] = CUR.zp0.org[CUR.GS.rp0];
+ CUR.zp1.cur[point] = CUR.zp1.org[point];
+ }
+
+ distance = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ CUR_Func_move( &CUR.zp1, point, args[1] - distance );
+
+ CUR.GS.rp1 = CUR.GS.rp0;
+ CUR.GS.rp2 = point;
+
+ if ( (CUR.opcode & 1) != 0 )
+ CUR.GS.rp0 = point;
+ }
+
+
+/**********************************************/
+/* MDAP[a] : Move Direct Absolute Point */
+/* CodeRange : $2E-$2F */
+/* Stack : uint32 --> */
+
+ static void Ins_MDAP( INS_ARG )
+ {
+ UShort point;
+ TT_F26Dot6 cur_dist,
+ distance;
+
+
+ point = (UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ /* XXX: Is there some undocumented feature while in the */
+ /* twilight zone? ? */
+ if ( (CUR.opcode & 1) != 0 )
+ {
+ cur_dist = CUR_Func_project( CUR.zp0.cur + point, NULL_Vector );
+ distance = CUR_Func_round( cur_dist,
+ CUR.metrics.compensations[0] ) - cur_dist;
+ }
+ else
+ distance = 0;
+
+ CUR_Func_move( &CUR.zp0, point, distance );
+
+ CUR.GS.rp0 = point;
+ CUR.GS.rp1 = point;
+ }
+
+
+/**********************************************/
+/* MIAP[a] : Move Indirect Absolute Point */
+/* CodeRange : $3E-$3F */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_MIAP( INS_ARG )
+ {
+ ULong cvtEntry;
+ UShort point;
+ TT_F26Dot6 distance,
+ org_dist;
+
+
+ cvtEntry = (ULong)args[1];
+ point = (UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) ||
+ BOUNDS( cvtEntry, CUR.cvtSize ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ /* UNDOCUMENTED! */
+ /* */
+ /* The behaviour of an MIAP instruction is quite */
+ /* different when used in the twilight zone. */
+ /* */
+ /* First, no control value cutin test is performed */
+ /* as it would fail anyway. Second, the original */
+ /* point, i.e. (org_x,org_y) of zp0.point, is set */
+ /* to the absolute, unrounded distance found in */
+ /* the CVT. */
+ /* */
+ /* This is used in the CVT programs of the Microsoft */
+ /* fonts Arial, Times, etc., in order to re-adjust */
+ /* some key font heights. It allows the use of the */
+ /* IP instruction in the twilight zone, which */
+ /* otherwise would be "illegal" according to the */
+ /* specs :) */
+ /* */
+ /* We implement it with a special sequence for the */
+ /* twilight zone. This is a bad hack, but it seems */
+ /* to work. */
+
+ distance = CUR_Func_read_cvt( cvtEntry );
+
+ if ( CUR.GS.gep0 == 0 ) /* If in twilight zone */
+ {
+ CUR.zp0.org[point].x = TT_MulDiv( CUR.GS.freeVector.x,
+ distance, 0x4000L );
+ CUR.zp0.org[point].y = TT_MulDiv( CUR.GS.freeVector.y,
+ distance, 0x4000L );
+ CUR.zp0.cur[point] = CUR.zp0.org[point];
+ }
+
+ org_dist = CUR_Func_project( CUR.zp0.cur + point, NULL_Vector );
+
+ if ( (CUR.opcode & 1) != 0 ) /* rounding and control cutin flag */
+ {
+ if ( ABS(distance - org_dist) > CUR.GS.control_value_cutin )
+ distance = org_dist;
+
+ distance = CUR_Func_round( distance, CUR.metrics.compensations[0] );
+ }
+
+ CUR_Func_move( &CUR.zp0, point, distance - org_dist );
+
+ CUR.GS.rp0 = point;
+ CUR.GS.rp1 = point;
+ }
+
+
+/**********************************************/
+/* MDRP[abcde] : Move Direct Relative Point */
+/* CodeRange : $C0-$DF */
+/* Stack : uint32 --> */
+
+ static void Ins_MDRP( INS_ARG )
+ {
+ UShort point;
+ TT_F26Dot6 org_dist, distance;
+
+
+ point = (UShort)args[0];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ /* XXX: Is there some undocumented feature while in the */
+ /* twilight zone? */
+
+ org_dist = CUR_Func_dualproj( CUR.zp1.org + point,
+ CUR.zp0.org + CUR.GS.rp0 );
+
+ /* single width cutin test */
+
+ if ( ABS( org_dist ) < CUR.GS.single_width_cutin )
+ {
+ if ( org_dist >= 0 )
+ org_dist = CUR.GS.single_width_value;
+ else
+ org_dist = -CUR.GS.single_width_value;
+ }
+
+ /* round flag */
+
+ if ( (CUR.opcode & 4) != 0 )
+ distance = CUR_Func_round( org_dist,
+ CUR.metrics.compensations[CUR.opcode & 3] );
+ else
+ distance = Round_None( EXEC_ARGS
+ org_dist,
+ CUR.metrics.compensations[CUR.opcode & 3] );
+
+ /* minimum distance flag */
+
+ if ( (CUR.opcode & 8) != 0 )
+ {
+ if ( org_dist >= 0 )
+ {
+ if ( distance < CUR.GS.minimum_distance )
+ distance = CUR.GS.minimum_distance;
+ }
+ else
+ {
+ if ( distance > -CUR.GS.minimum_distance )
+ distance = -CUR.GS.minimum_distance;
+ }
+ }
+
+ /* now move the point */
+
+ org_dist = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ CUR_Func_move( &CUR.zp1, point, distance - org_dist );
+
+ CUR.GS.rp1 = CUR.GS.rp0;
+ CUR.GS.rp2 = point;
+
+ if ( (CUR.opcode & 16) != 0 )
+ CUR.GS.rp0 = point;
+ }
+
+
+/**********************************************/
+/* MIRP[abcde] : Move Indirect Relative Point */
+/* CodeRange : $E0-$FF */
+/* Stack : int32? uint32 --> */
+
+ static void Ins_MIRP( INS_ARG )
+ {
+ UShort point;
+ ULong cvtEntry;
+
+ TT_F26Dot6 cvt_dist,
+ distance,
+ cur_dist,
+ org_dist;
+
+
+ point = (UShort)args[0];
+ cvtEntry = (ULong)(args[1] + 1);
+
+ /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) ||
+ BOUNDS( cvtEntry, CUR.cvtSize + 1 ) ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ if ( !cvtEntry )
+ cvt_dist = 0;
+ else
+ cvt_dist = CUR_Func_read_cvt( cvtEntry - 1 );
+
+ /* single width test */
+
+ if ( ABS( cvt_dist ) < CUR.GS.single_width_cutin )
+ {
+ if ( cvt_dist >= 0 )
+ cvt_dist = CUR.GS.single_width_value;
+ else
+ cvt_dist = -CUR.GS.single_width_value;
+ }
+
+ /* XXX : UNDOCUMENTED! -- twilight zone */
+
+ if ( CUR.GS.gep1 == 0 )
+ {
+ CUR.zp1.org[point].x = CUR.zp0.org[CUR.GS.rp0].x +
+ TT_MulDiv( cvt_dist,
+ CUR.GS.freeVector.x,
+ 0x4000 );
+
+ CUR.zp1.org[point].y = CUR.zp0.org[CUR.GS.rp0].y +
+ TT_MulDiv( cvt_dist,
+ CUR.GS.freeVector.y,
+ 0x4000 );
+
+ CUR.zp1.cur[point] = CUR.zp1.org[point];
+ }
+
+ org_dist = CUR_Func_dualproj( CUR.zp1.org + point,
+ CUR.zp0.org + CUR.GS.rp0 );
+
+ cur_dist = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ /* auto-flip test */
+
+ if ( CUR.GS.auto_flip )
+ {
+ if ( (org_dist ^ cvt_dist) < 0 )
+ cvt_dist = -cvt_dist;
+ }
+
+ /* control value cutin and round */
+
+ if ( (CUR.opcode & 4) != 0 )
+ {
+ /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */
+ /* refer to the same zone. */
+
+ if ( CUR.GS.gep0 == CUR.GS.gep1 )
+ if ( ABS( cvt_dist - org_dist ) >= CUR.GS.control_value_cutin )
+ cvt_dist = org_dist;
+
+ distance = CUR_Func_round( cvt_dist,
+ CUR.metrics.compensations[CUR.opcode & 3] );
+ }
+ else
+ distance = Round_None( EXEC_ARGS
+ cvt_dist,
+ CUR.metrics.compensations[CUR.opcode & 3] );
+
+ /* minimum distance test */
+
+ if ( (CUR.opcode & 8) != 0 )
+ {
+ if ( org_dist >= 0 )
+ {
+ if ( distance < CUR.GS.minimum_distance )
+ distance = CUR.GS.minimum_distance;
+ }
+ else
+ {
+ if ( distance > -CUR.GS.minimum_distance )
+ distance = -CUR.GS.minimum_distance;
+ }
+ }
+
+ CUR_Func_move( &CUR.zp1, point, distance - cur_dist );
+
+ CUR.GS.rp1 = CUR.GS.rp0;
+
+ if ( (CUR.opcode & 16) != 0 )
+ CUR.GS.rp0 = point;
+
+ /* UNDOCUMENTED! */
+
+ CUR.GS.rp2 = point;
+ }
+
+
+/**********************************************/
+/* ALIGNRP[] : ALIGN Relative Point */
+/* CodeRange : $3C */
+/* Stack : uint32 uint32... --> */
+
+ static void Ins_ALIGNRP( INS_ARG )
+ {
+ ULong point;
+ TT_F26Dot6 distance;
+
+
+ if ( CUR.top < CUR.GS.loop ||
+ BOUNDS( CUR.GS.rp0, CUR.zp0.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (ULong)CUR.stack[CUR.args];
+
+ if ( BOUNDS( point, CUR.zp1.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ distance = CUR_Func_project( CUR.zp1.cur + point,
+ CUR.zp0.cur + CUR.GS.rp0 );
+
+ CUR_Func_move( &CUR.zp1, point, -distance );
+ CUR.GS.loop--;
+ }
+
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+/**********************************************/
+/* ISECT[] : moves point to InterSECTion */
+/* CodeRange : $0F */
+/* Stack : 5 * uint32 --> */
+
+ static void Ins_ISECT( INS_ARG )
+ {
+ ULong point,
+ a0, a1,
+ b0, b1;
+
+ TT_F26Dot6 discriminant;
+
+ TT_F26Dot6 dx, dy,
+ dax, day,
+ dbx, dby;
+
+ TT_F26Dot6 val;
+
+ TT_Vector R;
+
+
+ point = (ULong) args[0];
+
+ a0 = (ULong) args[1];
+ a1 = (ULong) args[2];
+ b0 = (ULong) args[3];
+ b1 = (ULong) args[4];
+
+ if ( BOUNDS( b0, CUR.zp0.n_points ) ||
+ BOUNDS( b1, CUR.zp0.n_points ) ||
+ BOUNDS( a0, CUR.zp1.n_points ) ||
+ BOUNDS( a1, CUR.zp1.n_points ) ||
+ BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ dbx = CUR.zp0.cur[b1].x - CUR.zp0.cur[b0].x;
+ dby = CUR.zp0.cur[b1].y - CUR.zp0.cur[b0].y;
+
+ dax = CUR.zp1.cur[a1].x - CUR.zp1.cur[a0].x;
+ day = CUR.zp1.cur[a1].y - CUR.zp1.cur[a0].y;
+
+ dx = CUR.zp0.cur[b0].x - CUR.zp1.cur[a0].x;
+ dy = CUR.zp0.cur[b0].y - CUR.zp1.cur[a0].y;
+
+ CUR.zp2.touch[point] |= TT_Flag_Touched_Both;
+
+ discriminant = TT_MulDiv( dax, -dby, 0x40L ) +
+ TT_MulDiv( day, dbx, 0x40L );
+
+ if ( ABS( discriminant ) >= 0x40 )
+ {
+ val = TT_MulDiv( dx, -dby, 0x40L ) + TT_MulDiv( dy, dbx, 0x40L );
+
+ R.x = TT_MulDiv( val, dax, discriminant );
+ R.y = TT_MulDiv( val, day, discriminant );
+
+ CUR.zp2.cur[point].x = CUR.zp1.cur[a0].x + R.x;
+ CUR.zp2.cur[point].y = CUR.zp1.cur[a0].y + R.y;
+ }
+ else
+ {
+ /* else, take the middle of the middles of A and B */
+
+ CUR.zp2.cur[point].x = ( CUR.zp1.cur[a0].x +
+ CUR.zp1.cur[a1].x +
+ CUR.zp0.cur[b0].x +
+ CUR.zp0.cur[b1].x ) / 4;
+ CUR.zp2.cur[point].y = ( CUR.zp1.cur[a0].y +
+ CUR.zp1.cur[a1].y +
+ CUR.zp0.cur[b0].y +
+ CUR.zp0.cur[b1].y ) / 4;
+ }
+ }
+
+
+/**********************************************/
+/* ALIGNPTS[] : ALIGN PoinTS */
+/* CodeRange : $27 */
+/* Stack : uint32 uint32 --> */
+
+ static void Ins_ALIGNPTS( INS_ARG )
+ {
+ ULong p1, p2;
+ TT_F26Dot6 distance;
+
+
+ p1 = (ULong)args[0];
+ p2 = (ULong)args[1];
+
+ if ( BOUNDS( args[0], CUR.zp1.n_points ) ||
+ BOUNDS( args[1], CUR.zp0.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ distance = CUR_Func_project( CUR.zp0.cur + p2,
+ CUR.zp1.cur + p1 ) / 2;
+
+ CUR_Func_move( &CUR.zp1, p1, distance );
+ CUR_Func_move( &CUR.zp0, p2, -distance );
+ }
+
+
+/**********************************************/
+/* IP[] : Interpolate Point */
+/* CodeRange : $39 */
+/* Stack : uint32... --> */
+
+ static void Ins_IP( INS_ARG )
+ {
+ TT_F26Dot6 org_a, org_b, org_x,
+ cur_a, cur_b, cur_x,
+ distance;
+ UShort point;
+
+
+ if ( CUR.top < CUR.GS.loop )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ /* XXX: there are some glyphs in some braindead but popular */
+ /* fonts out there (e.g. [aeu]grave in monotype.ttf) */
+ /* calling IP[] with bad values of rp[12] */
+ /* do something sane when this odd thing happens */
+
+ if ( BOUNDS( CUR.GS.rp1, CUR.zp0.n_points ) ||
+ BOUNDS( CUR.GS.rp2, CUR.zp1.n_points ) )
+ {
+ org_a = cur_a = 0;
+ org_b = cur_b = 0;
+ }
+ else
+ {
+ org_a = CUR_Func_dualproj( CUR.zp0.org + CUR.GS.rp1, NULL_Vector );
+ org_b = CUR_Func_dualproj( CUR.zp1.org + CUR.GS.rp2, NULL_Vector );
+
+ cur_a = CUR_Func_project( CUR.zp0.cur + CUR.GS.rp1, NULL_Vector );
+ cur_b = CUR_Func_project( CUR.zp1.cur + CUR.GS.rp2, NULL_Vector );
+ }
+
+ while ( CUR.GS.loop > 0 )
+ {
+ CUR.args--;
+
+ point = (UShort)CUR.stack[CUR.args];
+ if ( BOUNDS( point, CUR.zp2.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ org_x = CUR_Func_dualproj( CUR.zp2.org + point, NULL_Vector );
+ cur_x = CUR_Func_project ( CUR.zp2.cur + point, NULL_Vector );
+
+ if ( ( org_a <= org_b && org_x <= org_a ) ||
+ ( org_a > org_b && org_x >= org_a ) )
+
+ distance = ( cur_a - org_a ) + ( org_x - cur_x );
+
+ else if ( ( org_a <= org_b && org_x >= org_b ) ||
+ ( org_a > org_b && org_x < org_b ) )
+
+ distance = ( cur_b - org_b ) + ( org_x - cur_x );
+
+ else
+ /* note: it seems that rounding this value isn't a good */
+ /* idea (cf. width of capital 'S' in Times) */
+
+ distance = TT_MulDiv( cur_b - cur_a,
+ org_x - org_a,
+ org_b - org_a ) + ( cur_a - cur_x );
+
+ CUR_Func_move( &CUR.zp2, point, distance );
+
+ CUR.GS.loop--;
+ }
+
+ CUR.GS.loop = 1;
+ CUR.new_top = CUR.args;
+ }
+
+
+/**********************************************/
+/* UTP[a] : UnTouch Point */
+/* CodeRange : $29 */
+/* Stack : uint32 --> */
+
+ static void Ins_UTP( INS_ARG )
+ {
+ ULong point;
+ Byte mask;
+
+
+ point = (ULong) args[0];
+
+ if ( BOUNDS( point, CUR.zp0.n_points ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ mask = 0xFF;
+
+ if ( CUR.GS.freeVector.x != 0 )
+ mask &= ~TT_Flag_Touched_X;
+
+ if ( CUR.GS.freeVector.y != 0 )
+ mask &= ~TT_Flag_Touched_Y;
+
+ CUR.zp0.touch[point] &= mask;
+ }
+
+
+ /* Local variables for Ins_IUP: */
+ struct LOC_Ins_IUP
+ {
+ TT_Vector* orgs; /* original and current coordinate */
+ TT_Vector* curs; /* arrays */
+ };
+
+
+ static void Shift( UShort p1,
+ UShort p2,
+ UShort p,
+ struct LOC_Ins_IUP* LINK )
+ {
+ UShort i;
+ TT_F26Dot6 x;
+
+
+ x = LINK->curs[p].x - LINK->orgs[p].x;
+
+ for ( i = p1; i < p; i++ )
+ LINK->curs[i].x += x;
+
+ for ( i = p + 1; i <= p2; i++ )
+ LINK->curs[i].x += x;
+ }
+
+
+ static void Interp( UShort p1, UShort p2,
+ UShort ref1, UShort ref2,
+ struct LOC_Ins_IUP* LINK )
+ {
+ UShort i;
+ TT_F26Dot6 x, x1, x2, d1, d2;
+
+
+ if ( p1 > p2 )
+ return;
+
+ x1 = LINK->orgs[ref1].x;
+ d1 = LINK->curs[ref1].x - LINK->orgs[ref1].x;
+ x2 = LINK->orgs[ref2].x;
+ d2 = LINK->curs[ref2].x - LINK->orgs[ref2].x;
+
+ if ( x1 == x2 )
+ {
+ for ( i = p1; i <= p2; i++ )
+ {
+ x = LINK->orgs[i].x;
+
+ if ( x <= x1 )
+ x += d1;
+ else
+ x += d2;
+
+ LINK->curs[i].x = x;
+ }
+ return;
+ }
+
+ if ( x1 < x2 )
+ {
+ for ( i = p1; i <= p2; i++ )
+ {
+ x = LINK->orgs[i].x;
+
+ if ( x <= x1 )
+ x += d1;
+ else
+ {
+ if ( x >= x2 )
+ x += d2;
+ else
+ x = LINK->curs[ref1].x +
+ TT_MulDiv( x - x1,
+ LINK->curs[ref2].x - LINK->curs[ref1].x,
+ x2 - x1 );
+ }
+ LINK->curs[i].x = x;
+ }
+ return;
+ }
+
+ /* x2 < x1 */
+
+ for ( i = p1; i <= p2; i++ )
+ {
+ x = LINK->orgs[i].x;
+ if ( x <= x2 )
+ x += d2;
+ else
+ {
+ if ( x >= x1 )
+ x += d1;
+ else
+ x = LINK->curs[ref1].x +
+ TT_MulDiv( x - x1,
+ LINK->curs[ref2].x - LINK->curs[ref1].x,
+ x2 - x1 );
+ }
+ LINK->curs[i].x = x;
+ }
+ }
+
+
+/**********************************************/
+/* IUP[a] : Interpolate Untouched Points */
+/* CodeRange : $30-$31 */
+/* Stack : --> */
+
+ static void Ins_IUP( INS_ARG )
+ {
+ struct LOC_Ins_IUP V;
+ Byte mask;
+
+ UShort first_point; /* first point of contour */
+ UShort end_point; /* end point (last+1) of contour */
+
+ UShort first_touched; /* first touched point in contour */
+ UShort cur_touched; /* current touched point in contour */
+
+ UShort point; /* current point */
+ UShort contour; /* current contour */
+
+
+ if ( CUR.opcode & 1 )
+ {
+ mask = TT_Flag_Touched_X;
+ V.orgs = CUR.pts.org;
+ V.curs = CUR.pts.cur;
+ }
+ else
+ {
+ mask = TT_Flag_Touched_Y;
+ V.orgs = (TT_Vector*)( ((TT_F26Dot6*)CUR.pts.org) + 1 );
+ V.curs = (TT_Vector*)( ((TT_F26Dot6*)CUR.pts.cur) + 1 );
+ }
+
+ contour = 0;
+ point = 0;
+
+ do
+ {
+ end_point = CUR.pts.contours[contour];
+ first_point = point;
+
+ while ( point <= end_point && (CUR.pts.touch[point] & mask) == 0 )
+ point++;
+
+ if ( point <= end_point )
+ {
+ first_touched = point;
+ cur_touched = point;
+
+ point++;
+
+ while ( point <= end_point )
+ {
+ if ( (CUR.pts.touch[point] & mask) != 0 )
+ {
+ if ( point > 0 )
+ Interp( cur_touched + 1,
+ point - 1,
+ cur_touched,
+ point,
+ &V );
+ cur_touched = point;
+ }
+
+ point++;
+ }
+
+ if ( cur_touched == first_touched )
+ Shift( (Int)first_point, (Int)end_point, (Int)cur_touched, &V );
+ else
+ {
+ Interp( cur_touched + 1,
+ end_point,
+ cur_touched,
+ first_touched,
+ &V );
+
+ if ( first_touched > 0 )
+ Interp( first_point,
+ first_touched - 1,
+ cur_touched,
+ first_touched,
+ &V );
+ }
+ }
+ contour++;
+ } while ( contour < CUR.pts.n_contours );
+ }
+
+
+/**********************************************/
+/* DELTAPn[] : DELTA Exceptions P1, P2, P3 */
+/* CodeRange : $5D,$71,$72 */
+/* Stack : uint32 (2 * uint32)... --> */
+
+ static void Ins_DELTAP( INS_ARG )
+ {
+ UShort k, nump;
+ ULong A, C;
+ Long B;
+
+
+ nump = (UShort)args[0];
+
+ for ( k = 1; k <= nump; k++ )
+ {
+ if ( CUR.args < 2 )
+ {
+ CUR.error = TT_Err_Too_Few_Arguments;
+ return;
+ }
+
+ CUR.args -= 2;
+
+ A = (ULong) CUR.stack[CUR.args + 1];
+ B = CUR.stack[CUR.args];
+
+ /* XXX : because some popular fonts contain some invalid DeltaP */
+ /* instructions, we simply ignore them when the stacked */
+ /* point reference is off limit, rather than returning an */
+ /* error. As a delta instruction doesn't change a glyph */
+ /* in great ways, this shouldn't be a problem.. */
+
+ if ( !BOUNDS( A, CUR.zp0.n_points ) )
+ {
+ C = ((ULong)B & 0xF0) >> 4;
+
+ switch ( CUR.opcode )
+ {
+ case 0x5d:
+ break;
+
+ case 0x71:
+ C += 16;
+ break;
+
+ case 0x72:
+ C += 32;
+ break;
+ }
+
+ C += CUR.GS.delta_base;
+
+ if ( CURRENT_Ppem() == C )
+ {
+ B = (B & 0xF) - 8;
+ if ( B >= 0 )
+ B++;
+ B = B * 64 / (1L << CUR.GS.delta_shift);
+
+ CUR_Func_move( &CUR.zp0, A, (Int)B );
+ }
+ }
+ }
+
+ CUR.new_top = CUR.args;
+ }
+
+
+/**********************************************/
+/* DELTACn[] : DELTA Exceptions C1, C2, C3 */
+/* CodeRange : $73,$74,$75 */
+/* Stack : uint32 (2 * uint32)... --> */
+
+ static void Ins_DELTAC( INS_ARG )
+ {
+ UShort nump, k;
+ ULong A, C;
+ Long B;
+
+
+ nump = (UShort)args[0];
+
+ for ( k = 1; k <= nump; k++ )
+ {
+ if ( CUR.args < 2 )
+ {
+ CUR.error = TT_Err_Too_Few_Arguments;
+ return;
+ }
+
+ CUR.args -= 2;
+
+ A = (ULong) CUR.stack[CUR.args + 1];
+ B = CUR.stack[CUR.args];
+
+ if ( BOUNDS( A, CUR.cvtSize ) )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ return;
+ }
+
+ C = ((ULong)B & 0xF0) >> 4;
+
+ switch ( CUR.opcode )
+ {
+ case 0x73:
+ break;
+
+ case 0x74:
+ C += 16;
+ break;
+
+ case 0x75:
+ C += 32;
+ break;
+ }
+
+ C += CUR.GS.delta_base;
+
+ if ( CURRENT_Ppem() == C )
+ {
+ B = (B & 0xF) - 8;
+ if ( B >= 0 )
+ B++;
+ B = B * 64 / (1L << CUR.GS.delta_shift);
+
+ CUR_Func_move_cvt( A, B );
+ }
+ }
+
+ CUR.new_top = CUR.args;
+ }
+
+
+
+/****************************************************************/
+/* */
+/* MISC. INSTRUCTIONS */
+/* */
+/****************************************************************/
+
+
+/**********************************************/
+/* GETINFO[] : GET INFOrmation */
+/* CodeRange : $88 */
+/* Stack : uint32 --> uint32 */
+
+/* XXX According to Apple specs, bits 1 & 2 of the argument ought to be */
+/* consulted before rotated / stretched info is returned */
+
+ static void Ins_GETINFO( INS_ARG )
+ {
+ Long K;
+
+
+ K = 0;
+
+ /* We return then Windows 3.1 version number */
+ /* for the font scaler */
+ if ( (args[0] & 1) != 0 )
+ K = 3;
+
+ /* Has the glyph been rotated ? */
+ if ( CUR.metrics.rotated )
+ K |= 0x80;
+
+ /* Has the glyph been stretched ? */
+ if ( CUR.metrics.stretched )
+ K |= 0x100;
+
+ args[0] = K;
+ }
+
+
+ static void Ins_UNKNOWN( INS_ARG )
+ {
+ CUR.error = TT_Err_Invalid_Opcode;
+ }
+
+
+#ifndef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+ static TInstruction_Function Instruct_Dispatch[256] =
+ {
+ /* Opcodes are gathered in groups of 16. */
+ /* Please keep the spaces as they are. */
+
+ /* SVTCA y */ Ins_SVTCA,
+ /* SVTCA x */ Ins_SVTCA,
+ /* SPvTCA y */ Ins_SPVTCA,
+ /* SPvTCA x */ Ins_SPVTCA,
+ /* SFvTCA y */ Ins_SFVTCA,
+ /* SFvTCA x */ Ins_SFVTCA,
+ /* SPvTL // */ Ins_SPVTL,
+ /* SPvTL + */ Ins_SPVTL,
+ /* SFvTL // */ Ins_SFVTL,
+ /* SFvTL + */ Ins_SFVTL,
+ /* SPvFS */ Ins_SPVFS,
+ /* SFvFS */ Ins_SFVFS,
+ /* GPV */ Ins_GPV,
+ /* GFV */ Ins_GFV,
+ /* SFvTPv */ Ins_SFVTPV,
+ /* ISECT */ Ins_ISECT,
+
+ /* SRP0 */ Ins_SRP0,
+ /* SRP1 */ Ins_SRP1,
+ /* SRP2 */ Ins_SRP2,
+ /* SZP0 */ Ins_SZP0,
+ /* SZP1 */ Ins_SZP1,
+ /* SZP2 */ Ins_SZP2,
+ /* SZPS */ Ins_SZPS,
+ /* SLOOP */ Ins_SLOOP,
+ /* RTG */ Ins_RTG,
+ /* RTHG */ Ins_RTHG,
+ /* SMD */ Ins_SMD,
+ /* ELSE */ Ins_ELSE,
+ /* JMPR */ Ins_JMPR,
+ /* SCvTCi */ Ins_SCVTCI,
+ /* SSwCi */ Ins_SSWCI,
+ /* SSW */ Ins_SSW,
+
+ /* DUP */ Ins_DUP,
+ /* POP */ Ins_POP,
+ /* CLEAR */ Ins_CLEAR,
+ /* SWAP */ Ins_SWAP,
+ /* DEPTH */ Ins_DEPTH,
+ /* CINDEX */ Ins_CINDEX,
+ /* MINDEX */ Ins_MINDEX,
+ /* AlignPTS */ Ins_ALIGNPTS,
+ /* INS_$28 */ Ins_UNKNOWN,
+ /* UTP */ Ins_UTP,
+ /* LOOPCALL */ Ins_LOOPCALL,
+ /* CALL */ Ins_CALL,
+ /* FDEF */ Ins_FDEF,
+ /* ENDF */ Ins_ENDF,
+ /* MDAP[0] */ Ins_MDAP,
+ /* MDAP[1] */ Ins_MDAP,
+
+ /* IUP[0] */ Ins_IUP,
+ /* IUP[1] */ Ins_IUP,
+ /* SHP[0] */ Ins_SHP,
+ /* SHP[1] */ Ins_SHP,
+ /* SHC[0] */ Ins_SHC,
+ /* SHC[1] */ Ins_SHC,
+ /* SHZ[0] */ Ins_SHZ,
+ /* SHZ[1] */ Ins_SHZ,
+ /* SHPIX */ Ins_SHPIX,
+ /* IP */ Ins_IP,
+ /* MSIRP[0] */ Ins_MSIRP,
+ /* MSIRP[1] */ Ins_MSIRP,
+ /* AlignRP */ Ins_ALIGNRP,
+ /* RTDG */ Ins_RTDG,
+ /* MIAP[0] */ Ins_MIAP,
+ /* MIAP[1] */ Ins_MIAP,
+
+ /* NPushB */ Ins_NPUSHB,
+ /* NPushW */ Ins_NPUSHW,
+ /* WS */ Ins_WS,
+ /* RS */ Ins_RS,
+ /* WCvtP */ Ins_WCVTP,
+ /* RCvt */ Ins_RCVT,
+ /* GC[0] */ Ins_GC,
+ /* GC[1] */ Ins_GC,
+ /* SCFS */ Ins_SCFS,
+ /* MD[0] */ Ins_MD,
+ /* MD[1] */ Ins_MD,
+ /* MPPEM */ Ins_MPPEM,
+ /* MPS */ Ins_MPS,
+ /* FlipON */ Ins_FLIPON,
+ /* FlipOFF */ Ins_FLIPOFF,
+ /* DEBUG */ Ins_DEBUG,
+
+ /* LT */ Ins_LT,
+ /* LTEQ */ Ins_LTEQ,
+ /* GT */ Ins_GT,
+ /* GTEQ */ Ins_GTEQ,
+ /* EQ */ Ins_EQ,
+ /* NEQ */ Ins_NEQ,
+ /* ODD */ Ins_ODD,
+ /* EVEN */ Ins_EVEN,
+ /* IF */ Ins_IF,
+ /* EIF */ Ins_EIF,
+ /* AND */ Ins_AND,
+ /* OR */ Ins_OR,
+ /* NOT */ Ins_NOT,
+ /* DeltaP1 */ Ins_DELTAP,
+ /* SDB */ Ins_SDB,
+ /* SDS */ Ins_SDS,
+
+ /* ADD */ Ins_ADD,
+ /* SUB */ Ins_SUB,
+ /* DIV */ Ins_DIV,
+ /* MUL */ Ins_MUL,
+ /* ABS */ Ins_ABS,
+ /* NEG */ Ins_NEG,
+ /* FLOOR */ Ins_FLOOR,
+ /* CEILING */ Ins_CEILING,
+ /* ROUND[0] */ Ins_ROUND,
+ /* ROUND[1] */ Ins_ROUND,
+ /* ROUND[2] */ Ins_ROUND,
+ /* ROUND[3] */ Ins_ROUND,
+ /* NROUND[0] */ Ins_NROUND,
+ /* NROUND[1] */ Ins_NROUND,
+ /* NROUND[2] */ Ins_NROUND,
+ /* NROUND[3] */ Ins_NROUND,
+
+ /* WCvtF */ Ins_WCVTF,
+ /* DeltaP2 */ Ins_DELTAP,
+ /* DeltaP3 */ Ins_DELTAP,
+ /* DeltaCn[0] */ Ins_DELTAC,
+ /* DeltaCn[1] */ Ins_DELTAC,
+ /* DeltaCn[2] */ Ins_DELTAC,
+ /* SROUND */ Ins_SROUND,
+ /* S45Round */ Ins_S45ROUND,
+ /* JROT */ Ins_JROT,
+ /* JROF */ Ins_JROF,
+ /* ROFF */ Ins_ROFF,
+ /* INS_$7B */ Ins_UNKNOWN,
+ /* RUTG */ Ins_RUTG,
+ /* RDTG */ Ins_RDTG,
+ /* SANGW */ Ins_SANGW,
+ /* AA */ Ins_AA,
+
+ /* FlipPT */ Ins_FLIPPT,
+ /* FlipRgON */ Ins_FLIPRGON,
+ /* FlipRgOFF */ Ins_FLIPRGOFF,
+ /* INS_$83 */ Ins_UNKNOWN,
+ /* INS_$84 */ Ins_UNKNOWN,
+ /* ScanCTRL */ Ins_SCANCTRL,
+ /* SDPVTL[0] */ Ins_SDPVTL,
+ /* SDPVTL[1] */ Ins_SDPVTL,
+ /* GetINFO */ Ins_GETINFO,
+ /* IDEF */ Ins_IDEF,
+ /* ROLL */ Ins_ROLL,
+ /* MAX */ Ins_MAX,
+ /* MIN */ Ins_MIN,
+ /* ScanTYPE */ Ins_SCANTYPE,
+ /* InstCTRL */ Ins_INSTCTRL,
+ /* INS_$8F */ Ins_UNKNOWN,
+
+ /* INS_$90 */ Ins_UNKNOWN,
+ /* INS_$91 */ Ins_UNKNOWN,
+ /* INS_$92 */ Ins_UNKNOWN,
+ /* INS_$93 */ Ins_UNKNOWN,
+ /* INS_$94 */ Ins_UNKNOWN,
+ /* INS_$95 */ Ins_UNKNOWN,
+ /* INS_$96 */ Ins_UNKNOWN,
+ /* INS_$97 */ Ins_UNKNOWN,
+ /* INS_$98 */ Ins_UNKNOWN,
+ /* INS_$99 */ Ins_UNKNOWN,
+ /* INS_$9A */ Ins_UNKNOWN,
+ /* INS_$9B */ Ins_UNKNOWN,
+ /* INS_$9C */ Ins_UNKNOWN,
+ /* INS_$9D */ Ins_UNKNOWN,
+ /* INS_$9E */ Ins_UNKNOWN,
+ /* INS_$9F */ Ins_UNKNOWN,
+
+ /* INS_$A0 */ Ins_UNKNOWN,
+ /* INS_$A1 */ Ins_UNKNOWN,
+ /* INS_$A2 */ Ins_UNKNOWN,
+ /* INS_$A3 */ Ins_UNKNOWN,
+ /* INS_$A4 */ Ins_UNKNOWN,
+ /* INS_$A5 */ Ins_UNKNOWN,
+ /* INS_$A6 */ Ins_UNKNOWN,
+ /* INS_$A7 */ Ins_UNKNOWN,
+ /* INS_$A8 */ Ins_UNKNOWN,
+ /* INS_$A9 */ Ins_UNKNOWN,
+ /* INS_$AA */ Ins_UNKNOWN,
+ /* INS_$AB */ Ins_UNKNOWN,
+ /* INS_$AC */ Ins_UNKNOWN,
+ /* INS_$AD */ Ins_UNKNOWN,
+ /* INS_$AE */ Ins_UNKNOWN,
+ /* INS_$AF */ Ins_UNKNOWN,
+
+ /* PushB[0] */ Ins_PUSHB,
+ /* PushB[1] */ Ins_PUSHB,
+ /* PushB[2] */ Ins_PUSHB,
+ /* PushB[3] */ Ins_PUSHB,
+ /* PushB[4] */ Ins_PUSHB,
+ /* PushB[5] */ Ins_PUSHB,
+ /* PushB[6] */ Ins_PUSHB,
+ /* PushB[7] */ Ins_PUSHB,
+ /* PushW[0] */ Ins_PUSHW,
+ /* PushW[1] */ Ins_PUSHW,
+ /* PushW[2] */ Ins_PUSHW,
+ /* PushW[3] */ Ins_PUSHW,
+ /* PushW[4] */ Ins_PUSHW,
+ /* PushW[5] */ Ins_PUSHW,
+ /* PushW[6] */ Ins_PUSHW,
+ /* PushW[7] */ Ins_PUSHW,
+
+ /* MDRP[00] */ Ins_MDRP,
+ /* MDRP[01] */ Ins_MDRP,
+ /* MDRP[02] */ Ins_MDRP,
+ /* MDRP[03] */ Ins_MDRP,
+ /* MDRP[04] */ Ins_MDRP,
+ /* MDRP[05] */ Ins_MDRP,
+ /* MDRP[06] */ Ins_MDRP,
+ /* MDRP[07] */ Ins_MDRP,
+ /* MDRP[08] */ Ins_MDRP,
+ /* MDRP[09] */ Ins_MDRP,
+ /* MDRP[10] */ Ins_MDRP,
+ /* MDRP[11] */ Ins_MDRP,
+ /* MDRP[12] */ Ins_MDRP,
+ /* MDRP[13] */ Ins_MDRP,
+ /* MDRP[14] */ Ins_MDRP,
+ /* MDRP[15] */ Ins_MDRP,
+
+ /* MDRP[16] */ Ins_MDRP,
+ /* MDRP[17] */ Ins_MDRP,
+ /* MDRP[18] */ Ins_MDRP,
+ /* MDRP[19] */ Ins_MDRP,
+ /* MDRP[20] */ Ins_MDRP,
+ /* MDRP[21] */ Ins_MDRP,
+ /* MDRP[22] */ Ins_MDRP,
+ /* MDRP[23] */ Ins_MDRP,
+ /* MDRP[24] */ Ins_MDRP,
+ /* MDRP[25] */ Ins_MDRP,
+ /* MDRP[26] */ Ins_MDRP,
+ /* MDRP[27] */ Ins_MDRP,
+ /* MDRP[28] */ Ins_MDRP,
+ /* MDRP[29] */ Ins_MDRP,
+ /* MDRP[30] */ Ins_MDRP,
+ /* MDRP[31] */ Ins_MDRP,
+
+ /* MIRP[00] */ Ins_MIRP,
+ /* MIRP[01] */ Ins_MIRP,
+ /* MIRP[02] */ Ins_MIRP,
+ /* MIRP[03] */ Ins_MIRP,
+ /* MIRP[04] */ Ins_MIRP,
+ /* MIRP[05] */ Ins_MIRP,
+ /* MIRP[06] */ Ins_MIRP,
+ /* MIRP[07] */ Ins_MIRP,
+ /* MIRP[08] */ Ins_MIRP,
+ /* MIRP[09] */ Ins_MIRP,
+ /* MIRP[10] */ Ins_MIRP,
+ /* MIRP[11] */ Ins_MIRP,
+ /* MIRP[12] */ Ins_MIRP,
+ /* MIRP[13] */ Ins_MIRP,
+ /* MIRP[14] */ Ins_MIRP,
+ /* MIRP[15] */ Ins_MIRP,
+
+ /* MIRP[16] */ Ins_MIRP,
+ /* MIRP[17] */ Ins_MIRP,
+ /* MIRP[18] */ Ins_MIRP,
+ /* MIRP[19] */ Ins_MIRP,
+ /* MIRP[20] */ Ins_MIRP,
+ /* MIRP[21] */ Ins_MIRP,
+ /* MIRP[22] */ Ins_MIRP,
+ /* MIRP[23] */ Ins_MIRP,
+ /* MIRP[24] */ Ins_MIRP,
+ /* MIRP[25] */ Ins_MIRP,
+ /* MIRP[26] */ Ins_MIRP,
+ /* MIRP[27] */ Ins_MIRP,
+ /* MIRP[28] */ Ins_MIRP,
+ /* MIRP[29] */ Ins_MIRP,
+ /* MIRP[30] */ Ins_MIRP,
+ /* MIRP[31] */ Ins_MIRP
+ };
+#endif
+
+
+/****************************************************************/
+/* */
+/* RUN */
+/* */
+/* This function executes a run of opcodes. It will exit */
+/* in the following cases: */
+/* */
+/* - Errors (in which case it returns FALSE) */
+/* */
+/* - Reaching the end of the main code range (returns TRUE). */
+/* Reaching the end of a code range within a function */
+/* call is an error. */
+/* */
+/* - After executing one single opcode, if the flag */
+/* 'Instruction_Trap' is set to TRUE (returns TRUE). */
+/* */
+/* On exit whith TRUE, test IP < CodeSize to know wether it */
+/* comes from a instruction trap or a normal termination. */
+/* */
+/* */
+/* Note: The documented DEBUG opcode pops a value from */
+/* the stack. This behaviour is unsupported, here */
+/* a DEBUG opcode is always an error. */
+/* */
+/* */
+/* THIS IS THE INTERPRETER'S MAIN LOOP */
+/* */
+/* Instructions appear in the specs' order. */
+/* */
+/****************************************************************/
+
+ LOCAL_DEF
+#ifndef DEBUG_INTERPRETER
+ TT_Error RunIns( PExecution_Context exc )
+#else
+ TT_Error RunIns2( PExecution_Context exc )
+#endif
+ {
+ UShort A;
+ PDefRecord WITH;
+ PCallRecord WITH1;
+
+ Long ins_counter = 0; /* executed instructions counter */
+
+ /* set CVT functions */
+ CUR.metrics.ratio = 0;
+ if ( CUR.metrics.x_ppem != CUR.metrics.y_ppem )
+ {
+ /* non-square pixels, use the stretched routines */
+ CUR.func_read_cvt = Read_CVT_Stretched;
+ CUR.func_write_cvt = Write_CVT_Stretched;
+ CUR.func_move_cvt = Move_CVT_Stretched;
+ }
+ else
+ {
+ /* square pixels, use normal routines */
+ CUR.func_read_cvt = Read_CVT;
+ CUR.func_write_cvt = Write_CVT;
+ CUR.func_move_cvt = Move_CVT;
+ }
+
+ COMPUTE_Funcs();
+ Compute_Round( EXEC_ARGS (Byte)exc->GS.round_state );
+
+ do
+ {
+ if ( CALC_Length() != SUCCESS )
+ {
+ CUR.error = TT_Err_Code_Overflow;
+ goto LErrorLabel_;
+ }
+
+ /* First, let's check for empty stack and overflow */
+
+ CUR.args = CUR.top - (Pop_Push_Count[CUR.opcode] >> 4);
+
+ /* `args' is the top of the stack once arguments have been popped. */
+ /* One can also interpret it as the index of the last argument. */
+
+ if ( CUR.args < 0 )
+ {
+ CUR.error = TT_Err_Too_Few_Arguments;
+ goto LErrorLabel_;
+ }
+
+ CUR.new_top = CUR.args + (Pop_Push_Count[CUR.opcode] & 15);
+
+ /* `new_top' is the new top of the stack, after the instruction's */
+ /* execution. `top' will be set to `new_top' after the 'switch' */
+ /* statement. */
+
+ if ( CUR.new_top > CUR.stackSize )
+ {
+ CUR.error = TT_Err_Stack_Overflow;
+ goto LErrorLabel_;
+ }
+
+ CUR.step_ins = TRUE;
+ CUR.error = TT_Err_Ok;
+
+#ifdef TT_CONFIG_OPTION_INTERPRETER_SWITCH
+ {
+ PStorage args = CUR.stack + CUR.args;
+ Byte opcode = CUR.opcode;
+
+#undef CHECK_BOUNDS
+#define CHECK_BOUNDS( a, b ) if ( BOUNDS( a, b ) ) goto Set_Invalid_Ref;
+
+ switch (opcode)
+ {
+ case 0x00: /* SVTCA y */
+ case 0x01: /* SVTCA x */
+ case 0x02: /* SPvTCA y */
+ case 0x03: /* SPvTCA x */
+ case 0x04: /* SFvTCA y */
+ case 0x05: /* SFvTCA x */
+ {
+ Short A, B;
+
+
+ A = (Short)(opcode & 1) << 14;
+ B = A ^ (Short)0x4000;
+
+ if ( opcode < 4 )
+ {
+ CUR.GS.projVector.x = A;
+ CUR.GS.projVector.y = B;
+
+ CUR.GS.dualVector.x = A;
+ CUR.GS.dualVector.y = B;
+ }
+
+ if ( (opcode & 2) == 0 )
+ {
+ CUR.GS.freeVector.x = A;
+ CUR.GS.freeVector.y = B;
+ }
+
+ COMPUTE_Funcs();
+ }
+ break;
+
+ case 0x06: /* SPvTL // */
+ case 0x07: /* SPvTL + */
+ DO_SPVTL
+ break;
+
+ case 0x08: /* SFvTL // */
+ case 0x09: /* SFvTL + */
+ DO_SFVTL
+ break;
+
+ case 0x0A: /* SPvFS */
+ DO_SPVFS
+ break;
+
+ case 0x0B: /* SFvFS */
+ DO_SFVFS
+ break;
+
+
+ case 0x0C: /* GPV */
+ DO_GPV
+ break;
+
+ case 0x0D: /* GFV */
+ DO_GFV
+ break;
+
+ case 0x0E: /* SFvTPv */
+ DO_SFVTPV
+ break;
+
+ case 0x0F: /* ISECT */
+ Ins_ISECT( EXEC_ARGS args );
+ break;
+
+ case 0x10: /* SRP0 */
+ DO_SRP0
+ break;
+
+ case 0x11: /* SRP1 */
+ DO_SRP1
+ break;
+
+ case 0x12: /* SRP2 */
+ DO_SRP2
+ break;
+
+ case 0x13: /* SZP0 */
+ Ins_SZP0( EXEC_ARGS args );
+ break;
+
+ case 0x14: /* SZP1 */
+ Ins_SZP1( EXEC_ARGS args );
+ break;
+
+ case 0x15: /* SZP2 */
+ Ins_SZP2( EXEC_ARGS args );
+ break;
+
+ case 0x16: /* SZPS */
+ Ins_SZPS( EXEC_ARGS args );
+ break;
+
+ case 0x17: /* SLOOP */
+ DO_SLOOP
+ break;
+
+ case 0x18: /* RTG */
+ DO_RTG
+ break;
+
+ case 0x19: /* RTHG */
+ DO_RTHG
+ break;
+
+ case 0x1A: /* SMD */
+ DO_SMD
+ break;
+
+ case 0x1B: /* ELSE */
+ Ins_ELSE( EXEC_ARGS args );
+ break;
+
+ case 0x1C: /* JMPR */
+ DO_JMPR
+ break;
+
+ case 0x1D: /* SCVTCI */
+ DO_SCVTCI
+ break;
+
+ case 0x1E: /* SSWCI */
+ DO_SSWCI
+ break;
+
+ case 0x1F: /* SSW */
+ DO_SSW
+ break;
+
+ case 0x20: /* DUP */
+ DO_DUP
+ break;
+
+ case 0x21: /* POP */
+ /* nothing :-) !! */
+ break;
+
+ case 0x22: /* CLEAR */
+ DO_CLEAR
+ break;
+
+ case 0x23: /* SWAP */
+ DO_SWAP
+ break;
+
+ case 0x24: /* DEPTH */
+ DO_DEPTH
+ break;
+
+ case 0x25: /* CINDEX */
+ DO_CINDEX
+ break;
+
+ case 0x26: /* MINDEX */
+ Ins_MINDEX( EXEC_ARGS args );
+ break;
+
+ case 0x27: /* ALIGNPTS */
+ Ins_ALIGNPTS( EXEC_ARGS args );
+ break;
+
+ case 0x28: /* ???? */
+ Ins_UNKNOWN( EXEC_ARGS args );
+ break;
+
+ case 0x29: /* UTP */
+ Ins_UTP( EXEC_ARGS args );
+ break;
+
+ case 0x2A: /* LOOPCALL */
+ Ins_LOOPCALL( EXEC_ARGS args );
+ break;
+
+ case 0x2B: /* CALL */
+ Ins_CALL( EXEC_ARGS args );
+ break;
+
+ case 0x2C: /* FDEF */
+ Ins_FDEF( EXEC_ARGS args );
+ break;
+
+ case 0x2D: /* ENDF */
+ Ins_ENDF( EXEC_ARGS args );
+ break;
+
+ case 0x2E: /* MDAP */
+ case 0x2F: /* MDAP */
+ Ins_MDAP( EXEC_ARGS args );
+ break;
+
+
+ case 0x30: /* IUP */
+ case 0x31: /* IUP */
+ Ins_IUP( EXEC_ARGS args );
+ break;
+
+ case 0x32: /* SHP */
+ case 0x33: /* SHP */
+ Ins_SHP( EXEC_ARGS args );
+ break;
+
+ case 0x34: /* SHC */
+ case 0x35: /* SHC */
+ Ins_SHC( EXEC_ARGS args );
+ break;
+
+ case 0x36: /* SHZ */
+ case 0x37: /* SHZ */
+ Ins_SHZ( EXEC_ARGS args );
+ break;
+
+ case 0x38: /* SHPIX */
+ Ins_SHPIX( EXEC_ARGS args );
+ break;
+
+ case 0x39: /* IP */
+ Ins_IP( EXEC_ARGS args );
+ break;
+
+ case 0x3A: /* MSIRP */
+ case 0x3B: /* MSIRP */
+ Ins_MSIRP( EXEC_ARGS args );
+ break;
+
+ case 0x3C: /* AlignRP */
+ Ins_ALIGNRP( EXEC_ARGS args );
+ break;
+
+ case 0x3D: /* RTDG */
+ DO_RTDG
+ break;
+
+ case 0x3E: /* MIAP */
+ case 0x3F: /* MIAP */
+ Ins_MIAP( EXEC_ARGS args );
+ break;
+
+ case 0x40: /* NPUSHB */
+ Ins_NPUSHB( EXEC_ARGS args );
+ break;
+
+ case 0x41: /* NPUSHW */
+ Ins_NPUSHW( EXEC_ARGS args );
+ break;
+
+ case 0x42: /* WS */
+ DO_WS
+ break;
+
+ Set_Invalid_Ref:
+ CUR.error = TT_Err_Invalid_Reference;
+ break;
+
+ case 0x43: /* RS */
+ DO_RS
+ break;
+
+ case 0x44: /* WCVTP */
+ DO_WCVTP
+ break;
+
+ case 0x45: /* RCVT */
+ DO_RCVT
+ break;
+
+ case 0x46: /* GC */
+ case 0x47: /* GC */
+ Ins_GC( EXEC_ARGS args );
+ break;
+
+ case 0x48: /* SCFS */
+ Ins_SCFS( EXEC_ARGS args );
+ break;
+
+ case 0x49: /* MD */
+ case 0x4A: /* MD */
+ Ins_MD( EXEC_ARGS args );
+ break;
+
+ case 0x4B: /* MPPEM */
+ DO_MPPEM
+ break;
+
+ case 0x4C: /* MPS */
+ DO_MPS
+ break;
+
+ case 0x4D: /* FLIPON */
+ DO_FLIPON
+ break;
+
+ case 0x4E: /* FLIPOFF */
+ DO_FLIPOFF
+ break;
+
+ case 0x4F: /* DEBUG */
+ DO_DEBUG
+ break;
+
+ case 0x50: /* LT */
+ DO_LT
+ break;
+
+ case 0x51: /* LTEQ */
+ DO_LTEQ
+ break;
+
+ case 0x52: /* GT */
+ DO_GT
+ break;
+
+ case 0x53: /* GTEQ */
+ DO_GTEQ
+ break;
+
+ case 0x54: /* EQ */
+ DO_EQ
+ break;
+
+ case 0x55: /* NEQ */
+ DO_NEQ
+ break;
+
+ case 0x56: /* ODD */
+ DO_ODD
+ break;
+
+ case 0x57: /* EVEN */
+ DO_EVEN
+ break;
+
+ case 0x58: /* IF */
+ Ins_IF( EXEC_ARGS args );
+ break;
+
+ case 0x59: /* EIF */
+ /* do nothing */
+ break;
+
+ case 0x5A: /* AND */
+ DO_AND
+ break;
+
+ case 0x5B: /* OR */
+ DO_OR
+ break;
+
+ case 0x5C: /* NOT */
+ DO_NOT
+ break;
+
+ case 0x5D: /* DELTAP1 */
+ Ins_DELTAP( EXEC_ARGS args );
+ break;
+
+ case 0x5E: /* SDB */
+ DO_SDB
+ break;
+
+ case 0x5F: /* SDS */
+ DO_SDS
+ break;
+
+ case 0x60: /* ADD */
+ DO_ADD
+ break;
+
+ case 0x61: /* SUB */
+ DO_SUB
+ break;
+
+ case 0x62: /* DIV */
+ DO_DIV
+ break;
+
+ case 0x63: /* MUL */
+ DO_MUL
+ break;
+
+ case 0x64: /* ABS */
+ DO_ABS
+ break;
+
+ case 0x65: /* NEG */
+ DO_NEG
+ break;
+
+ case 0x66: /* FLOOR */
+ DO_FLOOR
+ break;
+
+ case 0x67: /* CEILING */
+ DO_CEILING
+ break;
+
+ case 0x68: /* ROUND */
+ case 0x69: /* ROUND */
+ case 0x6A: /* ROUND */
+ case 0x6B: /* ROUND */
+ DO_ROUND
+ break;
+
+ case 0x6C: /* NROUND */
+ case 0x6D: /* NROUND */
+ case 0x6E: /* NRRUND */
+ case 0x6F: /* NROUND */
+ DO_NROUND
+ break;
+
+ case 0x70: /* WCVTF */
+ DO_WCVTF
+ break;
+
+ case 0x71: /* DELTAP2 */
+ case 0x72: /* DELTAP3 */
+ Ins_DELTAP( EXEC_ARGS args );
+ break;
+
+ case 0x73: /* DELTAC0 */
+ case 0x74: /* DELTAC1 */
+ case 0x75: /* DELTAC2 */
+ Ins_DELTAC( EXEC_ARGS args );
+ break;
+
+ case 0x76: /* SROUND */
+ DO_SROUND
+ break;
+
+ case 0x77: /* S45Round */
+ DO_S45ROUND
+ break;
+
+ case 0x78: /* JROT */
+ DO_JROT
+ break;
+
+ case 0x79: /* JROF */
+ DO_JROF
+ break;
+
+ case 0x7A: /* ROFF */
+ DO_ROFF
+ break;
+
+ case 0x7B: /* ???? */
+ Ins_UNKNOWN( EXEC_ARGS args );
+ break;
+
+ case 0x7C: /* RUTG */
+ DO_RUTG
+ break;
+
+ case 0x7D: /* RDTG */
+ DO_RDTG
+ break;
+
+ case 0x7E: /* SANGW */
+ case 0x7F: /* AA */
+ /* nothing - obsolete */
+ break;
+
+ case 0x80: /* FLIPPT */
+ Ins_FLIPPT( EXEC_ARGS args );
+ break;
+
+ case 0x81: /* FLIPRGON */
+ Ins_FLIPRGON( EXEC_ARGS args );
+ break;
+
+ case 0x82: /* FLIPRGOFF */
+ Ins_FLIPRGOFF( EXEC_ARGS args );
+ break;
+
+ case 0x83: /* UNKNOWN */
+ case 0x84: /* UNKNOWN */
+ Ins_UNKNOWN( EXEC_ARGS args );
+ break;
+
+ case 0x85: /* SCANCTRL */
+ Ins_SCANCTRL( EXEC_ARGS args );
+ break;
+
+ case 0x86: /* SDPVTL */
+ case 0x87: /* SDPVTL */
+ Ins_SDPVTL( EXEC_ARGS args );
+ break;
+
+ case 0x88: /* GETINFO */
+ Ins_GETINFO( EXEC_ARGS args );
+ break;
+
+ case 0x89: /* IDEF */
+ Ins_IDEF( EXEC_ARGS args );
+ break;
+
+ case 0x8A: /* ROLL */
+ Ins_ROLL( EXEC_ARGS args );
+ break;
+
+ case 0x8B: /* MAX */
+ DO_MAX
+ break;
+
+ case 0x8C: /* MIN */
+ DO_MIN
+ break;
+
+ case 0x8D: /* SCANTYPE */
+ Ins_SCANTYPE( EXEC_ARGS args );
+ break;
+
+ case 0x8E: /* INSTCTRL */
+ Ins_INSTCTRL( EXEC_ARGS args );
+ break;
+
+ case 0x8F:
+ Ins_UNKNOWN( EXEC_ARGS args );
+ break;
+
+ default:
+ if ( opcode >= 0xE0 )
+ Ins_MIRP( EXEC_ARGS args );
+ else if ( opcode >= 0xC0 )
+ Ins_MDRP( EXEC_ARGS args );
+ else if ( opcode >= 0xB8 )
+ Ins_PUSHW( EXEC_ARGS args );
+ else if ( opcode >= 0xB0 )
+ Ins_PUSHB( EXEC_ARGS args );
+ else
+ Ins_UNKNOWN( EXEC_ARGS args );
+ }
+
+ }
+#else
+ Instruct_Dispatch[CUR.opcode]( EXEC_ARGS &CUR.stack[CUR.args] );
+#endif
+ if ( CUR.error != TT_Err_Ok )
+ {
+ switch ( CUR.error )
+ {
+ case TT_Err_Invalid_Opcode: /* looking for redefined instructions */
+ A = 0;
+
+ while ( A < CUR.numIDefs )
+ {
+ WITH = &CUR.IDefs[A];
+
+ if ( WITH->Active && CUR.opcode == WITH->Opc )
+ {
+ if ( CUR.callTop >= CUR.callSize )
+ {
+ CUR.error = TT_Err_Invalid_Reference;
+ goto LErrorLabel_;
+ }
+
+ WITH1 = &CUR.callStack[CUR.callTop];
+
+ WITH1->Caller_Range = CUR.curRange;
+ WITH1->Caller_IP = CUR.IP + 1;
+ WITH1->Cur_Count = 1;
+ WITH1->Cur_Restart = WITH->Start;
+
+ if ( INS_Goto_CodeRange( WITH->Range, WITH->Start ) == FAILURE )
+ goto LErrorLabel_;
+
+ goto LSuiteLabel_;
+ }
+ else
+ {
+ A++;
+ continue;
+ }
+ }
+
+ CUR.error = TT_Err_Invalid_Opcode;
+ goto LErrorLabel_;
+/* break; Unreachable code warning suppress. Leave in case a later
+ change to remind the editor to consider break; */
+
+ default:
+ goto LErrorLabel_;
+/* break; */
+ }
+ }
+
+ CUR.top = CUR.new_top;
+
+ if ( CUR.step_ins )
+ CUR.IP += CUR.length;
+
+ /* increment instruction counter and check if we didn't */
+ /* run this program for too long ?? (e.g. infinite loops) */
+ if ( ++ins_counter > MAX_RUNNABLE_OPCODES )
+ return TT_Err_Execution_Too_Long;
+
+
+ LSuiteLabel_:
+
+ if ( CUR.IP >= CUR.codeSize )
+ {
+ if ( CUR.callTop > 0 )
+ {
+ CUR.error = TT_Err_Code_Overflow;
+ goto LErrorLabel_;
+ }
+ else
+ goto LNo_Error_;
+ }
+ } while ( !CUR.instruction_trap );
+
+ LNo_Error_:
+
+ return TT_Err_Ok;
+
+ LErrorLabel_:
+
+ return CUR.error;
+ }
+
+
+#ifdef DEBUG_INTERPRETER
+
+ LOCAL_DEF
+ TT_Error RunIns( PExecution_Context exc )
+ {
+ Int A, diff;
+ ULong next_IP;
+ Char ch, *temp;
+
+ TT_Error error;
+
+ TGlyph_Zone save;
+ TGlyph_Zone pts;
+
+#define TT_Round_Off 5
+#define TT_Round_To_Half_Grid 0
+#define TT_Round_To_Grid 1
+#define TT_Round_To_Double_Grid 2
+#define TT_Round_Up_To_Grid 4
+#define TT_Round_Down_To_Grid 3
+#define TT_Round_Super 6
+#define TT_Round_Super_45 7
+
+ const String* round_str[8] =
+ {
+ "to half-grid",
+ "to grid",
+ "to double grid",
+ "down to grid",
+ "up to grid",
+ "off",
+ "super",
+ "super 45"
+ };
+
+
+#if 0
+ if ( !Goto_CodeRange( exc, TT_CodeRange_Glyph, 0 ) )
+ return FAILURE;
+
+ exc->pts = ((PInstance)exc->owner)->pts;
+ exc->numContours = ((PInstance)exc)->numContours;
+
+ exc->zp0 = exc->pts;
+ exc->zp1 = exc->pts;
+ exc->zp2 = exc->pts;
+
+ exc->GS = exc->default_GS;
+
+ exc->GS.gep0 = 1;
+ exc->GS.gep1 = 1;
+ exc->GS.gep2 = 1;
+
+ exc->GS.projVector.x = 0x4000;
+ exc->GS.projVector.y = 0x0000;
+ exc->GS.freeVector.x = 0x4000;
+ exc->GS.freeVector.y = 0x0000;
+ exc->GS.dualVector.x = 0x4000;
+ exc->GS.dualVector.y = 0x0000;
+
+ exc->GS.round_state = 1;
+
+ exc->top = 0;
+ /* Some glyphs leave something on the stack! */
+ /* We must empty it. */
+#endif
+
+ if ( exc->curRange != TT_CodeRange_Glyph )
+ return RunIns2( exc );
+
+ pts = exc->pts;
+
+ save.n_points = pts.n_points;
+ save.n_contours = pts.n_contours;
+
+ save.org = (PCoordinates)malloc( 2 * sizeof( TT_F26Dot6 ) *
+ save.n_points );
+ save.cur = (PCoordinates)malloc( 2 * sizeof( TT_F26Dot6 ) *
+ save.n_points );
+ save.touch = (PByte)malloc( save.n_points );
+
+ exc->instruction_trap = 1;
+
+ do
+ {
+ if ( CUR.IP < CUR.codeSize )
+ {
+ CALC_Length();
+
+ CUR.args = CUR.top - (Pop_Push_Count[CUR.opcode] >> 4);
+
+ /* `args' is the top of the stack once arguments have been popped. */
+ /* One can also interpret it as the index of the last argument. */
+
+ /* First print the current stack */
+
+ A = CUR.args - 4;
+
+ if ( A < 0 )
+ A = 0;
+
+ while ( A < CUR.top )
+ {
+ PTRACE0(( "%04lx ", CUR.stack[A] ));
+ A++;
+ if ( A == CUR.args )
+ PTRACE0(( "* " ));
+ }
+ PTRACE0(( "\n" ));
+
+ /* Now print the current line */
+
+#if 1
+ PTRACE0(( "%s\n", (String*)Cur_U_Line( &CUR ) ));
+#endif
+
+ /* First, check for empty stack and overflow */
+
+ if ( CUR.args < 0 )
+ {
+ PTRACE0(( "ERROR : Too Few Arguments\n" ));
+ CUR.error = TT_Err_Too_Few_Arguments;
+ goto LErrorLabel_;
+ }
+
+ CUR.new_top = CUR.args + (Pop_Push_Count[CUR.opcode] & 15);
+
+ /* new_top is the new top of the stack, after the instruction's */
+ /* execution. top will be set to new_top after the 'case' */
+
+ if ( CUR.new_top > CUR.stackSize )
+ {
+ PTRACE0(( "ERROR : Stack overflow\n" ));
+ CUR.error = TT_Err_Stack_Overflow;
+ goto LErrorLabel_;
+ }
+ }
+ else
+ PTRACE0(( "End of program reached.\n" ));
+
+ do
+ {
+#ifdef OS2
+ ch = getch();
+ if ( ch > ' ' )
+ PTRACE0(( "%c\n", ch ));
+#else
+ ch = getchar();
+#endif
+ switch ( ch )
+ {
+ case '\n':
+ ch = '\0';
+ break;
+
+ case '?':
+ PTRACE0(( "Help\n\n" ));
+ PTRACE0(( "? Show this page\n" ));
+ PTRACE0(( "q Quit debugger\n" ));
+ PTRACE0(( "n Next instruction\n" ));
+ PTRACE0(( "s Step into\n" ));
+ PTRACE0(( "v Show vector info\n" ));
+ PTRACE0(( "p Show points zone\n\n" ));
+ ch = '\0';
+ break;
+
+ case 'v':
+ PTRACE0(( "freedom (%04hx,%04hx)\n",
+ exc->GS.freeVector.x,
+ exc->GS.freeVector.y ));
+ PTRACE0(( "projection (%04hx,%04hx)\n",
+ exc->GS.projVector.x,
+ exc->GS.projVector.y ));
+ PTRACE0(( "dual (%04hx,%04hx)\n\n",
+ exc->GS.dualVector.x,
+ exc->GS.dualVector.y ));
+ ch = '\0';
+ break;
+
+ case 'g':
+ PTRACE0(( "rounding %s\n", round_str[exc->GS.round_state] ));
+ PTRACE0(( "min dist %04lx\n", exc->GS.minimum_distance ));
+ PTRACE0(( "cvt_cutin %04lx\n", exc->GS.control_value_cutin ));
+ ch = '\0';
+ break;
+
+ case 'p':
+ for ( A = 0; A < exc->pts.n_points; A++ )
+ {
+ PTRACE0(( "%02hx ", A ));
+
+ PTRACE0(( "%08lx,%08lx - ",
+ pts.org[A].x,
+ pts.org[A].y ));
+
+ PTRACE0(( "%08lx,%08lx\n",
+ pts.cur[A].x,
+ pts.cur[A].y ));
+ }
+ PTRACE0(( "\n" ));
+ ch = '\0';
+ break;
+ }
+ } while ( ch == '\0' );
+
+ MEM_Copy( save.org, pts.org, 2 * pts.n_points *
+ sizeof ( TT_F26Dot6 ) );
+ MEM_Copy( save.cur, pts.cur, 2 * pts.n_points *
+ sizeof ( TT_F26Dot6 ) );
+ MEM_Copy( save.touch, pts.touch, pts.n_points );
+
+ switch ( ch )
+ {
+ case 'q':
+ goto LErrorLabel_;
+
+ case 's':
+ if ( CUR.IP < CUR.codeSize )
+ if ( ( error = RunIns2( exc ) ) )
+ goto LErrorLabel_;
+ break;
+
+ case 'n':
+ if ( CUR.IP < CUR.codeSize )
+ {
+ next_IP = CUR.IP + CUR.length;
+ while ( CUR.IP != next_IP )
+ {
+ if ( ( error = RunIns2( exc ) ) )
+ goto LErrorLabel_;
+ }
+ }
+ break;
+
+ default:
+ PTRACE0(( "unknown command. Press ? for help\n" ));
+ }
+
+ for ( A = 0; A < pts.n_points; A++ )
+ {
+ diff = 0;
+ if ( save.org[A].x != pts.org[A].x ) diff |= 1;
+ if ( save.org[A].y != pts.org[A].y ) diff |= 2;
+ if ( save.cur[A].x != pts.cur[A].x ) diff |= 4;
+ if ( save.cur[A].y != pts.cur[A].y ) diff |= 8;
+ if ( save.touch[A] != pts.touch[A] ) diff |= 16;
+
+ if ( diff )
+ {
+ PTRACE0(( "%02hx ", A ));
+
+ if ( diff & 16 ) temp = "(%01hx)"; else temp = " %01hx ";
+ PTRACE0(( temp, save.touch[A] & 7 ));
+
+ if ( diff & 1 ) temp = "(%08lx)"; else temp = " %08lx ";
+ PTRACE0(( temp, save.org[A].x ));
+
+ if ( diff & 2 ) temp = "(%08lx)"; else temp = " %08lx ";
+ PTRACE0(( temp, save.org[A].y ));
+
+ if ( diff & 4 ) temp = "(%08lx)"; else temp = " %08lx ";
+ PTRACE0(( temp, save.cur[A].x ));
+
+ if ( diff & 8 ) temp = "(%08lx)"; else temp = " %08lx ";
+ PTRACE0(( temp, save.cur[A].y ));
+
+ PTRACE0(( "\n" ));
+
+ PTRACE0(( "%02hx ", A ));
+
+ if ( diff & 16 ) temp = "[%01hx]"; else temp = " %01hx ";
+ PTRACE0(( temp, pts.touch[A] & 7 ));
+
+ if ( diff & 1 ) temp = "[%08lx]"; else temp = " %08lx ";
+ PTRACE0(( temp, pts.org[A].x ));
+
+ if ( diff & 2 ) temp = "[%08lx]"; else temp = " %08lx ";
+ PTRACE0(( temp, pts.org[A].y ));
+
+ if ( diff & 4 ) temp = "[%08lx]"; else temp = " %08lx ";
+ PTRACE0(( temp, pts.cur[A].x ));
+
+ if ( diff & 8 ) temp = "[%08lx]"; else temp = " %08lx ";
+ PTRACE0(( temp, pts.cur[A].y ));
+
+ PTRACE0(( "\n\n" ));
+ }
+ }
+ } while ( TRUE );
+
+ LErrorLabel_:
+
+ /* Load_Instance_Context(aIns); */
+
+ return error;
+ }
+
+#endif /* DEBUG_INTERPRETER */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttinterp.h b/xc/extras/FreeType/lib/ttinterp.h
new file mode 100644
index 000000000..e85f987a0
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttinterp.h
@@ -0,0 +1,54 @@
+/*******************************************************************
+ *
+ * ttinterp.h 2.2
+ *
+ * TrueType bytecode intepreter.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * Changes between 2.2 and 2.1:
+ *
+ * - a small bugfix in the Push opcodes
+ *
+ * Changes between 2.1 and 2.0:
+ *
+ * - created the TTExec component to take care of all execution
+ * context management. The interpreter has now one single
+ * function.
+ *
+ * - made some changes to support re-entrancy. The re-entrant
+ * interpreter is smaller!
+ *
+ ******************************************************************/
+
+#ifndef TTINTERP_H
+#define TTINTERP_H
+
+#include "ttconfig.h"
+#include "ttobjs.h"
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ /* Run instructions in current execution context */
+
+ LOCAL_DEF TT_Error RunIns( PExecution_Context exc );
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTINTERP_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttload.c b/xc/extras/FreeType/lib/ttload.c
new file mode 100644
index 000000000..07525d058
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttload.c
@@ -0,0 +1,1553 @@
+/*******************************************************************
+ *
+ * ttload.c 1.0
+ *
+ * TrueType Tables Loader.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "tttypes.h"
+#include "ttdebug.h"
+#include "ttcalc.h"
+#include "ttfile.h"
+
+#include "tttables.h"
+#include "ttobjs.h"
+
+#include "ttmemory.h"
+#include "tttags.h"
+#include "ttload.h"
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_load
+
+/* In all functions, the stream is taken from the 'face' object */
+#define DEFINE_LOCALS DEFINE_LOAD_LOCALS( face->stream )
+#define DEFINE_LOCALS_WO_FRAME DEFINE_LOAD_LOCALS_WO_FRAME( face->stream )
+
+
+/*******************************************************************
+ *
+ * Function : LookUp_TrueType_Table
+ *
+ * Description : Looks for a TrueType table by name.
+ *
+ * Input : face face table to look for
+ * tag searched tag
+ *
+ * Output : Index of table if found, -1 otherwise.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ Long TT_LookUp_Table( PFace face,
+ ULong tag )
+ {
+ UShort i;
+
+
+ PTRACE4(( "TT_LookUp_Table( %08lx, %c%c%c%c )\n",
+ (Long)face,
+ (Char)(tag >> 24),
+ (Char)(tag >> 16),
+ (Char)(tag >> 8),
+ (Char)(tag) ));
+
+ for ( i = 0; i < face->numTables; i++ )
+ if ( face->dirTables[i].Tag == tag )
+ return i;
+
+ PTRACE4(( " Could not find table!\n" ));
+ return -1;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Collection
+ *
+ * Description : Loads the TTC table directory into face table.
+ *
+ * Input : face face record to look for
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ static TT_Error Load_TrueType_Collection( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ ULong n;
+
+
+ PTRACE3(( "Load_TrueType_Collection( %08lx )\n", (long)face ));
+
+ if ( FILE_Seek ( 0L ) ||
+ ACCESS_Frame( 12L ) )
+ return error;
+
+ face->ttcHeader.Tag = GET_Tag4();
+ face->ttcHeader.version = GET_Long();
+ face->ttcHeader.DirCount = GET_Long();
+
+ FORGET_Frame();
+
+ if ( face->ttcHeader.Tag != TTAG_ttcf )
+ {
+ face->ttcHeader.Tag = 0;
+ face->ttcHeader.version = 0;
+ face->ttcHeader.DirCount = 0;
+
+ face->ttcHeader.TableDirectory = NULL;
+
+ PTRACE3(("skipped.\n"));
+
+ return TT_Err_File_Is_Not_Collection;
+ }
+
+ if ( ALLOC_ARRAY( face->ttcHeader.TableDirectory,
+ face->ttcHeader.DirCount,
+ ULong ) ||
+ ACCESS_Frame( face->ttcHeader.DirCount * 4L ) )
+ return error;
+
+ for ( n = 0; n < face->ttcHeader.DirCount; n++ )
+ face->ttcHeader.TableDirectory[n] = GET_ULong();
+
+ FORGET_Frame();
+
+ PTRACE3(( "collections directory loaded.\n" ));
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Directory
+ *
+ * Description : Loads the table directory into face table.
+ *
+ * Input : face face record to look for
+ *
+ * faceIndex the index of the TrueType font, when
+ * we're opening a collection.
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Directory( PFace face, ULong faceIndex )
+ {
+ DEFINE_LOCALS;
+
+ UShort n, limit;
+ TTableDir tableDir;
+
+ PTableDirEntry entry;
+
+
+ PTRACE2(("Load_TT_Directory( %08lx, %ld )\n", (long)face, faceIndex));
+
+ error = Load_TrueType_Collection( face );
+
+ if ( error )
+ {
+ if ( error != TT_Err_File_Is_Not_Collection )
+ return error;
+
+ /* the file isn't a collection, exit if we're asking */
+ /* for a collected font */
+ if ( faceIndex != 0 )
+ return error;
+
+ /* Now skip to the beginning of the file */
+ if ( FILE_Seek( 0 ) )
+ return error;
+ }
+ else
+ {
+ /* The file is a collection. Check the font index */
+ if ( faceIndex >= face->ttcHeader.DirCount )
+ return TT_Err_Bad_Argument;
+
+ /* select a TrueType font in the ttc file */
+ if ( FILE_Seek( face->ttcHeader.TableDirectory[faceIndex] ) )
+ return error;
+ }
+
+ if ( ACCESS_Frame( 12L ) )
+ return error;
+
+ tableDir.version = GET_Long();
+ tableDir.numTables = GET_UShort();
+
+ tableDir.searchRange = GET_UShort();
+ tableDir.entrySelector = GET_UShort();
+ tableDir.rangeShift = GET_UShort();
+
+ FORGET_Frame();
+
+ PTRACE2(( "-- Tables count : %12u\n", tableDir.numTables ));
+ PTRACE2(( "-- Format version : %08lx\n", tableDir.version ));
+
+ /* Check that we have a 'sfnt' format there */
+
+ if ( tableDir.version != 0x00010000 )
+ {
+ PERROR(( "!! invalid file format" ));
+ return TT_Err_Invalid_File_Format;
+ }
+
+ face->numTables = tableDir.numTables;
+
+ if ( ALLOC_ARRAY( face->dirTables,
+ face->numTables,
+ TTableDirEntry ) )
+ return error;
+
+ if ( ACCESS_Frame( face->numTables * 16L ) )
+ return error;
+
+ limit = face->numTables;
+ entry = face->dirTables;
+
+ for ( n = 0; n < limit; n++ )
+ { /* loop through the tables and get all entries */
+ entry->Tag = GET_Tag4();
+ entry->CheckSum = GET_ULong();
+ entry->Offset = GET_Long();
+ entry->Length = GET_Long();
+
+ PTRACE2(( " %c%c%c%c - %08lx - %08lx\n",
+ (Char)(entry->Tag >> 24),
+ (Char)(entry->Tag >> 16),
+ (Char)(entry->Tag >> 8 ),
+ (Char)(entry->Tag),
+ entry->Offset,
+ entry->Length ));
+ entry++;
+ }
+
+ FORGET_Frame();
+
+ PTRACE2(( "Directory loaded\n\n" ));
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_MaxProfile
+ *
+ * Description : Loads the maxp table into face table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_MaxProfile( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long i;
+ PMaxProfile maxProfile = &face->maxProfile;
+
+
+ PTRACE2(( "Load_TT_MaxProfile( %08lx )\n", (long)face ));
+
+ if ( ( i = TT_LookUp_Table( face, TTAG_maxp ) ) < 0 )
+ return TT_Err_Max_Profile_Missing;
+
+ if ( FILE_Seek( face->dirTables[i].Offset ) ) /* seek to maxprofile */
+ return error;
+
+ if ( ACCESS_Frame( 32L ) ) /* read into frame */
+ return error;
+
+ /* read frame data into face table */
+ maxProfile->version = GET_ULong();
+
+ maxProfile->numGlyphs = GET_UShort();
+
+ maxProfile->maxPoints = GET_UShort();
+ maxProfile->maxContours = GET_UShort();
+ maxProfile->maxCompositePoints = GET_UShort();
+ maxProfile->maxCompositeContours = GET_UShort();
+
+ maxProfile->maxZones = GET_UShort();
+ maxProfile->maxTwilightPoints = GET_UShort();
+
+ maxProfile->maxStorage = GET_UShort();
+ maxProfile->maxFunctionDefs = GET_UShort();
+ maxProfile->maxInstructionDefs = GET_UShort();
+ maxProfile->maxStackElements = GET_UShort();
+ maxProfile->maxSizeOfInstructions = GET_UShort();
+ maxProfile->maxComponentElements = GET_UShort();
+ maxProfile->maxComponentDepth = GET_UShort();
+
+ FORGET_Frame();
+
+ /* XXX : an adjustement that is necessary to load certain */
+ /* broken fonts like "Keystrokes MT" :-( */
+ /* */
+ /* We allocate 64 function entries by default when */
+ /* the maxFunctionDefs field is null. */
+
+ if (maxProfile->maxFunctionDefs == 0)
+ maxProfile->maxFunctionDefs = 64;
+
+ face->numGlyphs = maxProfile->numGlyphs;
+
+ face->maxPoints = MAX( maxProfile->maxCompositePoints,
+ maxProfile->maxPoints );
+ face->maxContours = MAX( maxProfile->maxCompositeContours,
+ maxProfile->maxContours );
+ face->maxComponents = maxProfile->maxComponentElements +
+ maxProfile->maxComponentDepth;
+
+ PTRACE2(( "GASP loaded.\n" ));
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Gasp
+ *
+ * Description : Loads the TrueType Gasp table into the face
+ * table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Gasp( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long i;
+ UShort j;
+ TGasp* gas;
+ GaspRange* gaspranges;
+
+
+ PTRACE2(( "Load_TT_Gasp( %08lx )\n", (long)face ));
+
+ if ( ( i = TT_LookUp_Table( face, TTAG_gasp ) ) < 0 )
+ return TT_Err_Ok; /* gasp table is not required */
+
+ if ( FILE_Seek( face->dirTables[i].Offset ) ||
+ ACCESS_Frame( 4L ) )
+ return error;
+
+ gas = &face->gasp;
+
+ gas->version = GET_UShort();
+ gas->numRanges = GET_UShort();
+
+ FORGET_Frame();
+
+ PTRACE3(( "number of ranges = %d\n", gas->numRanges ));
+
+ if ( ALLOC_ARRAY( gaspranges, gas->numRanges, GaspRange ) ||
+ ACCESS_Frame( gas->numRanges * 4L ) )
+ goto Fail;
+
+ face->gasp.gaspRanges = gaspranges;
+
+ for ( j = 0; j < gas->numRanges; j++ )
+ {
+ gaspranges[j].maxPPEM = GET_UShort();
+ gaspranges[j].gaspFlag = GET_UShort();
+
+ PTRACE3(( " [max:%d flag:%d]",
+ gaspranges[j].maxPPEM,
+ gaspranges[j].gaspFlag ));
+ }
+ PTRACE3(("\n"));
+
+ FORGET_Frame();
+
+ PTRACE2(( "GASP loaded\n" ));
+ return TT_Err_Ok;
+
+ Fail:
+ FREE( gaspranges );
+ gas->numRanges = 0;
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Header
+ *
+ * Description : Loads the TrueType header table into the face
+ * table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Header( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long i;
+ TT_Header* header;
+
+
+ PTRACE2(( "Load_TT_Header( %08lx )\n", (long)face ));
+
+ if ( ( i = TT_LookUp_Table( face, TTAG_head ) ) < 0 )
+ {
+ PTRACE0(( "Font Header is missing !!\n" ));
+ return TT_Err_Header_Table_Missing;
+ }
+
+ if ( FILE_Seek( face->dirTables[i].Offset ) ||
+ ACCESS_Frame( 54L ) )
+ return error;
+
+ header = &face->fontHeader;
+
+ header->Table_Version = GET_ULong();
+ header->Font_Revision = GET_ULong();
+
+ header->CheckSum_Adjust = GET_Long();
+ header->Magic_Number = GET_Long();
+
+ header->Flags = GET_UShort();
+ header->Units_Per_EM = GET_UShort();
+
+ header->Created [0] = GET_Long();
+ header->Created [1] = GET_Long();
+ header->Modified[0] = GET_Long();
+ header->Modified[1] = GET_Long();
+
+ header->xMin = GET_Short();
+ header->yMin = GET_Short();
+ header->xMax = GET_Short();
+ header->yMax = GET_Short();
+
+ header->Mac_Style = GET_UShort();
+ header->Lowest_Rec_PPEM = GET_UShort();
+
+ header->Font_Direction = GET_Short();
+ header->Index_To_Loc_Format = GET_Short();
+ header->Glyph_Data_Format = GET_Short();
+
+ FORGET_Frame();
+
+ PTRACE2(( " Units per EM : %8u\n", header->Units_Per_EM ));
+ PTRACE2(( " IndexToLoc : %8d\n", header->Index_To_Loc_Format ));
+ PTRACE2(( "Font Header Loaded.\n" ));
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Metrics
+ *
+ * Description : Loads the horizontal or vertical metrics table
+ * into face object.
+ *
+ * Input : face
+ * vertical set to true when loading the vmtx table,
+ * or false for hmtx
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ static
+ TT_Error Load_TrueType_Metrics( PFace face,
+ Bool vertical )
+ {
+ DEFINE_LOCALS;
+
+ Long n, num_shorts, num_shorts_checked, num_longs;
+
+ PLongMetrics* longs;
+ PShortMetrics* shorts;
+
+ PLongMetrics long_metric;
+
+
+ PTRACE2(( "Load_TT_%s_Metrics( %08lx )\n",
+ vertical ? "Vertical" : "Horizontal",
+ (long)face ));
+
+ if ( vertical )
+ {
+ /* The table is optional, quit silently if it wasn't found */
+ /* XXX : Some fonts have a valid vertical header with a non-null */
+ /* "number_of_VMetrics" fields, but no corresponding */
+ /* 'vmtx' table to get the metrics from (e.g. mingliu) */
+ /* */
+ /* For safety, we set the field to 0 ! */
+ /* */
+ n = TT_LookUp_Table( face, TTAG_vmtx );
+ if ( n < 0 )
+ {
+ /* Set the number_Of_VMetrics to 0! */
+ PTRACE2(( " no vertical header in file.\n" ));
+ face->verticalHeader.number_Of_VMetrics = 0;
+ return TT_Err_Ok;
+ }
+
+ num_longs = face->verticalHeader.number_Of_VMetrics;
+ longs = (PLongMetrics*)&face->verticalHeader.long_metrics;
+ shorts = (PShortMetrics*)&face->verticalHeader.short_metrics;
+ }
+ else
+ {
+ if ( ( n = TT_LookUp_Table( face, TTAG_hmtx ) ) < 0 )
+ {
+ PERROR(( "!! No Horizontal metrics in file !!\n" ));
+ return TT_Err_Hmtx_Table_Missing;
+ }
+
+ num_longs = face->horizontalHeader.number_Of_HMetrics;
+ longs = (PLongMetrics*)&face->horizontalHeader.long_metrics;
+ shorts = (PShortMetrics*)&face->horizontalHeader.short_metrics;
+ }
+
+ /* never trust derived values! */
+
+ num_shorts = face->maxProfile.numGlyphs - num_longs;
+ num_shorts_checked = ( face->dirTables[n].Length - num_longs * 4 ) / 2;
+
+ if ( num_shorts < 0 ) /* sanity check */
+ {
+ PERROR(( "!! more metrics than glyphs!\n" ));
+ return TT_Err_Invalid_Horiz_Metrics;
+ }
+
+ if ( ALLOC_ARRAY( *longs, num_longs, TLongMetrics ) ||
+ ALLOC_ARRAY( *shorts, num_shorts, TShortMetrics ) )
+ return error;
+
+ if ( FILE_Seek( face->dirTables[n].Offset ) ||
+ ACCESS_Frame( face->dirTables[n].Length ) )
+ return error;
+
+ long_metric = *longs;
+ for ( n = 0; n < num_longs; n++ )
+ {
+ long_metric->advance = GET_UShort();
+ long_metric->bearing = GET_Short();
+ long_metric++;
+ }
+
+ /* do we have an inconsistent number of metric values? */
+
+ if ( num_shorts > num_shorts_checked )
+ {
+ for ( n = 0; n < num_shorts_checked; n++ )
+ (*shorts)[n] = GET_Short();
+
+ /* we fill up the missing left side bearings with the */
+ /* last valid value. Since this will occur for buggy CJK */
+ /* fonts usually, nothing serious will happen. */
+
+ for ( n = num_shorts_checked; n < num_shorts; n++ )
+ (*shorts)[n] = (*shorts)[num_shorts_checked - 1];
+ }
+ else
+ {
+ for ( n = 0; n < num_shorts; n++ )
+ (*shorts)[n] = GET_Short();
+ }
+
+ FORGET_Frame();
+
+ PTRACE2(( "loaded\n" ));
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Metrics_Header
+ *
+ * Description : Loads either the "hhea" or "vhea" table in memory
+ *
+ * Input : face face table to look for
+ * vertical a boolean. When set, queries the optional
+ * "vhea" table. Otherwise, load the mandatory
+ * "hhea" horizontal header.
+ *
+ * Output : Error code.
+ *
+ * Note : This function now loads the corresponding metrics table
+ * (either hmtx or vmtx) and attaches it to the header.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Metrics_Header( PFace face,
+ Bool vertical )
+ {
+ DEFINE_LOCALS;
+
+ Long i;
+
+ TT_Horizontal_Header* header;
+
+
+ PTRACE2(( vertical ? "Vertical header" : "Horizontal header " ));
+
+ if ( vertical )
+ {
+ face->verticalInfo = 0;
+
+ /* The vertical header table is optional, so return quietly if */
+ /* we don't find it.. */
+ if ( ( i = TT_LookUp_Table( face, TTAG_vhea ) ) < 0 )
+ return TT_Err_Ok;
+
+ face->verticalInfo = 1;
+ header = (TT_Horizontal_Header*)&face->verticalHeader;
+ }
+ else
+ {
+ /* The orizontal header is mandatory, return an error if we */
+ /* don't find it. */
+ if ( ( i = TT_LookUp_Table( face, TTAG_hhea ) ) < 0 )
+ return TT_Err_Horiz_Header_Missing;
+
+ header = &face->horizontalHeader;
+ }
+
+ if ( FILE_Seek( face->dirTables[i].Offset ) ||
+ ACCESS_Frame( 36L ) )
+ return error;
+
+ header->Version = GET_ULong();
+ header->Ascender = GET_Short();
+ header->Descender = GET_Short();
+ header->Line_Gap = GET_Short();
+
+ header->advance_Width_Max = GET_UShort();
+
+ header->min_Left_Side_Bearing = GET_Short();
+ header->min_Right_Side_Bearing = GET_Short();
+ header->xMax_Extent = GET_Short();
+ header->caret_Slope_Rise = GET_Short();
+ header->caret_Slope_Run = GET_Short();
+
+ header->Reserved0 = GET_Short(); /* this is caret_Offset for
+ vertical headers */
+ header->Reserved1 = GET_Short();
+ header->Reserved2 = GET_Short();
+ header->Reserved3 = GET_Short();
+ header->Reserved4 = GET_Short();
+
+ header->metric_Data_Format = GET_Short();
+ header->number_Of_HMetrics = GET_UShort();
+
+ FORGET_Frame();
+
+ header->long_metrics = NULL;
+ header->short_metrics = NULL;
+
+ PTRACE2(( "loaded\n" ));
+
+ /* Now try to load the corresponding metrics */
+
+ return Load_TrueType_Metrics( face, vertical );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Locations
+ *
+ * Description : Loads the location table into face table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : Error code.
+ *
+ * NOTE:
+ * The Font Header *must* be loaded in the leading segment
+ * calling this function.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Locations( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long n, limit;
+ Short LongOffsets;
+
+
+ PTRACE2(( "Locations " ));
+
+ LongOffsets = face->fontHeader.Index_To_Loc_Format;
+
+ if ( ( n = TT_LookUp_Table( face, TTAG_loca ) ) < 0 )
+ return TT_Err_Locations_Missing;
+
+ if ( FILE_Seek( face->dirTables[n].Offset ) )
+ return error;
+
+ if ( LongOffsets != 0 )
+ {
+ face->numLocations = face->dirTables[n].Length >> 2;
+
+ PTRACE2(( "(32 bits offsets): %12d ",
+ face->numLocations ));
+
+ if ( ALLOC_ARRAY( face->glyphLocations,
+ face->numLocations,
+ Long ) )
+ return error;
+
+ if ( ACCESS_Frame( face->numLocations * 4L ) )
+ return error;
+
+ limit = face->numLocations;
+
+ for ( n = 0; n < limit; n++ )
+ face->glyphLocations[n] = GET_Long();
+
+ FORGET_Frame();
+ }
+ else
+ {
+ face->numLocations = face->dirTables[n].Length >> 1;
+
+ PTRACE2(( "(16 bits offsets): %12d ",
+ face->numLocations ));
+
+ if ( ALLOC_ARRAY( face->glyphLocations,
+ face->numLocations,
+ Long ) )
+ return error;
+
+ if ( ACCESS_Frame( face->numLocations * 2L ) )
+ return error;
+
+ limit = face->numLocations;
+
+ for ( n = 0; n < limit; n++ )
+ face->glyphLocations[n] =
+ (Long)((ULong)GET_UShort() * 2);
+
+ FORGET_Frame();
+ }
+
+ PTRACE2(( "loaded\n" ));
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Names
+ *
+ * Description : Loads the name table into face table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Names( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ UShort i, bytes;
+ Long n;
+ PByte storage;
+
+ TName_Table* names;
+ TNameRec* namerec;
+
+
+ PTRACE2(( "Names " ));
+
+ if ( ( n = TT_LookUp_Table( face, TTAG_name ) ) < 0 )
+ {
+ /* The name table is required so indicate failure. */
+ PTRACE2(( "is missing!\n" ));
+
+ return TT_Err_Name_Table_Missing;
+ }
+
+ /* Seek to the beginning of the table and check the frame access. */
+ /* The names table has a 6 byte header. */
+ if ( FILE_Seek( face->dirTables[n].Offset ) ||
+ ACCESS_Frame( 6L ) )
+ return error;
+
+ names = &face->nameTable;
+
+ /* Load the initial names data. */
+ names->format = GET_UShort();
+ names->numNameRecords = GET_UShort();
+ names->storageOffset = GET_UShort();
+
+ FORGET_Frame();
+
+ /* Allocate the array of name records. */
+ if ( ALLOC_ARRAY( names->names,
+ names->numNameRecords,
+ TNameRec ) ||
+ ACCESS_Frame( names->numNameRecords * 12L ) )
+ {
+ names->numNameRecords = 0;
+ goto Fail;
+ }
+
+ /* Load the name records and determine how much storage is needed */
+ /* to hold the strings themselves. */
+
+ for ( i = bytes = 0; i < names->numNameRecords; i++ )
+ {
+ namerec = names->names + i;
+ namerec->platformID = GET_UShort();
+ namerec->encodingID = GET_UShort();
+ namerec->languageID = GET_UShort();
+ namerec->nameID = GET_UShort();
+ namerec->stringLength = GET_UShort();
+ namerec->stringOffset = GET_UShort();
+
+#if 0
+ /* check the ids */
+ if ( namerec->platformID <= 3 )
+ {
+#endif
+ /* this test takes care of 'holes' in the names tables, as */
+ /* reported by Erwin */
+ if ( (namerec->stringOffset + namerec->stringLength) > bytes )
+ bytes = namerec->stringOffset + namerec->stringLength;
+#if 0
+ }
+#endif
+ }
+
+ FORGET_Frame();
+
+ /* Allocate storage for the strings if they exist. */
+
+ names->storage = NULL;
+
+ if ( bytes > 0 )
+ {
+ if ( ALLOC( storage, bytes ) ||
+ FILE_Read_At( face->dirTables[n].Offset + names->storageOffset,
+ (void*)storage,
+ bytes ) )
+ goto Fail_Storage;
+
+ names->storage = storage;
+
+ /* Go through and assign the string pointers to the name records. */
+
+ for ( i = 0; i < names->numNameRecords; i++ )
+ {
+ namerec = names->names + i;
+ namerec->string = storage + names->names[i].stringOffset;
+
+/* It is possible (but rather unlikely) that a new platform ID will be */
+/* added by Apple, so we can't rule out IDs > 3. */
+
+#if 0
+ if ( namerec->platformID <= 3 )
+ namerec->string = storage + names->names[i].stringOffset;
+ else
+ {
+ namerec->string = NULL;
+ namerec->stringLength = 0;
+ }
+#endif
+ }
+ }
+
+#ifdef DEBUG
+
+ for ( i = 0; i < names->numNameRecords; i++ )
+ {
+ int j;
+
+
+ PTRACE2(( "%d %d %x %d ",
+ names->names[i].platformID,
+ names->names[i].encodingID,
+ names->names[i].languageID,
+ names->names[i].nameID ));
+
+ /* I know that M$ encoded strings are Unicode, */
+ /* but this works reasonable well for debugging purposes. */
+ for ( j = 0; j < names->names[i].stringLength; j++ )
+ {
+ if (names->names[i].string)
+ {
+ Char c = *(names->names[i].string + j);
+
+
+ if ( (Byte)c < 128 )
+ PTRACE2(( "%c", c ));
+ }
+ }
+
+ PTRACE2(( "\n" ));
+ }
+
+#endif
+
+ PTRACE2(( "loaded\n" ));
+ return TT_Err_Ok;
+
+ Fail_Storage:
+ FREE( storage );
+
+ Fail:
+ Free_TrueType_Names( face );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Free_TrueType_Names
+ *
+ * Description : Frees a name table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : TT_Err_Ok.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Free_TrueType_Names( PFace face )
+ {
+ TName_Table* names = &face->nameTable;
+
+
+ /* free strings table */
+ FREE( names->names );
+
+ /* free strings storage */
+ FREE( names->storage );
+
+ names->numNameRecords = 0;
+ names->format = 0;
+ names->storageOffset = 0;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_CVT
+ *
+ * Description : Loads cvt table into resident table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_CVT( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long n, limit;
+
+
+ PTRACE2(( "CVT " ));
+
+ if ( ( n = TT_LookUp_Table( face, TTAG_cvt ) ) < 0 )
+ {
+ PTRACE2(( "is missing!\n" ));
+
+ face->cvtSize = 0;
+ face->cvt = NULL;
+ return TT_Err_Ok;
+ }
+
+ face->cvtSize = face->dirTables[n].Length / 2;
+
+ if ( ALLOC_ARRAY( face->cvt,
+ face->cvtSize,
+ Short ) )
+ return error;
+
+ if ( FILE_Seek( face->dirTables[n].Offset ) ||
+ ACCESS_Frame( face->cvtSize * 2L ) )
+ return error;
+
+ limit = face->cvtSize;
+
+ for ( n = 0; n < limit; n++ )
+ face->cvt[n] = GET_Short();
+
+ FORGET_Frame();
+
+ PTRACE2(( "loaded\n" ));
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_CMap
+ *
+ * Description : Loads the cmap directory in memory.
+ * The cmaps themselves are loaded in ttcmap.c .
+ *
+ * Input : face
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_CMap( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long off, table_start;
+ Long n, limit;
+
+ TCMapDir cmap_dir;
+ TCMapDirEntry entry_;
+ PCMapTable cmap;
+
+
+ PTRACE2(( "CMaps " ));
+
+ if ( ( n = TT_LookUp_Table( face, TTAG_cmap ) ) < 0 )
+ return TT_Err_CMap_Table_Missing;
+
+ table_start = face->dirTables[n].Offset;
+
+ if ( ( FILE_Seek( table_start ) ) ||
+ ( ACCESS_Frame( 4L ) ) ) /* 4 bytes cmap header */
+ return error;
+
+ cmap_dir.tableVersionNumber = GET_UShort();
+ cmap_dir.numCMaps = GET_UShort();
+
+ FORGET_Frame();
+
+ off = FILE_Pos(); /* save offset to cmapdir[] which follows */
+
+ /* save space in face table for cmap tables */
+ if ( ALLOC_ARRAY( face->cMaps,
+ cmap_dir.numCMaps,
+ TCMapTable ) )
+ return error;
+
+ face->numCMaps = cmap_dir.numCMaps;
+
+ limit = face->numCMaps;
+ cmap = face->cMaps;
+
+ for ( n = 0; n < limit; n++ )
+ {
+ if ( FILE_Seek( off ) ||
+ ACCESS_Frame( 8L ) )
+ return error;
+
+ /* extra code using entry_ for platxxx could be cleaned up later */
+ cmap->loaded = FALSE;
+ cmap->platformID = entry_.platformID = GET_UShort();
+ cmap->platformEncodingID = entry_.platformEncodingID = GET_UShort();
+
+ entry_.offset = GET_Long();
+
+ FORGET_Frame();
+
+ off = FILE_Pos();
+
+ if ( FILE_Seek( table_start + entry_.offset ) ||
+ ACCESS_Frame( 6L ) )
+ return error;
+
+ cmap->format = GET_UShort();
+ cmap->length = GET_UShort();
+ cmap->version = GET_UShort();
+
+ FORGET_Frame();
+
+ cmap->offset = FILE_Pos();
+
+ cmap++;
+ }
+
+ PTRACE2(( "loaded\n" ));
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Programs
+ *
+ * Description : Loads the font (fpgm) and cvt programs into the
+ * face table.
+ *
+ * Input : face
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Programs( PFace face )
+ {
+ DEFINE_LOCALS_WO_FRAME;
+
+ Long n;
+
+
+ PTRACE2(( "Font program " ));
+
+ /* The font program is optional */
+ if ( ( n = TT_LookUp_Table( face, TTAG_fpgm ) ) < 0 )
+ {
+ face->fontProgram = NULL;
+ face->fontPgmSize = 0;
+
+ PTRACE2(( "is missing!\n" ));
+ }
+ else
+ {
+ face->fontPgmSize = face->dirTables[n].Length;
+
+ if ( ALLOC( face->fontProgram,
+ face->fontPgmSize ) ||
+ FILE_Read_At( face->dirTables[n].Offset,
+ (void*)face->fontProgram,
+ face->fontPgmSize ) )
+ return error;
+
+ PTRACE2(( "loaded, %12d bytes\n", face->fontPgmSize ));
+ }
+
+ PTRACE2(( "Prep program " ));
+
+ if ( ( n = TT_LookUp_Table( face, TTAG_prep ) ) < 0 )
+ {
+ face->cvtProgram = NULL;
+ face->cvtPgmSize = 0;
+
+ PTRACE2(( "is missing!\n" ));
+ }
+ else
+ {
+ face->cvtPgmSize = face->dirTables[n].Length;
+
+ if ( ALLOC( face->cvtProgram,
+ face->cvtPgmSize ) ||
+ FILE_Read_At( face->dirTables[n].Offset,
+ (void*)face->cvtProgram,
+ face->cvtPgmSize ) )
+ return error;
+
+ PTRACE2(( "loaded, %12d bytes\n", face->cvtPgmSize ));
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_OS2
+ *
+ * Description : Loads the OS2 Table.
+ *
+ * Input : face
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_OS2( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long i;
+ TT_OS2* os2;
+
+
+ PTRACE2(( "OS/2 Table " ));
+
+ if ( ( i = TT_LookUp_Table( face, TTAG_OS2 ) ) < 0 )
+ {
+ PTRACE2(( "is missing\n!" ));
+ return TT_Err_OS2_Table_Missing;
+ }
+
+ if ( FILE_Seek( face->dirTables[i].Offset ) ||
+ ACCESS_Frame( 78L ) )
+ return error;
+
+ os2 = &face->os2;
+
+ os2->version = GET_UShort();
+ os2->xAvgCharWidth = GET_Short();
+ os2->usWeightClass = GET_UShort();
+ os2->usWidthClass = GET_UShort();
+ os2->fsType = GET_Short();
+ os2->ySubscriptXSize = GET_Short();
+ os2->ySubscriptYSize = GET_Short();
+ os2->ySubscriptXOffset = GET_Short();
+ os2->ySubscriptYOffset = GET_Short();
+ os2->ySuperscriptXSize = GET_Short();
+ os2->ySuperscriptYSize = GET_Short();
+ os2->ySuperscriptXOffset = GET_Short();
+ os2->ySuperscriptYOffset = GET_Short();
+ os2->yStrikeoutSize = GET_Short();
+ os2->yStrikeoutPosition = GET_Short();
+ os2->sFamilyClass = GET_Short();
+
+ for ( i = 0; i < 10; i++ )
+ os2->panose[i] = GET_Byte();
+
+ os2->ulUnicodeRange1 = GET_ULong();
+ os2->ulUnicodeRange2 = GET_ULong();
+ os2->ulUnicodeRange3 = GET_ULong();
+ os2->ulUnicodeRange4 = GET_ULong();
+
+ for ( i = 0; i < 4; i++ )
+ os2->achVendID[i] = GET_Byte();
+
+ os2->fsSelection = GET_UShort();
+ os2->usFirstCharIndex = GET_UShort();
+ os2->usLastCharIndex = GET_UShort();
+ os2->sTypoAscender = GET_Short();
+ os2->sTypoDescender = GET_Short();
+ os2->sTypoLineGap = GET_Short();
+ os2->usWinAscent = GET_UShort();
+ os2->usWinDescent = GET_UShort();
+
+ FORGET_Frame();
+
+ if ( os2->version >= 0x0001 )
+ {
+ /* only version 1 tables */
+
+ if ( ACCESS_Frame( 8L ) ) /* read into frame */
+ return error;
+
+ os2->ulCodePageRange1 = GET_ULong();
+ os2->ulCodePageRange2 = GET_ULong();
+
+ FORGET_Frame();
+ }
+ else
+ {
+ os2->ulCodePageRange1 = 0;
+ os2->ulCodePageRange2 = 0;
+ }
+
+ PTRACE2(( "loaded\n" ));
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_PostScript
+ *
+ * Description : Loads the post table into face table.
+ *
+ * Input : face face table to look for
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_PostScript( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ Long i;
+
+ TT_Postscript* post = &face->postscript;
+
+
+ PTRACE2(( "PostScript " ));
+
+ if ( ( i = TT_LookUp_Table( face, TTAG_post ) ) < 0 )
+ return TT_Err_Post_Table_Missing;
+
+ if ( FILE_Seek( face->dirTables[i].Offset ) ||
+ ACCESS_Frame( 32L ) )
+ return error;
+
+ /* read frame data into face table */
+
+ post->FormatType = GET_ULong();
+ post->italicAngle = GET_ULong();
+ post->underlinePosition = GET_Short();
+ post->underlineThickness = GET_Short();
+ post->isFixedPitch = GET_ULong();
+ post->minMemType42 = GET_ULong();
+ post->maxMemType42 = GET_ULong();
+ post->minMemType1 = GET_ULong();
+ post->maxMemType1 = GET_ULong();
+
+ FORGET_Frame();
+
+ /* we don't load the glyph names, we do that in a */
+ /* library extension (ftxpost). */
+
+ PTRACE2(( "loaded\n" ));
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Hdmx
+ *
+ * Description : Loads the horizontal device metrics table.
+ *
+ * Input : face face object to look for
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Hdmx( PFace face )
+ {
+ DEFINE_LOCALS;
+
+ TT_Hdmx_Record* rec;
+ TT_Hdmx hdmx;
+ Long table;
+ UShort n, num_glyphs;
+ Long record_size;
+
+
+ hdmx.version = 0;
+ hdmx.num_records = 0;
+ hdmx.records = 0;
+
+ face->hdmx = hdmx;
+
+ if ( ( table = TT_LookUp_Table( face, TTAG_hdmx ) ) < 0 )
+ return TT_Err_Ok;
+
+ if ( FILE_Seek( face->dirTables[table].Offset ) ||
+ ACCESS_Frame( 8L ) )
+ return error;
+
+ hdmx.version = GET_UShort();
+ hdmx.num_records = GET_Short();
+ record_size = GET_Long();
+
+ FORGET_Frame();
+
+ /* Only recognize format 0 */
+
+ if ( hdmx.version != 0 )
+ return TT_Err_Ok;
+
+ if ( ALLOC( hdmx.records, sizeof ( TT_Hdmx_Record ) * hdmx.num_records ) )
+ return error;
+
+ num_glyphs = face->numGlyphs;
+ record_size -= num_glyphs+2;
+ rec = hdmx.records;
+
+ for ( n = 0; n < hdmx.num_records; n++ )
+ {
+ /* read record */
+
+ if ( ACCESS_Frame( 2L ) )
+ goto Fail;
+
+ rec->ppem = GET_Byte();
+ rec->max_width = GET_Byte();
+
+ FORGET_Frame();
+
+ if ( ALLOC( rec->widths, num_glyphs ) ||
+ FILE_Read( rec->widths, num_glyphs ) )
+ goto Fail;
+
+ /* skip padding bytes */
+ if ( record_size > 0 )
+ if ( FILE_Skip( record_size ) )
+ goto Fail;
+
+ rec++;
+ }
+
+ face->hdmx = hdmx;
+
+ return TT_Err_Ok;
+
+ Fail:
+ for ( n = 0; n < hdmx.num_records; n++ )
+ FREE( hdmx.records[n].widths );
+
+ FREE( hdmx.records );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Free_TrueType_Hdmx
+ *
+ * Description : Frees the horizontal device metrics table.
+ *
+ * Input : face face object to look for
+ *
+ * Output : TT_Err_Ok.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Free_TrueType_Hdmx( PFace face )
+ {
+ UShort n;
+
+
+ if ( !face )
+ return TT_Err_Ok;
+
+ for ( n = 0; n < face->hdmx.num_records; n++ )
+ FREE( face->hdmx.records[n].widths );
+
+ FREE( face->hdmx.records );
+ face->hdmx.num_records = 0;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Load_TrueType_Any
+ *
+ * Description : Loads any font table in clinet memory. Used by
+ * the TT_Get_Font_Data API
+ *
+ * Input : face face object to look for
+ *
+ * tag tag of table to load. Use the value 0 if you
+ * want to access the whole font file, else set
+ * this parameter to a valid TrueType table tag
+ * that you can forge with the MAKE_TT_TAG
+ * macro.
+ *
+ * offset starting offset in the table (or the file
+ * if tag == 0 )
+ *
+ * buffer address of target buffer
+ *
+ * length address of decision variable :
+ *
+ * if length == NULL :
+ * load the whole table. returns an
+ * an error if 'offset' == 0 !!
+ *
+ * if *length == 0 :
+ * exit immediately, returning the
+ * length of the given table, or of
+ * the font file, depending on the
+ * value of 'tag'
+ *
+ * if *length != 0 :
+ * load the next 'length' bytes of
+ * table or font, starting at offset
+ * 'offset' (in table or font too).
+ *
+ * Output : Error condition
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Load_TrueType_Any( PFace face,
+ ULong tag,
+ Long offset,
+ void* buffer,
+ Long* length )
+ {
+ TT_Stream stream;
+ TT_Error error;
+ Long table;
+ ULong size;
+
+
+ if ( tag != 0 )
+ {
+ /* look for tag in font directory */
+ table = TT_LookUp_Table( face, tag );
+ if ( table < 0 )
+ return TT_Err_Table_Missing;
+
+ offset += face->dirTables[table].Offset;
+ size = face->dirTables[table].Length;
+ }
+ else
+ /* tag = 0 -- the use want to access the font file directly */
+ size = TT_Stream_Size( face->stream );
+
+ if ( length && *length == 0 )
+ {
+ *length = size;
+ return TT_Err_Ok;
+ }
+
+ if ( length )
+ size = *length;
+
+ if ( !USE_Stream( face->stream, stream ) )
+ (void)FILE_Read_At( offset, buffer, size );
+ DONE_Stream( stream );
+
+ return error;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttload.h b/xc/extras/FreeType/lib/ttload.h
new file mode 100644
index 000000000..8db7382dd
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttload.h
@@ -0,0 +1,203 @@
+/*******************************************************************
+ *
+ * ttload.h 1.1
+ *
+ * TrueType Tables Loader.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * Changes between 1.1 and 1.0 :
+ *
+ * - add function Load_TrueType_Any used by TT_Get_Font_Data
+ *
+ ******************************************************************/
+
+#ifndef TTLOAD_H
+#define TTLOAD_H
+
+#include "ttconfig.h"
+#include "tttypes.h"
+#include "ttobjs.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ EXPORT_DEF Long TT_LookUp_Table( PFace face,
+ ULong tag );
+
+ LOCAL_DEF TT_Error Load_TrueType_Directory ( PFace face,
+ ULong faceIndex );
+
+ LOCAL_DEF TT_Error Load_TrueType_MaxProfile ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_Gasp ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_Header ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_Locations ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_Names ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_CVT ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_CMap ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_Programs ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_OS2 ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_PostScript ( PFace face );
+ LOCAL_DEF TT_Error Load_TrueType_Hdmx ( PFace face );
+
+ LOCAL_DEF TT_Error Load_TrueType_Metrics_Header( PFace face,
+ Bool vertical );
+
+ LOCAL_DEF TT_Error Load_TrueType_Any( PFace face,
+ ULong tag,
+ Long offset,
+ void* buffer,
+ Long* length );
+
+ LOCAL_DEF TT_Error Free_TrueType_Names( PFace face );
+ LOCAL_DEF TT_Error Free_TrueType_Hdmx ( PFace face );
+
+
+/* The following macros are defined to simplify the writing of */
+/* the various table and glyph loaders. */
+
+/* For examples see the code in ttload.c, ttgload.c etc. */
+
+#define USE_Stream( original, duplicate ) \
+ ( (error = TT_Use_Stream( original, &duplicate )) != TT_Err_Ok )
+
+#define DONE_Stream( _stream ) \
+ TT_Done_Stream( &_stream )
+
+/* Define a file frame -- use it only when needed */
+#define DEFINE_A_FRAME TFileFrame frame = TT_Null_FileFrame
+
+/* Define a stream -- use it only when needed */
+#define DEFINE_A_STREAM TT_Stream stream
+
+
+#ifdef TT_CONFIG_OPTION_THREAD_SAFE /* re-entrant implementation */
+
+/* The following macros define the necessary local */
+/* variables used to access streams and frames. */
+
+/* Define stream locals with frame */
+#define DEFINE_STREAM_LOCALS \
+ TT_Error error; \
+ DEFINE_A_STREAM; \
+ DEFINE_A_FRAME
+
+/* Define stream locals without frame */
+#define DEFINE_STREAM_LOCALS_WO_FRAME \
+ TT_Error error; \
+ DEFINE_A_STREAM
+
+/* Define locals with a predefined stream in reentrant mode -- see ttload.c */
+#define DEFINE_LOAD_LOCALS( STREAM ) \
+ TT_Error error; \
+ DEFINE_A_STREAM = (STREAM); \
+ DEFINE_A_FRAME
+
+/* Define locals without frame with a predefined stream - see ttload.c */
+#define DEFINE_LOAD_LOCALS_WO_FRAME( STREAM ) \
+ TT_Error error; \
+ DEFINE_A_STREAM = (STREAM)
+
+/* Define all locals necessary to access a font file */
+#define DEFINE_ALL_LOCALS \
+ TT_Error error; \
+ DEFINE_A_STREAM; \
+ DEFINE_A_FRAME
+
+
+#define ACCESS_Frame( _size_ ) \
+ ( (error = TT_Access_Frame( stream, &frame, _size_ )) != TT_Err_Ok )
+#define CHECK_ACCESS_Frame( _size_ ) \
+ ( (error = TT_Check_And_Access_Frame( stream, &frame, _size_ )) != TT_Err_Ok )
+#define FORGET_Frame() \
+ ( (void)TT_Forget_Frame( &frame ) )
+
+#define GET_Byte() TT_Get_Byte ( &frame )
+#define GET_Char() TT_Get_Char ( &frame )
+#define GET_UShort() TT_Get_UShort( &frame )
+#define GET_Short() TT_Get_Short ( &frame )
+#define GET_Long() TT_Get_Long ( &frame )
+#define GET_ULong() TT_Get_ULong ( &frame )
+#define GET_Tag4() TT_Get_ULong ( &frame )
+
+#define FILE_Pos() TT_File_Pos ( stream )
+
+#define FILE_Seek( _position_ ) \
+ ( (error = TT_Seek_File( stream, _position_ )) != TT_Err_Ok )
+#define FILE_Skip( _distance_ ) \
+ ( (error = TT_Skip_File( stream, _distance_ )) != TT_Err_Ok )
+#define FILE_Read( buffer, count ) \
+ ( (error = TT_Read_File ( stream, buffer, count )) != TT_Err_Ok )
+#define FILE_Read_At( pos, buffer, count ) \
+ ( (error = TT_Read_At_File( stream, pos, buffer, count )) != TT_Err_Ok )
+
+#else /* thread-safe implementation */
+
+/* Define stream locals with frame -- nothing in thread-safe mode */
+#define DEFINE_STREAM_LOCALS \
+ TT_Error error
+
+/* Define stream locals without frame -- nothing in thread-safe mode */
+#define DEFINE_STREAM_LOCALS_WO_FRAME \
+ TT_Error error
+
+/* Define locals with a predefined stream in reentrant mode -- see ttload.c */
+#define DEFINE_LOAD_LOCALS( STREAM ) \
+ TT_Error error
+
+
+/* Define locals without frame with a predefined stream - see ttload.c */
+#define DEFINE_LOAD_LOCALS_WO_FRAME( STREAM ) \
+ TT_Error error
+
+/* Define all locals necessary to access a font file */
+#define DEFINE_ALL_LOCALS \
+ TT_Error error; \
+ DEFINE_A_STREAM
+
+
+#define ACCESS_Frame( _size_ ) \
+ ( (error = TT_Access_Frame( _size_ )) != TT_Err_Ok )
+#define CHECK_ACCESS_Frame( _size_ ) \
+ ( (error = TT_Check_And_Access_Frame( _size_ )) != TT_Err_Ok )
+#define FORGET_Frame() \
+ ( (void)TT_Forget_Frame() )
+
+#define GET_Byte() TT_Get_Byte ()
+#define GET_Char() TT_Get_Char ()
+#define GET_UShort() TT_Get_UShort()
+#define GET_Short() TT_Get_Short ()
+#define GET_Long() TT_Get_Long ()
+#define GET_ULong() TT_Get_ULong ()
+#define GET_Tag4() TT_Get_ULong ()
+
+#define FILE_Pos() TT_File_Pos()
+
+#define FILE_Seek( _position_ ) \
+ ( (error = TT_Seek_File( _position_ )) != TT_Err_Ok )
+#define FILE_Skip( _distance_ ) \
+ ( (error = TT_Skip_File( _distance_ )) != TT_Err_Ok )
+#define FILE_Read( buffer, count ) \
+ ( (error = TT_Read_File ( buffer, count )) != TT_Err_Ok )
+#define FILE_Read_At( pos, buffer, count ) \
+ ( (error = TT_Read_At_File( pos, buffer, count )) != TT_Err_Ok )
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTLOAD_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttmemory.c b/xc/extras/FreeType/lib/ttmemory.c
new file mode 100644
index 000000000..753bdc498
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttmemory.c
@@ -0,0 +1,389 @@
+/*******************************************************************
+ *
+ * ttmemory.c 1.2
+ *
+ * Memory management component (body).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ *
+ * Changes between 1.1 and 1.2:
+ *
+ * - the font pool is gone.
+ *
+ * - introduced the FREE macro and the Free function for
+ * future use in destructors.
+ *
+ * - Init_FontPool() is now a macro to allow the compilation of
+ * 'legacy' applications (all four test programs have been updated).
+ *
+ ******************************************************************/
+
+#include "ttdebug.h"
+#include "ttmemory.h"
+#include "ttengine.h"
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_memory
+
+
+#ifdef DEBUG_MEMORY
+
+#include <stdio.h>
+
+#define MAX_TRACKED_BLOCKS 1024
+
+ struct TMemRec_
+ {
+ void* base;
+ Long size;
+ };
+
+ typedef struct TMemRec_ TMemRec;
+
+ static TMemRec pointers[MAX_TRACKED_BLOCKS + 1];
+
+ static Int num_alloc;
+ static Int num_free;
+ static Int num_realloc; /* counts only `real' reallocations
+ (i.e., an existing buffer will be resized
+ to a value larger than zero */
+
+ static Int fail_alloc;
+ static Int fail_realloc;
+ static Int fail_free;
+
+#endif /* DEBUG_MEMORY */
+
+
+#ifndef TT_CONFIG_REENTRANT
+ Long TTMemory_Allocated;
+ Long TTMemory_MaxAllocated;
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : TT_Alloc
+ *
+ * Description : Allocates memory from the heap buffer.
+ *
+ * Input : Size size of the memory to be allocated
+ * P pointer to a buffer pointer
+ *
+ * Output : Error code.
+ *
+ * NOTE : The newly allocated block should _always_ be zeroed
+ * on return. Many parts of the engine rely on this to
+ * work properly.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Alloc( Long Size, void** P )
+ {
+#ifdef DEBUG_MEMORY
+ Int i;
+#endif
+
+
+ if ( !P )
+ return TT_Err_Invalid_Argument;
+
+ if ( Size > 0 )
+ {
+ *P = (void*)malloc( Size );
+ if ( !*P )
+ return TT_Err_Out_Of_Memory;
+
+#ifndef TT_CONFIG_REENTRANT
+ TTMemory_Allocated += Size;
+ TTMemory_MaxAllocated += Size;
+#endif
+
+#ifdef DEBUG_MEMORY
+
+ num_alloc++;
+
+ i = 0;
+ while ( i < MAX_TRACKED_BLOCKS && pointers[i].base != NULL )
+ i++;
+
+ if ( i >= MAX_TRACKED_BLOCKS )
+ fail_alloc++;
+ else
+ {
+ pointers[i].base = *P;
+ pointers[i].size = Size;
+ }
+
+#endif /* DEBUG_MEMORY */
+
+ MEM_Set( *P, 0, Size );
+ }
+ else
+ *P = NULL;
+
+ return TT_Err_Ok;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+
+
+/*******************************************************************
+ *
+ * Function : TT_Realloc
+ *
+ * Description : Reallocates memory from the heap buffer.
+ *
+ * Input : Size new size of the memory to be allocated;
+ * if zero or negative, TT_Free() will be called
+ * P pointer to a buffer pointer; if *P == NULL,
+ * TT_Alloc() will be called
+ *
+ * Output : Error code.
+ *
+ * NOTES : It's not necessary to zero the memory in case the
+ * reallocated buffer is larger than before -- the
+ * application has to take care of this.
+ *
+ * If the memory request fails, TT_Free() will be
+ * called on *P, and TT_Err_Out_Of_Memory returned.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Realloc( Long Size, void** P )
+ {
+ void* Q;
+
+#ifdef DEBUG_MEMORY
+ Int i;
+#endif
+
+
+ if ( !P )
+ return TT_Err_Invalid_Argument;
+
+ if ( !*P )
+ return TT_Alloc( Size, P );
+
+ if ( Size <= 0 )
+ return TT_Free( P );
+
+ Q = (void*)realloc( *P, Size );
+ if ( !Q )
+ {
+ TT_Free( *P );
+ return TT_Err_Out_Of_Memory;
+ }
+
+#ifdef DEBUG_MEMORY
+
+ num_realloc++;
+
+ i = 0;
+ while ( i < MAX_TRACKED_BLOCKS && pointers[i].base != *P )
+ i++;
+
+ if ( i >= MAX_TRACKED_BLOCKS )
+ fail_realloc++;
+ else
+ {
+#ifndef TT_CONFIG_REENTRANT
+ TTMemory_Allocated += Size - pointers[i].size;
+ if ( Size > pointers[i].size )
+ TTMemory_MaxAllocated += Size - pointers[i].size;
+#endif
+
+ pointers[i].base = Q;
+ pointers[i].size = size;
+ }
+#endif /* DEBUG_MEMORY */
+
+ *P = Q;
+
+ return TT_Err_Ok;
+ }
+
+
+#endif /* TT_CONFIG_OPTION_EXTEND_ENGINE */
+
+
+/*******************************************************************
+ *
+ * Function : TT_Free
+ *
+ * Description : Releases a previously allocated block of memory.
+ *
+ * Input : P pointer to memory block
+ *
+ * Output : Always SUCCESS.
+ *
+ * Note : The pointer must _always_ be set to NULL by this function.
+ *
+ ******************************************************************/
+
+ EXPORT_FUNC
+ TT_Error TT_Free( void** P )
+ {
+#ifdef DEBUG_MEMORY
+ Int i;
+#endif /* DEBUG_MEMORY */
+
+
+ if ( !P || !*P )
+ return TT_Err_Ok;
+
+#ifdef DEBUG_MEMORY
+
+ num_free++;
+
+ i = 0;
+ while ( i < MAX_TRACKED_BLOCKS && pointers[i].base != *P )
+ i++;
+
+ if ( i >= MAX_TRACKED_BLOCKS )
+ fail_free++;
+ else
+ {
+#ifndef TT_CONFIG_REENTRANT
+ TTMemory_Allocated -= pointers[i].size;
+#endif
+
+ pointers[i].base = NULL;
+ pointers[i].size = 0;
+ }
+#endif /* DEBUG_MEMORY */
+
+ free( *P );
+
+ *P = NULL;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTMemory_Init
+ *
+ * Description : Initializes the memory.
+ *
+ * Output : Always SUCCESS.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTMemory_Init( void )
+ {
+#ifdef DEBUG_MEMORY
+ Int i;
+
+
+ for ( i = 0; i < MAX_TRACKED_BLOCKS; i++ )
+ {
+ pointers[i].base = NULL;
+ pointers[i].size = 0;
+ }
+
+ num_alloc = 0;
+ num_realloc = 0;
+ num_free = 0;
+
+ fail_alloc = 0;
+ fail_realloc = 0;
+ fail_free = 0;
+#endif
+
+
+#ifndef TT_CONFIG_REENTRANT
+ TTMemory_Allocated = 0;
+ TTMemory_MaxAllocated = 0;
+#endif
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTMemory_Done
+ *
+ * Description : Finalizes memory usage.
+ *
+ * Output : Always SUCCESS.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTMemory_Done( void )
+ {
+#ifdef DEBUG_MEMORY
+ Int i, num_leaked, tot_leaked;
+
+
+ num_leaked = 0;
+ tot_leaked = 0;
+
+ for ( i = 0; i < MAX_TRACKED_BLOCKS; i++ )
+ {
+ if ( pointers[i].base )
+ {
+ num_leaked ++;
+ tot_leaked += pointers[i].size;
+ }
+ }
+
+ fprintf( stderr,
+ "%d memory allocations, of which %d failed\n",
+ num_alloc,
+ fail_alloc );
+
+ fprintf( stderr,
+ "%d memory reallocations, of which %d failed\n",
+ num_realloc,
+ fail_realloc );
+
+ fprintf( stderr,
+ "%d memory frees, of which %d failed\n",
+ num_free,
+ fail_free );
+
+ if ( num_leaked > 0 )
+ {
+ fprintf( stderr,
+ "There are %d leaked memory blocks, totalizing %d bytes\n",
+ num_leaked, tot_leaked );
+
+ for ( i = 0; i < MAX_TRACKED_BLOCKS; i++ )
+ {
+ if ( pointers[i].base )
+ {
+ fprintf( stderr,
+ "index: %4d (base: $%08lx, size: %08ld)\n",
+ i,
+ (long)pointers[i].base,
+ pointers[i].size );
+ }
+ }
+ }
+ else
+ fprintf( stderr, "No memory leaks !\n" );
+
+#endif /* DEBUG_MEMORY */
+
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttmemory.h b/xc/extras/FreeType/lib/ttmemory.h
new file mode 100644
index 000000000..0a6de1096
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttmemory.h
@@ -0,0 +1,129 @@
+/*******************************************************************
+ *
+ * ttmemory.h 1.2
+ *
+ * Memory management component (specification).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Changes between 1.2 and 1.1:
+ *
+ * - the font pool is gone! All allocations are now performed
+ * with malloc() and free().
+ *
+ * - introduced the FREE() macro and the Free() function for
+ * future use in destructors.
+ *
+ * - Init_FontPool() is now a macro to allow the compilation of
+ * 'legacy' applications (all four test programs have been updated).
+ *
+ ******************************************************************/
+/* $XFree86: xc/extras/FreeType/lib/ttmemory.h,v 1.3 1999/01/24 03:38:35 dawes Exp $ */
+
+#ifndef TTMEMORY_H
+#define TTMEMORY_H
+
+#include "ttconfig.h"
+#include "tttypes.h"
+/* Removed for XFree86 module support */
+#if 0
+#include <string.h>
+#endif
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#define MEM_Set( dest, byte, count ) memset( dest, byte, count )
+
+#ifdef HAVE_MEMCPY
+#define MEM_Copy( dest, source, count ) memcpy( dest, source, count )
+#else
+#define MEM_Copy( dest, source, count ) bcopy( source, dest, count )
+#endif
+
+#ifdef HAVE_MEMMOVE
+#define MEM_Move( dest, source, count ) memmove( dest, source, count )
+#else
+#define MEM_Move( dest, source, count ) bcopy( source, dest, count )
+#endif
+
+
+#define MEM_Alloc( _pointer_, _size_ ) \
+ TT_Alloc( _size_, (void**)&(_pointer_) )
+
+#define MEM_Realloc( _pointer_, _size_ ) \
+ TT_Realloc( _size_, (void**)&(_pointer_) )
+
+#define ALLOC( _pointer_, _size_ ) \
+ ( ( error = MEM_Alloc( _pointer_, _size_ ) ) != TT_Err_Ok )
+
+#define ALLOC_ARRAY( _pointer_, _count_, _type_ ) \
+ ( ( error = MEM_Alloc( _pointer_, \
+ (_count_) * sizeof ( _type_ ) ) ) != TT_Err_Ok )
+
+#define REALLOC( _pointer_, _size_ ) \
+ ( ( error = MEM_Realloc( _pointer_, _size_ ) ) != TT_Err_Ok )
+
+#define REALLOC_ARRAY( _pointer_, _count_, _type_ ) \
+ ( (error = MEM_Realloc( _pointer_, \
+ (_count_) * sizeof ( _type_ ) ) ) != TT_Err_Ok )
+
+#define FREE( _pointer_ ) \
+ TT_Free( (void**)&(_pointer_) )
+
+
+ /* Allocate a block of memory of 'Size' bytes from the heap, and */
+ /* sets the pointer '*P' to its address. If 'Size' is 0, or in */
+ /* case of error, the pointer is always set to NULL. */
+
+ EXPORT_DEF
+ TT_Error TT_Alloc( Long Size, void** P );
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+
+ /* Reallocates a block of memory pointed to by '*P' to 'Size' */
+ /* bytes from the heap, possibly changing '*P'. If 'Size' is 0, */
+ /* TT_Free() is called, if '*P' is NULL, TT_Alloc() is called. */
+ /* '*P' is freed (if it's non-NULL) in case of error. */
+
+ EXPORT_DEF
+ TT_Error TT_Realloc( Long Size, void** P );
+
+#endif /* TT_CONFIG_OPTION_EXTEND_ENGINE */
+
+ /* Releases a block that was previously allocated through Alloc. */
+ /* Note that the function returns successfully when P or *P are */
+ /* already NULL. The pointer '*P' is set to NULL on exit in */
+ /* case of success. */
+
+ EXPORT_DEF
+ TT_Error TT_Free( void** P );
+
+
+ /* For "legacy" applications, that should be re-coded. */
+ /* Note that this won't release the previously allocated font pool. */
+
+#define Init_FontPool( x, y ) while( 0 ) { }
+
+
+ LOCAL_DEF TT_Error TTMemory_Init( void );
+ LOCAL_DEF TT_Error TTMemory_Done( void );
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTMEMORY_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttmutex.c b/xc/extras/FreeType/lib/ttmutex.c
new file mode 100644
index 000000000..d8a19dda6
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttmutex.c
@@ -0,0 +1,85 @@
+/*******************************************************************
+ *
+ * ttmutex.c 1.0
+ *
+ * Mutual exclusion object, single-threaded implementation
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * NOTE: This is a generic non-functional implementation
+ * that you are welcome to refine for your own system.
+ *
+ * Please name your system-specific source with a
+ * different name (like ttmutex-os2.c or ttmutex-linux.c)
+ * and change your makefile accordingly.
+ *
+ ******************************************************************/
+
+#include "ttmutex.h"
+
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_mutex
+
+
+/* ANSI C prevents the compilation of empty units. We thus introduce */
+/* a dummy typedef to get rid of compiler warnings/errors. */
+/* Note that gcc's -ansi -pedantic does not report any error here. */
+/* Watcom, VC++ or Borland C++ do however. */
+
+ typedef void _ttmutex_to_satisfy_ANSI_C_;
+
+
+#ifdef TT_CONFIG_OPTION_THREAD_SAFE
+
+ LOCAL_FUNC
+ void TT_Mutex_Create ( TMutex* mutex )
+ {
+ *mutex = (void*)-1;
+ /* Replace this line with your own mutex creation code */
+ }
+
+
+ LOCAL_FUNC
+ void TT_Mutex_Delete ( TMutex* mutex )
+ {
+ *mutex = (void*)0;
+ /* Replace this line with your own mutex destruction code */
+ }
+
+
+ LOCAL_FUNC
+ void TT_Mutex_Lock ( TMutex* mutex )
+ {
+ /* NOTE: It is legal to call this function with a NULL argument */
+ /* in which case an immediate return is appropriate. */
+ if ( !mutex )
+ return;
+
+ ; /* Insert your own mutex locking code here */
+ }
+
+
+ LOCAL_FUNC
+ void TT_Mutex_Release( TMutex* mutex )
+ {
+ /* NOTE: It is legal to call this function with a NULL argument */
+ /* in which case an immediate return is appropriate */
+ if ( !mutex )
+ return;
+
+ ; /* Insert your own mutex release code here */
+ }
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttmutex.h b/xc/extras/FreeType/lib/ttmutex.h
new file mode 100644
index 000000000..424e8e77a
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttmutex.h
@@ -0,0 +1,59 @@
+/*******************************************************************
+ *
+ * ttmutex.h 1.0
+ *
+ * Mutual exclusion object / dummy generic interface.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * Note: This file provides a generic interface. The implementation
+ * to compile depends on your system and the type of
+ * library you want to build (either singly-threaded,
+ * thread-safe or re-entrant).
+ *
+ * Please read the technical documentation for more details.
+ *
+ ******************************************************************/
+
+#ifndef TTMUTEX_H
+#define TTMUTEX_H
+
+#include "ttconfig.h"
+
+
+ typedef void* TMutex; /* typeless reference to a mutex */
+
+#ifdef TT_CONFIG_OPTION_THREAD_SAFE /* thread-safe and re-entrant builds */
+
+#define MUTEX_Create( mutex ) TT_Mutex_Create ( &(mutex) )
+#define MUTEX_Destroy( mutex ) TT_Mutex_Delete ( &(mutex) )
+#define MUTEX_Lock( mutex ) TT_Mutex_Lock ( &(mutex) )
+#define MUTEX_Release( mutex ) TT_Mutex_Release( &(mutex) )
+
+ LOCAL_DEF void TT_Mutex_Create ( TMutex* mutex ); /* Create a new mutex */
+ LOCAL_DEF void TT_Mutex_Delete ( TMutex* mutex ); /* Delete a mutex */
+ LOCAL_DEF void TT_Mutex_Lock ( TMutex* mutex ); /* Lock a mutex. */
+ LOCAL_DEF void TT_Mutex_Release( TMutex* mutex ); /* Release a mutex */
+
+#else /* for the single-thread build */
+
+#define MUTEX_Create( mutex ) /* nothing */
+#define MUTEX_Destroy( mutex ) /* nothing */
+#define MUTEX_Lock( mutex ) /* nothing */
+#define MUTEX_Release( mutex ) /* nothing */
+
+ /* No code will be generated for mutex operations */
+
+#endif /* TT_CONFIG_OPTION_THREAD_SAFE */
+
+#endif /* TTMUTEX_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttobjs.c b/xc/extras/FreeType/lib/ttobjs.c
new file mode 100644
index 000000000..d3ab769c0
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttobjs.c
@@ -0,0 +1,1471 @@
+/*******************************************************************
+ *
+ * ttobjs.c 1.0
+ *
+ * Objects manager.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "ttobjs.h"
+#include "ttfile.h"
+#include "ttcalc.h"
+#include "ttmemory.h"
+#include "ttload.h"
+#include "ttinterp.h"
+#include "ttdebug.h"
+
+
+/* Add extensions definition */
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+#include "ttextend.h"
+#endif
+
+/* Required by tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_objs
+
+/*******************************************************************
+ *
+ * Function : New_Context
+ *
+ * Description : Creates a new execution context for a given
+ * face object.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ PExecution_Context New_Context( PFace face )
+ {
+ PEngine_Instance engine;
+ PExecution_Context exec;
+
+
+ if ( !face )
+ return NULL;
+
+ engine = face->engine;
+ CACHE_New( engine->objs_exec_cache, exec, face );
+ return exec;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Done_Context
+ *
+ * Description : Discards an execution context.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Done_Context( PExecution_Context exec )
+ {
+ PEngine_Instance engine;
+
+
+ if ( !exec )
+ return TT_Err_Ok;
+
+ engine = exec->face->engine;
+ return CACHE_Done( engine->objs_exec_cache, exec );
+ }
+
+
+#if 0
+
+/*******************************************************************
+ *
+ * Function : New_Instance
+ *
+ * Description : Creates a new instance for a given face object.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ PInstance New_Instance( PFace face )
+ {
+ PInstance ins;
+
+
+ if ( !face )
+ return NULL;
+
+ CACHE_New( &face->instances, ins, face );
+
+ return ins;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Done_Instance
+ *
+ * Description : Discards an instance.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Done_Instance( PInstance instance )
+ {
+ return CACHE_Done( &instance->owner->instances, instance );
+ }
+
+#endif
+
+
+/*******************************************************************
+ * *
+ * GLYPH ZONE FUNCTIONS *
+ * *
+ * *
+ *******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : New_Glyph_Zone
+ *
+ * Description : Allocates a new glyph zone
+ *
+ * Input : pts pointer to the target glyph zone record
+ * maxPoints capacity of glyph zone in points
+ * maxContours capacity of glyph zone in contours
+ *
+ * Return : Error code.
+ *
+ *****************************************************************/
+
+ static
+ TT_Error New_Glyph_Zone( PGlyph_Zone pts,
+ UShort maxPoints,
+ UShort maxContours )
+ {
+ TT_Error error;
+
+
+ if ( ALLOC( pts->org, maxPoints * 2 * sizeof ( TT_F26Dot6 ) ) ||
+ ALLOC( pts->cur, maxPoints * 2 * sizeof ( TT_F26Dot6 ) ) ||
+ ALLOC( pts->touch, maxPoints * sizeof ( Byte ) ) ||
+ ALLOC( pts->contours, maxContours * sizeof ( Short ) ) )
+ return error;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Done_Glyph_Zone
+ *
+ * Description : Deallocates a glyph zone
+ *
+ * Input : pts pointer to the target glyph zone record
+ *
+ * Return : Error code.
+ *
+ *****************************************************************/
+
+ static
+ TT_Error Done_Glyph_Zone( PGlyph_Zone pts )
+ {
+ FREE( pts->contours );
+ FREE( pts->touch );
+ FREE( pts->cur );
+ FREE( pts->org );
+
+ return TT_Err_Ok;
+ }
+
+
+
+/*******************************************************************
+ * *
+ * CODERANGE FUNCTIONS *
+ * *
+ *******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : Goto_CodeRange
+ *
+ * Description : Switch to a new code range (updates Code and IP).
+ *
+ * Input : exec target execution context
+ * range new execution code range
+ * IP new IP in new code range
+ *
+ * Output : SUCCESS on success. FAILURE on error (no code range).
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Goto_CodeRange( PExecution_Context exec,
+ Int range,
+ Long IP )
+ {
+ PCodeRange cr;
+
+
+ if ( range < 1 || range > 3 )
+ return TT_Err_Bad_Argument;
+
+ cr = &exec->codeRangeTable[range - 1];
+
+ if ( cr->Base == NULL )
+ return TT_Err_Invalid_CodeRange;
+
+ /* NOTE: Because the last instruction of a program may be a CALL */
+ /* which will return to the first byte *after* the code */
+ /* range, we test for IP <= Size, instead of IP < Size. */
+
+ if ( IP > cr->Size )
+ return TT_Err_Code_Overflow;
+
+ exec->code = cr->Base;
+ exec->codeSize = cr->Size;
+ exec->IP = IP;
+ exec->curRange = range;
+
+ return TT_Err_Ok;
+ }
+
+
+#if 0
+
+/*******************************************************************
+ *
+ * Function : Get_CodeRange
+ *
+ * Description : Returns a pointer to a given code range. Should
+ * be used only by the debugger. Returns NULL if
+ * 'range' is out of current bounds.
+ *
+ * Input : exec target execution context
+ * range new execution code range
+ *
+ * Output : Pointer to the code range record. NULL on failure.
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ PCodeRange Get_CodeRange( PExecution_Context exec, Int range )
+ {
+ if ( range < 1 || range > 3 )
+ return NULL;
+ else /* arrays start with 1 in Pascal, and with 0 in C */
+ return &exec->codeRangeTable[range - 1];
+ }
+
+#endif
+
+
+/*******************************************************************
+ *
+ * Function : Set_CodeRange
+ *
+ * Description : Sets a code range.
+ *
+ * Input : exec target execution context
+ * range code range index
+ * base new code base
+ * length sange size in bytes
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Set_CodeRange( PExecution_Context exec,
+ Int range,
+ void* base,
+ Long length )
+ {
+ if ( range < 1 || range > 3 )
+ return TT_Err_Bad_Argument;
+
+ exec->codeRangeTable[range - 1].Base = (Byte*)base;
+ exec->codeRangeTable[range - 1].Size = length;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Clear_CodeRange
+ *
+ * Description : Clears a code range.
+ *
+ * Input : exec target execution context
+ * range code range index
+ *
+ * Output : SUCCESS on success. FAILURE on error.
+ *
+ * Note : Does not set the Error variable.
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Clear_CodeRange( PExecution_Context exec, Int range )
+ {
+ if ( range < 1 || range > 3 )
+ return TT_Err_Bad_Argument;
+
+ exec->codeRangeTable[range - 1].Base = NULL;
+ exec->codeRangeTable[range - 1].Size = 0;
+
+ return TT_Err_Ok;
+ }
+
+
+
+/*******************************************************************
+ * *
+ * EXECUTION CONTEXT ROUTINES *
+ * *
+ *******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : Context_Destroy
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Context_Destroy( void* _context )
+ {
+ PExecution_Context exec = (PExecution_Context)_context;
+
+ if ( !exec )
+ return TT_Err_Ok;
+
+ /* free composite load stack */
+ FREE( exec->loadStack );
+ exec->loadSize = 0;
+
+ /* points zone */
+ Done_Glyph_Zone( &exec->pts );
+ exec->maxPoints = 0;
+ exec->maxContours = 0;
+
+ /* free stack */
+ FREE( exec->stack );
+ exec->stackSize = 0;
+
+ /* free call stack */
+ FREE( exec->callStack );
+ exec->callSize = 0;
+ exec->callTop = 0;
+
+ /* free glyph code range */
+ FREE( exec->glyphIns );
+ exec->glyphSize = 0;
+
+ exec->instance = NULL;
+ exec->face = NULL;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Context_Create
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Context_Create( void* _context, void* _face )
+ {
+ PExecution_Context exec = (PExecution_Context)_context;
+
+ PFace face = (PFace)_face;
+ TT_Error error;
+
+
+ /* XXX : We don't reserve arrays anymore, this is done automatically */
+ /* during a "Context_Load".. */
+
+ exec->callSize = 32;
+ if ( ALLOC_ARRAY( exec->callStack, exec->callSize, TCallRecord ) )
+ goto Fail_Memory;
+
+ /* all values in the context are set to 0 already, but this is */
+ /* here as a remainder */
+ exec->maxPoints = 0;
+ exec->maxContours = 0;
+
+ exec->stackSize = 0;
+ exec->loadSize = 0;
+ exec->glyphSize = 0;
+
+ exec->stack = NULL;
+ exec->loadStack = NULL;
+ exec->glyphIns = NULL;
+
+ exec->face = face;
+ exec->instance = NULL;
+
+ return TT_Err_Ok;
+
+ Fail_Memory:
+ Context_Destroy( exec );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Context_Load
+ *
+ *****************************************************************/
+
+/****************************************************************/
+/* */
+/* Update_Max : Reallocate a buffer if it needs to */
+/* */
+/* input: size address of buffer's current size */
+/* expressed in elements */
+/* */
+/* multiplier size in bytes of each element in the */
+/* buffer */
+/* */
+/* buff address of the buffer base pointer */
+/* */
+/* new_max new capacity (size) of the buffer */
+
+ static
+ TT_Error Update_Max( ULong* size,
+ Long multiplier,
+ void** buff,
+ Long new_max )
+ {
+ TT_Error error;
+
+ if ( *size < new_max )
+ {
+ FREE( *buff );
+ if ( ALLOC( *buff, new_max * multiplier ) )
+ return error;
+ *size = new_max;
+ }
+ return TT_Err_Ok;
+ }
+
+
+/****************************************************************/
+/* */
+/* Update_Zone: Reallocate a zone if it needs to */
+/* */
+/* input: zone address of the target zone */
+/* */
+/* maxPoints address of the zone's current capacity */
+/* in points */
+/* */
+/* maxContours address of the zone's current capacity */
+/* in contours */
+/* */
+/* newPoints new capacity in points */
+/* */
+/* newContours new capacity in contours */
+/* */
+
+ static
+ TT_Error Update_Zone( PGlyph_Zone zone,
+ UShort* maxPoints,
+ UShort* maxContours,
+ UShort newPoints,
+ UShort newContours )
+ {
+ if ( *maxPoints < newPoints || *maxContours < newContours )
+ {
+ TT_Error error;
+
+
+ Done_Glyph_Zone( zone );
+
+ error = New_Glyph_Zone( zone, newPoints, newContours );
+ if ( error )
+ return error;
+
+ *maxPoints = newPoints;
+ *maxContours = newContours;
+ }
+ return TT_Err_Ok;
+ }
+
+
+ LOCAL_FUNC
+ TT_Error Context_Load( PExecution_Context exec,
+ PFace face,
+ PInstance ins )
+ {
+ Int i;
+ TMaxProfile* maxp;
+ TT_Error error;
+
+ exec->face = face;
+ maxp = &face->maxProfile;
+
+ exec->instance = ins;
+
+ if ( ins )
+ {
+ exec->numFDefs = ins->numFDefs;
+ exec->numIDefs = ins->numIDefs;
+ exec->FDefs = ins->FDefs;
+ exec->IDefs = ins->IDefs;
+ exec->metrics = ins->metrics;
+
+ for ( i = 0; i < MAX_CODE_RANGES; i++ )
+ exec->codeRangeTable[i] = ins->codeRangeTable[i];
+
+ /* set graphics state */
+ exec->GS = ins->GS;
+
+ exec->cvtSize = ins->cvtSize;
+ exec->cvt = ins->cvt;
+
+ exec->storeSize = ins->storeSize;
+ exec->storage = ins->storage;
+
+ exec->twilight = ins->twilight;
+ }
+
+ error = Update_Max( &exec->loadSize,
+ sizeof ( TSubglyph_Record ),
+ (void**)&exec->loadStack,
+ face->maxComponents + 1 );
+ if ( error )
+ return error;
+
+ error = Update_Max( &exec->stackSize,
+ sizeof ( TT_F26Dot6 ),
+ (void**)&exec->stack,
+ maxp->maxStackElements + 32 );
+ /* XXX : We reserve a little more elements on the stack to deal safely */
+ /* with broken fonts like arialbs, courbs, timesbs... */
+ if ( error )
+ return error;
+
+ error = Update_Max( &exec->glyphSize,
+ sizeof ( Byte ),
+ (void**)&exec->glyphIns,
+ maxp->maxSizeOfInstructions );
+ if ( error )
+ return error;
+
+ error = Update_Zone( &exec->pts,
+ &exec->maxPoints,
+ &exec->maxContours,
+ exec->face->maxPoints + 2,
+ exec->face->maxContours );
+ /* XXX : We reserve two positions for the phantom points! */
+ if ( error )
+ return error;
+
+ exec->pts.n_points = 0;
+ exec->pts.n_contours = 0;
+
+ exec->instruction_trap = FALSE;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Context_Save
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Context_Save( PExecution_Context exec,
+ PInstance ins )
+ {
+ Int i;
+
+
+ /* XXXX : Will probably disappear soon with all the coderange */
+ /* management, which is now rather obsolete. */
+
+ for ( i = 0; i < MAX_CODE_RANGES; i++ )
+ ins->codeRangeTable[i] = exec->codeRangeTable[i];
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Context_Run
+ *
+ *****************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Context_Run( PExecution_Context exec,
+ Bool debug )
+ {
+ TT_Error error;
+
+
+ if ( (error = Goto_CodeRange( exec, TT_CodeRange_Glyph, 0 )) != TT_Err_Ok )
+ return error;
+
+ exec->zp0 = exec->pts;
+ exec->zp1 = exec->pts;
+ exec->zp2 = exec->pts;
+
+ exec->GS.gep0 = 1;
+ exec->GS.gep1 = 1;
+ exec->GS.gep2 = 1;
+
+ exec->GS.projVector.x = 0x4000;
+ exec->GS.projVector.y = 0x0000;
+
+ exec->GS.freeVector = exec->GS.projVector;
+ exec->GS.dualVector = exec->GS.projVector;
+
+ exec->GS.round_state = 1;
+ exec->GS.loop = 1;
+
+ /* some glyphs leave something on the stack. so we clean it */
+ /* before a new execution. */
+ exec->top = 0;
+ exec->callTop = 0;
+
+ if ( !debug )
+ return RunIns( exec );
+ else
+ return TT_Err_Ok;
+ }
+
+
+ LOCAL_FUNC
+ const TGraphicsState Default_GraphicsState =
+ {
+ 0, 0, 0,
+ { 0x4000, 0 },
+ { 0x4000, 0 },
+ { 0x4000, 0 },
+ 1, 64, 1,
+ TRUE, 68, 0, 0, 9, 3,
+ 0, FALSE, 2, 1, 1, 1
+ };
+
+
+
+/*******************************************************************
+ * *
+ * INSTANCE FUNCTIONS *
+ * *
+ * *
+ *******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : Instance_Destroy
+ *
+ * Description :
+ *
+ * Input : _instance the instance object to destroy
+ *
+ * Output : error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Instance_Destroy( void* _instance )
+ {
+ PInstance ins = (PInstance)_instance;
+
+
+ if ( !_instance )
+ return TT_Err_Ok;
+
+ if ( ins->debug )
+ {
+ /* the debug context must be deleted by the debugger itself */
+ ins->context = NULL;
+ ins->debug = FALSE;
+ }
+
+ FREE( ins->cvt );
+ ins->cvtSize = 0;
+
+ /* free storage area */
+ FREE( ins->storage );
+ ins->storeSize = 0;
+
+ /* twilight zone */
+ Done_Glyph_Zone( &ins->twilight );
+
+ FREE( ins->FDefs );
+ FREE( ins->IDefs );
+ ins->numFDefs = 0;
+ ins->numIDefs = 0;
+
+ ins->owner = NULL;
+ ins->valid = FALSE;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Instance_Create
+ *
+ * Description :
+ *
+ * Input : _instance instance record to initialize
+ * _face parent face object
+ *
+ * Output : Error code. All partially built subtables are
+ * released on error.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Instance_Create( void* _instance,
+ void* _face )
+ {
+ PInstance ins = (PInstance)_instance;
+ PFace face = (PFace)_face;
+ TT_Error error;
+ Int i;
+ UShort n_twilight;
+
+ PMaxProfile maxp = &face->maxProfile;
+
+
+ ins->owner = face;
+ ins->valid = FALSE;
+
+ ins->numFDefs = maxp->maxFunctionDefs;
+ ins->numIDefs = maxp->maxInstructionDefs;
+ ins->cvtSize = face->cvtSize;
+ ins->storeSize = maxp->maxStorage;
+
+ /* Set default metrics */
+ {
+ PIns_Metrics metrics = &ins->metrics;
+
+
+ metrics->pointSize = 10 * 64; /* default pointsize = 10pts */
+
+ metrics->x_resolution = 96; /* default resolution = 96dpi */
+ metrics->y_resolution = 96;
+
+ metrics->x_ppem = 0;
+ metrics->y_ppem = 0;
+
+ metrics->rotated = FALSE;
+ metrics->stretched = FALSE;
+
+ /* set default compensation ( all 0 ) */
+ for ( i = 0; i < 4; i++ )
+ metrics->compensations[i] = 0;
+ }
+
+ /* allocate function defs, instruction defs, cvt and storage area */
+ if ( ALLOC_ARRAY( ins->FDefs, ins->numFDefs, TDefRecord ) ||
+ ALLOC_ARRAY( ins->IDefs, ins->numIDefs, TDefRecord ) ||
+ ALLOC_ARRAY( ins->cvt, ins->cvtSize, Long ) ||
+ ALLOC_ARRAY( ins->storage, ins->storeSize, Long ) )
+ goto Fail_Memory;
+
+ /* reserve twilight zone */
+ n_twilight = maxp->maxTwilightPoints;
+ error = New_Glyph_Zone( &ins->twilight, n_twilight, 0 );
+ if (error)
+ goto Fail_Memory;
+
+ ins->twilight.n_points = n_twilight;
+
+ return TT_Err_Ok;
+
+ Fail_Memory:
+ Instance_Destroy( ins );
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Instance_Init
+ *
+ * Description : Initialize a fresh new instance.
+ * Executes the font program if any is found.
+ *
+ * Input : _instance the instance object to destroy
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Instance_Init( PInstance ins )
+ {
+ PExecution_Context exec;
+
+ TT_Error error;
+ PFace face = ins->owner;
+
+
+ if ( ins->debug )
+ exec = ins->context;
+ else
+ exec = New_Context( face );
+ /* debugging instances have their own context */
+
+ if ( !exec )
+ return TT_Err_Could_Not_Find_Context;
+
+ ins->GS = Default_GraphicsState;
+
+ Context_Load( exec, face, ins );
+
+ exec->callTop = 0;
+ exec->top = 0;
+
+ exec->period = 64;
+ exec->phase = 0;
+ exec->threshold = 0;
+
+ {
+ PIns_Metrics metrics = &exec->metrics;
+
+
+ metrics->x_ppem = 0;
+ metrics->y_ppem = 0;
+ metrics->pointSize = 0;
+ metrics->x_scale1 = 0;
+ metrics->x_scale2 = 1;
+ metrics->y_scale1 = 0;
+ metrics->y_scale2 = 1;
+
+ metrics->ppem = 0;
+ metrics->scale1 = 0;
+ metrics->scale2 = 1;
+ metrics->ratio = 1 << 16;
+ }
+
+ exec->instruction_trap = FALSE;
+
+ exec->cvtSize = ins->cvtSize;
+ exec->cvt = ins->cvt;
+
+ exec->F_dot_P = 0x10000;
+
+ /* allow font program execution */
+ Set_CodeRange( exec,
+ TT_CodeRange_Font,
+ face->fontProgram,
+ face->fontPgmSize );
+
+ /* disable CVT and glyph programs coderange */
+ Clear_CodeRange( exec, TT_CodeRange_Cvt );
+ Clear_CodeRange( exec, TT_CodeRange_Glyph );
+
+ if ( face->fontPgmSize > 0 )
+ {
+ error = Goto_CodeRange( exec, TT_CodeRange_Font, 0 );
+ if ( error )
+ goto Fin;
+
+ error = RunIns( exec );
+ }
+ else
+ error = TT_Err_Ok;
+
+ Fin:
+ Context_Save( exec, ins );
+
+ if ( !ins->debug )
+ Done_Context( exec );
+ /* debugging instances keep their context */
+
+ ins->valid = FALSE;
+
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Instance_Reset
+ *
+ * Description : Resets an instance to a new pointsize/transform.
+ * Executes the cvt program if any is found.
+ *
+ * Input : _instance the instance object to destroy
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Instance_Reset( PInstance ins )
+ {
+ PExecution_Context exec;
+
+ TT_Error error;
+ Long i;
+ UShort j;
+ PFace face;
+
+
+ if ( !ins )
+ return TT_Err_Invalid_Instance_Handle;
+
+ if ( ins->valid )
+ return TT_Err_Ok;
+
+ face = ins->owner;
+
+ if ( ins->metrics.x_ppem < 1 ||
+ ins->metrics.y_ppem < 1 )
+ return TT_Err_Invalid_PPem;
+
+ /* compute new transformation */
+ if ( ins->metrics.x_ppem >= ins->metrics.y_ppem )
+ {
+ ins->metrics.scale1 = ins->metrics.x_scale1;
+ ins->metrics.scale2 = ins->metrics.x_scale2;
+ ins->metrics.ppem = ins->metrics.x_ppem;
+ ins->metrics.x_ratio = 1 << 16;
+ ins->metrics.y_ratio = TT_MulDiv( ins->metrics.y_ppem,
+ 0x10000,
+ ins->metrics.x_ppem );
+ }
+ else
+ {
+ ins->metrics.scale1 = ins->metrics.y_scale1;
+ ins->metrics.scale2 = ins->metrics.y_scale2;
+ ins->metrics.ppem = ins->metrics.y_ppem;
+ ins->metrics.x_ratio = TT_MulDiv( ins->metrics.x_ppem,
+ 0x10000,
+ ins->metrics.y_ppem );
+ ins->metrics.y_ratio = 1 << 16;
+ }
+
+ /* Scale the cvt values to the new ppem. */
+ /* We use by default the y ppem to scale the CVT. */
+
+ for ( i = 0; i < ins->cvtSize; i++ )
+ ins->cvt[i] = TT_MulDiv( face->cvt[i],
+ ins->metrics.scale1,
+ ins->metrics.scale2 );
+
+ /* All twilight points are originally zero */
+ for ( j = 0; j < ins->twilight.n_points; j++ )
+ {
+ ins->twilight.org[j].x = 0;
+ ins->twilight.org[j].y = 0;
+ ins->twilight.cur[j].x = 0;
+ ins->twilight.cur[j].y = 0;
+ }
+
+ /* clear storage area */
+ for ( i = 0; i < ins->storeSize; i++ )
+ ins->storage[i] = 0;
+
+ ins->GS = Default_GraphicsState;
+
+ /* get execution context and run prep program */
+
+ if ( ins->debug )
+ exec = ins->context;
+ else
+ exec = New_Context(face);
+ /* debugging instances have their own context */
+
+ if ( !exec )
+ return TT_Err_Could_Not_Find_Context;
+
+ Context_Load( exec, face, ins );
+
+ Set_CodeRange( exec,
+ TT_CodeRange_Cvt,
+ face->cvtProgram,
+ face->cvtPgmSize );
+
+ Clear_CodeRange( exec, TT_CodeRange_Glyph );
+
+ exec->instruction_trap = FALSE;
+
+ exec->top = 0;
+ exec->callTop = 0;
+
+ if ( face->cvtPgmSize > 0 )
+ {
+ error = Goto_CodeRange( exec, TT_CodeRange_Cvt, 0 );
+ if ( error )
+ goto Fin;
+
+ if ( !ins->debug )
+ error = RunIns( exec );
+ }
+ else
+ error = TT_Err_Ok;
+
+ ins->GS = exec->GS;
+ /* save default graphics state */
+
+ Fin:
+ Context_Save( exec, ins );
+
+ if ( !ins->debug )
+ Done_Context( exec );
+ /* debugging instances keep their context */
+
+ if ( !error )
+ ins->valid = TRUE;
+
+ return error;
+ }
+
+
+
+/*******************************************************************
+ * *
+ * FACE FUNCTIONS *
+ * *
+ * *
+ *******************************************************************/
+
+/*******************************************************************
+ *
+ * Function : Face_Destroy
+ *
+ * Description : The face object destructor.
+ *
+ * Input : _face typeless pointer to the face object to destroy
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Face_Destroy( void* _face )
+ {
+ PFace face = (PFace)_face;
+ UShort n;
+
+
+ if ( !face )
+ return TT_Err_Ok;
+
+ /* well, we assume that no other thread is using the face */
+ /* at this moment, but one is never sure enough. */
+ MUTEX_Lock( face->lock );
+
+ /* first of all, destroys the cached sub-objects */
+ Cache_Destroy( &face->instances );
+ Cache_Destroy( &face->glyphs );
+
+ /* destroy the extensions */
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+ Extension_Destroy( face );
+#endif
+
+ /* freeing the collection table */
+ FREE( face->ttcHeader.TableDirectory );
+ face->ttcHeader.DirCount = 0;
+
+ /* freeing table directory */
+ FREE( face->dirTables );
+ face->numTables = 0;
+
+ /* freeing the locations table */
+ FREE( face->glyphLocations );
+ face->numLocations = 0;
+
+ /* freeing the character mapping tables */
+ for ( n = 0; n < face->numCMaps; n++ )
+ CharMap_Free( face->cMaps + n );
+
+ FREE( face->cMaps );
+ face->numCMaps = 0;
+
+ /* freeing the CVT */
+ FREE( face->cvt );
+ face->cvtSize = 0;
+
+ /* freeing the horizontal metrics */
+ FREE( face->horizontalHeader.long_metrics );
+ FREE( face->horizontalHeader.short_metrics );
+
+ /* freeing the vertical ones, if any */
+ if (face->verticalInfo)
+ {
+ FREE( face->verticalHeader.long_metrics );
+ FREE( face->verticalHeader.short_metrics );
+ face->verticalInfo = 0;
+ }
+
+ /* freeing the programs */
+ FREE( face->fontProgram );
+ FREE( face->cvtProgram );
+ face->fontPgmSize = 0;
+ face->cvtPgmSize = 0;
+
+ /* freeing the gasp table */
+ FREE( face->gasp.gaspRanges );
+ face->gasp.numRanges = 0;
+
+ /* freeing the name table */
+ Free_TrueType_Names( face );
+
+ /* freeing the hdmx table */
+ Free_TrueType_Hdmx( face );
+
+ /* TT_Close_Stream( &face->stream ); -- this is performed by the API */
+
+ /* destroy the mutex */
+ MUTEX_Destroy(face->lock);
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Face_Create
+ *
+ * Description : The face object constructor.
+ *
+ * Input : _face face record to build
+ * _input input stream where to load font data
+ *
+ * Output : Error code.
+ *
+ * NOTE : The input stream is kept in the face object. The
+ * caller shouldn't destroy it after calling Face_Create().
+ *
+ ******************************************************************/
+
+#undef LOAD_
+#define LOAD_( table ) \
+ (error = Load_TrueType_##table (face)) != TT_Err_Ok
+
+
+ LOCAL_FUNC
+ TT_Error Face_Create( void* _face,
+ void* _input )
+ {
+ PEngine_Instance engine;
+
+ TFont_Input* input = (TFont_Input*)_input;
+ PFace face = (PFace)_face;
+ TT_Error error;
+
+
+ face->stream = input->stream;
+ face->engine = input->engine;
+
+ engine = face->engine;
+
+ MUTEX_Create( face->lock );
+
+ Cache_Create( engine,
+ engine->objs_instance_class,
+ &face->instances,
+ &face->lock );
+
+ Cache_Create( engine,
+ engine->objs_glyph_class,
+ &face->glyphs,
+ &face->lock );
+
+ /* Load collection directory if present, then font directory */
+
+ error = Load_TrueType_Directory( face, input->fontIndex );
+ if ( error )
+ goto Fail;
+
+ /* Load tables */
+
+ if ( LOAD_( Header ) ||
+ LOAD_( MaxProfile ) ||
+ LOAD_( Locations ) ||
+
+ (error = Load_TrueType_Metrics_Header( face, 0 )) != TT_Err_Ok ||
+ /* load the 'hhea' & 'hmtx' tables at once */
+
+ LOAD_( CMap ) ||
+ LOAD_( CVT ) ||
+ LOAD_( Programs ) ||
+ LOAD_( Gasp ) ||
+ LOAD_( Names ) ||
+ LOAD_( OS2 ) ||
+ LOAD_( PostScript ) ||
+
+ (error = Load_TrueType_Metrics_Header( face, 1 )) != TT_Err_Ok ||
+ /* try to load the 'vhea' & 'vmtx' at once if present */
+
+ LOAD_( Hdmx ) )
+
+ goto Fail;
+
+#ifdef TT_CONFIG_OPTION_EXTEND_ENGINE
+ if ( ( error = Extension_Create( face ) ) != TT_Err_Ok )
+ return error;
+#endif
+
+ return TT_Err_Ok;
+
+ Fail :
+ Face_Destroy( face );
+ return error;
+ }
+
+#undef LOAD_
+
+
+/*******************************************************************
+ *
+ * Function : Glyph_Destroy
+ *
+ * Description : The glyph object destructor.
+ *
+ * Input : _glyph typeless pointer to the glyph record to destroy
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Glyph_Destroy( void* _glyph )
+ {
+ PGlyph glyph = (PGlyph)_glyph;
+
+
+ if ( !glyph )
+ return TT_Err_Ok;
+
+ glyph->outline.owner = TRUE;
+ return TT_Done_Outline( &glyph->outline );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Glyph_Create
+ *
+ * Description : The glyph object constructor.
+ *
+ * Input : _glyph glyph record to build.
+ * _face the glyph's parent face.
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Glyph_Create( void* _glyph,
+ void* _face )
+ {
+ PFace face = (PFace)_face;
+ PGlyph glyph = (PGlyph)_glyph;
+
+
+ if ( !face )
+ return TT_Err_Invalid_Face_Handle;
+
+ if ( !glyph )
+ return TT_Err_Invalid_Glyph_Handle;
+
+ glyph->face = face;
+
+ /* XXX: Don't forget the space for the 2 phantom points */
+ return TT_New_Outline( glyph->face->maxPoints + 2,
+ glyph->face->maxContours,
+ &glyph->outline );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Scale_X
+ *
+ * Description : scale an horizontal distance from font
+ * units to 26.6 pixels
+ *
+ * Input : metrics pointer to metrics
+ * x value to scale
+ *
+ * Output : scaled value
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Pos Scale_X( PIns_Metrics metrics, TT_Pos x )
+ {
+ return TT_MulDiv( x, metrics->x_scale1, metrics->x_scale2 );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : Scale_Y
+ *
+ * Description : scale a vertical distance from font
+ * units to 26.6 pixels
+ *
+ * Input : metrics pointer to metrics
+ * y value to scale
+ *
+ * Output : scaled value
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Pos Scale_Y( PIns_Metrics metrics, TT_Pos y )
+ {
+ return TT_MulDiv( y, metrics->y_scale1, metrics->y_scale2 );
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTObjs_Init
+ *
+ * Description : The TTObjs component initializer. Creates the
+ * object cache classes, as well as the face record
+ * cache.
+ *
+ * Input : engine engine instance
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ static
+ const TCache_Class objs_face_class =
+ {
+ sizeof ( TFace ),
+ -1,
+ Face_Create,
+ Face_Destroy,
+ NULL,
+ NULL
+ };
+
+ static
+ const TCache_Class objs_instance_class =
+ {
+ sizeof ( TInstance ),
+ -1,
+ Instance_Create,
+ Instance_Destroy,
+ NULL,
+ NULL
+ };
+
+ static
+ const TCache_Class objs_exec_class =
+ {
+ sizeof ( TExecution_Context ),
+ 1,
+ Context_Create,
+ Context_Destroy,
+ NULL,
+ NULL
+ };
+
+ static
+ const TCache_Class objs_glyph_class =
+ {
+ sizeof ( TGlyph ),
+ -1,
+ Glyph_Create,
+ Glyph_Destroy,
+ NULL,
+ NULL
+ };
+
+
+ LOCAL_FUNC
+ TT_Error TTObjs_Init( PEngine_Instance engine )
+ {
+ PCache face_cache, exec_cache;
+ TT_Error error;
+
+
+ face_cache = 0;
+ exec_cache = 0;
+
+ if ( ALLOC( face_cache, sizeof ( TCache ) ) ||
+ ALLOC( exec_cache, sizeof ( TCache ) ) )
+ goto Fail;
+
+ /* create face cache */
+ error = Cache_Create( engine, (PCache_Class)&objs_face_class,
+ face_cache, &engine->lock );
+ if ( error )
+ goto Fail;
+
+ engine->objs_face_cache = face_cache;
+
+ error = Cache_Create( engine, (PCache_Class)&objs_exec_class,
+ exec_cache, &engine->lock );
+ if ( error )
+ goto Fail;
+
+ engine->objs_exec_cache = exec_cache;
+
+ engine->objs_face_class = (PCache_Class)&objs_face_class;
+ engine->objs_instance_class = (PCache_Class)&objs_instance_class;
+ engine->objs_execution_class = (PCache_Class)&objs_exec_class;
+ engine->objs_glyph_class = (PCache_Class)&objs_glyph_class;
+
+ goto Exit;
+
+ Fail:
+ FREE( face_cache );
+ FREE( exec_cache );
+
+ Exit:
+ return error;
+ }
+
+
+/*******************************************************************
+ *
+ * Function : TTObjs_Done
+ *
+ * Description : The TTObjs component finalizer.
+ *
+ * Input : engine engine instance
+ *
+ * Output : Error code.
+ *
+ ******************************************************************/
+
+ LOCAL_FUNC
+ TT_Error TTObjs_Done( PEngine_Instance engine )
+ {
+ /* destroy all active faces and contexts before releasing the */
+ /* caches */
+ Cache_Destroy( (TCache*)engine->objs_exec_cache );
+ Cache_Destroy( (TCache*)engine->objs_face_cache );
+
+ /* Now frees caches and cache classes */
+ FREE( engine->objs_exec_cache );
+ FREE( engine->objs_face_cache );
+
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttobjs.h b/xc/extras/FreeType/lib/ttobjs.h
new file mode 100644
index 000000000..533ffef9f
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttobjs.h
@@ -0,0 +1,861 @@
+/*******************************************************************
+ *
+ * ttobjs.h 1.0
+ *
+ * Objects definition unit.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ ******************************************************************/
+
+#ifndef TTOBJS_H
+#define TTOBJS_H
+
+#include "ttconfig.h"
+#include "ttengine.h"
+#include "ttmutex.h"
+#include "ttcache.h"
+#include "tttables.h"
+#include "ttcmap.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* */
+/* This file contains the definitions and methods of the four */
+/* kinds of objects managed by the FreeType engine. These are: */
+/* */
+/* */
+/* Face objects: */
+/* */
+/* There is always one face object per opened TrueType font */
+/* file, and only one. The face object contains data that is */
+/* independent of current transform/scaling/rotation and */
+/* pointsize, or glyph index. This data is made of several */
+/* critical tables that are loaded on face object creation. */
+/* */
+/* A face object tracks all active and recycled objects of */
+/* the instance and execution context classes. Destroying a face */
+/* object will automatically destroy all associated instances. */
+/* */
+/* */
+/* Instance objects: */
+/* */
+/* An instance object always relates to a given face object, */
+/* known as its 'parent' or 'owner', and contains only the */
+/* data that is specific to one given pointsize/transform of */
+/* the face. You can only create an instance from a face object. */
+/* */
+/* An instance's current transform/pointsize can be changed */
+/* at any time using a single high-level API call, */
+/* TT_Reset_Instance(). */
+/* */
+/* Execution Context objects: */
+/* */
+/* An execution context (or context in short) relates to a face. */
+/* It contains the data and tables that are necessary to load */
+/* and hint (i.e. execute the glyph instructions of) one glyph. */
+/* A context is a transient object that is queried/created on */
+/* the fly: client applications never deal with them directly. */
+/* */
+/* */
+/* Glyph objects: */
+/* */
+/* A glyph object contains only the minimal glyph information */
+/* needed to render one glyph correctly. This means that a glyph */
+/* object really contains tables that are sized to hold the */
+/* contents of _any_ glyph of a given face. A client application */
+/* can usually create one glyph object for a given face, then use */
+/* it for all subsequent loads. */
+/* */
+/* Here is an example of a client application : */
+/* (NOTE: No error checking performed here!) */
+/* */
+/* */
+/* TT_Face face; -- face handle */
+/* TT_Instance ins1, ins2; -- two instance handles */
+/* TT_Glyph glyph; -- glyph handle */
+/* */
+/* TT_Init_FreeType(); */
+/* */
+/* -- Initialize the engine. This must be done prior to _any_ */
+/* operation. */
+/* */
+/* TT_Open_Face( "/some/face/name.ttf", &face ); */
+/* */
+/* -- create the face object. This call opens the font file */
+/* */
+/* TT_New_Instance( face, &ins1 ); */
+/* TT_New_Instance( face, &ins2 ); */
+/* */
+/* TT_Set_Instance_PointSize( ins1, 8 ); */
+/* TT_Set_Instance_PointSize( ins2, 12 ); */
+/* */
+/* -- create two distinct instances of the same face */
+/* -- ins1 is pointsize 8 at resolution 96 dpi */
+/* -- ins2 is pointsize 12 at resolution 96 dpi */
+/* */
+/* TT_New_Glyph( face, &glyph ); */
+/* */
+/* -- create a new glyph object which will receive the contents */
+/* of any glyph of 'face' */
+/* */
+/* TT_Load_Glyph( ins1, glyph, 64, DEFAULT_GLYPH_LOAD ); */
+/* */
+/* -- load glyph indexed 64 at pointsize 8 in the 'glyph' object */
+/* -- NOTE: This call will fail if the instance and the glyph */
+/* do not relate to the same face object. */
+/* */
+/* TT_Get_Outline( glyph, &outline ); */
+/* */
+/* -- extract the glyph outline from the object and copies it */
+/* to the 'outline' record */
+/* */
+/* TT_Get_Metrics( glyph, &metrics ); */
+/* */
+/* -- extract the glyph metrics and put them into the 'metrics' */
+/* record */
+/* */
+/* TT_Load_Glyph( ins2, glyph, 64, DEFAULT_GLYPH_LOAD ); */
+/* */
+/* -- load the same glyph at pointsize 12 in the 'glyph' object */
+/* */
+/* */
+/* TT_Close_Face( &face ); */
+/* */
+/* -- destroy the face object. This will destroy 'ins1' and */
+/* 'ins2'. However, the glyph object will still be available */
+/* */
+/* TT_Done_FreeType(); */
+/* */
+/* -- Finalize the engine. This will also destroy all pending */
+/* glyph objects (here 'glyph'). */
+
+ struct TFace_;
+ struct TInstance_;
+ struct TExecution_Context_;
+ struct TGlyph_;
+
+ typedef struct TFace_ TFace;
+ typedef TFace* PFace;
+
+ typedef struct TInstance_ TInstance;
+ typedef TInstance* PInstance;
+
+ typedef struct TExecution_Context_ TExecution_Context;
+ typedef TExecution_Context* PExecution_Context;
+
+ typedef struct TGlyph_ TGlyph;
+ typedef TGlyph* PGlyph;
+
+
+ /*************************************************************/
+ /* */
+ /* ADDITIONAL SUBTABLES */
+ /* */
+ /* These tables are not precisely defined by the specs */
+ /* but their structures is implied by the TrueType font */
+ /* file layout. */
+ /* */
+ /*************************************************************/
+
+ /* Graphics State */
+ /* */
+ /* The Graphics State (GS) is managed by the */
+ /* instruction field, but does not come from */
+ /* the font file. Thus, we can use 'int's */
+ /* where needed. */
+
+ struct TGraphicsState_
+ {
+ UShort rp0;
+ UShort rp1;
+ UShort rp2;
+
+ TT_UnitVector dualVector;
+ TT_UnitVector projVector;
+ TT_UnitVector freeVector;
+
+ Long loop;
+ TT_F26Dot6 minimum_distance;
+ Int round_state;
+
+ Bool auto_flip;
+ TT_F26Dot6 control_value_cutin;
+ TT_F26Dot6 single_width_cutin;
+ TT_F26Dot6 single_width_value;
+ Short delta_base;
+ Short delta_shift;
+
+ Byte instruct_control;
+ Bool scan_control;
+ Int scan_type;
+
+ UShort gep0;
+ UShort gep1;
+ UShort gep2;
+ };
+
+ typedef struct TGraphicsState_ TGraphicsState;
+
+
+ LOCAL_DEF
+ const TGraphicsState Default_GraphicsState;
+
+
+ /*************************************************************/
+ /* */
+ /* EXECUTION SUBTABLES */
+ /* */
+ /* These sub-tables relate to instruction execution. */
+ /* */
+ /*************************************************************/
+
+#define MAX_CODE_RANGES 3
+
+/* There can only be 3 active code ranges at once: */
+/* - the Font Program */
+/* - the CVT Program */
+/* - a glyph's instructions set */
+
+#define TT_CodeRange_Font 1
+#define TT_CodeRange_Cvt 2
+#define TT_CodeRange_Glyph 3
+
+
+ struct TCodeRange_
+ {
+ PByte Base;
+ Long Size;
+ };
+
+ typedef struct TCodeRange_ TCodeRange;
+ typedef TCodeRange* PCodeRange;
+
+
+ /* Defintion of a code range */
+ /* */
+ /* Code ranges can be resident to a glyph (i.e. the Font Program) */
+ /* while some others are volatile (Glyph instructions). */
+ /* Tracking the state and presence of code ranges allows function */
+ /* and instruction definitions within a code range to be forgotten */
+ /* when the range is discarded. */
+
+ typedef TCodeRange TCodeRangeTable[MAX_CODE_RANGES];
+
+ /* defines a function/instruction definition record */
+
+ struct TDefRecord_
+ {
+ Int Range; /* in which code range is it located ? */
+ Long Start; /* where does it start ? */
+ Byte Opc; /* function #, or instruction code */
+ Bool Active; /* is it active ? */
+ };
+
+ typedef struct TDefRecord_ TDefRecord;
+ typedef TDefRecord* PDefRecord;
+ typedef TDefRecord* PDefArray;
+
+ /* defines a call record, used to manage function calls. */
+
+ struct TCallRecord_
+ {
+ Int Caller_Range;
+ Long Caller_IP;
+ Long Cur_Count;
+ Long Cur_Restart;
+ };
+
+ typedef struct TCallRecord_ TCallRecord;
+ typedef TCallRecord* PCallRecord;
+ typedef TCallRecord* PCallStack; /* defines a simple call stack */
+
+
+ /* This type defining a set of glyph points will be used to represent */
+ /* each zone (regular and twilight) during instructions decoding. */
+ struct TGlyph_Zone_
+ {
+ UShort n_points; /* number of points in zone */
+ Short n_contours; /* number of contours */
+
+ TT_Vector* org; /* original points coordinates */
+ TT_Vector* cur; /* current points coordinates */
+
+ Byte* touch; /* current touch flags */
+ UShort* contours; /* contour end points */
+ };
+
+ typedef struct TGlyph_Zone_ TGlyph_Zone;
+ typedef TGlyph_Zone* PGlyph_Zone;
+
+
+
+#ifndef TT_STATIC_INTEPRETER /* indirect implementation */
+
+#define EXEC_OPS PExecution_Context exc,
+#define EXEC_OP PExecution_Context exc
+#define EXEC_ARGS exc,
+#define EXEC_ARG exc
+
+#else /* static implementation */
+
+#define EXEC_OPS /* void */
+#define EXEC_OP /* void */
+#define EXEC_ARGS /* void */
+#define EXEC_ARG /* void */
+
+#endif
+
+ /* Rounding function, as used by the interpreter */
+ typedef TT_F26Dot6 (*TRound_Function)( EXEC_OPS TT_F26Dot6 distance,
+ TT_F26Dot6 compensation );
+
+ /* Point displacement along the freedom vector routine, as */
+ /* used by the interpreter */
+ typedef void (*TMove_Function)( EXEC_OPS PGlyph_Zone zone,
+ UShort point,
+ TT_F26Dot6 distance );
+
+ /* Distance projection along one of the proj. vectors, as used */
+ /* by the interpreter */
+ typedef TT_F26Dot6 (*TProject_Function)( EXEC_OPS TT_Vector* v1,
+ TT_Vector* v2 );
+
+ /* reading a cvt value. Take care of non-square pixels when needed */
+ typedef TT_F26Dot6 (*TGet_CVT_Function)( EXEC_OPS ULong index );
+
+ /* setting or moving a cvt value. Take care of non-square pixels */
+ /* when needed */
+ typedef void (*TSet_CVT_Function)( EXEC_OPS ULong index,
+ TT_F26Dot6 value );
+
+ /* subglyph transformation record */
+ struct TTransform_
+ {
+ TT_Fixed xx, xy; /* transformation */
+ TT_Fixed yx, yy; /* matrix */
+ TT_F26Dot6 ox, oy; /* offsets */
+ };
+
+ typedef struct TTransform_ TTransform;
+ typedef TTransform* PTransform;
+
+ /* subglyph loading record. Used to load composite components */
+ struct TSubglyph_Record_
+ {
+ Long index; /* subglyph index; initialized with -1 */
+ Bool is_scaled; /* is the subglyph scaled? */
+ Bool is_hinted; /* should it be hinted? */
+ Bool preserve_pps; /* preserve phantom points? */
+
+ Long file_offset;
+
+#if 0
+ TT_BBox bbox;
+ Int leftBearing; /* in FUnits */
+ Int advanceWidth; /* in FUnits */
+#endif
+
+ TT_Big_Glyph_Metrics metrics;
+
+ TGlyph_Zone zone;
+
+ Long arg1; /* first argument */
+ Long arg2; /* second argument */
+
+ UShort element_flag; /* current load element flag */
+
+ TTransform transform; /* transform */
+
+ TT_Vector pp1, pp2; /* phantom points */
+
+ };
+
+ typedef struct TSubglyph_Record_ TSubglyph_Record;
+ typedef TSubglyph_Record* PSubglyph_Record;
+ typedef TSubglyph_Record* PSubglyph_Stack;
+
+ /* A note regarding non-squared pixels: */
+ /* */
+ /* (This text will probably go into some docs at some time, for */
+ /* now, it is kept there to explain some definitions in the */
+ /* TIns_Metrics record). */
+ /* */
+ /* The CVT is a one-dimensional array containing values that */
+ /* control certain important characteristics in a font, like */
+ /* the height of all capitals, all lowercase letter, default */
+ /* spacing or stem width/height. */
+ /* */
+ /* These values are found in FUnits in the font file, and must be */
+ /* scaled to pixel coordinates before being used by the CVT and */
+ /* glyph programs. Unfortunately, when using distinct x and y */
+ /* resolutions (or distinct x and y pointsizes), there are two */
+ /* possible scalings. */
+ /* */
+ /* A first try was to implement a 'lazy' scheme where all values */
+ /* were scaled when first used. However, while some values are always */
+ /* used in the same direction, and some other are used in many */
+ /* different circumstances and orientations. */
+ /* */
+ /* I have found a simpler way to do the same, and it even seems to */
+ /* work in most of the cases: */
+ /* */
+ /* - all CVT values are scaled to the maximum ppem size */
+ /* */
+ /* - when performing a read or write in the CVT, a ratio factor */
+ /* is used to perform adequate scaling. Example: */
+ /* */
+ /* x_ppem = 14 */
+ /* y_ppem = 10 */
+ /* */
+ /* we choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */
+ /* entries are scaled to it. */
+ /* */
+ /* x_ratio = 1.0 */
+ /* y_ratio = y_ppem/ppem (< 1.0) */
+ /* */
+ /* we compute the current ratio like: */
+ /* */
+ /* - if projVector is horizontal, */
+ /* ratio = x_ratio = 1.0 */
+ /* - if projVector is vertical, */
+ /* ratop = y_ratio */
+ /* - else, */
+ /* ratio = sqrt((proj.x*x_ratio)^2 + (proj.y*y_ratio)^2) */
+ /* */
+ /* reading a cvt value returns ratio * cvt[index] */
+ /* writing a cvt value in pixels cvt[index] / ratio */
+ /* */
+ /* the current ppem is simply ratio * ppem */
+ /* */
+
+ /* metrics used by the instance and execution context objects */
+ struct TIns_Metrics_
+ {
+ TT_F26Dot6 pointSize; /* point size. 1 point = 1/72 inch. */
+
+ UShort x_resolution; /* device horizontal resolution in dpi. */
+ UShort y_resolution; /* device vertical resolution in dpi. */
+
+ UShort x_ppem; /* horizontal pixels per EM */
+ UShort y_ppem; /* vertical pixels per EM */
+
+ Long x_scale1;
+ Long x_scale2; /* used to scale FUnits to fractional pixels */
+
+ Long y_scale1;
+ Long y_scale2; /* used to scale FUnits to fractional pixels */
+
+ /* for non-square pixels */
+ Long x_ratio;
+ Long y_ratio;
+
+ UShort ppem; /* maximum ppem size */
+ Long ratio; /* current ratio */
+ Long scale1;
+ Long scale2; /* scale for ppem */
+
+ TT_F26Dot6 compensations[4]; /* device-specific compensations */
+
+ Bool rotated; /* `is the glyph rotated?'-flag */
+ Bool stretched; /* `is the glyph stretched?'-flag */
+ };
+
+ typedef struct TIns_Metrics_ TIns_Metrics;
+ typedef TIns_Metrics* PIns_Metrics;
+
+
+
+ /***********************************************************************/
+ /* */
+ /* FreeType Face Type */
+ /* */
+ /***********************************************************************/
+
+ struct TFace_
+ {
+ /* parent engine instance for the face object */
+ PEngine_Instance engine;
+
+ /* i/o stream */
+ TT_Stream stream;
+
+ /* used only by the threaded builds of the library */
+ TMutex lock;
+
+ /* TrueType collection header, if any was found */
+ TTTCHeader ttcHeader;
+
+ /* maximum profile table, as found in the TrueType file */
+ TMaxProfile maxProfile;
+
+ /* Note: */
+ /* it seems that some maximum values cannot be */
+ /* taken directly from this table, but rather by */
+ /* combining some of its fields; e.g. the max. */
+ /* number of points seems to be given by */
+ /* MAX( maxPoints, maxCompositePoints ) */
+ /* */
+ /* For this reason, we define later our own */
+ /* max values that are used to load and allocate */
+ /* further tables. */
+
+ TT_Header fontHeader; /* the font header, as */
+ /* found in the TTF file */
+ TT_Horizontal_Header horizontalHeader; /* the horizontal header */
+
+ Bool verticalInfo; /* True when vertical table */
+ TT_Vertical_Header verticalHeader; /* is present in the font */
+
+ TT_OS2 os2; /* 'OS/2' table */
+
+ TT_Postscript postscript; /* 'Post' table */
+
+ TT_Hdmx hdmx; /* 'Hdmx' table */
+
+ TName_Table nameTable; /* name table */
+
+ TGasp gasp; /* the 'gasp' table */
+
+ /* The directory of TrueType tables for this typeface */
+ UShort numTables;
+ PTableDirEntry dirTables;
+
+ /* The directory of character mappings table for */
+ /* this typeface */
+ UShort numCMaps;
+ PCMapTable cMaps;
+
+ /* The glyph locations table */
+ UShort numLocations;
+ PStorage glyphLocations;
+
+ /* NOTE : Tjhe "hmtx" is now part of the horizontal header */
+
+ /* the font program, if any */
+ ULong fontPgmSize;
+ PByte fontProgram;
+
+ /* the cvt program, if any */
+ ULong cvtPgmSize;
+ PByte cvtProgram;
+
+ /* the original, unscaled, control value table */
+ ULong cvtSize;
+ PShort cvt;
+
+ /* The following values _must_ be set by the */
+ /* maximum profile loader */
+
+ UShort numGlyphs; /* the face's total number of glyphs */
+ UShort maxPoints; /* max glyph points number, simple and composite */
+ UShort maxContours; /* max glyph contours numb, simple and composite */
+ UShort maxComponents; /* max components in a composite glyph */
+
+ /* the following are object caches to track active */
+ /* and recycled instances and execution contexts */
+ /* objects. See 'ttcache.h' */
+
+ TCache instances; /* current instances for this face */
+ TCache glyphs; /* current glyph containers for this face */
+
+
+ /* A typeless pointer to the face object extensions defined */
+ /* in the 'ttextend.*' files. */
+ void* extension;
+ Int n_extensions; /* number of extensions */
+
+ /* Use extensions to provide additional capabilities to the */
+ /* engine. Read the developer's guide in the documentation */
+ /* directory to know how to do that. */
+
+ /* a generic pointer for client use - see TT_Set/Get_Face_Pointer */
+ void* generic;
+ };
+
+
+
+ /***********************************************************************/
+ /* */
+ /* FreeType Instance Type */
+ /* */
+ /***********************************************************************/
+
+ struct TInstance_
+ {
+ PFace owner; /* face object */
+
+ Bool valid;
+
+ TIns_Metrics metrics;
+
+ ULong numFDefs; /* number of function definitions */
+ PDefArray FDefs; /* table of FDefs entries */
+
+ ULong numIDefs; /* number of instruction definitions */
+ PDefArray IDefs; /* table of IDefs entries */
+
+ TCodeRangeTable codeRangeTable;
+
+ TGraphicsState GS;
+ TGraphicsState default_GS;
+
+ ULong cvtSize; /* the scaled control value table */
+ PLong cvt;
+
+ ULong storeSize; /* The storage area is now part of the */
+ PLong storage; /* instance */
+
+ TGlyph_Zone twilight; /* The instance's twilight zone */
+
+ /* debugging variables */
+
+ /* When using the debugger, we must keep the */
+ /* execution context tied to the instance */
+ /* object rather than asking it on demand */
+
+ Bool debug;
+ PExecution_Context context;
+
+ /* a generic pointer for client use - see TT_Set/Get_Instance_Pointer */
+ void* generic;
+ };
+
+
+ /***********************************************************************/
+ /* */
+ /* FreeType Execution Context Type */
+ /* */
+ /***********************************************************************/
+
+ struct TExecution_Context_
+ {
+ PFace face;
+ PInstance instance;
+
+ /* instructions state */
+
+ TT_Error error; /* last execution error */
+
+ Long top; /* top of exec. stack */
+
+ ULong stackSize; /* size of exec. stack */
+ PStorage stack; /* current exec. stack */
+
+ Long args,
+ new_top; /* new top after exec. */
+
+ TGlyph_Zone zp0, /* zone records */
+ zp1,
+ zp2,
+ pts,
+ twilight;
+
+ TIns_Metrics metrics; /* instance metrics */
+
+ TGraphicsState GS; /* current graphics state */
+
+ Int curRange; /* current code range number */
+ PByte code; /* current code range */
+ Long IP; /* current instruction pointer */
+ Long codeSize; /* size of current range */
+
+ Byte opcode; /* current opcode */
+ Int length; /* length of current opcode */
+
+ Bool step_ins; /* true if the interpreter must */
+ /* increment IP after ins. exec */
+ ULong cvtSize;
+ PLong cvt;
+
+ ULong glyphSize; /* glyph instructions buffer size */
+ PByte glyphIns; /* glyph instructions buffer */
+
+ ULong numFDefs; /* number of function defs */
+ PDefRecord FDefs; /* table of FDefs entries */
+
+ ULong numIDefs; /* number of instruction defs */
+ PDefRecord IDefs; /* table of IDefs entries */
+
+ Int callTop, /* top of call stack during execution */
+ callSize; /* size of call stack */
+ PCallStack callStack; /* call stack */
+
+ UShort maxPoints; /* capacity of this context's "pts" */
+ UShort maxContours; /* record, expressed in points and */
+ /* contours.. */
+
+ TCodeRangeTable codeRangeTable; /* table of valid coderanges */
+ /* useful for the debugger */
+
+ ULong storeSize; /* size of current storage */
+ PLong storage; /* storage area */
+
+ TT_F26Dot6 period; /* values used for the */
+ TT_F26Dot6 phase; /* 'SuperRounding' */
+ TT_F26Dot6 threshold;
+
+ /* this seems to be unused */
+#if 0
+ Int cur_ppem; /* ppem along the current proj vector */
+#endif
+ Long scale1; /* scaling values along the current */
+ Long scale2; /* projection vector too.. */
+ Bool cached_metrics; /* the ppem is computed lazily. used */
+ /* to trigger computation when needed */
+
+ Bool instruction_trap; /* If True, the interpreter will */
+ /* exit after each instruction */
+
+ TGraphicsState default_GS; /* graphics state resulting from */
+ /* the prep program */
+ Bool is_composite; /* ture if the glyph is composite */
+
+ /* latest interpreter additions */
+
+ Long F_dot_P; /* dot product of freedom and projection */
+ /* vectors */
+ TRound_Function func_round; /* current rounding function */
+
+ TProject_Function func_project, /* current projection function */
+ func_dualproj, /* current dual proj. function */
+ func_freeProj; /* current freedom proj. func */
+
+ TMove_Function func_move; /* current point move function */
+
+ TGet_CVT_Function func_read_cvt; /* read a cvt entry */
+ TSet_CVT_Function func_write_cvt; /* write a cvt entry (in pixels) */
+ TSet_CVT_Function func_move_cvt; /* incr a cvt entry (in pixels) */
+
+ ULong loadSize;
+ PSubglyph_Stack loadStack; /* loading subglyph stack */
+ };
+
+
+ /***********************************************************************/
+ /* */
+ /* FreeType Glyph Object Type */
+ /* */
+ /***********************************************************************/
+
+ struct TGlyph_
+ {
+ PFace face;
+ TT_Big_Glyph_Metrics metrics;
+ TT_Outline outline;
+ };
+
+
+ /* The following type is used to load a font from a collection. */
+ /* See Face_Create in ttobjs.c */
+
+ struct TFont_Input_
+ {
+ TT_Stream stream; /* input stream */
+ ULong fontIndex; /* index of font in collection */
+ PEngine_Instance engine; /* parent engine instance */
+
+ };
+
+ typedef struct TFont_Input_ TFont_Input;
+
+
+ /********************************************************************/
+ /* */
+ /* Code Range Functions */
+ /* */
+ /********************************************************************/
+
+ /* Goto a specified coderange */
+ LOCAL_DEF
+ TT_Error Goto_CodeRange( PExecution_Context exec,
+ Int range,
+ Long IP );
+
+#if 0
+ /* Return a pointer to a given coderange record. */
+ /* Used only by the debugger. */
+ LOCAL_DEF
+ PCodeRange Get_CodeRange( PExecution_Context exec,
+ Int range );
+#endif
+
+ /* Set a given code range properties */
+ LOCAL_DEF
+ TT_Error Set_CodeRange( PExecution_Context exec,
+ Int range,
+ void* base,
+ Long length );
+
+ /* Clear a given coderange */
+ LOCAL_DEF
+ TT_Error Clear_CodeRange( PExecution_Context exec, Int range );
+
+
+ LOCAL_DEF
+ PExecution_Context New_Context( PFace face );
+
+ LOCAL_DEF
+ TT_Error Done_Context( PExecution_Context exec );
+
+
+ LOCAL_DEF
+ TT_Error Context_Load( PExecution_Context exec,
+ PFace face,
+ PInstance ins );
+
+ LOCAL_DEF
+ TT_Error Context_Save( PExecution_Context exec,
+ PInstance ins );
+
+ LOCAL_DEF
+ TT_Error Context_Run( PExecution_Context exec,
+ Bool debug );
+
+ LOCAL_DEF
+ TT_Error Instance_Init( PInstance ins );
+
+ LOCAL_DEF
+ TT_Error Instance_Reset( PInstance ins );
+
+
+ /********************************************************************/
+ /* */
+ /* Handy scaling functions */
+ /* */
+ /********************************************************************/
+
+ LOCAL_DEF TT_Pos Scale_X( PIns_Metrics metrics, TT_Pos x );
+ LOCAL_DEF TT_Pos Scale_Y( PIns_Metrics metrics, TT_Pos y );
+
+ /********************************************************************/
+ /* */
+ /* Component Initializer/Finalizer */
+ /* */
+ /* Called from 'freetype.c' */
+ /* The component must create and register the face, instance and */
+ /* execution context cache classes before any object can be */
+ /* managed. */
+ /* */
+ /********************************************************************/
+
+ LOCAL_DEF TT_Error TTObjs_Init( PEngine_Instance engine );
+ LOCAL_DEF TT_Error TTObjs_Done( PEngine_Instance engine );
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTOBJS_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttraster.c b/xc/extras/FreeType/lib/ttraster.c
new file mode 100644
index 000000000..db8ecf66a
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttraster.c
@@ -0,0 +1,2733 @@
+/*******************************************************************
+ *
+ * ttraster.c 1.5
+ *
+ * The FreeType glyph rasterizer (body).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * NOTES:
+ *
+ * This version supports the following:
+ *
+ * - direct grayscaling
+ * - sub-banding
+ * - drop-out modes 4 and 5
+ * - second pass for complete drop-out control (bitmap only)
+ * - variable precision
+ *
+ * Changes between 1.5 and 1.4:
+ *
+ * Performance tuning.
+ *
+ * Changes between 1.4 and 1.3:
+ *
+ * Mainly performance tunings:
+ *
+ * - Line_Down() and Bezier_Down() now use the functions Line_Up()
+ * and Bezier_Up() to do their work.
+ * - optimized Split_Bezier()
+ * - optimized linked lists used during sweeps
+ *
+ ******************************************************************/
+
+#include "ttraster.h"
+#include "ttdebug.h"
+#include "tttypes.h"
+#include "ttengine.h"
+
+#include "ttmemory.h" /* only used to allocate memory on engine init */
+
+/* required by the tracing mode */
+#undef TT_COMPONENT
+#define TT_COMPONENT trace_raster
+
+
+/* The default render pool size */
+#define RASTER_RENDER_POOL 64000
+
+/* The size of the two-lines intermediate bitmap used */
+/* for anti-aliasing */
+#define RASTER_GRAY_LINES 2048
+
+
+#define Raster_Err_None TT_Err_Ok
+#define Raster_Err_Not_Ini TT_Err_Raster_Not_Initialized
+#define Raster_Err_Overflow TT_Err_Raster_Pool_Overflow
+#define Raster_Err_Neg_Height TT_Err_Raster_Negative_Height
+#define Raster_Err_Invalid TT_Err_Raster_Invalid_Value
+#define Raster_Err_Gray_Unsupported TT_Err_Raster_Gray_Unsupported
+
+
+/* RELEASE NOTE : */
+/* */
+/* The 'SECURE_COMPUTATIONS' macro has disappeared to define the */
+/* FMulDiv macro. It was used to grab the macro definition located in */
+/* 'ttcalc.h' which, long times ago, used to be a simple call to the */
+/* MulDiv function. */
+/* */
+/* However, we are now certain that in a 'FMulDiv(a,b,c)' call, the */
+/* value of 'b' is always less or equal then 64 or 1024, depending on */
+/* precision. This means that the result of the product 'a*b' will fit */
+/* in 32-bits under the condition ( abs(a) < (1<<25) ) for the small */
+/* precision mode, and ( abs(a) < (1<<21) ) for the large precision one. */
+/* */
+/* In other words, it will be always the case, unless you want to */
+/* generate bitmaps that are several millions pixels wide !! */
+/* */
+/* So, the following definition fits the bill nicely, and we don't need */
+/* to use the one in 'ttcalc' anymore, even for 16-bit systems.. */
+
+#define FMulDiv( a, b, c ) ( (a) * (b) / (c) )
+
+
+/* Define DEBUG_RASTER if you want to generate a debug version of the */
+/* rasterizer. This will progressively draw the glyphs while all the */
+/* computation are done directly on the graphics screen (the glyphs */
+/* will be inverted). */
+
+/* Note that DEBUG_RASTER should only be used for debugging with b/w */
+/* rendering, not with gray levels. */
+
+/* The definition of DEBUG_RASTER should appear in the file */
+/* "ttconfig.h". */
+
+#ifdef DEBUG_RASTER
+ extern Char* Vio; /* A pointer to VRAM or display buffer */
+#endif
+
+
+/* The rasterizer is a very general purpose component, please leave */
+/* the following redefinitions there (you never know your target */
+/* environment). */
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */
+ /* Setting this constant to more than 32 is a */
+ /* pure waste of space. */
+
+#define Pixel_Bits 6 /* fractional bits of *input* coordinates */
+
+ /* States of each line, arc and profile */
+ enum TStates_
+ {
+ Unknown,
+ Ascending,
+ Descending,
+ Flat
+ };
+
+ typedef enum TStates_ TStates;
+
+ struct TProfile_;
+ typedef struct TProfile_ TProfile;
+ typedef TProfile* PProfile;
+
+ struct TProfile_
+ {
+ TT_F26Dot6 X; /* current coordinate during sweep */
+ PProfile link; /* link to next profile - various purpose */
+ PStorage offset; /* start of profile's data in render pool */
+ Int flow; /* Profile orientation: Asc/Descending */
+ UShort height; /* profile's height in scanlines */
+ UShort start; /* profile's starting scanline */
+
+ UShort countL; /* number of lines to step before this */
+ /* profile becomes drawable */
+
+ PProfile next; /* next profile in same contour, used */
+ /* during drop-out control */
+ };
+
+ typedef PProfile TProfileList;
+ typedef PProfile* PProfileList;
+
+
+ /* I use the classic trick of two dummy records for the head and tail */
+ /* of a linked list; this reduces tests in insertion/deletion/sorting. */
+ /* NOTE: used during sweeps only. */
+
+ /* Simple record used to implement a stack of bands, required */
+ /* by the sub-banding mechanism */
+
+ struct TBand_
+ {
+ Short y_min; /* band's minimum */
+ Short y_max; /* band's maximum */
+ };
+
+ typedef struct TBand_ TBand;
+
+
+#define AlignProfileSize ( (sizeof ( TProfile ) + 7) / 4)
+
+
+ /* Left fill bitmask */
+ static const Byte LMask[8] =
+ { 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01 };
+
+ /* Right fill bitmask */
+ static const Byte RMask[8] =
+ { 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE, 0xFF };
+
+ /* prototypes used for sweep function dispatch */
+ typedef void Function_Sweep_Init( RAS_ARGS Short* min,
+ Short* max );
+
+ typedef void Function_Sweep_Span( RAS_ARGS Short y,
+ TT_F26Dot6 x1,
+ TT_F26Dot6 x2,
+ PProfile left,
+ PProfile right );
+
+ typedef void Function_Sweep_Step( RAS_ARG );
+
+
+/* NOTE: These operations are only valid on 2's complement processors */
+
+#define FLOOR( x ) ( (x) & -ras.precision )
+#define CEILING( x ) ( ((x) + ras.precision - 1) & -ras.precision )
+#define TRUNC( x ) ( (signed long)(x) >> ras.precision_bits )
+#define FRAC( x ) ( (x) & (ras.precision - 1) )
+#define SCALED( x ) ( ((x) << ras.scale_shift) - ras.precision_half )
+
+#ifdef DEBUG_RASTER
+#define DEBUG_PSET Pset()
+#else
+#define DEBUG_PSET
+#endif
+
+ struct TPoint_
+ {
+ Long x, y;
+ };
+
+ typedef struct TPoint_ TPoint;
+
+
+ /* Note that I have moved the location of some fields in the */
+ /* structure to ensure that the most used variables are used */
+ /* at the top. Thus, their offset can be coded with less */
+ /* opcodes, and it results in a smaller executable. */
+
+ struct TRaster_Instance_
+ {
+ Int precision_bits; /* precision related variables */
+ Int precision;
+ Int precision_half;
+ Long precision_mask;
+ Int precision_shift;
+ Int precision_step;
+ Int precision_jitter;
+
+ Int scale_shift; /* == precision_shift for bitmaps */
+ /* == precision_shift+1 for pixmaps */
+
+ PStorage buff; /* The profiles buffer */
+ PStorage sizeBuff; /* Render pool size */
+ PStorage maxBuff; /* Profiles buffer size */
+ PStorage top; /* Current cursor in buffer */
+
+ TT_Error error;
+
+ PByte flags; /* current flags table */
+ PUShort outs; /* current outlines table */
+
+ UShort nPoints; /* number of points in current glyph */
+ Short nContours; /* number of contours in current glyph */
+ Int numTurns; /* number of Y-turns in outline */
+
+ TPoint* arc; /* current Bezier arc pointer */
+
+ UShort bWidth; /* target bitmap width */
+ PByte bTarget; /* target bitmap buffer */
+ PByte gTarget; /* target pixmap buffer */
+
+ Long lastX, lastY, minY, maxY;
+
+ UShort num_Profs; /* current number of profiles */
+
+ Bool fresh; /* signals a fresh new profile which */
+ /* 'start' field must be completed */
+ Bool joint; /* signals that the last arc ended */
+ /* exactly on a scanline. Allows */
+ /* removal of doublets */
+ PProfile cProfile; /* current profile */
+ PProfile fProfile; /* head of linked list of profiles */
+ PProfile gProfile; /* contour's first profile in case */
+ /* of impact */
+ TStates state; /* rendering state */
+
+ TT_Raster_Map target; /* description of target bit/pixmap */
+
+ Long traceOfs; /* current offset in target bitmap */
+ Long traceG; /* current offset in target pixmap */
+
+ Short traceIncr; /* sweep's increment in target bitmap */
+
+ Short gray_min_x; /* current min x during gray rendering */
+ Short gray_max_x; /* current max x during gray rendering */
+
+ /* dispatch variables */
+
+ Function_Sweep_Init* Proc_Sweep_Init;
+ Function_Sweep_Span* Proc_Sweep_Span;
+ Function_Sweep_Span* Proc_Sweep_Drop;
+ Function_Sweep_Step* Proc_Sweep_Step;
+
+ TT_Vector* coords;
+
+ Byte dropOutControl; /* current drop_out control method */
+
+ Byte grays[5]; /* Palette of gray levels used for render */
+
+ Byte* gray_lines; /* Intermediate table used to render the */
+ /* graylevels pixmaps. */
+ /* gray_lines is a buffer holding two */
+ /* monochrome scanlines */
+ Short gray_width; /* width in bytes of one monochrome */
+ /* intermediate scanline of gray_lines. */
+ /* Each gray pixel takes 2 bits long there */
+
+ /* The gray_lines must hold 2 lines, thus with size */
+ /* in bytes of at least 'gray_width*2' */
+
+ Bool second_pass; /* indicates wether a horizontal pass */
+ /* should be performed to control drop-out */
+ /* accurately when calling Render_Glyph. */
+ /* Note that there is no horizontal pass */
+ /* during gray rendering. */
+ TPoint arcs[2 * MaxBezier + 1]; /* The Bezier stack */
+
+ TBand band_stack[16]; /* band stack used for sub-banding */
+ Int band_top; /* band stack top */
+
+ Int count_table[256]; /* Look-up table used to quickly count */
+ /* set bits in a gray 2x2 cell */
+ };
+
+
+#ifdef TT_STATIC_RASTER
+
+ static TRaster_Instance cur_ras;
+
+#define ras cur_ras
+
+#else
+
+#define ras (*raster)
+
+#endif /* TT_STATIC_RASTER */
+
+
+#ifdef DEBUG_RASTER
+
+ /************************************************/
+ /* */
+ /* Pset: */
+ /* */
+ /* Used for debugging only. Plots a point */
+ /* in VRAM during rendering (not afterwards). */
+ /* */
+ /* NOTE: This procedure relies on the value */
+ /* of cProfile->start, which may not */
+ /* be set when Pset is called sometimes. */
+ /* This will usually result in a dot */
+ /* plotted on the first screen scanline */
+ /* (far away its original position). */
+ /* */
+ /* This "bug" reflects nothing wrong */
+ /* in the current implementation, and */
+ /* the bitmap is rendered correctly, */
+ /* so don't panic if you see 'flying' */
+ /* dots in debugging mode. */
+ /* */
+ /* - David */
+ /* */
+ /************************************************/
+
+ static void Pset( RAS_ARG )
+ {
+ Long o;
+ Long x;
+
+
+ x = ras.top[-1];
+
+ switch ( ras.cProfile->flow )
+ {
+ case TT_Flow_Up:
+ o = Vio_ScanLineWidth *
+ ( ras.top-ras.cProfile->offset + ras.cProfile->start ) +
+ ( x / (ras.precision*8) );
+ break;
+
+ case TT_Flow_Down:
+ o = Vio_ScanLineWidth *
+ ( ras.cProfile->start-ras.top + ras.cProfile->offset ) +
+ ( x / (ras.precision*8) );
+ break;
+ }
+
+ if ( o > 0 )
+ Vio[o] |= (unsigned)0x80 >> ( (x/ras.precision) & 7 );
+ }
+
+
+ static void Clear_Band( RAS_ARGS Int y1, Int y2 )
+ {
+ MEM_Set( Vio + y1*Vio_ScanLineWidth, (y2-y1+1)*Vio_ScanLineWidth, 0 );
+ }
+
+#endif /* DEBUG_RASTER */
+
+
+/************************************************************************/
+/* */
+/* Function: Set_High_Precision */
+/* */
+/* Description: Sets precision variables according to param flag. */
+/* */
+/* Input: High set to True for high precision (typically for */
+/* ppem < 18), false otherwise. */
+/* */
+/************************************************************************/
+
+ static void Set_High_Precision( RAS_ARGS Bool High )
+ {
+ if ( High )
+ {
+ ras.precision_bits = 10;
+ ras.precision_step = 128;
+ ras.precision_jitter = 24;
+ }
+ else
+ {
+ ras.precision_bits = 6;
+ ras.precision_step = 32;
+ ras.precision_jitter = 2;
+ }
+
+ PTRACE7(( "Set_High_Precision(%s)\n", High ? "true" : "false" ));
+
+ ras.precision = 1 << ras.precision_bits;
+ ras.precision_half = ras.precision / 2;
+ ras.precision_shift = ras.precision_bits - Pixel_Bits;
+ ras.precision_mask = -ras.precision;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: New_Profile */
+/* */
+/* Description: Creates a new Profile in the render pool. */
+/* */
+/* Input: aState state/orientation of the new Profile */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE in case of overflow or of incoherent Profile. */
+/* */
+/****************************************************************************/
+
+ static Bool New_Profile( RAS_ARGS TStates aState )
+ {
+ if ( !ras.fProfile )
+ {
+ ras.cProfile = (PProfile)ras.top;
+ ras.fProfile = ras.cProfile;
+ ras.top += AlignProfileSize;
+ }
+
+ if ( ras.top >= ras.maxBuff )
+ {
+ ras.error = Raster_Err_Overflow;
+ return FAILURE;
+ }
+
+ switch ( aState )
+ {
+ case Ascending:
+ ras.cProfile->flow = TT_Flow_Up;
+ PTRACE7(( "New ascending profile = %lx\n", (long)ras.cProfile ));
+ break;
+
+ case Descending:
+ ras.cProfile->flow = TT_Flow_Down;
+ PTRACE7(( "New descending profile = %lx\n", (long)ras.cProfile ));
+ break;
+
+ default:
+ PTRACE0(( "Invalid profile direction in Raster:New_Profile !!\n" ));
+ ras.error = Raster_Err_Invalid;
+ return FAILURE;
+ }
+
+ ras.cProfile->start = 0;
+ ras.cProfile->height = 0;
+ ras.cProfile->offset = ras.top;
+ ras.cProfile->link = (PProfile)0;
+ ras.cProfile->next = (PProfile)0;
+
+ if ( !ras.gProfile )
+ ras.gProfile = ras.cProfile;
+
+ ras.state = aState;
+ ras.fresh = TRUE;
+ ras.joint = FALSE;
+
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: End_Profile */
+/* */
+/* Description: Finalizes the current Profile. */
+/* */
+/* Input: None */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE in case of overflow or incoherency. */
+/* */
+/****************************************************************************/
+
+ static Bool End_Profile( RAS_ARG )
+ {
+ Long h;
+ PProfile oldProfile;
+
+
+ h = ras.top - ras.cProfile->offset;
+
+ if ( h < 0 )
+ {
+ PTRACE0(( "Negative height encountered in End_Profile!\n" ));
+ ras.error = Raster_Err_Neg_Height;
+ return FAILURE;
+ }
+
+ if ( h > 0 )
+ {
+ PTRACE1(( "Ending profile %lx, start = %ld, height = %ld\n",
+ (long)ras.cProfile, ras.cProfile->start, h ));
+
+ oldProfile = ras.cProfile;
+ ras.cProfile->height = h;
+ ras.cProfile = (PProfile)ras.top;
+
+ ras.top += AlignProfileSize;
+
+ ras.cProfile->height = 0;
+ ras.cProfile->offset = ras.top;
+ oldProfile->next = ras.cProfile;
+ ras.num_Profs++;
+ }
+
+ if ( ras.top >= ras.maxBuff )
+ {
+ PTRACE1(( "overflow in End_Profile\n" ));
+ ras.error = Raster_Err_Overflow;
+ return FAILURE;
+ }
+
+ ras.joint = FALSE;
+
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Insert_Y_Turn */
+/* */
+/* Description: Insert a salient into the sorted list placed on top */
+/* of the render pool */
+/* */
+/* Input: New y scanline position */
+/* */
+/****************************************************************************/
+
+ static
+ Bool Insert_Y_Turn( RAS_ARGS Int y )
+ {
+ PStorage y_turns;
+ Int y2, n;
+
+ n = ras.numTurns-1;
+ y_turns = ras.sizeBuff - ras.numTurns;
+
+ /* look for first y value that is <= */
+ while ( n >= 0 && y < y_turns[n] )
+ n--;
+
+ /* if it is <, simply insert it, ignore if == */
+ if ( n >= 0 && y > y_turns[n] )
+ while ( n >= 0 )
+ {
+ y2 = y_turns[n];
+ y_turns[n] = y;
+ y = y2;
+ n--;
+ }
+
+ if ( n < 0 )
+ {
+ if (ras.maxBuff <= ras.top)
+ {
+ ras.error = Raster_Err_Overflow;
+ return FAILURE;
+ }
+ ras.maxBuff--;
+ ras.numTurns++;
+ ras.sizeBuff[-ras.numTurns ] = y;
+ }
+
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Finalize_Profile_Table */
+/* */
+/* Description: Adjusts all links in the Profiles list. */
+/* */
+/* Input: None */
+/* */
+/* Returns: None. */
+/* */
+/****************************************************************************/
+
+ static
+ Bool Finalize_Profile_Table( RAS_ARG )
+ {
+ Int bottom, top;
+ UShort n;
+ PProfile p;
+
+
+ n = ras.num_Profs;
+
+ if ( n > 1 )
+ {
+ p = ras.fProfile;
+ while ( n > 0 )
+ {
+ if ( n > 1 )
+ p->link = (PProfile)( p->offset + p->height );
+ else
+ p->link = NULL;
+
+ switch ( p->flow )
+ {
+ case TT_Flow_Down:
+ bottom = p->start - p->height+1;
+ top = p->start;
+ p->start = bottom;
+ p->offset += p->height-1;
+ break;
+
+ case TT_Flow_Up:
+ default:
+ bottom = p->start;
+ top = p->start + p->height-1;
+ }
+
+ if ( Insert_Y_Turn( RAS_VARS bottom ) ||
+ Insert_Y_Turn( RAS_VARS top+1 ) )
+ return FAILURE;
+
+ p = p->link;
+ n--;
+ }
+ }
+ else
+ ras.fProfile = NULL;
+
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Split_Bezier */
+/* */
+/* Description: Subdivides one Bezier arc into two joint */
+/* sub-arcs in the Bezier stack. */
+/* */
+/* Input: None (subdivided bezier is taken from the top of the */
+/* stack). */
+/* */
+/* Returns: None. */
+/* */
+/* */
+/* Note: This routine is the 'beef' of this component. It is _the_ */
+/* inner loop that should be optimized to hell to get the */
+/* best performance. */
+/* */
+/****************************************************************************/
+
+ static void Split_Bezier( TPoint* base )
+ {
+ Long a, b;
+
+
+ base[4].x = base[2].x;
+ b = base[1].x;
+ a = base[3].x = ( base[2].x + b ) / 2;
+ b = base[1].x = ( base[0].x + b ) / 2;
+ base[2].x = ( a + b ) / 2;
+
+ base[4].y = base[2].y;
+ b = base[1].y;
+ a = base[3].y = ( base[2].y + b ) / 2;
+ b = base[1].y = ( base[0].y + b ) / 2;
+ base[2].y = ( a + b ) / 2;
+
+ /* hand optimized. gcc doesn't seem too good at common expression */
+ /* substitution and instruction scheduling ;-) */
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Push_Bezier */
+/* */
+/* Description: Clears the Bezier stack and pushes a new arc on top of it. */
+/* */
+/* Input: x1,y1 x2,y2 x3,y3 new Bezier arc */
+/* */
+/* Returns: None. */
+/* */
+/****************************************************************************/
+
+ static void Push_Bezier( RAS_ARGS Long x1, Long y1,
+ Long x2, Long y2,
+ Long x3, Long y3 )
+ {
+ ras.arc = ras.arcs;
+ ras.arc[2].x = x1; ras.arc[2].y = y1;
+ ras.arc[1].x = x2; ras.arc[1].y = y2;
+ ras.arc[0].x = x3; ras.arc[0].y = y3;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Line_Up */
+/* */
+/* Description: Computes the x-coordinates of an ascending line segment */
+/* and stores them in the render pool. */
+/* */
+/* Input: x1,y1,x2,y2 Segment start (x1,y1) and end (x2,y2) points */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE on Render Pool overflow. */
+/* */
+/****************************************************************************/
+
+ static Bool Line_Up( RAS_ARGS Long x1, Long y1,
+ Long x2, Long y2,
+ Long miny, Long maxy )
+ {
+ Long Dx, Dy;
+ Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */
+ Long Ix, Rx, Ax;
+
+ PStorage top;
+
+
+ Dx = x2 - x1;
+ Dy = y2 - y1;
+
+ if ( Dy <= 0 || y2 < miny || y1 > maxy )
+ return SUCCESS;
+
+ if ( y1 < miny )
+ {
+ x1 += FMulDiv( Dx, miny - y1, Dy );
+ e1 = TRUNC( miny );
+ f1 = 0;
+ }
+ else
+ {
+ e1 = TRUNC( y1 );
+ f1 = FRAC( y1 );
+ }
+
+ if ( y2 > maxy )
+ {
+ /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */
+ e2 = TRUNC( maxy );
+ f2 = 0;
+ }
+ else
+ {
+ e2 = TRUNC( y2 );
+ f2 = FRAC( y2 );
+ }
+
+ if ( f1 > 0 )
+ {
+ if ( e1 == e2 ) return SUCCESS;
+ else
+ {
+ x1 += FMulDiv( Dx, ras.precision - f1, Dy );
+ e1 += 1;
+ }
+ }
+ else
+ if ( ras.joint )
+ {
+ ras.top--;
+ ras.joint = FALSE;
+ }
+
+ ras.joint = ( f2 == 0 );
+
+ if ( ras.fresh )
+ {
+ ras.cProfile->start = e1;
+ ras.fresh = FALSE;
+ }
+
+ size = e2 - e1 + 1;
+ if ( ras.top + size >= ras.maxBuff )
+ {
+ ras.error = Raster_Err_Overflow;
+ return FAILURE;
+ }
+
+ if ( Dx > 0 )
+ {
+ Ix = (ras.precision*Dx) / Dy;
+ Rx = (ras.precision*Dx) % Dy;
+ Dx = 1;
+ }
+ else
+ {
+ Ix = -( (ras.precision*-Dx) / Dy );
+ Rx = (ras.precision*-Dx) % Dy;
+ Dx = -1;
+ }
+
+ Ax = -Dy;
+ top = ras.top;
+
+ while ( size > 0 )
+ {
+ *top++ = x1;
+
+ DEBUG_PSET;
+
+ x1 += Ix;
+ Ax += Rx;
+ if ( Ax >= 0 )
+ {
+ Ax -= Dy;
+ x1 += Dx;
+ }
+ size--;
+ }
+
+ ras.top = top;
+ return SUCCESS;
+ }
+
+
+ static Bool Line_Down( RAS_ARGS Long x1, Long y1,
+ Long x2, Long y2,
+ Long miny, Long maxy )
+ {
+ Bool result, fresh;
+
+
+ fresh = ras.fresh;
+
+ result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny );
+
+ if ( fresh && !ras.fresh )
+ ras.cProfile->start = -ras.cProfile->start;
+
+ return result;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Bezier_Up */
+/* */
+/* Description: Computes thes x-coordinates of an ascending bezier arc */
+/* and stores them in the render pool. */
+/* */
+/* Input: None. The arc is taken from the top of the Bezier stack. */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE on Render Pool overflow. */
+/* */
+/****************************************************************************/
+
+ static Bool Bezier_Up( RAS_ARGS Long miny, Long maxy )
+ {
+ Long y1, y2, e, e2, e0;
+ Short f1;
+
+ TPoint* arc;
+ TPoint* start_arc;
+
+ PStorage top;
+
+
+ arc = ras.arc;
+ y1 = arc[2].y;
+ y2 = arc[0].y;
+ top = ras.top;
+
+ if ( y2 < miny || y1 > maxy )
+ goto Fin;
+
+ e2 = FLOOR( y2 );
+
+ if ( e2 > maxy )
+ e2 = maxy;
+
+ e0 = miny;
+
+ if ( y1 < miny )
+ e = miny;
+ else
+ {
+ e = CEILING( y1 );
+ f1 = FRAC( y1 );
+ e0 = e;
+
+ if ( f1 == 0 )
+ {
+ if ( ras.joint )
+ {
+ top--;
+ ras.joint = FALSE;
+ }
+
+ *top++ = arc[2].x;
+
+ DEBUG_PSET;
+
+ e += ras.precision;
+ }
+ }
+
+ if ( ras.fresh )
+ {
+ ras.cProfile->start = TRUNC( e0 );
+ ras.fresh = FALSE;
+ }
+
+ if ( e2 < e )
+ goto Fin;
+
+ if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff )
+ {
+ ras.top = top;
+ ras.error = Raster_Err_Overflow;
+ return FAILURE;
+ }
+
+ start_arc = arc;
+
+ while ( arc >= start_arc && e <= e2 )
+ {
+ ras.joint = FALSE;
+
+ y2 = arc[0].y;
+
+ if ( y2 > e )
+ {
+ y1 = arc[2].y;
+ if ( y2 - y1 >= ras.precision_step )
+ {
+ Split_Bezier( arc );
+ arc += 2;
+ }
+ else
+ {
+ *top++ = arc[2].x + FMulDiv( arc[0].x - arc[2].x,
+ e - y1,
+ y2 - y1 );
+ DEBUG_PSET;
+
+ arc -= 2;
+ e += ras.precision;
+ }
+ }
+ else
+ {
+ if ( y2 == e )
+ {
+ ras.joint = TRUE;
+ *top++ = arc[0].x;
+
+ DEBUG_PSET;
+
+ e += ras.precision;
+ }
+ arc -= 2;
+ }
+ }
+
+ Fin:
+ ras.top = top;
+ ras.arc -= 2;
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Bezier_Down */
+/* */
+/* Description: Computes the x-coordinates of a descending bezier arc */
+/* and stores them in the render pool. */
+/* */
+/* Input: None. Arc is taken from the top of the Bezier stack. */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE on Render Pool overflow. */
+/* */
+/****************************************************************************/
+
+ static Bool Bezier_Down( RAS_ARGS Long miny, Long maxy )
+ {
+ TPoint* arc = ras.arc;
+ Bool result, fresh;
+
+
+ arc[0].y = -arc[0].y;
+ arc[1].y = -arc[1].y;
+ arc[2].y = -arc[2].y;
+
+ fresh = ras.fresh;
+
+ result = Bezier_Up( RAS_VARS -maxy, -miny );
+
+ if ( fresh && !ras.fresh )
+ ras.cProfile->start = -ras.cProfile->start;
+
+ arc[0].y = -arc[0].y;
+ return result;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Line_To */
+/* */
+/* Description: Injects a new line segment and adjusts Profiles list. */
+/* */
+/* Input: x, y : segment endpoint (start point in LastX,LastY) */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE on Render Pool overflow or Incorrect Profile. */
+/* */
+/****************************************************************************/
+
+ static Bool Line_To( RAS_ARGS Long x, Long y )
+ {
+ /* First, detect a change of direction */
+
+ switch ( ras.state )
+ {
+ case Unknown:
+ if ( y > ras.lastY )
+ {
+ if ( New_Profile( RAS_VARS Ascending ) ) return FAILURE;
+ }
+ else
+ {
+ if ( y < ras.lastY )
+ if ( New_Profile( RAS_VARS Descending ) ) return FAILURE;
+ }
+ break;
+
+ case Ascending:
+ if ( y < ras.lastY )
+ {
+ if ( End_Profile( RAS_VAR ) ||
+ New_Profile( RAS_VARS Descending ) ) return FAILURE;
+ }
+ break;
+
+ case Descending:
+ if ( y > ras.lastY )
+ {
+ if ( End_Profile( RAS_VAR ) ||
+ New_Profile( RAS_VARS Ascending ) ) return FAILURE;
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ /* Then compute the lines */
+
+ switch ( ras.state )
+ {
+ case Ascending:
+ if ( Line_Up ( RAS_VARS ras.lastX, ras.lastY,
+ x, y, ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ case Descending:
+ if ( Line_Down( RAS_VARS ras.lastX, ras.lastY,
+ x, y, ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ default:
+ ;
+ }
+
+ ras.lastX = x;
+ ras.lastY = y;
+
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Bezier_To */
+/* */
+/* Description: Injects a new bezier arc and adjusts the profile list. */
+/* */
+/* Input: x, y : arc endpoint (start point in LastX, LastY) */
+/* Cx, Cy : control point */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE on Render Pool overflow or Incorrect Profile. */
+/* */
+/****************************************************************************/
+
+ static Bool Bezier_To( RAS_ARGS Long x,
+ Long y,
+ Long cx,
+ Long cy )
+ {
+ Long y1, y2, y3, x3;
+ TStates state_bez;
+
+
+ Push_Bezier( RAS_VARS ras.lastX, ras.lastY, cx, cy, x, y );
+
+ do
+ {
+ y1 = ras.arc[2].y;
+ y2 = ras.arc[1].y;
+ y3 = ras.arc[0].y;
+ x3 = ras.arc[0].x;
+
+ /* first, categorize the bezier arc */
+
+ if ( y1 == y2 )
+ {
+ if ( y2 == y3 )
+ state_bez = Flat;
+ else if ( y2 > y3 )
+ state_bez = Descending;
+ else
+ state_bez = Ascending;
+ }
+ else if ( y1 > y2 )
+ {
+ if ( y2 >= y3 )
+ state_bez = Descending;
+ else
+ state_bez = Unknown;
+ }
+ else if ( y2 <= y3 )
+ state_bez = Ascending;
+ else
+ state_bez = Unknown;
+
+ /* split non-monotonic arcs, ignore flat ones, or */
+ /* computes the up and down ones */
+
+ switch ( state_bez )
+ {
+ case Flat:
+ ras.arc -= 2;
+ break;
+
+ case Unknown:
+ Split_Bezier( ras.arc );
+ ras.arc += 2;
+ break;
+
+ default:
+ /* detect a change of direction */
+
+ if ( ras.state != state_bez )
+ {
+ if ( ras.state != Unknown )
+ if ( End_Profile( RAS_VAR ) ) return FAILURE;
+
+ if ( New_Profile( RAS_VARS state_bez ) ) return FAILURE;
+ }
+
+ /* compute */
+
+ switch ( ras.state )
+ {
+ case Ascending:
+ if ( Bezier_Up ( RAS_VARS ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ case Descending:
+ if ( Bezier_Down( RAS_VARS ras.minY, ras.maxY ) )
+ return FAILURE;
+ break;
+
+ default:
+ ;
+ }
+ }
+ } while ( ras.arc >= ras.arcs );
+
+ ras.lastX = x3;
+ ras.lastY = y3;
+
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Decompose_Curve */
+/* */
+/* Description: Scans the outline arays in order to emit individual */
+/* segments and beziers by calling Line_To() and Bezier_To(). */
+/* It handles all weird cases, like when the first point */
+/* is off the curve, or when there are simply no 'on' */
+/* points in the contour! */
+/* */
+/* Input: first, last : indexes of first and last point in */
+/* contour. */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE on error. */
+/* */
+/****************************************************************************/
+
+#undef SWAP_
+#define SWAP_(x,y) { Long swap = x; x = y; y = swap; }
+
+ static Bool Decompose_Curve( RAS_ARGS UShort first,
+ UShort last,
+ Bool flipped )
+ {
+ Long x, y; /* current point */
+ Long cx, cy; /* current Bezier control point */
+ Long mx, my; /* current middle point */
+
+ Long x_first, y_first; /* first point's coordinates */
+ Long x_last, y_last; /* last point's coordinates */
+
+ UShort index; /* current point's index */
+ Bool on_curve; /* current point's state */
+
+ x_first = SCALED( ras.coords[first].x );
+ y_first = SCALED( ras.coords[first].y );
+
+ if ( flipped ) SWAP_( x_first,y_first );
+
+ x_last = SCALED( ras.coords[last].x );
+ y_last = SCALED( ras.coords[last].y );
+
+ if ( flipped ) SWAP_( x_last,y_last );
+
+ ras.lastX = cx = x_first;
+ ras.lastY = cy = y_first;
+
+ on_curve = (ras.flags[first] & 1);
+ index = first;
+
+ /* check first point to determine origin */
+ if ( !on_curve )
+ {
+ /* first point is off the curve. Yes, this happens... */
+ if ( ras.flags[last] & 1 )
+ {
+ ras.lastX = x_last; /* start at last point if it */
+ ras.lastY = y_last; /* is on the curve */
+ }
+ else
+ {
+ /* if both first and last points are off the curve, */
+ /* start at their middle and record its position */
+ /* for closure */
+ ras.lastX = (ras.lastX + x_last)/2;
+ ras.lastY = (ras.lastY + y_last)/2;
+
+ x_last = ras.lastX;
+ y_last = ras.lastY;
+ }
+ }
+
+ /* now process each contour point individually */
+ while ( index < last )
+ {
+ index++;
+ x = SCALED( ras.coords[index].x );
+ y = SCALED( ras.coords[index].y );
+
+ if ( flipped ) SWAP_( x, y );
+
+ if ( on_curve )
+ {
+ /* the previous point was on the curve */
+ on_curve = ( ras.flags[index] & 1 );
+ if ( on_curve )
+ {
+ /* two successive on points => emit segment */
+ if ( Line_To( RAS_VARS x, y ) ) return FAILURE;
+ }
+ else
+ {
+ /* else, keep current control point for next bezier */
+ cx = x;
+ cy = y;
+ }
+ }
+ else
+ {
+ /* the previous point was off the curve */
+ on_curve = ( ras.flags[index] & 1 );
+ if ( on_curve )
+ {
+ /* reaching an `on' point */
+ if ( Bezier_To( RAS_VARS x, y, cx, cy ) ) return FAILURE;
+ }
+ else
+ {
+ /* two successive `off' points => create middle point */
+ mx = ( cx + x ) / 2;
+ my = ( cy + y ) / 2;
+
+ if ( Bezier_To( RAS_VARS mx, my, cx, cy ) ) return FAILURE;
+
+ cx = x;
+ cy = y;
+ }
+ }
+ }
+
+ /* end of contour, close curve cleanly */
+ if ( ras.flags[first] & 1 )
+ {
+ if ( on_curve )
+ return Line_To( RAS_VARS x_first, y_first );
+ else
+ return Bezier_To( RAS_VARS x_first, y_first, cx, cy );
+ }
+ else
+ if ( !on_curve )
+ return Bezier_To( RAS_VARS x_last, y_last, cx, cy );
+
+ return SUCCESS;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Convert_Glyph */
+/* */
+/* Description: Converts a glyph into a series of segments and arcs */
+/* and makes a Profiles list with them. */
+/* */
+/* Input: _xCoord, _yCoord : coordinates tables. */
+/* */
+/* Uses the 'Flag' table too. */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE if any error was encountered during rendering. */
+/* */
+/****************************************************************************/
+
+ static Bool Convert_Glyph( RAS_ARGS int flipped )
+ {
+ Short i;
+ UShort start;
+
+ PProfile lastProfile;
+
+
+ ras.fProfile = NULL;
+ ras.joint = FALSE;
+ ras.fresh = FALSE;
+
+ ras.maxBuff = ras.sizeBuff - AlignProfileSize;
+
+ ras.numTurns = 0;
+
+ ras.cProfile = (PProfile)ras.top;
+ ras.cProfile->offset = ras.top;
+ ras.num_Profs = 0;
+
+ start = 0;
+
+ for ( i = 0; i < ras.nContours; i++ )
+ {
+ ras.state = Unknown;
+ ras.gProfile = NULL;
+
+ if ( Decompose_Curve( RAS_VARS start, ras.outs[i], flipped ) )
+ return FAILURE;
+
+ start = ras.outs[i] + 1;
+
+ /* We must now see if the extreme arcs join or not */
+ if ( ( FRAC( ras.lastY ) == 0 &&
+ ras.lastY >= ras.minY &&
+ ras.lastY <= ras.maxY ) )
+ if ( ras.gProfile && ras.gProfile->flow == ras.cProfile->flow )
+ ras.top--;
+ /* Note that ras.gProfile can be nil if the contour was too small */
+ /* to be drawn. */
+
+ lastProfile = ras.cProfile;
+ if ( End_Profile( RAS_VAR ) ) return FAILURE;
+
+ /* close the 'next profile in contour' linked list */
+ if ( ras.gProfile )
+ lastProfile->next = ras.gProfile;
+ }
+
+ if (Finalize_Profile_Table( RAS_VAR ))
+ return FAILURE;
+
+ return (ras.top < ras.maxBuff ? SUCCESS : FAILURE );
+ }
+
+
+/************************************************/
+/* */
+/* Init_Linked */
+/* */
+/* Inits an empty linked list. */
+/* */
+/************************************************/
+
+ static void Init_Linked( TProfileList* l )
+ {
+ *l = NULL;
+ }
+
+
+/************************************************/
+/* */
+/* InsNew : */
+/* */
+/* Inserts a new Profile in a linked list. */
+/* */
+/************************************************/
+
+ static void InsNew( PProfileList list,
+ PProfile profile )
+ {
+ PProfile *old, current;
+ Long x;
+
+
+ old = list;
+ current = *old;
+ x = profile->X;
+
+ while ( current )
+ {
+ if ( x < current->X )
+ break;
+ old = &current->link;
+ current = *old;
+ }
+
+ profile->link = current;
+ *old = profile;
+ }
+
+
+/*************************************************/
+/* */
+/* DelOld : */
+/* */
+/* Removes an old Profile from a linked list. */
+/* */
+/*************************************************/
+
+ static void DelOld( PProfileList list,
+ PProfile profile )
+ {
+ PProfile *old, current;
+
+
+ old = list;
+ current = *old;
+
+ while ( current )
+ {
+ if ( current == profile )
+ {
+ *old = current->link;
+ return;
+ }
+
+ old = &current->link;
+ current = *old;
+ }
+
+ /* we should never get there, unless the Profile was not part of */
+ /* the list. */
+ }
+
+
+/************************************************/
+/* */
+/* Update : */
+/* */
+/* Update all X offsets of a drawing list */
+/* */
+/************************************************/
+
+ static void Update( PProfile first )
+ {
+ PProfile current = first;
+
+
+ while ( current )
+ {
+ current->X = *current->offset;
+ current->offset += current->flow;
+ current->height--;
+ current = current->link;
+ }
+ }
+
+
+/************************************************/
+/* */
+/* Sort : */
+/* */
+/* Sorts a trace list. In 95%, the list */
+/* is already sorted. We need an algorithm */
+/* which is fast in this case. Bubble sort */
+/* is enough and simple. */
+/* */
+/************************************************/
+
+ static void Sort( PProfileList list )
+ {
+ PProfile *old, current, next;
+
+
+ /* First, set the new X coordinate of each profile */
+ Update( *list );
+
+ /* Then sort them */
+ old = list;
+ current = *old;
+
+ if ( !current )
+ return;
+
+ next = current->link;
+
+ while ( next )
+ {
+ if ( current->X <= next->X )
+ {
+ old = &current->link;
+ current = *old;
+
+ if ( !current )
+ return;
+ }
+ else
+ {
+ *old = next;
+ current->link = next->link;
+ next->link = current;
+
+ old = list;
+ current = *old;
+ }
+
+ next = current->link;
+ }
+ }
+
+
+/***********************************************************************/
+/* */
+/* Vertical Sweep Procedure Set : */
+/* */
+/* These three routines are used during the vertical black/white */
+/* sweep phase by the generic Draw_Sweep() function. */
+/* */
+/***********************************************************************/
+
+ static void Vertical_Sweep_Init( RAS_ARGS Short* min, Short* max )
+ {
+ switch ( ras.target.flow )
+ {
+ case TT_Flow_Up:
+ ras.traceOfs = *min * ras.target.cols;
+ ras.traceIncr = ras.target.cols;
+ break;
+
+ default:
+ ras.traceOfs = ( ras.target.rows - 1 - *min ) * ras.target.cols;
+ ras.traceIncr = -ras.target.cols;
+ }
+
+ ras.gray_min_x = 0;
+ ras.gray_max_x = 0;
+ }
+
+
+ static void Vertical_Sweep_Span( RAS_ARGS Short y,
+ TT_F26Dot6 x1,
+ TT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ Short c1, c2;
+ Short f1, f2;
+ Byte* target;
+
+
+ /* Drop-out control */
+
+ e1 = TRUNC( CEILING( x1 ) );
+
+ if ( x2-x1-ras.precision <= ras.precision_jitter )
+ e2 = e1;
+ else
+ e2 = TRUNC( FLOOR ( x2 ) );
+
+ if ( e2 >= 0 && e1 < ras.bWidth )
+ {
+ if ( e1 < 0 ) e1 = 0;
+ if ( e2 >= ras.bWidth ) e2 = ras.bWidth-1;
+
+ c1 = e1 >> 3;
+ c2 = e2 >> 3;
+
+ f1 = e1 & 7;
+ f2 = e2 & 7;
+
+ if ( ras.gray_min_x > c1 ) ras.gray_min_x = c1;
+ if ( ras.gray_max_x < c2 ) ras.gray_max_x = c2;
+
+ target = ras.bTarget + ras.traceOfs + c1;
+
+ if ( c1 != c2 )
+ {
+ *target |= LMask[f1];
+
+ if ( c2 > c1 + 1 )
+ MEM_Set( target + 1, 0xFF, c2 - c1 - 1 );
+
+ target[c2 - c1] |= RMask[f2];
+ }
+ else
+ *target |= ( LMask[f1] & RMask[f2] );
+ }
+ }
+
+
+ static void Vertical_Sweep_Drop( RAS_ARGS Short y,
+ TT_F26Dot6 x1,
+ TT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ UShort c1, f1;
+
+
+ /* Drop-out control */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 > e2 )
+ {
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( ras.dropOutControl )
+ {
+ case 1:
+ e1 = e2;
+ break;
+
+ case 4:
+ e1 = CEILING( (x1 + x2 + 1) / 2 );
+ break;
+
+ case 2:
+ case 5:
+ /* Drop-out Control Rule #4 */
+
+ /* The spec is not very clear regarding rule #4. It */
+ /* presents a method that is way too costly to implement */
+ /* while the general idea seems to get rid of 'stubs'. */
+ /* */
+ /* Here, we only get rid of stubs recognized when: */
+ /* */
+ /* upper stub: */
+ /* */
+ /* - P_Left and P_Right are in the same contour */
+ /* - P_Right is the successor of P_Left in that contour */
+ /* - y is the top of P_Left and P_Right */
+ /* */
+ /* lower stub: */
+ /* */
+ /* - P_Left and P_Right are in the same contour */
+ /* - P_Left is the successor of P_Right in that contour */
+ /* - y is the bottom of P_Left */
+ /* */
+
+ /* FIXXXME : uncommenting this line solves the disappearing */
+ /* bit problem in the '7' of verdana 10pts, but */
+ /* makes a new one in the 'C' of arial 14pts */
+
+ /* if ( x2-x1 < ras.precision_half ) */
+ {
+ /* upper stub test */
+
+ if ( left->next == right && left->height <= 0 ) return;
+
+ /* lower stub test */
+
+ if ( right->next == left && left->start == y ) return;
+ }
+
+ /* check that the rightmost pixel isn't set */
+
+ e1 = TRUNC( e1 );
+
+ c1 = e1 >> 3;
+ f1 = e1 & 7;
+
+ if ( e1 >= 0 && e1 < ras.bWidth &&
+ ras.bTarget[ras.traceOfs + c1] & (0x80 >> f1) )
+ return;
+
+ if ( ras.dropOutControl == 2 )
+ e1 = e2;
+ else
+ e1 = CEILING( (x1 + x2 + 1) / 2 );
+
+ break;
+
+ default:
+ return; /* unsupported mode */
+ }
+ }
+ else
+ return;
+ }
+
+ e1 = TRUNC( e1 );
+
+ if ( e1 >= 0 && e1 < ras.bWidth )
+ {
+ c1 = e1 >> 3;
+ f1 = e1 & 7;
+
+ if ( ras.gray_min_x > c1 ) ras.gray_min_x = c1;
+ if ( ras.gray_max_x < c1 ) ras.gray_max_x = c1;
+
+ ras.bTarget[ras.traceOfs + c1] |= (Char)(0x80 >> f1);
+ }
+ }
+
+
+ static void Vertical_Sweep_Step( RAS_ARG )
+ {
+ ras.traceOfs += ras.traceIncr;
+ }
+
+
+/***********************************************************************/
+/* */
+/* Horizontal Sweep Procedure Set : */
+/* */
+/* These three routines are used during the horizontal black/white */
+/* sweep phase by the generic Draw_Sweep() function. */
+/* */
+/***********************************************************************/
+
+ static void Horizontal_Sweep_Init( RAS_ARGS Short* min, Short* max )
+ {
+ /* nothing, really */
+ }
+
+
+ static void Horizontal_Sweep_Span( RAS_ARGS Short y,
+ TT_F26Dot6 x1,
+ TT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ PByte bits;
+ Byte f1;
+
+
+ if ( x2-x1 < ras.precision )
+ {
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 == e2 )
+ {
+ bits = ras.bTarget + (y >> 3);
+ f1 = (Byte)(0x80 >> (y & 7));
+
+ e1 = TRUNC( e1 );
+
+ if ( e1 >= 0 && e1 < ras.target.rows )
+ {
+ if ( ras.target.flow == TT_Flow_Down )
+ bits[(ras.target.rows-1 - e1) * ras.target.cols] |= f1;
+ else
+ bits[e1 * ras.target.cols] |= f1;
+ }
+ }
+ }
+#if 0
+ e2 = TRUNC( e2 );
+
+ if ( e2 >= 0 && e2 < ras.target.rows )
+ if ( ras.target.flow == TT_Flow_Down )
+ bits[(ras.target.rows-1-e2) * ras.target.cols] |= f1;
+ else
+ bits[e2 * ras.target.cols] |= f1;
+#endif
+ }
+
+
+ static void Horizontal_Sweep_Drop( RAS_ARGS Short y,
+ TT_F26Dot6 x1,
+ TT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ PByte bits;
+ Byte f1;
+
+
+ /* During the horizontal sweep, we only take care of drop-outs */
+
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 > e2 )
+ {
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( ras.dropOutControl )
+ {
+ case 1:
+ e1 = e2;
+ break;
+
+ case 4:
+ e1 = CEILING( (x1 + x2 + 1) / 2 );
+ break;
+
+ case 2:
+ case 5:
+
+ /* Drop-out Control Rule #4 */
+
+ /* The spec is not very clear regarding rule #4. It */
+ /* presents a method that is way too costly to implement */
+ /* while the general idea seems to get rid of 'stubs'. */
+ /* */
+
+ /* rightmost stub test */
+
+ if ( left->next == right && left->height <= 0 ) return;
+
+ /* leftmost stub test */
+
+ if ( right->next == left && left->start == y ) return;
+
+ /* check that the rightmost pixel isn't set */
+
+ e1 = TRUNC( e1 );
+
+ bits = ras.bTarget + (y >> 3);
+ f1 = (Byte)(0x80 >> (y & 7));
+
+ if ( ras.target.flow == TT_Flow_Down )
+ bits += (ras.target.rows-1-e1) * ras.target.cols;
+ else
+ bits += e1 * ras.target.cols;
+
+ if ( e1 >= 0 &&
+ e1 < ras.target.rows &&
+ *bits & f1 )
+ return;
+
+ if ( ras.dropOutControl == 2 )
+ e1 = e2;
+ else
+ e1 = CEILING( (x1 + x2 + 1) / 2 );
+
+ break;
+
+ default:
+ return; /* unsupported mode */
+ }
+ }
+ else
+ return;
+ }
+
+ bits = ras.bTarget + (y >> 3);
+ f1 = (Byte)(0x80 >> (y & 7));
+
+ e1 = TRUNC( e1 );
+
+ if ( e1 >= 0 && e1 < ras.target.rows )
+ {
+ if (ras.target.flow==TT_Flow_Down)
+ bits[(ras.target.rows-1-e1) * ras.target.cols] |= f1;
+ else
+ bits[e1 * ras.target.cols] |= f1;
+ }
+ }
+
+
+ static void Horizontal_Sweep_Step( RAS_ARG )
+ {
+ /* Nothing, really */
+ }
+
+
+#ifdef TT_CONFIG_OPTION_GRAY_SCALING
+
+/***********************************************************************/
+/* */
+/* Vertical Gray Sweep Procedure Set: */
+/* */
+/* These two routines are used during the vertical gray-levels */
+/* sweep phase by the generic Draw_Sweep() function. */
+/* */
+/* */
+/* NOTES: */
+/* */
+/* - The target pixmap's width *must* be a multiple of 4. */
+/* */
+/* - you have to use the function Vertical_Sweep_Span() for */
+/* the gray span call. */
+/* */
+/***********************************************************************/
+
+ static void Vertical_Gray_Sweep_Init( RAS_ARGS Short* min, Short* max )
+ {
+ *min = *min & -2;
+ *max = ( *max + 3 ) & -2;
+
+ ras.traceOfs = 0;
+
+ switch ( ras.target.flow )
+ {
+ case TT_Flow_Up:
+ ras.traceG = (*min / 2) * ras.target.cols;
+ ras.traceIncr = ras.target.cols;
+ break;
+
+ default:
+ ras.traceG = (ras.target.rows-1 - *min/2) * ras.target.cols;
+ ras.traceIncr = -ras.target.cols;
+ }
+
+ ras.gray_min_x = ras.target.cols;
+ ras.gray_max_x = -ras.target.cols;
+ }
+
+
+ static void Vertical_Gray_Sweep_Step( RAS_ARG )
+ {
+ Int c1, c2;
+ PByte pix, bit, bit2;
+ Int* count = ras.count_table;
+ Byte* grays;
+
+
+ ras.traceOfs += ras.gray_width;
+
+ if ( ras.traceOfs > ras.gray_width )
+ {
+ pix = ras.gTarget + ras.traceG + ras.gray_min_x * 4;
+ grays = ras.grays;
+
+ if ( ras.gray_max_x >= 0 )
+ {
+ if ( ras.gray_max_x >= ras.target.width )
+ ras.gray_max_x = ras.target.width-1;
+
+ if ( ras.gray_min_x < 0 )
+ ras.gray_min_x = 0;
+
+ bit = ras.bTarget + ras.gray_min_x;
+ bit2 = bit + ras.gray_width;
+
+ c1 = ras.gray_max_x - ras.gray_min_x;
+
+ while ( c1 >= 0 )
+ {
+ c2 = count[*bit] + count[*bit2];
+
+ if ( c2 )
+ {
+ pix[0] = grays[(c2 & 0xF000) >> 12];
+ pix[1] = grays[(c2 & 0x0F00) >> 8];
+ pix[2] = grays[(c2 & 0x00F0) >> 4];
+ pix[3] = grays[(c2 & 0x000F) ];
+
+ *bit = 0;
+ *bit2 = 0;
+ }
+
+ bit ++;
+ bit2++;
+ pix += 4;
+ c1 --;
+ }
+ }
+
+ ras.traceOfs = 0;
+ ras.traceG += ras.traceIncr;
+
+ ras.gray_min_x = ras.target.cols;
+ ras.gray_max_x = -ras.target.cols;
+ }
+ }
+
+
+ static void Horizontal_Gray_Sweep_Span( RAS_ARGS Short y,
+ TT_F26Dot6 x1,
+ TT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ /* nothing, really */
+ }
+
+ static void Horizontal_Gray_Sweep_Drop( RAS_ARGS Short y,
+ TT_F26Dot6 x1,
+ TT_F26Dot6 x2,
+ PProfile left,
+ PProfile right )
+ {
+ Long e1, e2;
+ PByte pixel;
+ Byte color;
+
+
+ /* During the horizontal sweep, we only take care of drop-outs */
+ e1 = CEILING( x1 );
+ e2 = FLOOR ( x2 );
+
+ if ( e1 > e2 )
+ {
+ if ( e1 == e2 + ras.precision )
+ {
+ switch ( ras.dropOutControl )
+ {
+ case 1:
+ e1 = e2;
+ break;
+
+ case 4:
+ e1 = CEILING( (x1 + x2 + 1) / 2 );
+ break;
+
+ case 2:
+ case 5:
+
+ /* Drop-out Control Rule #4 */
+
+ /* The spec is not very clear regarding rule #4. It */
+ /* presents a method that is way too costly to implement */
+ /* while the general idea seems to get rid of 'stubs'. */
+ /* */
+
+ /* rightmost stub test */
+ if ( left->next == right && left->height <= 0 ) return;
+
+ /* leftmost stub test */
+ if ( right->next == left && left->start == y ) return;
+
+ if ( ras.dropOutControl == 2 )
+ e1 = e2;
+ else
+ e1 = CEILING( (x1 + x2 + 1) / 2 );
+
+ break;
+
+ default:
+ return; /* unsupported mode */
+ }
+ }
+ else
+ return;
+ }
+
+ if ( e1 >= 0 )
+ {
+ if ( x2 - x1 >= ras.precision_half )
+ color = ras.grays[2];
+ else
+ color = ras.grays[1];
+
+ e1 = TRUNC(e1) / 2;
+ if ( e1 < ras.target.rows )
+ {
+ if ( ras.target.flow == TT_Flow_Down )
+ pixel = ras.gTarget +
+ (ras.target.rows - 1 - e1) * ras.target.cols + y / 2;
+ else
+ pixel = ras.gTarget +
+ e1 * ras.target.cols + y / 2;
+
+ if (pixel[0] == ras.grays[0])
+ pixel[0] = color;
+ }
+ }
+ }
+
+#endif /* TT_CONFIG_OPTION_GRAY_SCALING */
+
+
+/********************************************************************/
+/* */
+/* Generic Sweep Drawing routine */
+/* */
+/********************************************************************/
+
+ static Bool Draw_Sweep( RAS_ARG )
+ {
+ Short y, y_change, y_height;
+
+ PProfile P, Q, P_Left, P_Right;
+
+ Short min_Y, max_Y, top, bottom, dropouts;
+
+ Long x1, x2, xs, e1, e2;
+
+ TProfileList wait;
+ TProfileList draw_left, draw_right;
+
+
+ /* Init empty linked lists */
+
+ Init_Linked( &wait );
+
+ Init_Linked( &draw_left );
+ Init_Linked( &draw_right );
+
+ /* first, compute min and max Y */
+
+ P = ras.fProfile;
+ max_Y = TRUNC( ras.minY );
+ min_Y = TRUNC( ras.maxY );
+
+ while ( P )
+ {
+ Q = P->link;
+
+ bottom = P->start;
+ top = P->start + P->height-1;
+
+ if ( min_Y > bottom ) min_Y = bottom;
+ if ( max_Y < top ) max_Y = top;
+
+ P->X = 0;
+ InsNew( &wait, P );
+
+ P = Q;
+ }
+
+ /* Check the Y-turns */
+ if ( ras.numTurns == 0 )
+ {
+ ras.error = Raster_Err_Invalid;
+ return FAILURE;
+ }
+
+ /* Now inits the sweep */
+
+ ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y );
+
+ /* Then compute the distance of each profile from min_Y */
+
+ P = wait;
+
+ while ( P )
+ {
+ P->countL = P->start - min_Y;
+ P = P->link;
+ }
+
+ /* Let's go */
+
+ y = min_Y;
+ y_height = 0;
+
+ if ( ras.numTurns > 0 &&
+ ras.sizeBuff[-ras.numTurns] == min_Y )
+ ras.numTurns--;
+
+ while ( ras.numTurns > 0 )
+ {
+ /* look in the wait list for new activations */
+
+ P = wait;
+
+ while ( P )
+ {
+ Q = P->link;
+ P->countL -= y_height;
+ if ( P->countL == 0 )
+ {
+ DelOld( &wait, P );
+
+ switch ( P->flow )
+ {
+ case TT_Flow_Up: InsNew( &draw_left, P ); break;
+ case TT_Flow_Down: InsNew( &draw_right, P ); break;
+ }
+ }
+
+ P = Q;
+ }
+
+ /* Sort the drawing lists */
+
+ Sort( &draw_left );
+ Sort( &draw_right );
+
+ y_change = ras.sizeBuff[-ras.numTurns--];
+ y_height = y_change - y;
+
+ while ( y < y_change )
+ {
+
+ /* Let's trace */
+
+ dropouts = 0;
+
+ P_Left = draw_left;
+ P_Right = draw_right;
+
+ while ( P_Left )
+ {
+ x1 = P_Left ->X;
+ x2 = P_Right->X;
+
+ if ( x1 > x2 )
+ {
+ xs = x1;
+ x1 = x2;
+ x2 = xs;
+ }
+
+ if ( x2-x1 <= ras.precision )
+ {
+ e1 = FLOOR( x1 );
+ e2 = CEILING( x2 );
+
+ if ( ras.dropOutControl != 0 &&
+ (e1 > e2 || e2 == e1 + ras.precision) )
+ {
+ /* a drop out was detected */
+
+ P_Left ->X = x1;
+ P_Right->X = x2;
+
+ /* mark profile for drop-out processing */
+ P_Left->countL = 1;
+ dropouts++;
+
+ goto Skip_To_Next;
+ }
+ }
+
+ ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right );
+
+ Skip_To_Next:
+
+ P_Left = P_Left->link;
+ P_Right = P_Right->link;
+ }
+
+ /* now perform the dropouts _after_ the span drawing */
+ /* drop-outs processing has been moved out of the loop */
+ /* for performance tuning */
+ if (dropouts > 0)
+ goto Scan_DropOuts;
+
+ Next_Line:
+
+ ras.Proc_Sweep_Step( RAS_VAR );
+
+ y++;
+
+ if ( y < y_change )
+ {
+ Sort( &draw_left );
+ Sort( &draw_right );
+ }
+
+ }
+
+ /* Now finalize the profiles that needs it */
+
+ {
+ PProfile Q, P;
+ P = draw_left;
+ while ( P )
+ {
+ Q = P->link;
+ if ( P->height == 0 )
+ DelOld( &draw_left, P );
+ P = Q;
+ }
+ }
+
+ {
+ PProfile Q, P = draw_right;
+ while ( P )
+ {
+ Q = P->link;
+ if ( P->height == 0 )
+ DelOld( &draw_right, P );
+ P = Q;
+ }
+ }
+ }
+
+ /* for gray-scaling, flushes the bitmap scanline cache */
+ while ( y <= max_Y )
+ {
+ ras.Proc_Sweep_Step( RAS_VAR );
+ y++;
+ }
+
+ return SUCCESS;
+
+Scan_DropOuts :
+
+ P_Left = draw_left;
+ P_Right = draw_right;
+
+ while ( P_Left )
+ {
+ if (P_Left->countL)
+ {
+ P_Left->countL = 0;
+ /* dropouts--; -- this is useful when debugging only */
+ ras.Proc_Sweep_Drop( RAS_VARS y,
+ P_Left->X,
+ P_Right->X,
+ P_Left,
+ P_Right );
+ }
+
+ P_Left = P_Left->link;
+ P_Right = P_Right->link;
+ }
+
+ goto Next_Line;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Render_Single_Pass */
+/* */
+/* Description: Performs one sweep with sub-banding. */
+/* */
+/* Input: _XCoord, _YCoord : x and y coordinates arrays */
+/* */
+/* Returns: SUCCESS on success */
+/* FAILURE if any error was encountered during render. */
+/* */
+/****************************************************************************/
+
+ static TT_Error Render_Single_Pass( RAS_ARGS Bool flipped )
+ {
+ Short i, j, k;
+
+
+ while ( ras.band_top >= 0 )
+ {
+ ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision;
+ ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision;
+
+ ras.top = ras.buff;
+
+ ras.error = Raster_Err_None;
+
+ if ( Convert_Glyph( RAS_VARS flipped ) )
+ {
+ if ( ras.error != Raster_Err_Overflow ) return FAILURE;
+
+ ras.error = Raster_Err_None;
+
+ /* sub-banding */
+
+#ifdef DEBUG_RASTER
+ ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) );
+#endif
+
+ i = ras.band_stack[ras.band_top].y_min;
+ j = ras.band_stack[ras.band_top].y_max;
+
+ k = ( i + j ) / 2;
+
+ if ( ras.band_top >= 7 || k < i )
+ {
+ ras.band_top = 0;
+ ras.error = Raster_Err_Invalid;
+ return ras.error;
+ }
+
+ ras.band_stack[ras.band_top+1].y_min = k;
+ ras.band_stack[ras.band_top+1].y_max = j;
+
+ ras.band_stack[ras.band_top].y_max = k - 1;
+
+ ras.band_top++;
+ }
+ else
+ {
+ if ( ras.fProfile )
+ if ( Draw_Sweep( RAS_VAR ) ) return ras.error;
+ ras.band_top--;
+ }
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+/****************************************************************************/
+/* */
+/* Function: Render_Glyph */
+/* */
+/* Description: Renders a glyph in a bitmap. Sub-banding if needed. */
+/* */
+/* Input: AGlyph Glyph record */
+/* */
+/* Returns: SUCCESS on success. */
+/* FAILURE if any error was encountered during rendering. */
+/* */
+/****************************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Render_Glyph( RAS_ARGS TT_Outline* glyph,
+ TT_Raster_Map* target_map )
+ {
+ TT_Error error;
+
+
+ if ( glyph->n_points == 0 || glyph->n_contours <= 0 )
+ return TT_Err_Ok;
+
+ if ( !ras.buff )
+ {
+ ras.error = Raster_Err_Not_Ini;
+ return ras.error;
+ }
+
+ if ( glyph->n_points < glyph->contours[glyph->n_contours - 1] )
+ {
+ ras.error = TT_Err_Too_Many_Points;
+ return ras.error;
+ }
+
+ if ( target_map )
+ ras.target = *target_map;
+
+ ras.outs = glyph->contours;
+ ras.flags = glyph->flags;
+ ras.nPoints = glyph->n_points;
+ ras.nContours = glyph->n_contours;
+ ras.coords = glyph->points;
+
+ Set_High_Precision( RAS_VARS glyph->high_precision );
+ ras.scale_shift = ras.precision_shift;
+ ras.dropOutControl = glyph->dropout_mode;
+ ras.second_pass = glyph->second_pass;
+
+
+ /* Vertical Sweep */
+ ras.Proc_Sweep_Init = Vertical_Sweep_Init;
+ ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+ ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+ ras.Proc_Sweep_Step = Vertical_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = ras.target.rows - 1;
+
+ ras.bWidth = ras.target.width;
+ ras.bTarget = (Byte*)ras.target.bitmap;
+
+ if ( (error = Render_Single_Pass( RAS_VARS 0 )) != 0 )
+ return error;
+
+ /* Horizontal Sweep */
+
+ if ( ras.second_pass && ras.dropOutControl != 0 )
+ {
+ ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+ ras.Proc_Sweep_Span = Horizontal_Sweep_Span;
+ ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop;
+ ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = ras.target.width - 1;
+
+ if ( (error = Render_Single_Pass( RAS_VARS 1 )) != 0 )
+ return error;
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+#ifdef TT_CONFIG_OPTION_GRAY_SCALING
+
+/****************************************************************************/
+/* */
+/* Function: Render_Gray_Glyph */
+/* */
+/* Description: Renders a glyph with grayscaling. Sub-banding if needed. */
+/* */
+/* Input: AGlyph Glyph record */
+/* */
+/* Returns: SUCCESS on success */
+/* FAILURE if any error was encountered during rendering. */
+/* */
+/****************************************************************************/
+
+ LOCAL_FUNC
+ TT_Error Render_Gray_Glyph( RAS_ARGS TT_Outline* glyph,
+ TT_Raster_Map* target_map,
+ Byte* palette )
+ {
+ Int i;
+ TT_Error error;
+
+ if ( !ras.buff )
+ {
+ ras.error = Raster_Err_Not_Ini;
+ return ras.error;
+ }
+
+ if ( glyph->n_points == 0 || glyph->n_contours <= 0 )
+ return TT_Err_Ok;
+
+ if ( glyph->n_points < glyph->contours[glyph->n_contours - 1] )
+ {
+ ras.error = TT_Err_Too_Many_Points;
+ return ras.error;
+ }
+
+ if ( palette )
+ {
+ for ( i = 0; i < 5; i++ )
+ ras.grays[i] = palette[i];
+ }
+
+ if ( target_map )
+ ras.target = *target_map;
+
+ ras.outs = glyph->contours;
+ ras.flags = glyph->flags;
+ ras.nPoints = glyph->n_points;
+ ras.nContours = glyph->n_contours;
+ ras.coords = glyph->points;
+
+ Set_High_Precision( RAS_VARS glyph->high_precision );
+ ras.scale_shift = ras.precision_shift+1;
+ ras.dropOutControl = glyph->dropout_mode;
+ ras.second_pass = glyph->second_pass;
+
+
+ /* Vertical Sweep */
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = 2 * ras.target.rows - 1;
+
+ ras.bWidth = ras.gray_width;
+ if ( ras.bWidth > ras.target.cols/4 )
+ ras.bWidth = ras.target.cols/4;
+
+ ras.bWidth = ras.bWidth * 8;
+ ras.bTarget = (Byte*)ras.gray_lines;
+ ras.gTarget = (Byte*)ras.target.bitmap;
+
+ ras.Proc_Sweep_Init = Vertical_Gray_Sweep_Init;
+ ras.Proc_Sweep_Span = Vertical_Sweep_Span;
+ ras.Proc_Sweep_Drop = Vertical_Sweep_Drop;
+ ras.Proc_Sweep_Step = Vertical_Gray_Sweep_Step;
+
+ error = Render_Single_Pass( RAS_VARS 0 );
+ if (error)
+ return error;
+
+ /* Horizontal Sweep */
+
+ if ( ras.second_pass && ras.dropOutControl != 0 )
+ {
+ ras.Proc_Sweep_Init = Horizontal_Sweep_Init;
+ ras.Proc_Sweep_Span = Horizontal_Gray_Sweep_Span;
+ ras.Proc_Sweep_Drop = Horizontal_Gray_Sweep_Drop;
+ ras.Proc_Sweep_Step = Horizontal_Sweep_Step;
+
+ ras.band_top = 0;
+ ras.band_stack[0].y_min = 0;
+ ras.band_stack[0].y_max = ras.target.width * 2 - 1;
+
+ error = Render_Single_Pass( RAS_VARS 1 );
+ if (error)
+ return error;
+ }
+
+ return TT_Err_Ok;
+ }
+
+#endif /* TT_CONFIG_OPTION_GRAY_SCALING */
+
+
+/************************************************/
+/* */
+/* InitRasterizer */
+/* */
+/* Raster Initialization. */
+/* Gets the bitmap description and render pool */
+/* addresses. */
+/* */
+/************************************************/
+
+#undef ras
+
+ LOCAL_FUNC
+ TT_Error TTRaster_Done( PEngine_Instance engine )
+ {
+ TRaster_Instance* ras = (TRaster_Instance*)engine->raster_component;
+
+
+ if ( !ras )
+ return TT_Err_Ok;
+
+ FREE( ras->buff );
+ FREE( ras->gray_lines );
+
+#ifndef TT_STATIC_RASTER
+ FREE( engine->raster_component );
+#endif
+
+ return TT_Err_Ok;
+ }
+
+
+ LOCAL_FUNC
+ TT_Error TTRaster_Init( PEngine_Instance engine )
+ {
+ TT_Error error;
+
+ Int i, l, j, c;
+
+ TRaster_Instance* ras;
+
+
+#ifdef TT_STATIC_RASTER
+ ras = engine->raster_component = &cur_ras;
+#else
+ if ( ALLOC( engine->raster_component, sizeof ( TRaster_Instance ) ) )
+ return error;
+
+ ras = (TRaster_Instance*)engine->raster_component;
+#endif
+
+ if ( ALLOC( ras->buff, RASTER_RENDER_POOL ) ||
+ ALLOC( ras->gray_lines, RASTER_GRAY_LINES ) )
+ return error;
+
+ ras->sizeBuff = ras->buff + ( RASTER_RENDER_POOL/4 );
+ ras->gray_width = RASTER_GRAY_LINES/2;
+
+ /* Initialization of Count_Table */
+
+ for ( i = 0; i < 256; i++ )
+ {
+ l = 0;
+ j = i;
+
+ for ( c = 0; c < 4; c++ )
+ {
+ l <<= 4;
+
+ if ( j & 0x80 ) l++;
+ if ( j & 0x40 ) l++;
+
+ j = ( j << 2 ) & 0xFF;
+ }
+
+ ras->count_table[i] = l;
+ }
+
+ ras->dropOutControl = 2;
+ ras->error = Raster_Err_None;
+
+ return TT_Err_Ok;
+ }
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/ttraster.h b/xc/extras/FreeType/lib/ttraster.h
new file mode 100644
index 000000000..c8937b9fe
--- /dev/null
+++ b/xc/extras/FreeType/lib/ttraster.h
@@ -0,0 +1,126 @@
+/*******************************************************************
+ *
+ * ttraster.h v 1.4
+ *
+ * The FreeType glyph rasterizer.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * NOTES:
+ *
+ * This version supports the following:
+ *
+ * - direct grayscaling
+ * - sub-banding
+ * - drop-out modes 4 and 5
+ * - second pass for complete drop-out control (bitmap only)
+ * - variable precision
+ *
+ *
+ * Changes between 1.4 and 1.3:
+ *
+ * Mainly performance tunings:
+ *
+ * - Line_Down() and Bezier_Down() now use the functions Line_Up()
+ * and Bezier_Up() to do their work.
+ * - optimized Split_Bezier()
+ * - optimized linked lists used during sweeps
+ *
+ * Changes between 1.2 and 1.3:
+ *
+ * - made the engine optionaly re-entrant. Saves a lot
+ * of code for a moderate performance hit.
+ *
+ ******************************************************************/
+
+#ifndef TTRASTER_H
+#define TTRASTER_H
+
+#include "ttconfig.h"
+#include "freetype.h" /* for TT_Outline */
+#include "ttengine.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* We provide two different builds of the scan-line converter */
+ /* The static build uses global variables and isn't */
+ /* re-entrant. */
+ /* The indirect build is re-entrant but accesses all variables */
+ /* indirectly. */
+ /* */
+ /* As a consequence, the indirect build is about 10% slower */
+ /* than the static one on a _Pentium_ (this could get worse */
+ /* on older processors), but the code size is reduced by */
+ /* more than 30% ! */
+ /* */
+ /* The indirect build is now the default, defined in */
+ /* ttconfig.h. Be careful if you experiment with this. */
+
+ /* Note also that, though its code can be re-entrant, the */
+ /* component is always used in thread-safe mode. This is */
+ /* simply due to the fact that we want to use a single */
+ /* render pool (of 64 Kb), and not to waste memory. */
+
+#ifdef TT_STATIC_RASTER
+
+#define RAS_ARGS /* void */
+#define RAS_ARG /* void */
+
+#define RAS_VARS /* void */
+#define RAS_VAR /* void */
+
+#else
+
+#define RAS_ARGS TRaster_Instance* raster,
+#define RAS_ARG TRaster_Instance* raster
+
+#define RAS_VARS raster,
+#define RAS_VAR raster
+
+#endif
+
+
+ typedef struct TRaster_Instance_ TRaster_Instance;
+
+ /* Render one glyph in the target bitmap, using drop-out control */
+ /* mode 'scan'. */
+ LOCAL_DEF
+ TT_Error Render_Glyph( RAS_ARGS TT_Outline* glyph,
+ TT_Raster_Map* target );
+
+#ifdef TT_CONFIG_OPTION_GRAY_SCALING
+ /* Render one gray-level glyph in the target pixmap. */
+ /* Palette points to an array of 5 colors used for the rendering. */
+ /* Use NULL to reuse the last palette. Default is VGA graylevels. */
+ LOCAL_DEF
+ TT_Error Render_Gray_Glyph( RAS_ARGS TT_Outline* glyph,
+ TT_Raster_Map* target,
+ Byte* palette );
+#endif
+
+ /* Initialize rasterizer */
+ LOCAL_DEF
+ TT_Error TTRaster_Init( PEngine_Instance engine );
+
+ /* Finalize it */
+ LOCAL_DEF
+ TT_Error TTRaster_Done( PEngine_Instance engine );
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* TTRASTER_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/tttables.h b/xc/extras/FreeType/lib/tttables.h
new file mode 100644
index 000000000..a8097b416
--- /dev/null
+++ b/xc/extras/FreeType/lib/tttables.h
@@ -0,0 +1,215 @@
+/*******************************************************************
+ *
+ * tttables.h 1.1
+ *
+ * TrueType Tables structures and handling (specification).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ ******************************************************************/
+
+#ifndef TTTABLES_H
+#define TTTABLES_H
+
+#include "ttconfig.h"
+#include "tttypes.h"
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ /***********************************************************************/
+ /* */
+ /* TrueType Table Types */
+ /* */
+ /***********************************************************************/
+
+ /* TrueType Collection Header */
+
+ struct TTTCHeader_
+ {
+ ULong Tag;
+ TT_Fixed version;
+ ULong DirCount;
+ PULong TableDirectory;
+ };
+
+ typedef struct TTTCHeader_ TTTCHeader;
+ typedef TTTCHeader* PTTCHeader;
+
+
+ /* TrueType Table Directory type */
+
+ struct TTableDir_
+ {
+ TT_Fixed version; /* should be 0x10000 */
+ UShort numTables; /* number of tables */
+
+ UShort searchRange; /* These parameters are only used */
+ UShort entrySelector; /* for a dichotomy search in the */
+ UShort rangeShift; /* directory. We ignore them. */
+ };
+
+ typedef struct TTableDir_ TTableDir;
+ typedef TTableDir* PTableDir;
+
+
+ /* The 'TableDir' is followed by 'numTables' TableDirEntries */
+
+ struct TTableDirEntry_
+ {
+ ULong Tag; /* table type */
+ ULong CheckSum; /* table checksum */
+ ULong Offset; /* table file offset */
+ ULong Length; /* table length */
+ };
+
+ typedef struct TTableDirEntry_ TTableDirEntry;
+ typedef TTableDirEntry* PTableDirEntry;
+
+
+ /* 'cmap' tables */
+
+ struct TCMapDir_
+ {
+ UShort tableVersionNumber;
+ UShort numCMaps;
+ };
+
+ typedef struct TCMapDir_ TCMapDir;
+ typedef TCMapDir* PCMapDir;
+
+ struct TCMapDirEntry_
+ {
+ UShort platformID;
+ UShort platformEncodingID;
+ Long offset;
+ };
+
+ typedef struct TCMapDirEntry_ TCMapDirEntry;
+ typedef TCMapDirEntry* PCMapDirEntries;
+
+
+ /* 'maxp' Maximum Profiles table */
+
+ struct TMaxProfile_
+ {
+ TT_Fixed version;
+ UShort numGlyphs,
+ maxPoints,
+ maxContours,
+ maxCompositePoints,
+ maxCompositeContours,
+ maxZones,
+ maxTwilightPoints,
+ maxStorage,
+ maxFunctionDefs,
+ maxInstructionDefs,
+ maxStackElements,
+ maxSizeOfInstructions,
+ maxComponentElements,
+ maxComponentDepth;
+ };
+
+ typedef struct TMaxProfile_ TMaxProfile;
+ typedef TMaxProfile* PMaxProfile;
+
+
+ /* table "gasp" */
+
+#define GASP_GRIDFIT 0x01
+#define GASP_DOGRAY 0x02
+
+ struct GaspRange_
+ {
+ UShort maxPPEM;
+ UShort gaspFlag;
+ };
+
+ typedef struct GaspRange_ GaspRange;
+
+
+ struct TGasp_
+ {
+ UShort version;
+ UShort numRanges;
+ GaspRange* gaspRanges;
+ };
+
+ typedef struct TGasp_ TGasp;
+
+
+ /* table "head" - now defined in freetype.h */
+ /* table "hhea" - now defined in freetype.h */
+
+
+ /* tables "HMTX" and "VMTX" */
+
+ struct TLongMetrics_
+ {
+ UShort advance;
+ Short bearing;
+ };
+
+ typedef struct TLongMetrics_ TLongMetrics, *PLongMetrics;
+
+ typedef Short TShortMetrics, *PShortMetrics;
+
+ /* 'loca' location table type */
+
+ struct TLoca_
+ {
+ UShort Size;
+ PStorage Table;
+ };
+
+ typedef struct TLoca_ TLoca;
+
+
+ /* table "name" */
+
+ struct TNameRec_
+ {
+ UShort platformID;
+ UShort encodingID;
+ UShort languageID;
+ UShort nameID;
+ UShort stringLength;
+ UShort stringOffset;
+
+ /* this last field is not defined in the spec */
+ /* but used by the FreeType engine */
+
+ PByte string;
+ };
+
+ typedef struct TNameRec_ TNameRec;
+
+
+ struct TName_Table_
+ {
+ UShort format;
+ UShort numNameRecords;
+ UShort storageOffset;
+ TNameRec* names;
+ PByte storage;
+ };
+
+ typedef struct TName_Table_ TName_Table;
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* TTTABLES_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/tttags.h b/xc/extras/FreeType/lib/tttags.h
new file mode 100644
index 000000000..b3205089f
--- /dev/null
+++ b/xc/extras/FreeType/lib/tttags.h
@@ -0,0 +1,56 @@
+/*******************************************************************
+ *
+ * tttags.h
+ *
+ * tags for TrueType tables (specification only).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ ******************************************************************/
+
+#ifndef TTAGS_H
+#define TTAGS_H
+
+#include "ttconfig.h"
+#include "freetype.h" /* for MAKE_TT_TAG() */
+
+
+#define TTAG_cmap MAKE_TT_TAG( 'c', 'm', 'a', 'p' )
+#define TTAG_cvt MAKE_TT_TAG( 'c', 'v', 't', ' ' )
+#define TTAG_EBDT MAKE_TT_TAG( 'E', 'B', 'D', 'T' )
+#define TTAG_EBLC MAKE_TT_TAG( 'E', 'B', 'L', 'C' )
+#define TTAG_EBSC MAKE_TT_TAG( 'E', 'B', 'S', 'C' )
+#define TTAG_fpgm MAKE_TT_TAG( 'f', 'p', 'g', 'm' )
+#define TTAG_gasp MAKE_TT_TAG( 'g', 'a', 's', 'p' )
+#define TTAG_glyf MAKE_TT_TAG( 'g', 'l', 'y', 'f' )
+#define TTAG_GSUB MAKE_TT_TAG( 'G', 'S', 'U', 'B' )
+#define TTAG_hdmx MAKE_TT_TAG( 'h', 'd', 'm', 'x' )
+#define TTAG_head MAKE_TT_TAG( 'h', 'e', 'a', 'd' )
+#define TTAG_hhea MAKE_TT_TAG( 'h', 'h', 'e', 'a' )
+#define TTAG_hmtx MAKE_TT_TAG( 'h', 'm', 't', 'x' )
+#define TTAG_kern MAKE_TT_TAG( 'k', 'e', 'r', 'n' )
+#define TTAG_loca MAKE_TT_TAG( 'l', 'o', 'c', 'a' )
+#define TTAG_LTSH MAKE_TT_TAG( 'L', 'T', 'S', 'H' )
+#define TTAG_maxp MAKE_TT_TAG( 'm', 'a', 'x', 'p' )
+#define TTAG_name MAKE_TT_TAG( 'n', 'a', 'm', 'e' )
+#define TTAG_OS2 MAKE_TT_TAG( 'O', 'S', '/', '2' )
+#define TTAG_PCLT MAKE_TT_TAG( 'P', 'C', 'L', 'T' )
+#define TTAG_post MAKE_TT_TAG( 'p', 'o', 's', 't' )
+#define TTAG_prep MAKE_TT_TAG( 'p', 'r', 'e', 'p' )
+#define TTAG_ttc MAKE_TT_TAG( 't', 't', 'c', ' ' )
+#define TTAG_ttcf MAKE_TT_TAG( 't', 't', 'c', 'f' )
+#define TTAG_VDMX MAKE_TT_TAG( 'V', 'D', 'M', 'X' )
+#define TTAG_vhea MAKE_TT_TAG( 'v', 'h', 'e', 'a' )
+#define TTAG_vmtx MAKE_TT_TAG( 'v', 'm', 't', 'x' )
+
+#endif /* TTAGS_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/lib/tttypes.h b/xc/extras/FreeType/lib/tttypes.h
new file mode 100644
index 000000000..166a1a79d
--- /dev/null
+++ b/xc/extras/FreeType/lib/tttypes.h
@@ -0,0 +1,156 @@
+/*******************************************************************
+ *
+ * tttypes.h
+ *
+ * Freetype engine's common types specification
+ * (this spec has no associated body).
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify, or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ * NOTE:
+ *
+ * All these declarations are library internals, and *not* part
+ * of the high-level interface. See also 'freetype.h'.
+ *
+ ******************************************************************/
+/* $XFree86: xc/extras/FreeType/lib/tttypes.h,v 1.4 1999/01/24 03:38:35 dawes Exp $ */
+
+#ifndef TTTYPES_H
+#define TTTYPES_H
+
+#include "ttconfig.h"
+#include "freetype.h"
+
+#ifdef DEBUG
+#ifndef ARM_1212
+#include <stdio.h>
+#else
+#include <std.h>
+#endif
+#endif
+
+ typedef char String;
+ typedef signed char Char;
+ typedef unsigned char Byte;
+
+ typedef unsigned short UShort;
+ typedef signed short Short;
+
+ typedef unsigned long ULong;
+ typedef signed long Long;
+
+ typedef TT_Int32 Fixed;
+
+ typedef int Int;
+
+ /* Simple access types: pointers and tables */
+
+ typedef Byte* PByte;
+ typedef UShort* PUShort;
+ typedef Short* PShort;
+ typedef ULong* PULong;
+ typedef Long* PLong;
+
+ typedef Fixed* PFixed;
+
+ typedef Int* PInt;
+
+ typedef void* Pointer;
+
+ typedef TT_F26Dot6* PCoordinates;
+ typedef unsigned char* PTouchTable;
+
+
+/* Xserver-specific change */
+#if 0
+#ifndef Bool
+ typedef int Bool; /* No boolean type in C */
+#endif
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef NULL
+#define NULL (void*)0
+#endif
+
+ typedef long* PStorage;
+
+
+/* Rounding mode constants */
+
+#define TT_Round_Off 5
+#define TT_Round_To_Half_Grid 0
+#define TT_Round_To_Grid 1
+#define TT_Round_To_Double_Grid 2
+#define TT_Round_Up_To_Grid 4
+#define TT_Round_Down_To_Grid 3
+#define TT_Round_Super 6
+#define TT_Round_Super_45 7
+
+
+/* Touch flag masks */
+
+#define TT_Flag_On_Curve 1
+#define TT_Flag_Touched_X 2
+#define TT_Flag_Touched_Y 4
+#define TT_Flag_Touched_Both 6
+
+
+/* Error management constants :) */
+
+#define SUCCESS 0
+#define FAILURE -1
+
+
+/* The min and max functions missing in C. As usual, be careful not to */
+/* write things like MIN( a++, b++ ) to avoid side effects. */
+
+#ifndef MIN
+#define MIN( a, b ) ( (a) < (b) ? (a) : (b) )
+#endif
+
+#ifndef MAX
+#define MAX( a, b ) ( (a) > (b) ? (a) : (b) )
+#endif
+
+#ifndef ABS
+#define ABS( a ) ( (a) < 0 ? -(a) : (a) )
+#endif
+
+/* conversion macros for the handles defined in freetype.h */
+
+#define HANDLE_Val( handle ) ((handle).z)
+
+#define HANDLE_Engine( handle ) ((PEngine_Instance)HANDLE_Val( handle ))
+
+#define HANDLE_Face( handle ) ((PFace)HANDLE_Val( handle ))
+
+#define HANDLE_Instance( handle ) ((PInstance)HANDLE_Val( handle ))
+
+/* HANDLE_Stream( handle ) must be defined in ttfile.c */
+
+#define HANDLE_Glyph( handle ) ((PGlyph)HANDLE_Val( handle ))
+
+#define HANDLE_CharMap( handle ) ((PCMapTable)HANDLE_Val( handle ))
+
+#define HANDLE_Set( handle, val ) ((handle).z = (void*)(val))
+
+
+#endif /* TTTYPES_H */
+
+
+/* END */
diff --git a/xc/extras/FreeType/license.txt b/xc/extras/FreeType/license.txt
new file mode 100644
index 000000000..d740139c4
--- /dev/null
+++ b/xc/extras/FreeType/license.txt
@@ -0,0 +1,159 @@
+ The FreeType Project LICENSE
+ ----------------------------
+
+ Copyright 1996-1998 by
+ David Turner, Robert Wilhelm, and Werner Lemberg
+
+
+
+Introduction:
+
+ The FreeType Project is distributed in several archive packages;
+ some of them may contain, in addition to the FreeType font engine,
+ various tools and contributions which rely on, or relate to, the
+ FreeType Project.
+
+ This license applies to all files found in such packages, and
+ which do not fall under their own explicit license. The license
+ affects thus the FreeType font engine, the test programs,
+ documentation and makefiles, at the very least.
+
+ This license was inspired by the BSD, Artistic and IJG
+ (Independent JPEG Group) licenses, which all encourage inclusion
+ and use of free software in commercial and freeware products
+ alike. As a consequence, its main points are that:
+
+ o We don't promise that this software works. However, we'll be
+ interested in any kind of bug reports. ("as is" distribution)
+
+ o You can use this software for whatever you want, in parts or
+ full form, without having to pay us. ("royalty-free" usage)
+
+ o You may not pretend that you wrote this software. If you use
+ it, or only parts of it, in a program, you must acknowledge
+ somewhere in your documentation that you've used the FreeType
+ code. ("credits").
+
+ We specifically permit and encourage the inclusion of this
+ software, with or without modifications, in commercial products,
+ provided that all warranty or liability claims are assumed by the
+ product vendor.
+
+
+
+Legal Terms:
+
+
+0.Definitions:
+
+ Throughout this license, the terms "package", "FreeType Project",
+ and "FreeType archive" refer to the set of files originally
+ distributed by the authors (David Turner, Robert Wilhelm, and
+ Werner Lemberg) as the "FreeType project", be they named as alpha,
+ beta or final release.
+
+ "You" refers to the licensee, or person using the project, where
+ "using" is a generic term including compiling the project's source
+ code as well as linking it to form a "program" or "executable".
+ This program is referred to as "a program using the FreeType
+ engine".
+
+ This license applies to all files distributed in the original
+ FreeType archive, including all source code, binaries and
+ documentation, unless otherwise stated in the file in its
+ original, unmodified form as distributed in the original archive.
+ If you are unsure whether or not a particular file is covered by
+ this license, you must contact us to verify this.
+
+ The FreeType project is copyright (C) 1996-1998 by David Turner,
+ Robert Wilhelm, and Werner Lemberg. All rights reserved except as
+ specified below.
+
+
+1. No Warranty:
+
+ THE FREETYPE ARCHIVE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
+ KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE. IN NO EVENT WILL ANY OF THE AUTHORS OR COPYRIGHT HOLDERS
+ BE LIABLE FOR ANY DAMAGES CAUSED BY THE USE OR THE INABILITY TO
+ USE, OF THE FREETYPE PROJECT.
+
+ As you have not signed this license, you are not required to
+ accept it. However, as the FreeType project is copyrighted
+ material, only this license, or another one contracted with the
+ authors, grants you the right to use, distribute, and modify it.
+ Therefore, by using, distributing, or modifying the FreeType
+ project, you indicate that you understand and accept all the terms
+ of this license.
+
+
+2. Redistribution:
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ o Redistribution of source code must retain this license file
+ (LICENSE.TXT) unaltered; any additions, deletions or changes
+ to the original files must be clearly indicated in
+ accompanying documentation. All copyright notices must be
+ preserved in all copies of source files.
+
+ o Redistribution in binary form must provide a disclaimer that
+ states that the software is based in part of the work of the
+ FreeType team in the distribution documentation. We also
+ encourage you to put an URL to the FreeType web page in your
+ documentation, though this isn't mandatory.
+
+ These conditions apply to any software derived from or based on
+ the FreeType code, not just the unmodified files. If you use our
+ work, you must acknowledge us. However, no fee need be paid to
+ us.
+
+
+3. Advertising:
+
+ The names of FreeType's authors and contributors may not be used
+ to endorse or promote products derived from this software without
+ specific prior written permission.
+
+ We suggest, but do not require, that you use one or more of the
+ following phrases to refer to this software in your documentation
+ or advertising materials: "FreeType Project", "FreeType Engine",
+ "FreeType library", or "FreeType Distribution".
+
+
+4. Contacts:
+
+ There are two mailing lists related to FreeType:
+
+ o freetype@lists.lrz-muenchen.de
+
+ Discusses general use and applications of FreeType, as well as
+ future and wanted additions to the library and distribution.
+ If you're looking for support, start in this list if you
+ haven't found anything to help you in the documentation.
+
+
+ o freetype-devel@lists.lrz-muenchen.de
+
+ Discusses bugs, as well as engine internals, design issues,
+ specific licenses, porting, etc.
+
+
+ o http://www.physiol.med.tu-muenchen.de/~robert/freetype.html
+
+ Holds the current FreeType web page, which will allow you to
+ download our latest development version and read online
+ documentation.
+
+
+ You can also contact us individually at:
+
+ David Turner <turner@email.enst.fr>
+ Robert Wilhelm <robert@physiol.med.tu-muenchen.de>
+ Werner Lemberg <wl@gnu.org>
+
+
+ --- The End ---
diff --git a/xc/extras/FreeType/ltconfig b/xc/extras/FreeType/ltconfig
new file mode 100755
index 000000000..8afadbdfd
--- /dev/null
+++ b/xc/extras/FreeType/ltconfig
@@ -0,0 +1,1519 @@
+#! /bin/sh
+
+# ltconfig - Create a system-specific libtool.
+# Copyright (C) 1996-1998 Free Software Foundation, Inc.
+# Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# 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
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A lot of this script is taken from autoconf-2.10.
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
+
+echo=echo
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then :
+else
+ # The Solaris and AIX default echo program unquotes backslashes.
+ # This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ # So, we emulate echo with printf '%s\n'
+ echo="printf %s\\n"
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then :
+ else
+ # Oops. We have no working printf. Try to find a not-so-buggy echo.
+ echo=echo
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
+ for dir in $PATH /usr/ucb; do
+ if test -f $dir/echo && test "X`$dir/echo '\t'`" = 'X\t'; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+fi
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'
+
+# The name of this program.
+progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'`
+
+# Constants:
+PROGRAM=ltconfig
+PACKAGE=libtool
+VERSION=1.2
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.c 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS 1>&5'
+rm="rm -f"
+
+help="Try \`$progname --help' for more information."
+
+# Global variables:
+can_build_shared=yes
+enable_shared=yes
+# All known linkers require a `.a' archive for static linking.
+enable_static=yes
+ltmain=
+silent=
+srcdir=
+ac_config_guess=
+ac_config_sub=
+host=
+nonopt=
+verify_host=yes
+with_gcc=no
+with_gnu_ld=no
+
+old_AR="$AR"
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+old_CPPFLAGS="$CPPFLAGS"
+old_LD="$LD"
+old_LN_S="$LN_S"
+old_NM="$NM"
+old_RANLIB="$RANLIB"
+
+# Parse the command line options.
+args=
+prev=
+for option
+do
+ case "$option" in
+ -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ eval "$prev=\$option"
+ prev=
+ continue
+ fi
+
+ case "$option" in
+ --help) cat <<EOM
+Usage: $progname [OPTION]... LTMAIN [HOST]
+
+Generate a system-specific libtool script.
+
+ --disable-shared do not build shared libraries
+ --disable-static do not build static libraries
+ --help display this help and exit
+ --no-verify do not verify that HOST is a valid host type
+ --quiet same as \`--silent'
+ --silent do not print informational messages
+ --srcdir=DIR find \`config.guess' in DIR
+ --version output version information and exit
+ --with-gcc assume that the GNU C compiler will be used
+ --with-gnu-ld assume that the C compiler uses the GNU linker
+
+LTMAIN is the \`ltmain.sh' shell script fragment that provides basic libtool
+functionality.
+
+HOST is the canonical host system name [default=guessed].
+EOM
+ exit 0
+ ;;
+
+ --disable-shared) enable_shared=no ;;
+
+ --disable-static) enable_static=no ;;
+
+ --quiet | --silent) silent=yes ;;
+
+ --srcdir) prev=srcdir ;;
+ --srcdir=*) srcdir="$optarg" ;;
+
+ --no-verify) verify_host=no ;;
+
+ --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION"; exit 0 ;;
+
+ --with-gcc) with_gcc=yes ;;
+ --with-gnu-ld) with_gnu_ld=yes ;;
+
+ -*)
+ echo "$progname: unrecognized option \`$option'" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ ;;
+
+ *)
+ if test -z "$ltmain"; then
+ ltmain="$option"
+ elif test -z "$host"; then
+# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1
+# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then
+# echo "$progname: warning \`$option' is not a valid host type" 1>&2
+# fi
+ host="$option"
+ else
+ echo "$progname: too many arguments" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi ;;
+ esac
+done
+
+if test -z "$ltmain"; then
+ echo "$progname: you must specify a LTMAIN file" 1>&2
+ echo "$help" 1>&2
+ exit 1
+fi
+
+if test -f "$ltmain"; then :
+else
+ echo "$progname: \`$ltmain' does not exist" 1>&2
+ echo "$help" 1>&2
+ exit 1
+fi
+
+# Quote any args containing shell metacharacters.
+ltconfig_args=
+for arg
+do
+ case "$arg" in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+ ltconfig_args="$ltconfig_args '$arg'" ;;
+ *) ltconfig_args="$ltconfig_args $arg" ;;
+ esac
+done
+
+# A relevant subset of AC_INIT.
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 5 compiler messages saved in config.log
+# 6 checking for... messages and results
+if test "$silent" = yes; then
+ exec 6>/dev/null
+else
+ exec 6>&1
+fi
+exec 5>>./config.log
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+ # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+ if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+ ac_n= ac_c='
+' ac_t=' '
+ else
+ ac_n=-n ac_c= ac_t=
+ fi
+else
+ ac_n= ac_c='\c' ac_t=
+fi
+
+if test -z "$srcdir"; then
+ # Assume the source directory is the same one as the path to ltmain.sh.
+ srcdir=`$echo "$ltmain" | $Xsed -e 's%/[^/]*$%%'`
+ test "$srcdir" = "$ltmain" && srcdir=.
+fi
+
+trap "$rm conftest*; exit 1" 1 2 15
+if test "$verify_host" = yes; then
+ # Check for config.guess and config.sub.
+ ac_aux_dir=
+ for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+ if test -f $ac_dir/config.guess; then
+ ac_aux_dir=$ac_dir
+ break
+ fi
+ done
+ if test -z "$ac_aux_dir"; then
+ echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi
+ ac_config_guess=$ac_aux_dir/config.guess
+ ac_config_sub=$ac_aux_dir/config.sub
+
+ # Make sure we can run config.sub.
+ if $ac_config_sub sun4 >/dev/null 2>&1; then :
+ else
+ echo "$progname: cannot run $ac_config_sub" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi
+
+ echo $ac_n "checking host system type""... $ac_c" 1>&6
+
+ host_alias=$host
+ case "$host_alias" in
+ "")
+ if host_alias=`$ac_config_guess`; then :
+ else
+ echo "$progname: cannot guess host type; you must specify one" 1>&2
+ echo "$help" 1>&2
+ exit 1
+ fi ;;
+ esac
+ host=`$ac_config_sub $host_alias`
+ echo "$ac_t$host" 1>&6
+
+ # Make sure the host verified.
+ test -z "$host" && exit 1
+
+elif test -z "$host"; then
+ echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2
+ echo "$help" 1>&2
+ exit 1
+else
+ host_alias=$host
+fi
+
+# Transform linux* to *-*-linux-gnu*, to support old configure scripts.
+case "$host_os" in
+linux-gnu*) ;;
+linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
+esac
+
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+case "$host_os" in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "${COLLECT_NAMES+set}" != set; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR cru $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+# Set a sane default for `AR'.
+test -z "$AR" && AR=ar
+
+# If RANLIB is not set, then run the test.
+if test "${RANLIB+set}" != "set"; then
+ result=no
+
+ echo $ac_n "checking for ranlib... $ac_c" 1>&6
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/ranlib; then
+ RANLIB="ranlib"
+ result="ranlib"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+
+ echo "$ac_t$result" 1>&6
+fi
+
+if test -n "$RANLIB"; then
+ old_archive_cmds="$old_archive_cmds;\$RANLIB \$oldlib"
+ old_postinstall_cmds="\$RANLIB \$oldlib;$old_postinstall_cmds"
+fi
+
+# Check to see if we are using GCC.
+if test "$with_gcc" != yes || test -z "$CC"; then
+ # If CC is not set, then try to find GCC or a usable CC.
+ if test -z "$CC"; then
+ echo $ac_n "checking for gcc... $ac_c" 1>&6
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
+ for dir in $PATH; do
+ IFS="$save_ifs"
+ test -z "$dir" && dir=.
+ if test -f $dir/gcc; then
+ CC="gcc"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+
+ if test -n "$CC"; then
+ echo "$ac_t$CC" 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+ fi
+
+ # Not "gcc", so try "cc", rejecting "/usr/ucb/cc".
+ if test -z "$CC"; then
+ echo $ac_n "checking for cc... $ac_c" 1>&6
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}:"
+ cc_rejected=no
+ for dir in $PATH; do
+ test -z "$dir" && dir=.
+ if test -f $dir/cc; then
+ if test "$dir/cc" = "/usr/ucb/cc"; then
+ cc_rejected=yes
+ continue
+ fi
+ CC="cc"
+ break
+ fi
+ done
+ IFS="$save_ifs"
+ if test $cc_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $CC
+ shift
+ if test $# -gt 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same name, so the bogon will be chosen
+ # first if we set CC to just the name; use the full file name.
+ shift
+ set dummy "$dir/cc" "$@"
+ shift
+ CC="$@"
+ fi
+ fi
+
+ if test -n "$CC"; then
+ echo "$ac_t$CC" 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+
+ if test -z "$CC"; then
+ echo "$progname: error: no acceptable cc found in \$PATH" 1>&2
+ exit 1
+ fi
+ fi
+
+ # Now see if the compiler is really GCC.
+ with_gcc=no
+ echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
+ echo "$progname:424: checking whether we are using GNU C" >&5
+
+ $rm conftest.c
+ cat > conftest.c <<EOF
+#ifdef __GNUC__
+ yes;
+#endif
+EOF
+ if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+ with_gcc=yes
+ fi
+ $rm conftest.c
+ echo "$ac_t$with_gcc" 1>&6
+fi
+
+# Allow CC to be a program name with arguments.
+set dummy $CC
+compiler="$2"
+
+echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6
+pic_flag=
+special_shlib_compile_flags=
+wl=
+link_static_flag=
+no_builtin_flag=
+
+if test "$with_gcc" = yes; then
+ wl='-Wl,'
+ link_static_flag='-static'
+ no_builtin_flag=' -fno-builtin'
+
+ case "$host_os" in
+ aix3* | aix4* | irix5* | irix6* | osf3* | osf4*)
+ # PIC is the default for these OSes.
+ ;;
+ os2*)
+ # We can build DLLs from non-PIC.
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ pic_flag='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ *)
+ pic_flag='-fPIC'
+ ;;
+ esac
+else
+ # PORTME Check for PIC flags for the system compiler.
+ case "$host_os" in
+ aix3* | aix4*)
+ # All AIX code is PIC.
+ link_static_flag='-bnso -bI:/lib/syscalls.exp'
+ ;;
+
+ hpux9* | hpux10*)
+ # Is there a better link_static_flag that works with the bundled CC?
+ wl='-Wl,'
+ link_static_flag="${wl}-a ${wl}archive"
+ pic_flag='+Z'
+ ;;
+
+ irix5* | irix6*)
+ wl='-Wl,'
+ link_static_flag='-non_shared'
+ # PIC (with -KPIC) is the default.
+ ;;
+
+ os2*)
+ # We can build DLLs from non-PIC.
+ ;;
+
+ osf3* | osf4*)
+ # All OSF/1 code is PIC.
+ wl='-Wl,'
+ link_static_flag='-non_shared'
+ ;;
+
+ sco3.2v5*)
+ pic_flag='-Kpic'
+ link_static_flag='-dn'
+ special_shlib_compile_flags='-belf'
+ ;;
+
+ solaris2*)
+ pic_flag='-KPIC'
+ link_static_flag='-Bstatic'
+ wl='-Wl,'
+ ;;
+
+ sunos4*)
+ pic_flag='-PIC'
+ link_static_flag='-Bstatic'
+ wl='-Qoption ld '
+ ;;
+
+ sysv4.2uw2*)
+ pic_flag='-KPIC'
+ link_static_flag='-Bstatic'
+ wl='-Wl,'
+ ;;
+
+ uts4*)
+ pic_flag='-pic'
+ link_static_flag='-Bstatic'
+ ;;
+
+ *)
+ can_build_shared=no
+ ;;
+ esac
+fi
+
+if test -n "$pic_flag"; then
+ echo "$ac_t$pic_flag" 1>&6
+
+ # Check to make sure the pic_flag actually works.
+ echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
+ $rm conftest*
+ echo > conftest.c
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS $pic_flag -DPIC"
+ echo "$progname:547: checking if $compiler PIC flag $pic_flag works" >&5
+ if { (eval echo $progname:548: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
+ # Append any warnings to the config.log.
+ cat conftest.err 1>&5
+
+ # On HP-UX, both CC and GCC only warn that PIC is supported... then they
+ # create non-PIC objects. So, if there were any warnings, we assume that
+ # PIC is not supported.
+ if test -s conftest.err; then
+ echo "$ac_t"no 1>&6
+ can_build_shared=no
+ pic_flag=
+ else
+ echo "$ac_t"yes 1>&6
+ pic_flag=" $pic_flag"
+ fi
+ else
+ # Append any errors to the config.log.
+ cat conftest.err 1>&5
+ can_build_shared=no
+ pic_flag=
+ echo "$ac_t"no 1>&6
+ fi
+ CFLAGS="$save_CFLAGS"
+ $rm conftest*
+else
+ echo "$ac_t"none 1>&6
+fi
+
+# Check for any special shared library compilation flags.
+if test -n "$special_shlib_compile_flags"; then
+ echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2
+ if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then :
+ else
+ echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2
+ can_build_shared=no
+ fi
+fi
+
+echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6
+$rm conftest*
+echo 'main(){return(0);}' > conftest.c
+save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS $link_static_flag"
+echo "$progname:591: checking if $compiler static flag $link_static_flag works" >&5
+if { (eval echo $progname:592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ echo "$ac_t$link_static_flag" 1>&6
+else
+ echo "$ac_t"none 1>&6
+ link_static_flag=
+fi
+LDFLAGS="$save_LDFLAGS"
+$rm conftest*
+
+if test -z "$LN_S"; then
+ # Check to see if we can use ln -s, or we need hard links.
+ echo $ac_n "checking whether ln -s works... $ac_c" 1>&6
+ $rm conftestdata
+ if ln -s X conftestdata 2>/dev/null; then
+ $rm conftestdata
+ LN_S="ln -s"
+ else
+ LN_S=ln
+ fi
+ if test "$LN_S" = "ln -s"; then
+ echo "$ac_t"yes 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+fi
+
+# Make sure LD is an absolute path.
+if test -z "$LD"; then
+ ac_prog=ld
+ if test "$with_gcc" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
+ echo "$progname:624: checking for ld used by GCC" >&5
+ ac_prog=`($CC -print-prog-name=ld) 2>&5`
+ case "$ac_prog" in
+ # Accept absolute paths.
+ /* | [A-Za-z]:\\*)
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we are not using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+ elif test "$with_gnu_ld" = yes; then
+ echo $ac_n "checking for GNU ld... $ac_c" 1>&6
+ echo "$progname:642: checking for GNU ld" >&5
+ else
+ echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
+ echo "$progname:645: checking for non-GNU ld" >&5
+ fi
+
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog"; then
+ LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then
+ test "$with_gnu_ld" != no && break
+ else
+ test "$with_gnu_ld" != yes && break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+ fi
+
+ if test -n "$LD"; then
+ echo "$ac_t$LD" 1>&6
+ else
+ echo "$ac_t"no 1>&6
+ fi
+
+ if test -z "$LD"; then
+ echo "$progname: error: no acceptable ld found in \$PATH" 1>&2
+ exit 1
+ fi
+fi
+
+# Check to see if it really is or is not GNU ld.
+echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6
+# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+if $LD -v 2>&1 </dev/null | egrep '(GNU|with BFD)' 1>&5; then
+ with_gnu_ld=yes
+else
+ with_gnu_ld=no
+fi
+echo "$ac_t$with_gnu_ld" 1>&6
+
+# See if the linker supports building shared libraries.
+echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6
+
+allow_undefined_flag=
+no_undefined_flag=
+archive_cmds=
+old_archive_from_new_cmds=
+export_dynamic_flag_spec=
+hardcode_libdir_flag_spec=
+hardcode_libdir_separator=
+hardcode_direct=no
+hardcode_minus_L=no
+hardcode_shlibpath_var=unsupported
+runpath_var=
+
+case "$host_os" in
+amigaos* | sunos4*)
+ # On these operating systems, we should treat GNU ld like the system ld.
+ gnu_ld_acts_native=yes
+ ;;
+*)
+ gnu_ld_acts_native=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes && test "$gnu_ld_acts_native" != yes; then
+
+ # See if GNU ld supports shared libraries.
+ if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
+ case "$host_os" in
+ linux-gnu*)
+ archive_cmds='$CC -shared ${wl}-soname $wl$soname -o $lib$libobjs $deplibs'
+ ;;
+ *)
+ archive_cmds='$CC -shared ${wl}-soname $wl$soname -o $lib$libobjs'
+ ;;
+ esac
+ runpath_var=LD_RUN_PATH
+ ld_shlibs=yes
+ else
+ ld_shlibs=no
+ fi
+
+ if test "$ld_shlibs" = yes; then
+ hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec='${wl}--export-dynamic'
+ fi
+else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case "$host_os" in
+ aix3*)
+ allow_undefined_flag=unsupported
+ archive_cmds='$NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;$LD -o $objdir/$soname$libobjs -bE:$lib.exp -T512 -H512 -bM:SRE;$AR cru $lib $objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ hardcode_minus_L=yes
+ if test "$with_gcc" = yes && test -z "$link_static_flag"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ hardcode_direct=unsupported
+ fi
+ ;;
+
+ aix4*)
+ allow_undefined_flag=unsupported
+ archive_cmds='$NM$libobjs | $global_symbol_pipe | sed '\''s/.* //'\'' > $lib.exp;$CC -o $objdir/$soname$libobjs ${wl}-bE:$lib.exp ${wl}-bM:SRE ${wl}-bnoentry;$AR cru $lib $objdir/$soname'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ ;;
+
+ amigaos*)
+ archive_cmds='$rm $objdir/a2ixlibrary.data;$echo "#define NAME $libname" > $objdir/a2ixlibrary.data;$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data;$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data;$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data;$AR cru $lib$libobjs;$RANLIB $lib;(cd $objdir && a2ixlibrary -32)'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ archive_cmds='$LD -Bshareable -o $lib$libobjs /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds='$LD -Bshareable -o $lib$libobjs'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ # FreeBSD 3, at last, uses gcc -shared to do shared libraries.
+ freebsd3*)
+ archive_cmds='$CC -shared -o $lib$libobjs'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ hpux9*)
+ archive_cmds='$rm $objdir/$soname;$LD -b +s +b $install_libdir -o $objdir/$soname$libobjs;mv $objdir/$soname $lib'
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ hpux10*)
+ archive_cmds='$LD -b +h $soname +s +b $install_libdir -o $lib$libobjs'
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ export_dynamic_flag_spec='${wl}-E'
+ ;;
+
+ irix5* | irix6*)
+ archive_cmds='$LD -shared -o $lib -soname $soname -set_version $verstring$libobjs'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ ;;
+
+ netbsd*)
+ # Tested with NetBSD 1.2 ld
+ archive_cmds='$LD -Bshareable -o $lib$libobjs'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ openbsd*)
+ archive_cmds='$LD -Bshareable -o $lib$libobjs'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_minus_L=yes
+ allow_undefined_flag=unsupported
+ archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def;$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def;$echo DATA >> $objdir/$libname.def;$echo " SINGLE NONSHARED" >> $objdir/$libname.def;$echo EXPORTS >> $objdir/$libname.def;emxexp$libobjs >> $objdir/$libname.def;$CC -Zdll -Zcrtdll -o $lib$libobjs $objdir/$libname.def'
+ old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def'
+ ;;
+
+ osf3* | osf4*)
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} -o $lib -soname $soname -set_version $verstring$libobjs$deplibs'
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ ;;
+
+ sco3.2v5*)
+ archive_cmds='$LD -G -o $lib$libobjs'
+ hardcode_direct=yes
+ ;;
+
+ solaris2*)
+ no_undefined_flag=' -z text'
+ archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib$libobjs'
+ hardcode_libdir_flag_spec='-R$libdir'
+ hardcode_shlibpath_var=no
+
+ # Solaris 2 before 2.5 hardcodes -L paths.
+ case "$host_os" in
+ solaris2.[0-4]*)
+ hardcode_minus_L=yes
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ if test "$with_gcc" = yes; then
+ archive_cmds='$CC -shared -o $lib$libobjs'
+ else
+ archive_cmds='$LD -assert pure-text -Bstatic -o $lib$libobjs'
+ fi
+
+ if test "$with_gnu_ld" = yes; then
+ export_dynamic_flag_spec='${wl}-export-dynamic'
+ fi
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=yes
+ hardcode_minus_L=yes
+ hardcode_shlibpath_var=no
+ ;;
+
+ uts4*)
+ archive_cmds='$LD -G -h $soname -o $lib$libobjs'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=no
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=no
+ ;;
+
+ *)
+ ld_shlibs=no
+ can_build_shared=no
+ ;;
+ esac
+fi
+echo "$ac_t$ld_shlibs" 1>&6
+
+if test -z "$NM"; then
+ echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
+ case "$NM" in
+ /* | [A-Za-z]:\\*) ;; # Let the user override the test with a path.
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/nm; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ NM="$ac_dir/nm -B"
+ elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then
+ NM="$ac_dir/nm -p"
+ else
+ NM="$ac_dir/nm"
+ fi
+ break
+ fi
+ done
+ IFS="$ac_save_ifs"
+ test -z "$NM" && NM=nm
+ ;;
+ esac
+ echo "$ac_t$NM" 1>&6
+fi
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRSTU]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Transform the above into a raw symbol and a C symbol.
+symxfrm='\1 \1'
+
+# Define system-specific variables.
+case "$host_os" in
+aix*)
+ symcode='[BCDTU]'
+ ;;
+irix*)
+ # Cannot use undefined symbols on IRIX because inlined functions mess us up.
+ symcode='[BCDEGRST]'
+ ;;
+solaris2*)
+ symcode='[BDTU]'
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then
+ symcode='[ABCDGISTUW]'
+fi
+
+# Write the raw and C identifiers.
+global_symbol_pipe="sed -n -e 's/^.* $symcode $sympat$/$symxfrm/p'"
+
+# Check to see that the pipe works correctly.
+pipe_works=no
+$rm conftest*
+cat > conftest.c <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+echo "$progname:978: checking if global_symbol_pipe works" >&5
+if { (eval echo $progname:979: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { echo "$progname:982: eval \"$NM conftest.o | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.o | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
+
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ wcout=`wc "$nlist" 2>/dev/null`
+ count=`$echo "X$wcout" | $Xsed -e 's/^[ ]*\([0-9][0-9]*\).*$/\1/'`
+ (test "$count" -ge 0) 2>/dev/null || count=-1
+ else
+ rm -f "$nlist"T
+ count=-1
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if egrep ' nm_test_var$' "$nlist" >/dev/null; then
+ if egrep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.c
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ sed 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> conftest.c
+
+ cat <<EOF >> conftest.c
+#if defined (__STDC__) && __STDC__
+# define __ptr_t void *
+#else
+# define __ptr_t char *
+#endif
+
+/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
+int dld_preloaded_symbol_count = $count;
+
+/* The mapping between symbol names and symbols. */
+struct {
+ char *name;
+ __ptr_t address;
+}
+dld_preloaded_symbols[] =
+{
+EOF
+ sed 's/^\(.*\) \(.*\)$/ {"\1", (__ptr_t) \&\2},/' < "$nlist" >> conftest.c
+ cat <<\EOF >> conftest.c
+ {0, (__ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.o conftestm.o
+ save_LIBS="$LIBS"
+ save_CFLAGS="$CFLAGS"
+ LIBS='conftestm.o'
+ CFLAGS="$CFLAGS$no_builtin_flag"
+ if { (eval echo $progname:1040: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+ pipe_works=yes
+ else
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+ fi
+ LIBS="$save_LIBS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&5
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&5
+ fi
+ else
+ echo "cannot run $global_symbol_pipe" >&5
+ fi
+else
+ echo "$progname: failed program was:" >&5
+ cat conftest.c >&5
+fi
+$rm conftest*
+
+# Do not use the global_symbol_pipe unless it works.
+echo "$ac_t$pipe_works" 1>&6
+test "$pipe_works" = yes || global_symbol_pipe=
+
+# Check hardcoding attributes.
+echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var"; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct" != no && \
+ test "$hardcode_minus_L" != no && \
+ test "$hardcode_shlibpath_var" != no; then
+
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action=immediate
+ fi
+elif test "$hardcode_direct" != yes && \
+ test "$hardcode_minus_L" != yes && \
+ test "$hardcode_shlibpath_var" != yes; then
+ # We cannot hardcode anything.
+ hardcode_action=unsupported
+else
+ # We can only hardcode existing directories.
+ hardcode_action=relink
+fi
+echo "$ac_t$hardcode_action" 1>&6
+test "$hardcode_action" = unsupported && can_build_shared=no
+
+
+reload_flag=
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
+# PORTME Some linker may need a different reload flag.
+reload_flag='-r'
+echo "$ac_t$reload_flag"
+test -n "$reload_flag" && reload_flag=" $reload_flag"
+
+# PORTME Fill in your ld.so characteristics
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+version_type=none
+dynamic_linker="$host_os ld.so"
+
+echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6
+case "$host_os" in
+aix3* | aix4*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so.$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}.so.$major'
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done'
+ ;;
+
+freebsd2* | freebsd3*)
+ version_type=sunos
+ library_names_spec='${libname}${release}.so.$versuffix $libname.so'
+ finish_cmds='PATH="$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+gnu*)
+ version_type=sunos
+ library_names_spec='${libname}${release}.so.$versuffix'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+hpux9* | hpux10*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ dynamic_linker="$host_os dld.sl"
+ version_type=sunos
+ shlibpath_var=SHLIB_PATH
+ library_names_spec='${libname}${release}.sl.$versuffix ${libname}${release}.sl.$major $libname.sl'
+ soname_spec='${libname}${release}.sl.$major'
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+irix5* | irix6*)
+ version_type=osf
+ soname_spec='${libname}${release}.so'
+ library_names_spec='${libname}${release}.so.$versuffix $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux-gnu*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
+ soname_spec='${libname}${release}.so.$major'
+ finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+
+ if test -f /lib/ld.so.1; then
+ dynamic_linker='GNU ld.so'
+ else
+ # Only the GNU ld.so supports shared libraries on MkLinux.
+ case "$host_cpu" in
+ powerpc*) dynamic_linker=no ;;
+ *) dynamic_linker='Linux ld.so' ;;
+ esac
+ fi
+ ;;
+
+netbsd* | openbsd*)
+ version_type=sunos
+ library_names_spec='${libname}${release}.so.$versuffix'
+ finish_cmds='PATH="$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+os2*)
+ libname_spec='$name'
+ library_names_spec='$libname.dll $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4*)
+ version_type=osf
+ soname_spec='${libname}${release}.so'
+ library_names_spec='${libname}${release}.so.$versuffix $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+sco3.2v5*)
+ version_type=osf
+ soname_spec='${libname}${release}.so.$major'
+ library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+solaris2*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
+ soname_spec='${libname}${release}.so.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}.so.$versuffix'
+ finish_cmds='PATH="$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+sysv4.2uw2*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
+ soname_spec='${libname}${release}.so.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
+ soname_spec='${libname}${release}.so.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+echo "$ac_t$dynamic_linker"
+test "$dynamic_linker" = no && can_build_shared=no
+
+# Report the final consequences.
+echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6
+
+echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case "$host_os" in
+aix*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds;\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+esac
+
+echo "$ac_t$enable_shared" 1>&6
+
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+
+echo "checking whether to build static libraries... $enable_static" 1>&6
+
+echo $ac_n "checking for objdir... $ac_c" 1>&6
+rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+echo "$ac_t$objdir" 1>&6
+
+# Copy echo and quote the copy, instead of the original, because it is
+# used later.
+ltecho="$echo"
+
+# Now quote all the things that may contain metacharacters.
+for var in ltecho old_CC old_CFLAGS old_CPPFLAGS old_LD old_NM old_RANLIB \
+ old_LN_S AR CC LD LN_S NM reload_flag reload_cmds wl pic_flag \
+ link_static_flag no_builtin_flag export_dynamic_flag_spec \
+ libname_spec library_names_spec soname_spec RANLIB \
+ old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
+ old_postuninstall_cmds archive_cmds postinstall_cmds postuninstall_cmds \
+ allow_undefined_flag no_undefined_flag \
+ finish_cmds finish_eval global_symbol_pipe \
+ hardcode_libdir_flag_spec hardcode_libdir_separator; do
+
+ case "$var" in
+ reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | archive_cmds | \
+ postinstall_cmds | postuninstall_cmds | finish_cmds)
+ # Double-quote double-evaled strings.
+ eval "$var=\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\"\`"
+ ;;
+ *)
+ eval "$var=\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`"
+ ;;
+ esac
+done
+
+ofile=libtool
+trap "$rm $ofile; exit 1" 1 2 15
+echo creating $ofile
+$rm $ofile
+cat <<EOF > $ofile
+#! /bin/sh
+
+# libtool - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM - GNU $PACKAGE $VERSION
+# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
+#
+# Copyright (C) 1996-1998 Free Software Foundation, Inc.
+# Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This program was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# CC="$old_CC" CFLAGS="$old_CFLAGS" CPPFLAGS="$old_CPPFLAGS" \\
+# LD="$old_LD" NM="$old_NM" RANLIB="$old_RANLIB" LN_S="$old_LN_S" \\
+# $0$ltconfig_args
+#
+# Compiler and other test output produced by $progname, useful for
+# debugging $progname, is in ./config.log if it exists.
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="sed -e s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test "\${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
+
+# An echo program that does not interpret backslashes.
+echo="$ltecho"
+
+# The version of $progname that generated this script.
+LTCONFIG_VERSION="$VERSION"
+
+# Shell to use when invoking shell scripts.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Whether or not to build libtool libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build old-style libraries.
+build_old_libs=$enable_static
+
+# The host system.
+host_alias="$host_alias"
+host="$host"
+
+# The archiver.
+AR="$AR"
+
+# The default C compiler.
+CC="$CC"
+
+# The linker used to build libraries.
+LD="$LD"
+
+# Whether we need hard or soft links.
+LN_S="$LN_S"
+
+# A BSD-compatible nm program.
+NM="$NM"
+
+# The name of the directory that contains temporary libtool files.
+objdir="$objdir"
+
+# How to create reloadable object files.
+reload_flag="$reload_flag"
+reload_cmds="$reload_cmds"
+
+# How to pass a linker flag through the compiler.
+wl="$wl"
+
+# Additional compiler flags for building library objects.
+pic_flag="$pic_flag"
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag="$link_static_flag"
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag="$no_builtin_flag"
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec="$export_dynamic_flag_spec"
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec="$libname_spec"
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec="$library_names_spec"
+
+# The coded name of the library, if different from the real name.
+soname_spec="$soname_spec"
+
+# Commands used to build and install an old-style archive.
+RANLIB="$RANLIB"
+old_archive_cmds="$old_archive_cmds"
+old_postinstall_cmds="$old_postinstall_cmds"
+old_postuninstall_cmds="$old_postuninstall_cmds"
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds="$old_archive_from_new_cmds"
+
+# Commands used to build and install a shared archive.
+archive_cmds="$archive_cmds"
+postinstall_cmds="$postinstall_cmds"
+postuninstall_cmds="$postuninstall_cmds"
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag="$allow_undefined_flag"
+
+# Flag that forces no undefined symbols.
+no_undefined_flag="$no_undefined_flag"
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds="$finish_cmds"
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval="$finish_eval"
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe="$global_symbol_pipe"
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec="$hardcode_libdir_flag_spec"
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator="$hardcode_libdir_separator"
+
+# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+EOF
+
+case "$host_os" in
+aix3*)
+ cat <<\EOF >> $ofile
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "${COLLECT_NAMES+set}" != set; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+
+EOF
+ ;;
+esac
+
+# Append the ltmain.sh script.
+cat "$ltmain" >> $ofile || (rm -f $ofile; exit 1)
+
+chmod +x $ofile
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/xc/extras/FreeType/ltmain.sh b/xc/extras/FreeType/ltmain.sh
new file mode 100755
index 000000000..e9350b3fa
--- /dev/null
+++ b/xc/extras/FreeType/ltmain.sh
@@ -0,0 +1,2453 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun ltconfig.
+#
+# Copyright (C) 1996-1998 Free Software Foundation, Inc.
+# Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# The name of this program.
+progname=`$echo "$0" | sed 's%^.*/%%'`
+modename="$progname"
+
+# Constants.
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.2
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g'
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LANG+set}" = set; then LANG=C; export LANG; fi
+
+if test "$LTCONFIG_VERSION" != "$VERSION"; then
+ echo "$modename: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
+ echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit 1
+fi
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ echo "$modename: not configured to build any kind of library" 1>&2
+ echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit 1
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+
+# Parse our command line options once, thoroughly.
+while test $# -gt 0
+do
+ arg="$1"
+ shift
+
+ case "$arg" in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case "$prev" in
+ execute_dlfiles)
+ eval "$prev=\"\$$prev \$arg\""
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case "$arg" in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ echo "$PROGRAM (GNU $PACKAGE) $VERSION"
+ exit 0
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --features)
+ echo "host: $host"
+ if test "$build_libtool_libs" = yes; then
+ echo "enable shared libraries"
+ else
+ echo "disable shared libraries"
+ fi
+ if test "$build_old_libs" = yes; then
+ echo "enable static libraries"
+ else
+ echo "disable static libraries"
+ fi
+ exit 0
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --quiet | --silent)
+ show=:
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+fi
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ case "$nonopt" in
+ *cc | *++ | gcc* | *-gcc*)
+ mode=link
+ for arg
+ do
+ case "$arg" in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case "$mode" in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # Get the compilation command and the source file.
+ base_compile=
+ lastarg=
+ srcfile="$nonopt"
+ suppress_output=
+
+ for arg
+ do
+ # Accept any command-line options.
+ case "$arg" in
+ -o)
+ $echo "$modename: you cannot specify the output filename with \`-o'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+
+ -static)
+ build_libtool_libs=no
+ build_old_libs=yes
+ continue
+ ;;
+ esac
+
+ # Accept the current argument as the source file.
+ lastarg="$srcfile"
+ srcfile="$arg"
+
+ # Aesthetically quote the previous argument.
+
+ # Backslashify any backslashes, double quotes, and dollar signs.
+ # These are the only characters that are still specially
+ # interpreted inside of double-quoted scrings.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly in scan
+ # sets, so we specify it separately.
+ case "$lastarg" in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ # Add the previous argument to base_compile.
+ if test -z "$base_compile"; then
+ base_compile="$lastarg"
+ else
+ base_compile="$base_compile $lastarg"
+ fi
+ done
+
+ # Get the name of the library object.
+ libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+
+ # Recognize several different file suffixes.
+ xform='[cCFSfms]'
+ case "$libobj" in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.f90) xform=f90 ;;
+ *.for) xform=for ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case "$libobj" in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e 's/\.lo$/.o/'` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$srcfile'" 1>&2
+ exit 1
+ ;;
+ esac
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Delete any leftover library objects.
+ if test "$build_old_libs" = yes; then
+ $run $rm $obj $libobj
+ trap "$run $rm $obj $libobj; exit 1" 1 2 15
+ else
+ $run $rm $libobj
+ trap "$run $rm $libobj; exit 1" 1 2 15
+ fi
+
+ # Only build a PIC object if we are building libtool libraries.
+ if test "$build_libtool_libs" = yes; then
+ # Without this assignment, base_compile gets emptied.
+ fbsd_hideous_sh_bug=$base_compile
+
+ # All platforms use -DPIC, to notify preprocessed assembler code.
+ $show "$base_compile$pic_flag -DPIC $srcfile"
+ if $run eval "$base_compile\$pic_flag -DPIC \$srcfile"; then :
+ else
+ test -n "$obj" && $run $rm $obj
+ exit 1
+ fi
+
+ # If we have no pic_flag, then copy the object into place and finish.
+ if test -z "$pic_flag"; then
+ $show "$LN_S $obj $libobj"
+ $run $LN_S $obj $libobj
+ exit $?
+ fi
+
+ # Just move the object, then go on to compile the next one
+ $show "$mv $obj $libobj"
+ $run $mv $obj $libobj || exit 1
+
+ # Allow error messages only from the first compilation.
+ suppress_output=' >/dev/null 2>&1'
+ fi
+
+ # Only build a position-dependent object if we build old libraries.
+ if test "$build_old_libs" = yes; then
+ # Suppress compiler output if we already did a PIC compilation.
+ $show "$base_compile $srcfile$suppress_output"
+ if $run eval "$base_compile \$srcfile$suppress_output"; then :
+ else
+ $run $rm $obj $libobj
+ exit 1
+ fi
+ fi
+
+ # Create an invalid libtool object if no PIC, so that we do not
+ # accidentally link it into a program.
+ if test "$build_libtool_libs" != yes; then
+ $show "echo timestamp > $libobj"
+ $run eval "echo timestamp > \$libobj" || exit $?
+ fi
+
+ exit 0
+ ;;
+
+ # libtool link mode
+ link)
+ modename="$modename: link"
+ CC="$nonopt"
+ allow_undefined=yes
+ compile_command="$CC"
+ finalize_command="$CC"
+
+ compile_shlibpath=
+ finalize_shlibpath=
+ deplibs=
+ dlfiles=
+ dlprefiles=
+ export_dynamic=no
+ hardcode_libdirs=
+ libobjs=
+ link_against_libtool_libs=
+ ltlibs=
+ objs=
+ prev=
+ prevarg=
+ release=
+ rpath=
+ perm_rpath=
+ temp_rpath=
+ vinfo=
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case "$arg" in
+ -all-static | -static)
+ if test "X$arg" = "X-all-static" && test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ build_libtool_libs=no
+ build_old_libs=yes
+ break
+ ;;
+ esac
+ done
+
+ # See if our shared archives depend on static archives.
+ test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+ # Go through the arguments, transforming them on the way.
+ for arg
+ do
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case "$prev" in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case "$prev" in
+ dlfiles|dlprefiles)
+ case "$arg" in
+ *.la | *.lo) ;; # We handle these cases below.
+ *)
+ dlprefiles="$dlprefiles $arg"
+ test "$prev" = dlfiles && dlfiles="$dlfiles $arg"
+ prev=
+ ;;
+ esac
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ rpath)
+ rpath="$rpath $arg"
+ prev=
+ continue
+ ;;
+ *)
+ eval "$prev=\"\$arg\""
+ prev=
+ continue
+ ;;
+ esac
+ fi
+
+ prevarg="$arg"
+
+ case "$arg" in
+ -all-static)
+ if test -n "$link_static_flag"; then
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -dlopen)
+ prev=dlfiles
+ continue
+ ;;
+
+ -dlpreopen)
+ prev=dlprefiles
+ continue
+ ;;
+
+ -export-dynamic)
+ if test "$export_dynamic" != yes; then
+ export_dynamic=yes
+ if test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ else
+ arg=
+ fi
+
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$finalize_command @SYMFILE@"
+ fi
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's%^-L\(.*\)$%\1%'`
+ case "$dir" in
+ /* | [A-Za-z]:\\*)
+ # Add the corresponding hardcode_libdir_flag, if it is not identical.
+ ;;
+ *)
+ $echo "$modename: \`-L$dir' cannot specify a relative directory" 1>&2
+ exit 1
+ ;;
+ esac
+ deplibs="$deplibs $arg"
+ ;;
+
+ -l*) deplibs="$deplibs $arg" ;;
+
+ -no-undefined)
+ allow_undefined=no
+ continue
+ ;;
+
+ -o) prev=output ;;
+
+ -release)
+ prev=release
+ continue
+ ;;
+
+ -rpath)
+ prev=rpath
+ continue
+ ;;
+
+ -static)
+ # If we have no pic_flag, then this is the same as -all-static.
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -version-info)
+ prev=vinfo
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case "$arg" in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.o | *.a)
+ # A standard object.
+ objs="$objs $arg"
+ ;;
+
+ *.lo)
+ # A library object.
+ if test "$prev" = dlfiles; then
+ dlfiles="$dlfiles $arg"
+ if test "$build_libtool_libs" = yes; then
+ prev=
+ continue
+ else
+ # If libtool objects are unsupported, then we need to preload.
+ prev=dlprefiles
+ fi
+ fi
+
+ if test "$prev" = dlprefiles; then
+ # Preload the old-style object.
+ dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e 's/\.lo$/\.o/'`
+ prev=
+ fi
+ libobjs="$libobjs $arg"
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ dlname=
+ libdir=
+ library_names=
+ old_library=
+
+ # Check to see that this really is a libtool archive.
+ if (sed -e '2q' $arg | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
+ exit 1
+ fi
+
+ # If there is no directory component, then add one.
+ case "$arg" in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$libdir"; then
+ $echo "$modename: \`$arg' contains no -rpath information" 1>&2
+ exit 1
+ fi
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$arg'" 1>&2
+ exit 1
+ fi
+
+ # Find the relevant object directory and library name.
+ name=`$echo "X$arg" | $Xsed -e 's%^.*/%%' -e 's/\.la$//' -e 's/^lib//'`
+ dir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$arg"; then
+ dir="$objdir"
+ else
+ dir="$dir/$objdir"
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$prev" = dlfiles; then
+ dlfiles="$dlfiles $arg"
+ if test -z "$dlname"; then
+ # If there is no dlname, we need to preload.
+ prev=dlprefiles
+ else
+ # We should not create a dependency on this library, but we
+ # may need any libraries it requires.
+ compile_command="$compile_command$dependency_libs"
+ finalize_command="$finalize_command$dependency_libs"
+ prev=
+ continue
+ fi
+ fi
+
+ # The library was specified with -dlpreopen.
+ if test "$prev" = dlprefiles; then
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ dlprefiles="$dlprefiles $dir/$old_library"
+ else
+ dlprefiles="$dlprefiles $dir/$linklib"
+ fi
+ prev=
+ fi
+
+ if test "$build_libtool_libs" = yes && test -n "$library_names"; then
+ link_against_libtool_libs="$link_against_libtool_libs $arg"
+ if test -n "$shlibpath_var"; then
+ # Make sure the rpath contains only unique directories.
+ case "$temp_rpath " in
+ *" $dir "*) ;;
+ *) temp_rpath="$temp_rpath $dir" ;;
+ esac
+ fi
+
+ # This is the magic to use -rpath.
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ # Put the magic libdir with the hardcode flag.
+ hardcode_libdirs="$libdir"
+ libdir="@HARDCODE_LIBDIRS@"
+ else
+ # Just accumulate the unique libdirs.
+ case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ libdir=
+ fi
+ fi
+
+ if test -n "$libdir"; then
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ compile_command="$compile_command $flag"
+ finalize_command="$finalize_command $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ # Do the same for the permanent run path.
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+
+
+ case "$hardcode_action" in
+ immediate)
+ if test "$hardcode_direct" = no; then
+ compile_command="$compile_command $dir/$linklib"
+ elif test "$hardcode_minus_L" = no; then
+ compile_command="$compile_command -L$dir -l$name"
+ elif test "$hardcode_shlibpath_var" = no; then
+ compile_shlibpath="$compile_shlibpath$dir:"
+ compile_command="$compile_command -l$name"
+ fi
+ ;;
+
+ relink)
+ # We need an absolute path.
+ case "$dir" in
+ /* | [A-Za-z]:\\*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ exit 1
+ fi
+ dir="$absdir"
+ ;;
+ esac
+
+ if test "$hardcode_direct" = yes; then
+ compile_command="$compile_command $dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ compile_command="$compile_command -L$dir -l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ compile_shlibpath="$compile_shlibpath$dir:"
+ compile_command="$compile_command -l$name"
+ fi
+ ;;
+
+ *)
+ $echo "$modename: \`$hardcode_action' is an unknown hardcode action" 1>&2
+ exit 1
+ ;;
+ esac
+
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; then
+ finalize_command="$finalize_command $libdir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ finalize_command="$finalize_command -L$libdir -l$name"
+ elif test "$hardcode_shlibpath_var" = yes; then
+ finalize_shlibpath="$finalize_shlibpath$libdir:"
+ finalize_command="$finalize_command -l$name"
+ else
+ # We cannot seem to hardcode it, guess we'll fake it.
+ finalize_command="$finalize_command -L$libdir -l$name"
+ fi
+ else
+ # Transform directly to old archives if we don't build new libraries.
+ if test -n "$pic_flag" && test -z "$old_library"; then
+ $echo "$modename: cannot find static library for \`$arg'" 1>&2
+ exit 1
+ fi
+
+ # Here we assume that one of hardcode_direct or hardcode_minus_L
+ # is not unsupported. This is valid on all known static and
+ # shared platforms.
+ if test "$hardcode_direct" != unsupported; then
+ test -n "$old_library" && linklib="$old_library"
+ compile_command="$compile_command $dir/$linklib"
+ finalize_command="$finalize_command $dir/$linklib"
+ else
+ compile_command="$compile_command -L$dir -l$name"
+ finalize_command="$finalize_command -L$dir -l$name"
+ fi
+ fi
+
+ # Add in any libraries that this one depends upon.
+ compile_command="$compile_command$dependency_libs"
+ finalize_command="$finalize_command$dependency_libs"
+ continue
+ ;;
+
+ # Some other compiler argument.
+ *)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case "$arg" in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ if test -n "$vinfo" && test -n "$release"; then
+ $echo "$modename: you cannot specify both \`-version-info' and \`-release'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ oldlib=
+ oldobjs=
+ case "$output" in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+
+ */* | *\\*)
+ $echo "$modename: output file \`$output' must have no directory components" 1>&2
+ exit 1
+ ;;
+
+ *.a)
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ build_old_libs=yes
+ oldlib="$output"
+ $show "$rm $oldlib"
+ $run $rm $oldlib
+ ;;
+
+ *.la)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case "$output" in
+ lib*) ;;
+ *)
+ $echo "$modename: libtool library \`$arg' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+ esac
+
+ name=`$echo "X$output" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval libname=\"$libname_spec\"
+
+ # All the library-specific variables (install_libdir is set above).
+ library_names=
+ old_library=
+ dlname=
+ current=0
+ revision=0
+ age=0
+
+ if test -n "$objs"; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
+ exit 1
+ fi
+
+ # How the heck are we supposed to write a wrapper for a shared library?
+ if test -n "$link_against_libtool_libs"; then
+ $echo "$modename: libtool library \`$output' may not depend on uninstalled libraries:$link_against_libtool_libs" 1>&2
+ exit 1
+ fi
+
+ if test -n "$dlfiles$dlprefiles"; then
+ $echo "$modename: warning: \`-dlopen' is ignored while creating libtool libraries" 1>&2
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test -z "$rpath"; then
+ $echo "$modename: you must specify an installation directory with \`-rpath'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ set dummy $rpath
+ if test $# -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ # Parse the version information argument.
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo
+ IFS="$save_ifs"
+
+ if test -n "$5"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ test -n "$2" && current="$2"
+ test -n "$3" && revision="$3"
+ test -n "$4" && age="$4"
+
+ # Check that each of the things are valid numbers.
+ case "$current" in
+ 0 | [1-9] | [1-9][0-9]*) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ ;;
+ esac
+
+ case "$revision" in
+ 0 | [1-9] | [1-9][0-9]*) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ ;;
+ esac
+
+ case "$age" in
+ 0 | [1-9] | [1-9][0-9]*) ;;
+ *)
+ $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ ;;
+ esac
+
+ if test $age -gt $current; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit 1
+ fi
+
+ # Calculate the version variables.
+ version_vars="version_type current age revision"
+ case "$version_type" in
+ none) ;;
+
+ linux)
+ version_vars="$version_vars major versuffix"
+ major=`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ version_vars="$version_vars versuffix verstring"
+ major=`expr $current - $age`
+ versuffix="$current.$age.$revision"
+ verstring="$versuffix"
+
+ # Add in all the interfaces that we are compatible with.
+ loop=$age
+ while test $loop != 0; do
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ version_vars="$version_vars major versuffix"
+ major="$current"
+ versuffix="$current.$revision"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit 1
+ ;;
+ esac
+
+ # Create the output directory, or remove our outputs if we need to.
+ if test -d $objdir; then
+ $show "$rm $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*"
+ $run $rm $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*
+ else
+ $show "$mkdir $objdir"
+ $run $mkdir $objdir
+ status=$?
+ if test $status -eq 0 || test -d $objdir; then :
+ else
+ exit $status
+ fi
+ fi
+
+ # Check to see if the archive will have undefined symbols.
+ if test "$allow_undefined" = yes; then
+ if test "$allow_undefined_flag" = unsupported; then
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+
+ # Add libc to deplibs on all systems.
+ dependency_libs="$deplibs"
+ deplibs="$deplibs -lc"
+
+ if test "$build_libtool_libs" = yes; then
+ # Get the real and link names of the library.
+ eval library_names=\"$library_names_spec\"
+ set dummy $library_names
+ realname="$2"
+ shift; shift
+
+ if test -n "$soname_spec"; then
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ lib="$objdir/$realname"
+ for link
+ do
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are PIC.
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//g'`
+
+ # Do each of the archive commands.
+ eval cmds=\"$archive_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Create links to the real library.
+ for linkname in $linknames; do
+ $show "(cd $objdir && $LN_S $realname $linkname)"
+ $run eval '(cd $objdir && $LN_S $realname $linkname)' || exit $?
+ done
+
+ # If -export-dynamic was specified, set the dlname.
+ if test "$export_dynamic" = yes; then
+ # On all known operating systems, these are identical.
+ dlname="$soname"
+ fi
+ fi
+
+ # Now set the variables for building old libraries.
+ oldlib="$objdir/$libname.a"
+ ;;
+
+ *.lo | *.o)
+ if test -n "$link_against_libtool_libs"; then
+ $echo "$modename: error: cannot link libtool libraries into reloadable objects" 1>&2
+ exit 1
+ fi
+
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored while creating objects" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles"; then
+ $echo "$modename: warning: \`-dlopen' is ignored while creating objects" 1>&2
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored while creating objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored while creating objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored while creating objects" 1>&2
+ fi
+
+ case "$output" in
+ *.lo)
+ if test -n "$objs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit 1
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e 's/\.lo$/.o/'`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $run $rm $obj $libobj
+
+ # Create the old-style object.
+ reload_objs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`
+
+ output="$obj"
+ eval cmds=\"$reload_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ test -z "$libobj" && exit 0
+
+ if test "$build_libtool_libs" != yes; then
+ # Create an invalid libtool object if no PIC, so that we don't
+ # accidentally link it into a program.
+ $show "echo timestamp > $libobj"
+ $run eval "echo timestamp > $libobj" || exit $?
+ exit 0
+ fi
+
+ if test -n "$pic_flag"; then
+ # Only do commands if we really have different PIC objects.
+ reload_objs="$libobjs"
+ output="$libobj"
+ eval cmds=\"$reload_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ else
+ # Just create a symlink.
+ $show "$LN_S $obj $libobj"
+ $run $LN_S $obj $libobj || exit 1
+ fi
+
+ exit 0
+ ;;
+
+ *)
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored while linking programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored while creating objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ # If the user specified any rpath flags, then add them.
+ for libdir in $rpath; do
+ if test -n "$hardcode_libdir_flag_spec"; then
+ if test -n "$hardcode_libdir_separator"; then
+ if test -z "$hardcode_libdirs"; then
+ # Put the magic libdir with the hardcode flag.
+ hardcode_libdirs="$libdir"
+ libdir="@HARDCODE_LIBDIRS@"
+ else
+ # Just accumulate the unique libdirs.
+ case "$hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator" in
+ *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ libdir=
+ fi
+ fi
+
+ if test -n "$libdir"; then
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ compile_command="$compile_command $flag"
+ finalize_command="$finalize_command $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ done
+ fi
+
+ # Substitute the hardcoded libdirs into the compile commands.
+ if test -n "$hardcode_libdir_separator"; then
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@HARDCODE_LIBDIRS@%$hardcode_libdirs%g"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@HARDCODE_LIBDIRS@%$hardcode_libdirs%g"`
+ fi
+
+ if test -n "$libobjs" && test "$build_old_libs" = yes; then
+ # Transform all the library objects into standard objects.
+ compile_command=`$echo "X$compile_command " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
+ finalize_command=`$echo "X$finalize_command " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${output}S.c"
+ else
+ dlsyms=
+ fi
+
+ if test -n "$dlsyms"; then
+ # Add our own program objects to the preloaded list.
+ dlprefiles=`$echo "X$objs$dlprefiles " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//'`
+
+ # Discover the nlist of each of the dlfiles.
+ nlist="$objdir/${output}.nm"
+
+ if test -d $objdir; then
+ $show "$rm $nlist ${nlist}T"
+ $run $rm "$nlist" "${nlist}T"
+ else
+ $show "$mkdir $objdir"
+ $run $mkdir $objdir
+ status=$?
+ if test $status -eq 0 || test -d $objdir; then :
+ else
+ exit $status
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ # Parse the name list into a source file.
+ $show "creating $objdir/$dlsyms"
+ if test -z "$run"; then
+ # Make sure we at least have an empty file.
+ test -f "$nlist" || : > "$nlist"
+
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ wcout=`wc "$nlist" 2>/dev/null`
+ count=`echo "X$wcout" | $Xsed -e 's/^[ ]*\([0-9][0-9]*\).*$/\1/'`
+ (test "$count" -ge 0) 2>/dev/null || count=-1
+ else
+ $rm "$nlist"T
+ count=-1
+ fi
+
+ case "$dlsyms" in
+ "") ;;
+ *.c)
+ $echo > "$objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$output' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define dld_preloaded_symbol_count some_other_symbol
+#define dld_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test -f "$nlist"; then
+ sed -e 's/^.* \(.*\)$/extern char \1;/' < "$nlist" >> "$objdir/$dlsyms"
+ else
+ echo '/* NONE */' >> "$objdir/$dlsyms"
+ fi
+
+ $echo >> "$objdir/$dlsyms" "\
+
+#undef dld_preloaded_symbol_count
+#undef dld_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define __ptr_t void *
+#else
+# define __ptr_t char *
+#endif
+
+/* The number of symbols in dld_preloaded_symbols, -1 if unsorted. */
+int dld_preloaded_symbol_count = $count;
+
+/* The mapping between symbol names and symbols. */
+struct {
+ char *name;
+ __ptr_t address;
+}
+dld_preloaded_symbols[] =
+{\
+"
+
+ if test -f "$nlist"; then
+ sed 's/^\(.*\) \(.*\)$/ {"\1", (__ptr_t) \&\2},/' < "$nlist" >> "$objdir/$dlsyms"
+ fi
+
+ $echo >> "$objdir/$dlsyms" "\
+ {0, (__ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ ;;
+
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit 1
+ ;;
+ esac
+ fi
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $objdir && $CC -c$no_builtin_flag \"$dlsyms\")"
+ $run eval '(cd $objdir && $CC -c$no_builtin_flag "$dlsyms")' || exit $?
+
+ # Transform the symbol file into the correct name.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$objdir/${output}S.o%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$objdir/${output}S.o%"`
+ elif test "$export_dynamic" != yes; then
+ test -n "$dlfiles$dlprefiles" && $echo "$modename: warning: \`-dlopen' and \`-dlpreopen' are ignored without \`-export-dynamic'" 1>&2
+ else
+ # We keep going just in case the user didn't refer to
+ # dld_preloaded_symbols. The linker will fail if global_symbol_pipe
+ # really was required.
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+
+ # Nullify the symbol file.
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test -z "$link_against_libtool_libs" || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$compile_command"
+ $run eval "$compile_command"
+ exit $?
+ fi
+
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$objdir/$output"'%g'`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e 's%@OUTPUT@%'"$objdir/$output"'T%g'`
+
+ # Create the binary in the object directory, then wrap it.
+ if test -d $objdir; then :
+ else
+ $show "$mkdir $objdir"
+ $run $mkdir $objdir
+ status=$?
+ if test $status -eq 0 || test -d $objdir; then :
+ else
+ exit $status
+ fi
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case "$dir" in
+ /* | [A-Za-z]:\\*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ fi
+
+ # Delete the old output file.
+ $run $rm $output
+
+ if test -n "$compile_shlibpath"; then
+ compile_command="$shlibpath_var=\"$compile_shlibpath\$$shlibpath_var\" $compile_command"
+ fi
+ if test -n "$finalize_shlibpath"; then
+ finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+ fi
+
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$rpath$dir:"
+ done
+ compile_command="$runpath_var=\"$rpath\$$runpath_var\" $compile_command"
+ finalize_command="$runpath_var=\"$rpath\$$runpath_var\" $finalize_command"
+ fi
+
+ case "$hardcode_action" in
+ relink)
+ # AGH! Flame the AIX and HP-UX people for me, will ya?
+ $echo "$modename: warning: using a buggy system linker" 1>&2
+ $echo "$modename: relinking will be required before \`$output' can be installed" 1>&2
+ ;;
+ esac
+
+ $show "$compile_command"
+ $run eval "$compile_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "creating $output"
+
+ # Quote the finalize command for shipping.
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "$sed_quote_subst"`
+
+ # Quote $echo for shipping.
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ $rm $output
+ trap "$rm $output; exit 1" 1 2 15
+
+ $echo > $output "\
+#! /bin/sh
+
+# $output - temporary wrapper script for $objdir/$output
+# Generated by ltmain.sh - GNU $PACKAGE $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of \``pwd`'.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+if test \"\${CDPATH+set}\" = set; then CDPATH=; export CDPATH; fi
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+ # install mode needs the following variables:
+ link_against_libtool_libs='$link_against_libtool_libs'
+ finalize_command=\"$finalize_command\"
+else
+ # When we are sourced in execute mode, \$file and \$echo are already set.
+ if test \"\$libtool_execute_magic\" = \"$magic\"; then :
+ else
+ echo=\"$qecho\"
+ file=\"\$0\"
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\`
+ test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+ # Follow symbolic links until we get to the real thisdir.
+ file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\`
+ while test -n \"\$file\"; do
+ destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\`
+
+ # If there was a directory component, then change thisdir.
+ if test \"x\$destdir\" != \"x\$file\"; then
+ case \"\$destdir\" in
+ /* | [A-Za-z]:\\*) thisdir=\"\$destdir\" ;;
+ *) thisdir=\"\$thisdir/\$destdir\" ;;
+ esac
+ fi
+
+ file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+
+ progdir=\"\$thisdir/$objdir\"
+ program='$output'
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # Add our own library path to $shlibpath_var
+ $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+ # Some systems cannot cope with colon-terminated $shlibpath_var
+ $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/:*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+
+ # Export the path to the program.
+ PATH=\"\$progdir:\$PATH\"
+ export PATH
+
+ exec \$program \${1+\"\$@\"}
+
+ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+ exit 1
+ fi
+ else
+ # The program doesn't exist.
+ \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2
+ \$echo \"This script is just a wrapper for \$program.\" 1>&2
+ echo \"See the $PACKAGE documentation for more information.\" 1>&2
+ exit 1
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ exit 0
+ ;;
+ esac
+
+ # See if we need to build an old-fashioned archive.
+ if test "$build_old_libs" = "yes"; then
+ # Transform .lo files to .o files.
+ oldobjs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^ ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`
+
+ # Do each command in the archive commands.
+ if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+ eval cmds=\"$old_archive_from_new_cmds\"
+ else
+ eval cmds=\"$old_archive_cmds\"
+ fi
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Now create the libtool archive.
+ case "$output" in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.a"
+
+ $show "creating $output"
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ $echo > $output "\
+# $output - a libtool library file
+# Generated by ltmain.sh - GNU $PACKAGE $VERSION
+
+# The name that we can dlopen(3).
+dlname='$dlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'\
+"
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $objdir && $LN_S ../$output $output)"
+ $run eval "(cd $objdir && $LN_S ../$output $output)" || exit 1
+ ;;
+ esac
+ exit 0
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # There may be an optional /bin/sh argument at the beginning of
+ # install_prog (especially on Windows NT).
+ if test "$nonopt" = "$SHELL"; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case "$arg" in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg="$nonopt"
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case "$arg" in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest="$arg"
+ continue
+ fi
+
+ case "$arg" in
+ -d) isdir=yes ;;
+ -f) prev="-f" ;;
+ -g) prev="-g" ;;
+ -m) prev="-m" ;;
+ -o) prev="-o" ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*) ;;
+
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest="$arg"
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case "$arg" in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*)
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test -n "$isdir"; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test $# -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+ fi
+ case "$destdir" in
+ /* | [A-Za-z]:\\*) ;;
+ *)
+ for file in $files; do
+ case "$file" in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ # This variable tells wrapper scripts just to set variables rather
+ # than running their programs.
+ libtool_install_magic="$magic"
+
+ staticlibs=
+ future_libdirs=
+ current_libdirs=
+ for file in $files; do
+
+ # Do each installation.
+ case "$file" in
+ *.a)
+ # Do the static libraries later.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (sed -e '2q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ library_names=
+ old_library=
+ # If there is no directory component, then add one.
+ case "$file" in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir="`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/"
+ test "X$dir" = "X$file/" && dir=
+ dir="$dir$objdir"
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$realname $destdir/$realname"
+ $run eval "$install_prog $dir/$realname $destdir/$realname" || exit $?
+ test "X$dlname" = "X$realname" && dlname=
+
+ if test $# -gt 0; then
+ # Delete the old symlinks.
+ rmcmd="$rm"
+ for linkname
+ do
+ rmcmd="$rmcmd $destdir/$linkname"
+ done
+ $show "$rmcmd"
+ $run $rmcmd
+
+ # ... and create new ones.
+ for linkname
+ do
+ test "X$dlname" = "X$linkname" && dlname=
+ $show "(cd $destdir && $LN_S $realname $linkname)"
+ $run eval "(cd $destdir && $LN_S $realname $linkname)"
+ done
+ fi
+
+ if test -n "$dlname"; then
+ # Install the dynamically-loadable library.
+ $show "$install_prog $dir/$dlname $destdir/$dlname"
+ $run eval "$install_prog $dir/$dlname $destdir/$dlname" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ eval cmds=\"$postinstall_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ $show "$install_prog $file $destdir/$name"
+ $run eval "$install_prog $file $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library"
+ ;;
+
+ *.lo)
+ # Install (i.e. copy) a libtool object.
+
+ # Figure out destination file name, if it wasn't already specified.
+ if test -n "$destname"; then
+ destfile="$destdir/$destname"
+ else
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case "$destfile" in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e 's/\.lo$/\.o/'`
+ ;;
+ *.o)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e 's/\.lo$/\.o/'`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run eval "$install_prog \$staticobj \$staticdest" || exit $?
+ fi
+ exit 0
+ ;;
+
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (sed -e '4q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then
+ link_against_libtool_libs=
+ finalize_command=
+
+ # If there is no directory component, then add one.
+ case "$file" in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$link_against_libtool_libs" || test -z "$finalize_command"; then
+ $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2
+ exit 1
+ fi
+
+ finalize=yes
+ for lib in $link_against_libtool_libs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case "$lib" in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`"
+ if test -z "$libdir"; then
+ $echo "$modename: warning: \`$lib' contains no -rpath information" 1>&2
+ elif test -f "$libfile"; then :
+ else
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ if test "$hardcode_action" = relink; then
+ if test "$finalize" = yes; then
+ $echo "$modename: warning: relinking \`$file' on behalf of your buggy system linker" 1>&2
+ $show "$finalize_command"
+ if $run eval "$finalize_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ continue
+ fi
+ file="$objdir/$file"T
+ else
+ $echo "$modename: warning: cannot relink \`$file' on behalf of your buggy system linker" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"`
+ fi
+ fi
+
+ $show "$install_prog$stripme $file $dest"
+ $run eval "$install_prog\$stripme \$file \$dest" || exit $?
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ # Do each command in the postinstall commands.
+ eval cmds=\"$old_postinstall_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec $SHELL $0 --finish$current_libdirs
+ exit 1
+ fi
+
+ exit 0
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ eval cmds=\"$finish_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds"
+ fi
+ done
+ fi
+
+ echo "------------------------------------------------------------------------------"
+ echo "Libraries have been installed in:"
+ for libdir in $libdirs; do
+ echo " $libdir"
+ done
+ echo
+ echo "To link against installed libraries in a given directory, LIBDIR,"
+ echo "you must use the \`-LLIBDIR' flag during linking."
+ echo
+ echo " You will also need to do one of the following:"
+ if test -n "$shlibpath_var"; then
+ echo " - add LIBDIR to the \`$shlibpath_var' environment variable"
+ echo " during execution"
+ fi
+ if test -n "$runpath_var"; then
+ echo " - add LIBDIR to the \`$runpath_var' environment variable"
+ echo " during linking"
+ fi
+ if test -n "$hardcode_libdir_flag_spec"; then
+ libdir=LIBDIR
+ eval flag=\"$hardcode_libdir_flag_spec\"
+
+ echo " - use the \`$flag' linker flag"
+ fi
+ if test -f /etc/ld.so.conf; then
+ echo " - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+ fi
+ echo
+ echo "See any operating system documentation about shared libraries for"
+ echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ echo "------------------------------------------------------------------------------"
+ exit 0
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit 1
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test -f "$file"; then :
+ else
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ dir=
+ case "$file" in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (sed -e '2q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case "$file" in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit 1
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ continue
+ ;;
+ esac
+
+ # Get the absolute pathname.
+ absdir=`cd "$dir" && pwd`
+ test -n "$absdir" && dir="$absdir"
+
+ # Now add the directory to shlibpath_var.
+ if eval "test -z \"\$$shlibpath_var\""; then
+ eval "$shlibpath_var=\"\$dir\""
+ else
+ eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+ fi
+ done
+
+ # This variable tells wrapper scripts just to set shlibpath_var
+ # rather than running their programs.
+ libtool_execute_magic="$magic"
+
+ # Check if any of the arguments is a wrapper script.
+ args=
+ for file
+ do
+ case "$file" in
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (sed -e '4q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case "$file" in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+
+ # Now actually exec the command.
+ eval "exec \$cmd$args"
+
+ $echo "$modename: cannot exec \$cmd$args"
+ exit 1
+ else
+ # Display what would be done.
+ eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\""
+ $echo "export $shlibpath_var"
+ $echo "$cmd$args"
+ exit 0
+ fi
+ ;;
+
+ # libtool uninstall mode
+ uninstall)
+ modename="$modename: uninstall"
+ rm="$nonopt"
+ files=
+
+ for arg
+ do
+ case "$arg" in
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ fi
+
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ rmfiles="$file"
+
+ case "$name" in
+ *.la)
+ # Possibly a libtool archive, so verify it.
+ if (sed -e '2q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $dir/$n"
+ test "X$n" = "X$dlname" && dlname=
+ done
+ test -n "$dlname" && rmfiles="$rmfiles $dir/$dlname"
+ test -n "$old_library" && rmfiles="$rmfiles $dir/$old_library"
+
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles
+
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ eval cmds=\"$postuninstall_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd"
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ eval cmds=\"$old_postuninstall_cmds\"
+ IFS="${IFS= }"; save_ifs="$IFS"; IFS=';'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd"
+ done
+ IFS="$save_ifs"
+ fi
+
+ # FIXME: should reinstall the best remaining shared library.
+ fi
+ ;;
+
+ *.lo)
+ if test "$build_old_libs" = yes; then
+ oldobj=`$echo "X$name" | $Xsed -e 's/\.lo$/\.o/'`
+ rmfiles="$rmfiles $dir/$oldobj"
+ fi
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles
+ ;;
+
+ *)
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles
+ ;;
+ esac
+ done
+ exit 0
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit 1
+ ;;
+ esac
+
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit 1
+fi # test -z "$show_help"
+
+# We need to display help for each of the modes.
+case "$mode" in
+"") $echo \
+"Usage: $modename [OPTION]... [MODE-ARG]...
+
+Provide generalized library-building support services.
+
+-n, --dry-run display commands without modifying any files
+ --features display configuration information and exit
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --version print version information
+
+MODE must be one of the following:
+
+ compile compile a source file into a libtool object
+ execute automatically set library path, then run a program
+ finish complete the installation of libtool libraries
+ install install libraries or executables
+ link create a library or an executable
+ uninstall remove libraries from an installed directory
+
+MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE."
+ exit 0
+ ;;
+
+compile)
+ $echo \
+"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+ ;;
+
+execute)
+ $echo \
+"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+ -dlopen FILE add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+ ;;
+
+finish)
+ $echo \
+"Usage: $modename [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges. Use
+the \`--dry-run' option if you just want to see what would be executed."
+ ;;
+
+install)
+ $echo \
+"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command. The first component should be
+either the \`install' or \`cp' program.
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+ -all-static do not do any dynamic linking at all
+ -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime
+ -dlpreopen FILE link in FILE and add its symbols to dld_preloaded_symbols
+ -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+ -LLIBDIR search LIBDIR for required installed libraries
+ -lNAME OUTPUT-FILE requires the installed library libNAME
+ -no-undefined declare that a library does not refer to external symbols
+ -o OUTPUT-FILE create OUTPUT-FILE from the specified objects
+ -release RELEASE specify package release information
+ -rpath LIBDIR the created library will eventually be installed in LIBDIR
+ -static do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename. Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created, only
+library objects (\`.lo' files) may be specified, and \`-rpath' is required.
+
+If OUTPUT-FILE ends in \`.a', then a standard library is created using \`ar'
+and \`ranlib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.o', then a reloadable object file is
+created, otherwise an executable program is created."
+ ;;
+
+uninstall)
+ $echo
+"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit 1
+ ;;
+esac
+
+echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit 0
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/xc/extras/FreeType/mkinstalldirs b/xc/extras/FreeType/mkinstalldirs
new file mode 100755
index 000000000..12ac2f1ad
--- /dev/null
+++ b/xc/extras/FreeType/mkinstalldirs
@@ -0,0 +1,40 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+# Author: Noah Friedman <friedman@prep.ai.mit.edu>
+# Created: 1993-05-16
+# Public domain
+
+# $Id: mkinstalldirs,v 1.1.1.1 1999/12/05 01:22:27 daryll Exp $
+
+errstatus=0
+
+for file
+do
+ set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
+ shift
+
+ pathcomp=
+ for d
+ do
+ pathcomp="$pathcomp$d"
+ case "$pathcomp" in
+ -* ) pathcomp=./$pathcomp ;;
+ esac
+
+ if test ! -d "$pathcomp"; then
+ echo "mkdir $pathcomp" 1>&2
+
+ mkdir "$pathcomp" || lasterr=$?
+
+ if test ! -d "$pathcomp"; then
+ errstatus=$lasterr
+ fi
+ fi
+
+ pathcomp="$pathcomp/"
+ done
+done
+
+exit $errstatus
+
+# mkinstalldirs ends here
diff --git a/xc/extras/FreeType/net.m4 b/xc/extras/FreeType/net.m4
new file mode 100644
index 000000000..254473be8
--- /dev/null
+++ b/xc/extras/FreeType/net.m4
@@ -0,0 +1,55 @@
+dnl
+dnl The following was written by jhawk@mit.edu
+dnl
+dnl AC_LIBRARY_NET: Id: net.m4,v 1.4 1997/10/25 20:49:53 jhawk Exp
+dnl
+dnl This test is for network applications that need socket() and
+dnl gethostbyname() -ish functions. Under Solaris, those applications need to
+dnl link with "-lsocket -lnsl". Under IRIX, they should *not* link with
+dnl "-lsocket" because libsocket.a breaks a number of things (for instance:
+dnl gethostbyname() under IRIX 5.2, and snoop sockets under most versions of
+dnl IRIX).
+dnl
+dnl Unfortunately, many application developers are not aware of this, and
+dnl mistakenly write tests that cause -lsocket to be used under IRIX. It is
+dnl also easy to write tests that cause -lnsl to be used under operating
+dnl systems where neither are necessary (or useful), such as SunOS 4.1.4, which
+dnl uses -lnsl for TLI.
+dnl
+dnl This test exists so that every application developer does not test this in
+dnl a different, and subtly broken fashion.
+dnl
+dnl It has been argued that this test should be broken up into two seperate
+dnl tests, one for the resolver libraries, and one for the libraries necessary
+dnl for using Sockets API. Unfortunately, the two are carefully intertwined and
+dnl allowing the autoconf user to use them independantly potentially results in
+dnl unfortunate ordering dependancies -- as such, such component macros would
+dnl have to carefully use indirection and be aware if the other components were
+dnl executed. Since other autoconf macros do not go to this trouble, and almost
+dnl no applications use sockets without the resolver, this complexity has not
+dnl been implemented.
+dnl
+dnl The check for libresolv is in case you are attempting to link statically
+dnl and happen to have a libresolv.a lying around (and no libnsl.a).
+dnl
+AC_DEFUN(AC_LIBRARY_NET, [
+ # Most operating systems have gethostbyname() in the default searched
+ # libraries (i.e. libc):
+ AC_CHECK_FUNC(gethostbyname, ,
+ # Some OSes (eg. Solaris) place it in libnsl:
+ AC_CHECK_LIB(nsl, gethostbyname, ,
+ # Some strange OSes (SINIX) have it in libsocket:
+ AC_CHECK_LIB(socket, gethostbyname, ,
+ # Unfortunately libsocket sometimes depends on libnsl.
+ # AC_CHECK_LIB's API is essentially broken so the following
+ # ugliness is necessary:
+ AC_CHECK_LIB(socket, gethostbyname,
+ LIBS="-lsocket -lnsl $LIBS",
+ AC_CHECK_LIB(resolv, gethostbyname),
+ -lnsl)
+ )
+ )
+ )
+ AC_CHECK_FUNC(socket, , AC_CHECK_LIB(socket, socket, ,
+ AC_CHECK_LIB(socket, socket, LIBS="-lsocket -lnsl $LIBS", , -lnsl)))
+ ])
diff --git a/xc/extras/FreeType/po/Makefile.in.in b/xc/extras/FreeType/po/Makefile.in.in
new file mode 100644
index 000000000..a4be8ffb1
--- /dev/null
+++ b/xc/extras/FreeType/po/Makefile.in.in
@@ -0,0 +1,216 @@
+#
+#
+# Makefile for freetype I18n,
+# based on the Makefile.in.in that comes with gettext
+#
+# Erwin Dieterich, 20. 1. 1998 Erwin.Dieterich.ED@Bayer-AG.de
+#
+#
+#
+# Makefile for program source directory in GNU NLS utilities package.
+# Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+PACKAGE = freetype
+VERSION = @freetype_version@
+
+SHELL = /bin/sh
+@SET_MAKE@
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+datadir = $(prefix)/@DATADIRNAME@
+localedir = @LOCALEDIR@
+gnulocaledir = @LOCALEDIR@
+subdir = po
+
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+
+CC = @CC@
+GMSGFMT = @GMSGFMT@
+MSGFMT = @MSGFMT@
+XGETTEXT = @XGETTEXT@
+MSGMERGE = @MSGMERGE@
+
+DEFS = @DEFS@
+CFLAGS = @CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+
+INCLUDES = -I..
+
+COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
+
+DISTFILES = ChangeLog Makefile.in.in POTFILES.in $(PACKAGE).pot
+
+POTFILES = \
+
+CATALOGS = @CATALOGS@
+CATOBJEXT = @CATOBJEXT@
+INSTOBJEXT = @INSTOBJEXT@
+
+.SUFFIXES:
+.SUFFIXES: .c .o .po .pox .gmo .mo .msg
+
+.c.o:
+ $(COMPILE) $<
+
+.po.pox:
+ $(MAKE) $(PACKAGE).pot
+ $(MSGMERGE) $< $(srcdir)/$(PACKAGE).pot -o $*.pox
+
+.po.mo:
+ $(MSGFMT) -o $@ $<
+
+.po.gmo:
+ file=`echo $* | sed 's,.*/,,'`.gmo \
+ && rm -f $$file && $(GMSGFMT) -o $$file $<
+
+
+
+all: all-@USE_NLS@
+
+all-yes: $(PACKAGE).pot $(CATALOGS)
+all-no:
+ @echo "No support for NLS requested"
+
+$(PACKAGE).pot: $(POTFILES)
+ if test -n "$(XGETTEXT)"; then \
+ $(XGETTEXT) --default-domain=freetype --directory=$(srcdir)/.. \
+ --keyword=_ --files-from=$(srcdir)/POTFILES.in; \
+ mv freetype.po freetype.pot; \
+ else \
+ echo "xgettext not available: $(PACKAGE).pot not updated" 1>&2; \
+ fi
+
+
+install: install-exec install-data
+install-exec:
+install-data: install-data-@USE_NLS@
+install-data-no: all
+install-data-yes: all
+ $(top_srcdir)/mkinstalldirs $(datadir); \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ case "$$cat" in \
+ *.gmo) destdir=$(gnulocaledir);; \
+ *) destdir=$(localedir);; \
+ esac; \
+ lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \
+ dir=$$destdir/$$lang/LC_MESSAGES; \
+ $(top_srcdir)/mkinstalldirs $$dir; \
+ if test -r $$cat; then \
+ $(INSTALL_DATA) $$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+ echo "installing $$cat as $$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+ else \
+ $(INSTALL_DATA) $(srcdir)/$$cat $$dir/$(PACKAGE)$(INSTOBJEXT); \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(PACKAGE)$(INSTOBJEXT)"; \
+ fi; \
+ if test -r $$cat.m; then \
+ $(INSTALL_DATA) $$cat.m $$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $$cat.m as $$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ if test -r $(srcdir)/$$cat.m ; then \
+ $(INSTALL_DATA) $(srcdir)/$$cat.m \
+ $$dir/$(PACKAGE)$(INSTOBJEXT).m; \
+ echo "installing $(srcdir)/$$cat as" \
+ "$$dir/$(PACKAGE)$(INSTOBJEXT).m"; \
+ else \
+ true; \
+ fi; \
+ fi; \
+ done
+
+# Define this as empty until I found a useful application.
+installcheck:
+
+uninstall:
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+ rm -f $(localedir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT); \
+ rm -f $(gnulocaledir)/$$lang/LC_MESSAGES/$(PACKAGE)$(INSTOBJEXT).m; \
+ done
+ rm -f $(gettextsrcdir)/po-Makefile.in.in
+
+check: all
+
+dvi info tags TAGS ID:
+
+mostlyclean:
+ rm -f core core.* *.pox $(PACKAGE).po *.old.po
+ rm -fr *.o *~
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile Makefile.in POTFILES *.mo *.gmo *.msg *.cat.m
+
+maintainer-clean: distclean
+ @echo "This command is intended for maintainers to use;"
+ @echo "it deletes files that may require special tools to rebuild."
+
+distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
+dist distdir: update-po $(DISTFILES)
+ dists="$(DISTFILES)"; \
+ for file in $$dists; do \
+ ln $(srcdir)/$$file $(distdir) 2> /dev/null \
+ || cp -p $(srcdir)/$$file $(distdir); \
+ done
+
+update-po: Makefile
+ $(MAKE) $(PACKAGE).pot
+ PATH=`pwd`/../src:$$PATH; \
+ cd $(srcdir); \
+ catalogs='$(CATALOGS)'; \
+ for cat in $$catalogs; do \
+ lang=`echo $$cat | sed 's/$(CATOBJEXT)$$//'`; \
+ mv $$lang.po $$lang.old.po; \
+ echo "$$lang:"; \
+ if $(MSGMERGE) $$lang.old.po $(PACKAGE).pot -o $$lang.po; then \
+ rm -f $$lang.old.po; \
+ else \
+ echo "msgmerge for $$cat failed!"; \
+ rm -f $$lang.po; \
+ mv $$lang.old.po $$lang.po; \
+ fi; \
+ done
+
+POTFILES: POTFILES.in
+ ( if test 'x$(srcdir)' != 'x.'; then \
+ posrcprefix='$(top_srcdir)/'; \
+ else \
+ posrcprefix="../"; \
+ fi; \
+ sed -e '/^#/d' -e '/^[ ]*$$/d' \
+ -e "s@.*@ $$posrcprefix& \\\\@" \
+ -e '$$s/\(.*\) \\/\1/' < $(srcdir)/POTFILES.in > POTFILES )
+
+Makefile: Makefile.in.in ../config.status POTFILES
+ cd .. \
+ && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
+ $(SHELL) ./config.status
+
+# Tell versions [3.59,3.63) of GNU make not to export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/xc/extras/FreeType/po/POTFILES.in b/xc/extras/FreeType/po/POTFILES.in
new file mode 100644
index 000000000..b1eb1983b
--- /dev/null
+++ b/xc/extras/FreeType/po/POTFILES.in
@@ -0,0 +1,8 @@
+#
+# List of source files containing translatable strings
+#
+#
+lib/extend/ftxerr18.c
+test/fterror.c
+test/ftdump.c
+test/ftlint.c
diff --git a/xc/extras/FreeType/po/cs.po b/xc/extras/FreeType/po/cs.po
new file mode 100644
index 000000000..526bd75b6
--- /dev/null
+++ b/xc/extras/FreeType/po/cs.po
@@ -0,0 +1,443 @@
+# Czech messages for FreeType
+# Copyright (C) 1998 Pavel Kaòkovský
+# Pavel Kaòkovský <peak@kerberos.troja.mff.cuni.cz>, 1998
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeType 1.0\n"
+"POT-Creation-Date: 1998-10-08 17:57+0000\n"
+"PO-Revision-Date: 1998-01-28\n"
+"Last-Translator: Pavel Kaòkovský <peak@kerberos.troja.mff.cuni.cz>, 1998\n"
+"Language-Team: Czech\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-2\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/extend/ftxerr18.c:44
+msgid "Successful function call, no error."
+msgstr "Úspì¹né volání funkce, ¾ádná chyba"
+
+#: lib/extend/ftxerr18.c:47
+msgid "Invalid face handle."
+msgstr "Neplatný manipulátor písma"
+
+#: lib/extend/ftxerr18.c:49
+msgid "Invalid instance handle."
+msgstr "Neplatný manipulátor instance"
+
+#: lib/extend/ftxerr18.c:51
+msgid "Invalid glyph handle."
+msgstr "Neplatný manipulátor litery"
+
+#: lib/extend/ftxerr18.c:53
+msgid "Invalid charmap handle."
+msgstr "Neplatný manipulátor znakové mapy"
+
+#: lib/extend/ftxerr18.c:55
+msgid "Invalid result address."
+msgstr "Neplatná adresa výsledku"
+
+#: lib/extend/ftxerr18.c:57
+msgid "Invalid glyph index."
+msgstr "Neplatný index litery"
+
+#: lib/extend/ftxerr18.c:59
+msgid "Invalid argument."
+msgstr "Neplatný argument"
+
+#: lib/extend/ftxerr18.c:61
+msgid "Could not open file."
+msgstr "Nelze otevøít soubor"
+
+#: lib/extend/ftxerr18.c:63
+msgid "File is not a TrueType collection."
+msgstr "Soubor není kolekce písem TrueType"
+
+#: lib/extend/ftxerr18.c:66
+msgid "Mandatory table missing."
+msgstr "Nìkterá z povinných tabulek chybí"
+
+#: lib/extend/ftxerr18.c:68
+msgid "Invalid horizontal metrics (hmtx table broken)."
+msgstr "Neplatná horizontální metrika (tabulka HMTX po¹kozena)"
+
+#: lib/extend/ftxerr18.c:70
+msgid "Invalid charmap format."
+msgstr "Neplatný formát znakové mapy"
+
+#: lib/extend/ftxerr18.c:73
+msgid "Invalid file format."
+msgstr "Neplatný formát souboru"
+
+#: lib/extend/ftxerr18.c:76
+msgid "Invalid engine."
+msgstr "Neplatná globální data knihovny (engine)"
+
+#: lib/extend/ftxerr18.c:78
+msgid "Too many extensions (max: 8)."
+msgstr "Pøíli¹ mnoho roz¹íøení (max: 8)"
+
+#: lib/extend/ftxerr18.c:80
+msgid "Extensions unsupported."
+msgstr "Roz¹íøení není podporováno"
+
+#: lib/extend/ftxerr18.c:82
+msgid "Invalid extension id."
+msgstr "Neplatný identifikátor roz¹íøení"
+
+#: lib/extend/ftxerr18.c:85
+msgid "No vertical data in font."
+msgstr "V písmu nejsou obsa¾ena ¾ádná vertikální data"
+
+#: lib/extend/ftxerr18.c:88
+msgid "Maximum Profile (maxp) table missing."
+msgstr "Tabulka maximálních hodnot (MAXP) chybí"
+
+#: lib/extend/ftxerr18.c:90
+msgid "Font Header (head) table missing."
+msgstr "Tabulka HEAD chybí"
+
+#: lib/extend/ftxerr18.c:92
+msgid "Horizontal Header (hhea) table missing."
+msgstr "Tabulka HHEA chybí"
+
+#: lib/extend/ftxerr18.c:94
+msgid "Index to Location (loca) table missing."
+msgstr "Tabulka pozic liter (LOCA) chybí"
+
+#: lib/extend/ftxerr18.c:96
+msgid "Naming (name) table missing."
+msgstr "Tabulka jmen (NAME) chybí"
+
+#: lib/extend/ftxerr18.c:98
+msgid "Character to Glyph Index Mapping (cmap) tables missing."
+msgstr "Tabulky znakových map (CMAP) chybí"
+
+#: lib/extend/ftxerr18.c:100
+msgid "Horizontal Metrics (hmtx) table missing."
+msgstr "Tabulka horizontálních metrik (HTMX) chybí"
+
+#: lib/extend/ftxerr18.c:102
+msgid "OS/2 table missing."
+msgstr "Tabulka OS/2 chybí"
+
+#: lib/extend/ftxerr18.c:104
+msgid "PostScript (post) table missing."
+msgstr "Tabulka dat pro PostScript (POST) chybí"
+
+#: lib/extend/ftxerr18.c:109
+msgid "Out of memory."
+msgstr "Nedostatek pamìti"
+
+#: lib/extend/ftxerr18.c:114
+msgid "Invalid file offset."
+msgstr "Neplatná pozice v souboru"
+
+#: lib/extend/ftxerr18.c:116
+msgid "Invalid file read."
+msgstr "Neplatné ètení ze souboru"
+
+#: lib/extend/ftxerr18.c:118
+msgid "Invalid frame access."
+msgstr "Neplatný pøístup k úseku souboru"
+
+#: lib/extend/ftxerr18.c:123
+msgid "Too many points."
+msgstr "Pøíli¹ mnoho bodù"
+
+#: lib/extend/ftxerr18.c:125
+msgid "Too many contours."
+msgstr "Pøíli¹ mnoho kontur"
+
+#: lib/extend/ftxerr18.c:127
+msgid "Invalid composite glyph."
+msgstr "Neplatná kompozitní litera"
+
+#: lib/extend/ftxerr18.c:129
+msgid "Too many instructions."
+msgstr "Pøíli¹ mnoho instrukcí"
+
+#: lib/extend/ftxerr18.c:134
+msgid "Invalid opcode."
+msgstr "Neplatný kód operace"
+
+#: lib/extend/ftxerr18.c:136
+msgid "Too few arguments."
+msgstr "Pøíli¹ málo argumentù"
+
+#: lib/extend/ftxerr18.c:138
+msgid "Stack overflow."
+msgstr "Pøeteèení zásobníku"
+
+#: lib/extend/ftxerr18.c:140
+msgid "Code overflow."
+msgstr "Pøeteèení oblasti instrukcí"
+
+#: lib/extend/ftxerr18.c:142
+msgid "Bad argument."
+msgstr "©patný argument"
+
+#: lib/extend/ftxerr18.c:144
+msgid "Divide by zero."
+msgstr "Dìlení nulou"
+
+#: lib/extend/ftxerr18.c:146
+msgid "Storage overflow."
+msgstr "Pøeteèení oblasti pro ukládání dat"
+
+#: lib/extend/ftxerr18.c:148
+msgid "Control Value (cvt) table overflow."
+msgstr "Pøeteèení tabulky øídících hodnot (CVT)"
+
+#: lib/extend/ftxerr18.c:150
+msgid "Invalid reference."
+msgstr "Neplatný odkaz"
+
+#: lib/extend/ftxerr18.c:152
+msgid "Invalid distance."
+msgstr "Neplatná vzdálenost"
+
+#: lib/extend/ftxerr18.c:154
+msgid "Interpolate twilight points."
+msgstr "Interpolace mezi body v soumraèné zónì"
+
+#: lib/extend/ftxerr18.c:156
+msgid "`DEBUG' opcode found."
+msgstr "Ladící operace"
+
+#: lib/extend/ftxerr18.c:158
+msgid "`ENDF' in byte-code stream."
+msgstr "Operace ENDF nalezena na ¹patném místì"
+
+#: lib/extend/ftxerr18.c:160
+msgid "Out of code ranges."
+msgstr "Mimo oblast instrukcí"
+
+#: lib/extend/ftxerr18.c:162
+msgid "Nested function definitions."
+msgstr "Vnoøené definice funkcí"
+
+#: lib/extend/ftxerr18.c:164
+msgid "Invalid code range."
+msgstr "Neplatná oblast instrukcí"
+
+#: lib/extend/ftxerr18.c:166
+msgid "Invalid displacement."
+msgstr "Neplatné posunutí"
+
+#: lib/extend/ftxerr18.c:168
+msgid "Endless loop encountered while executing instructions."
+msgstr "Do¹lo k zacyklení bìhem vykonávání instrukcí"
+
+#: lib/extend/ftxerr18.c:173
+msgid "Nested frame access."
+msgstr "Vnoøené pøístupy k úseku souboru"
+
+#: lib/extend/ftxerr18.c:175
+msgid "Invalid cache list."
+msgstr "Neplatný seznam vyrovnávací pamìti"
+
+#: lib/extend/ftxerr18.c:177
+msgid "Could not find context."
+msgstr "Nelze najít kontext"
+
+#: lib/extend/ftxerr18.c:179
+msgid "Unlisted object."
+msgstr "Objekt není v seznamu"
+
+#: lib/extend/ftxerr18.c:184
+msgid "Raster pool overflow."
+msgstr "Pøeteèení pamìti rasterizéru"
+
+#: lib/extend/ftxerr18.c:186
+msgid "Raster: negative height encountered."
+msgstr "Rasterizér: záporná vý¹ka"
+
+#: lib/extend/ftxerr18.c:188
+msgid "Raster: invalid value."
+msgstr "Rasterizér: neplatná hodnota"
+
+#: lib/extend/ftxerr18.c:190
+msgid "Raster not initialized."
+msgstr "Rasterizér není incializován"
+
+#: lib/extend/ftxerr18.c:195
+msgid "Invalid kerning (kern) table format."
+msgstr "Neplatný formát tabulky kernù (KERN)"
+
+#: lib/extend/ftxerr18.c:197
+msgid "Invalid kerning (kern) table."
+msgstr "Neplatná tabulka kernù (KERN)"
+
+#: lib/extend/ftxerr18.c:199
+msgid "Invalid PostScript (post) table format."
+msgstr "Neplatný formát tabulky PostScript (POST)"
+
+#: lib/extend/ftxerr18.c:201
+msgid "Invalid PostScript (post) table."
+msgstr "Neplatná tabulka PostScript (POST)"
+
+#: lib/extend/ftxerr18.c:208
+msgid "Invalid Error Number."
+msgstr "Neznámý kód chyby"
+
+#: test/fterror.c:59
+msgid "Start of fterror.\n"
+msgstr "Zaèátek fterror.\n"
+
+#: test/fterror.c:67
+msgid "End of fterror.\n"
+msgstr "Konec fterror.\n"
+
+#: test/ftdump.c:145 test/ftlint.c:197
+msgid "Could not create glyph container.\n"
+msgstr "Nelze vytvoøit kontejner liter.\n"
+
+#: test/ftdump.c:152
+msgid " Could not create instance.\n"
+msgstr "Nelze vytvoøit instanci.\n"
+
+#: test/ftdump.c:158
+msgid "Could not create 2nd instance.\n"
+msgstr "Nelze vytvoøit druhou instanci.\n"
+
+#: test/ftdump.c:162
+msgid "Memory footprint statistics:\n"
+msgstr "Statistika pamì»ových nárokù:\n"
+
+#. NOTE: In our current implementation, the face's execution
+#. context object is created lazily with the first
+#. instance. However, all later instances share the
+#. the same context.
+#: test/ftdump.c:170
+msgid "face object"
+msgstr "objekt písma"
+
+#: test/ftdump.c:171
+msgid "glyph_object"
+msgstr "objekt litery"
+
+#: test/ftdump.c:172
+msgid "instance object"
+msgstr "objekt instance"
+
+#: test/ftdump.c:176
+msgid "exec. context object"
+msgstr "objekt provádìcího kontextu"
+
+#: test/ftdump.c:182
+msgid "total memory usage"
+msgstr "celková spotøeba pamìti"
+
+#: test/ftdump.c:259
+msgid "font name table entries\n"
+msgstr "polo¾ky v tabulce jmen\n"
+
+#: test/ftdump.c:288
+msgid "character map encodings\n"
+msgstr "kódování map znakù\n"
+
+#: test/ftdump.c:294 test/ftdump.c:435
+msgid "The file doesn't seem to have any encoding table.\n"
+msgstr "Soubor zøejmì neobsahuje ¾ádnou mapu znakù.\n"
+
+#: test/ftdump.c:298 test/ftdump.c:439
+#, c-format
+msgid ""
+"There are %d encodings:\n"
+"\n"
+msgstr ""
+"%d kódování:\n"
+"\n"
+
+#: test/ftdump.c:303
+#, c-format
+msgid "encoding %2d: "
+msgstr "kódování %2d: "
+
+#: test/ftdump.c:330 test/ftdump.c:339 test/ftdump.c:402
+#, c-format
+msgid "Unknown %d"
+msgstr "Neznámé %d"
+
+#: test/ftdump.c:409
+msgid "Unknown"
+msgstr "Neznámé"
+
+#: test/ftdump.c:429
+msgid "ftxcmap test\n"
+msgstr ""
+
+#: test/ftdump.c:445
+#, fuzzy, c-format
+msgid "encoding %2d:\n"
+msgstr "kódování %2d: "
+
+#: test/ftdump.c:481
+msgid "ftdump: simple TrueType Dumper -- part of the FreeType project\n"
+msgstr ""
+"ftdump: jednoduchý výpis obsahu písma TrueType -- souèást projektu FreeType\n"
+
+#: test/ftdump.c:484
+#, c-format
+msgid ""
+"Usage: %s fontname[.ttf|.ttc]\n"
+"\n"
+msgstr ""
+"Pou¾ití: %s název-písma[.ttf|.ttc]\n"
+"\n"
+
+#: test/ftdump.c:515 test/ftlint.c:125
+#, c-format
+msgid "Error while initializing engine: %s\n"
+msgstr "Chyba bìhem inicializace knihovny: %s\n"
+
+#: test/ftdump.c:531
+#, c-format
+msgid "Error while opening %s.\n"
+msgstr "Chyba bìhem otevírání souboru %s.\n"
+
+#: test/ftdump.c:532 test/ftlint.c:182 test/ftlint.c:199 test/ftlint.c:211
+#: test/ftlint.c:225
+#, c-format
+msgid "FreeType error message: %s\n"
+msgstr "Chybové hlá¹ení FreeType: %s\n"
+
+#: test/ftlint.c:87
+msgid ""
+"ftlint: simple TrueType instruction tester -- part of the FreeType project\n"
+msgstr ""
+"ftlint: jednoduchý program na testování instrukcí TrueType -- souèást "
+"projektu FreeType\n"
+
+#: test/ftlint.c:90
+#, c-format
+msgid "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+msgstr "Pou¾ití: %s ppem název-písma[.ttf|.ttc] [název-dal¹ího-písma..]\n"
+
+#: test/ftlint.c:180
+msgid "Could not find or open file.\n"
+msgstr "Nelze nalézt nebo otevøít soubor.\n"
+
+#: test/ftlint.c:209
+msgid "Could not create instance.\n"
+msgstr "Nelze vytvoøit instanci\n"
+
+#: test/ftlint.c:223
+#, c-format
+msgid "Could not set point size to %d.\n"
+msgstr "Nelze nastavit velikost písma na %d bodù.\n"
+
+#: test/ftlint.c:239
+#, c-format
+msgid "glyph %4u: %s\n"
+msgstr "litera %4d: %s\n"
+
+#: test/ftlint.c:252
+msgid "1 fail.\n"
+msgstr "poèet chyb: 1\n"
+
+#: test/ftlint.c:254
+#, c-format
+msgid "%d fails.\n"
+msgstr "poèet chyb: %d\n"
diff --git a/xc/extras/FreeType/po/de.po b/xc/extras/FreeType/po/de.po
new file mode 100644
index 000000000..8fc969e09
--- /dev/null
+++ b/xc/extras/FreeType/po/de.po
@@ -0,0 +1,446 @@
+# German messages for FreeType.
+# Copyright (C) 1997-1998 Erwin Dieterich
+# Erwin Dieterich <Erwin.Dieterich.ED@Bayer-AG.de>, 1997-1998.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeType 1.0\n"
+"POT-Creation-Date: 1998-10-08 17:57+0000\n"
+"PO-Revision-Date: 1998-01-21\n"
+"Last-Translator: Erwin Dieterich <Erwin.Dieterich.ED@Bayer-AG.de>\n"
+"Language-Team: German\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/extend/ftxerr18.c:44
+msgid "Successful function call, no error."
+msgstr "Funktionsaufruf erfolgreich."
+
+#: lib/extend/ftxerr18.c:47
+msgid "Invalid face handle."
+msgstr "Ungültiger Oberflächen-Henkel."
+
+#: lib/extend/ftxerr18.c:49
+msgid "Invalid instance handle."
+msgstr "Ungültiger Instanzen-Henkel."
+
+#: lib/extend/ftxerr18.c:51
+msgid "Invalid glyph handle."
+msgstr "Ungültiger Glyph-Henkel."
+
+#: lib/extend/ftxerr18.c:53
+msgid "Invalid charmap handle."
+msgstr "Ungültiger Charmap-Henkel."
+
+#: lib/extend/ftxerr18.c:55
+msgid "Invalid result address."
+msgstr "Ungültige Ergebnis-Adresse."
+
+#: lib/extend/ftxerr18.c:57
+msgid "Invalid glyph index."
+msgstr "Ungültiger Glyph-Index."
+
+#: lib/extend/ftxerr18.c:59
+msgid "Invalid argument."
+msgstr "Ungültiger Übergabeparameter"
+
+#: lib/extend/ftxerr18.c:61
+msgid "Could not open file."
+msgstr "Datei konnte nicht geöffnet werden."
+
+#: lib/extend/ftxerr18.c:63
+msgid "File is not a TrueType collection."
+msgstr "Datei ist keine TrueType-Collection."
+
+#: lib/extend/ftxerr18.c:66
+msgid "Mandatory table missing."
+msgstr "Eine obligatorische Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:68
+msgid "Invalid horizontal metrics (hmtx table broken)."
+msgstr "Ungültige horizontale Metrik (hmtx-Tabelle defekt)."
+
+#: lib/extend/ftxerr18.c:70
+msgid "Invalid charmap format."
+msgstr "Ungültiges Charmap-Format."
+
+#: lib/extend/ftxerr18.c:73
+msgid "Invalid file format."
+msgstr "Unerlaubtes Dateiformat."
+
+#: lib/extend/ftxerr18.c:76
+msgid "Invalid engine."
+msgstr "Unerlaubte FreeType-Maschine (engine)."
+
+#: lib/extend/ftxerr18.c:78
+msgid "Too many extensions (max: 8)."
+msgstr "Zu viele Erweiterungen (max: 8)."
+
+#: lib/extend/ftxerr18.c:80
+msgid "Extensions unsupported."
+msgstr "Erweiterungen nicht unterstützt."
+
+#: lib/extend/ftxerr18.c:82
+msgid "Invalid extension id."
+msgstr "Unerlaubte ID einer Erweiterung."
+
+#: lib/extend/ftxerr18.c:85
+msgid "No vertical data in font."
+msgstr "Keine vertikale Informationen in der Schrift."
+
+#: lib/extend/ftxerr18.c:88
+msgid "Maximum Profile (maxp) table missing."
+msgstr "`Maximum Profile (maxp)'-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:90
+msgid "Font Header (head) table missing."
+msgstr "`Font Header (head)'-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:92
+msgid "Horizontal Header (hhea) table missing."
+msgstr "`Horizontal Header (hhea)'-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:94
+msgid "Index to Location (loca) table missing."
+msgstr "`Index to Location (loca)'-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:96
+msgid "Naming (name) table missing."
+msgstr "`Naming (name)'-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:98
+msgid "Character to Glyph Index Mapping (cmap) tables missing."
+msgstr "`Character to Glyph Index Mapping (cmap)'-Tabellen fehlen."
+
+#: lib/extend/ftxerr18.c:100
+msgid "Horizontal Metrics (hmtx) table missing."
+msgstr "`Horizontal Metrics (hmtx)'-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:102
+msgid "OS/2 table missing."
+msgstr "OS/2-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:104
+msgid "PostScript (post) table missing."
+msgstr "`PostScript (post)'-Tabelle fehlt."
+
+#: lib/extend/ftxerr18.c:109
+msgid "Out of memory."
+msgstr "Zu wenig Speicher."
+
+#: lib/extend/ftxerr18.c:114
+msgid "Invalid file offset."
+msgstr "Unerlaubter Datei-Abstand."
+
+#: lib/extend/ftxerr18.c:116
+msgid "Invalid file read."
+msgstr "Unerlaubtes Lesen in der Datei."
+
+#: lib/extend/ftxerr18.c:118
+msgid "Invalid frame access."
+msgstr "Unerlaubte Rahmen-Anforderung."
+
+#: lib/extend/ftxerr18.c:123
+msgid "Too many points."
+msgstr "Zu viele Punkte."
+
+#: lib/extend/ftxerr18.c:125
+msgid "Too many contours."
+msgstr "Zu viele Konturen."
+
+#: lib/extend/ftxerr18.c:127
+msgid "Invalid composite glyph."
+msgstr "Ungültiges zusammengesetztes Glyph."
+
+#: lib/extend/ftxerr18.c:129
+msgid "Too many instructions."
+msgstr "Zu viele Anleitungen (instructions)."
+
+#: lib/extend/ftxerr18.c:134
+msgid "Invalid opcode."
+msgstr "Unerlaubter Opcode."
+
+#: lib/extend/ftxerr18.c:136
+msgid "Too few arguments."
+msgstr "Zu wenig Übergabeparameter."
+
+#: lib/extend/ftxerr18.c:138
+msgid "Stack overflow."
+msgstr "Stack-Überlauf."
+
+#: lib/extend/ftxerr18.c:140
+msgid "Code overflow."
+msgstr "Code-Überlauf."
+
+#: lib/extend/ftxerr18.c:142
+msgid "Bad argument."
+msgstr "Falscher Übergabeparameter."
+
+#: lib/extend/ftxerr18.c:144
+msgid "Divide by zero."
+msgstr "Division durch Null."
+
+#: lib/extend/ftxerr18.c:146
+msgid "Storage overflow."
+msgstr "Speicher-Überlauf."
+
+#: lib/extend/ftxerr18.c:148
+msgid "Control Value (cvt) table overflow."
+msgstr "Überlauf der `Control Value (cvt)'-Tabelle."
+
+#: lib/extend/ftxerr18.c:150
+msgid "Invalid reference."
+msgstr "Unerlaubte Referenz."
+
+#: lib/extend/ftxerr18.c:152
+msgid "Invalid distance."
+msgstr "Unerlaubter Abstand."
+
+#: lib/extend/ftxerr18.c:154
+msgid "Interpolate twilight points."
+msgstr "Interpolation von Zwielicht-Punkten. (??)"
+
+#: lib/extend/ftxerr18.c:156
+msgid "`DEBUG' opcode found."
+msgstr "`DEBUG'-Opcode gefunden."
+
+#: lib/extend/ftxerr18.c:158
+msgid "`ENDF' in byte-code stream."
+msgstr "`ENDF' in Byte-Code-Strom."
+
+#: lib/extend/ftxerr18.c:160
+msgid "Out of code ranges."
+msgstr "Außerhalb des Code-Bereichs."
+
+#: lib/extend/ftxerr18.c:162
+msgid "Nested function definitions."
+msgstr "Verschachtelte Funktions-Definitionen."
+
+#: lib/extend/ftxerr18.c:164
+msgid "Invalid code range."
+msgstr "Unerlaubter Code-Bereich."
+
+#: lib/extend/ftxerr18.c:166
+msgid "Invalid displacement."
+msgstr "Unerlaubte Deplazierung."
+
+#: lib/extend/ftxerr18.c:168
+msgid "Endless loop encountered while executing instructions."
+msgstr ""
+"Unendliche Schleife entdeckt beim Ausführen \n"
+"der Anleitungen (instructions)."
+
+#: lib/extend/ftxerr18.c:173
+msgid "Nested frame access."
+msgstr "Verschachtelter Rahmen-Zugriff."
+
+#: lib/extend/ftxerr18.c:175
+msgid "Invalid cache list."
+msgstr "Ungütlige Cache-Liste."
+
+#: lib/extend/ftxerr18.c:177
+msgid "Could not find context."
+msgstr "Der Zusammenhang (context) konnte nicht gefunden werden."
+
+#: lib/extend/ftxerr18.c:179
+msgid "Unlisted object."
+msgstr "Objekt ist nicht aufgeführt."
+
+#: lib/extend/ftxerr18.c:184
+msgid "Raster pool overflow."
+msgstr "Überlauf des Raster-Pools."
+
+#: lib/extend/ftxerr18.c:186
+msgid "Raster: negative height encountered."
+msgstr "Raster: Negative Höhe gefunden."
+
+#: lib/extend/ftxerr18.c:188
+msgid "Raster: invalid value."
+msgstr "Raster: Ungültiger Wert."
+
+#: lib/extend/ftxerr18.c:190
+msgid "Raster not initialized."
+msgstr "Raster nicht initialisiert."
+
+#: lib/extend/ftxerr18.c:195
+msgid "Invalid kerning (kern) table format."
+msgstr "Ungültiges Format der `Kerning (kern)'-Tabelle."
+
+#: lib/extend/ftxerr18.c:197
+msgid "Invalid kerning (kern) table."
+msgstr "Ungültige `Kerning (kern)'-Tabelle."
+
+#: lib/extend/ftxerr18.c:199
+msgid "Invalid PostScript (post) table format."
+msgstr "Ungültiges Format der `PostScript (post)'-Tabelle."
+
+#: lib/extend/ftxerr18.c:201
+msgid "Invalid PostScript (post) table."
+msgstr "Ungültige `PostScript (post)'-Tabelle."
+
+#: lib/extend/ftxerr18.c:208
+msgid "Invalid Error Number."
+msgstr "Ungültige Fehler-Zahl."
+
+#: test/fterror.c:59
+msgid "Start of fterror.\n"
+msgstr "Beginn von fterror.\n"
+
+#: test/fterror.c:67
+msgid "End of fterror.\n"
+msgstr "Ende von fterror.\n"
+
+#: test/ftdump.c:145 test/ftlint.c:197
+msgid "Could not create glyph container.\n"
+msgstr "Konnte den Glyph-Container nicht erzeugen.\n"
+
+#: test/ftdump.c:152
+msgid " Could not create instance.\n"
+msgstr "Konnte die Instanz nicht erzeugen.\n"
+
+#: test/ftdump.c:158
+msgid "Could not create 2nd instance.\n"
+msgstr "Die zweite Instanz konnte nicht erzeugt werden.\n"
+
+#: test/ftdump.c:162
+msgid "Memory footprint statistics:\n"
+msgstr "Speicherabdruck-Statistik:\n"
+
+#. NOTE: In our current implementation, the face's execution
+#. context object is created lazily with the first
+#. instance. However, all later instances share the
+#. the same context.
+#: test/ftdump.c:170
+msgid "face object"
+msgstr "Oberflächen-Objekt"
+
+#: test/ftdump.c:171
+msgid "glyph_object"
+msgstr "Glyph-Objekt"
+
+#: test/ftdump.c:172
+msgid "instance object"
+msgstr "Instanz-Objekt"
+
+#: test/ftdump.c:176
+msgid "exec. context object"
+msgstr "Ausführbarer Kontext-Objekt"
+
+#: test/ftdump.c:182
+msgid "total memory usage"
+msgstr "Gesamtverbrauch an Speicher"
+
+#: test/ftdump.c:259
+msgid "font name table entries\n"
+msgstr "Einträge in der Names-Tabelle der Schrift\n"
+
+#: test/ftdump.c:288
+msgid "character map encodings\n"
+msgstr "Zeichen-Kodierungs-Tabellen\n"
+
+#: test/ftdump.c:294 test/ftdump.c:435
+msgid "The file doesn't seem to have any encoding table.\n"
+msgstr "Diese Datei enthält anscheinend keine cmap-Tabelle.\n"
+
+#: test/ftdump.c:298 test/ftdump.c:439
+#, c-format
+msgid ""
+"There are %d encodings:\n"
+"\n"
+msgstr ""
+"Es gibt %d Kodierungen:\n"
+"\n"
+
+#: test/ftdump.c:303
+#, c-format
+msgid "encoding %2d: "
+msgstr "Kodierung %2d: "
+
+#: test/ftdump.c:330 test/ftdump.c:339 test/ftdump.c:402
+#, c-format
+msgid "Unknown %d"
+msgstr "Unbekannt %d"
+
+#: test/ftdump.c:409
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: test/ftdump.c:429
+msgid "ftxcmap test\n"
+msgstr ""
+
+#: test/ftdump.c:445
+#, fuzzy, c-format
+msgid "encoding %2d:\n"
+msgstr "Kodierung %2d:\n"
+
+#: test/ftdump.c:481
+msgid "ftdump: simple TrueType Dumper -- part of the FreeType project\n"
+msgstr "ftdump: Ein einfacher TrueType Dumper -- Teil des FreeType-Projekts\n"
+
+#: test/ftdump.c:484
+#, c-format
+msgid ""
+"Usage: %s fontname[.ttf|.ttc]\n"
+"\n"
+msgstr ""
+"Verwendung: %s fontname[.ttf|.ttc]\n"
+"\n"
+
+#: test/ftdump.c:515 test/ftlint.c:125
+#, c-format
+msgid "Error while initializing engine: %s\n"
+msgstr "Fehler beim Starten von FreeType: %s\n"
+
+#: test/ftdump.c:531
+#, c-format
+msgid "Error while opening %s.\n"
+msgstr "Fehler beim Öffnen von %s.\n"
+
+#: test/ftdump.c:532 test/ftlint.c:182 test/ftlint.c:199 test/ftlint.c:211
+#: test/ftlint.c:225
+#, c-format
+msgid "FreeType error message: %s\n"
+msgstr "FreeType Fehlermeldung: %s\n"
+
+#: test/ftlint.c:87
+msgid ""
+"ftlint: simple TrueType instruction tester -- part of the FreeType project\n"
+msgstr ""
+"ftlint: Ein einfacher TrueType Instruktionen-Tester -- Teil des "
+"FreeType-Projekts\n"
+
+#: test/ftlint.c:90
+#, c-format
+msgid "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+msgstr ""
+"Verwendung: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+"\n"
+
+#: test/ftlint.c:180
+msgid "Could not find or open file.\n"
+msgstr "Datei konnte nicht gefunden oder geöffnet werden.\n"
+
+#: test/ftlint.c:209
+msgid "Could not create instance.\n"
+msgstr "Konnte die Instanz nicht erzeugen.\n"
+
+#: test/ftlint.c:223
+#, c-format
+msgid "Could not set point size to %d.\n"
+msgstr "Konnte die point size nicht auf %d setzen.\n"
+
+#: test/ftlint.c:239
+#, c-format
+msgid "glyph %4u: %s\n"
+msgstr "Glyph %4u: %s\n"
+
+#: test/ftlint.c:252
+msgid "1 fail.\n"
+msgstr "1 mal gescheitert.\n"
+
+#: test/ftlint.c:254
+#, c-format
+msgid "%d fails.\n"
+msgstr "%d mal gescheitert.\n"
diff --git a/xc/extras/FreeType/po/es.po b/xc/extras/FreeType/po/es.po
new file mode 100644
index 000000000..754f45e58
--- /dev/null
+++ b/xc/extras/FreeType/po/es.po
@@ -0,0 +1,441 @@
+# Spanish messages for FreeType
+# Copyright (C) 1998 Free Software Foundation, Inc.
+# Miguel A. Pérez Valdenebro <map@fujitsu.es>, 1998.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeType 1.0\n"
+"POT-Creation-Date: 1998-10-08 17:57+0000\n"
+"PO-Revision-Date: 1998-05-20\n"
+"Last-Translator: Miguel A. Pérez Valdenebro <map@fujitsu.es>\n"
+"Language-Team: Spanish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/extend/ftxerr18.c:44
+msgid "Successful function call, no error."
+msgstr "Éxito en la llamada a función."
+
+#: lib/extend/ftxerr18.c:47
+msgid "Invalid face handle."
+msgstr "Manejador de cara inválido."
+
+#: lib/extend/ftxerr18.c:49
+msgid "Invalid instance handle."
+msgstr "Manejador de instancia inválido."
+
+#: lib/extend/ftxerr18.c:51
+msgid "Invalid glyph handle."
+msgstr "Manejador de 'glyph' inválido."
+
+#: lib/extend/ftxerr18.c:53
+msgid "Invalid charmap handle."
+msgstr "Manejador de 'CharMap' inválido."
+
+#: lib/extend/ftxerr18.c:55
+msgid "Invalid result address."
+msgstr "Dirección de parámetro inválida."
+
+#: lib/extend/ftxerr18.c:57
+msgid "Invalid glyph index."
+msgstr "Índice de glyph inválido."
+
+#: lib/extend/ftxerr18.c:59
+msgid "Invalid argument."
+msgstr "Argumento inválido."
+
+#: lib/extend/ftxerr18.c:61
+msgid "Could not open file."
+msgstr "No se pudo abrir el fichero."
+
+#: lib/extend/ftxerr18.c:63
+msgid "File is not a TrueType collection."
+msgstr "El fichero no es una colección TrueType."
+
+#: lib/extend/ftxerr18.c:66
+msgid "Mandatory table missing."
+msgstr "Tabla requerida no encontrada."
+
+#: lib/extend/ftxerr18.c:68
+msgid "Invalid horizontal metrics (hmtx table broken)."
+msgstr "Métricas horizontales (tabla hmtx) incorrectas."
+
+#: lib/extend/ftxerr18.c:70
+msgid "Invalid charmap format."
+msgstr "Formato de 'CharMap' inválido."
+
+#: lib/extend/ftxerr18.c:73
+msgid "Invalid file format."
+msgstr "Formato de fichero inválido."
+
+#: lib/extend/ftxerr18.c:76
+msgid "Invalid engine."
+msgstr "Instancia de la biblioteca incorrecta."
+
+#: lib/extend/ftxerr18.c:78
+msgid "Too many extensions (max: 8)."
+msgstr "Demasiadas extensiones (max:8)."
+
+#: lib/extend/ftxerr18.c:80
+msgid "Extensions unsupported."
+msgstr "Extensión no soportada."
+
+#: lib/extend/ftxerr18.c:82
+msgid "Invalid extension id."
+msgstr "Identificador de extensión inválido."
+
+#: lib/extend/ftxerr18.c:85
+msgid "No vertical data in font."
+msgstr "'Font' sin datos verticales."
+
+#: lib/extend/ftxerr18.c:88
+msgid "Maximum Profile (maxp) table missing."
+msgstr "Tabla de perfil máximo (maxp) no encontrada."
+
+#: lib/extend/ftxerr18.c:90
+msgid "Font Header (head) table missing."
+msgstr "Tabla de cabecera de 'font' (head) no encontrada."
+
+#: lib/extend/ftxerr18.c:92
+msgid "Horizontal Header (hhea) table missing."
+msgstr "Tabla de cabecera horizontal (hhea) no encontrada."
+
+#: lib/extend/ftxerr18.c:94
+msgid "Index to Location (loca) table missing."
+msgstr "Tabla de translación de índice a posición (loca) no encontrada."
+
+#: lib/extend/ftxerr18.c:96
+msgid "Naming (name) table missing."
+msgstr "Tabla de nombres (name) no encontrada."
+
+#: lib/extend/ftxerr18.c:98
+msgid "Character to Glyph Index Mapping (cmap) tables missing."
+msgstr "Tabla de translación caráctera índice de glyph (cmap) no encontrada."
+
+#: lib/extend/ftxerr18.c:100
+msgid "Horizontal Metrics (hmtx) table missing."
+msgstr "Tabla de métricas horizontales (hmtx) no encontrada."
+
+#: lib/extend/ftxerr18.c:102
+msgid "OS/2 table missing."
+msgstr "Tabla OS/2 no encontrada."
+
+#: lib/extend/ftxerr18.c:104
+msgid "PostScript (post) table missing."
+msgstr "Tabla PostScript (post) no encontrada"
+
+#: lib/extend/ftxerr18.c:109
+msgid "Out of memory."
+msgstr "No hay suficiente memoria."
+
+#: lib/extend/ftxerr18.c:114
+msgid "Invalid file offset."
+msgstr "Offset de fichero inválido."
+
+#: lib/extend/ftxerr18.c:116
+msgid "Invalid file read."
+msgstr "Lectura de fichero incorrecta."
+
+#: lib/extend/ftxerr18.c:118
+msgid "Invalid frame access."
+msgstr "Acceso a trama inválido."
+
+#: lib/extend/ftxerr18.c:123
+msgid "Too many points."
+msgstr "Demasiados puntos."
+
+#: lib/extend/ftxerr18.c:125
+msgid "Too many contours."
+msgstr "Demasiados contornos."
+
+#: lib/extend/ftxerr18.c:127
+msgid "Invalid composite glyph."
+msgstr "'Glyph' compuesto inválido."
+
+#: lib/extend/ftxerr18.c:129
+msgid "Too many instructions."
+msgstr "Demasiadas instrucciones."
+
+#: lib/extend/ftxerr18.c:134
+msgid "Invalid opcode."
+msgstr "Código de operación inválido."
+
+#: lib/extend/ftxerr18.c:136
+msgid "Too few arguments."
+msgstr "Faltan argumentos."
+
+#: lib/extend/ftxerr18.c:138
+msgid "Stack overflow."
+msgstr "Desbordamiento de pila."
+
+#: lib/extend/ftxerr18.c:140
+msgid "Code overflow."
+msgstr "Desbordamiento de código."
+
+#: lib/extend/ftxerr18.c:142
+msgid "Bad argument."
+msgstr "Argumento inválido."
+
+#: lib/extend/ftxerr18.c:144
+msgid "Divide by zero."
+msgstr "División por cero."
+
+#: lib/extend/ftxerr18.c:146
+msgid "Storage overflow."
+msgstr "Desbordamiento de almacenamiento."
+
+#: lib/extend/ftxerr18.c:148
+msgid "Control Value (cvt) table overflow."
+msgstr "Desbordamiento de la tabla CVT."
+
+#: lib/extend/ftxerr18.c:150
+msgid "Invalid reference."
+msgstr "Referencia inválida."
+
+#: lib/extend/ftxerr18.c:152
+msgid "Invalid distance."
+msgstr "Distancia inválida."
+
+#: lib/extend/ftxerr18.c:154
+msgid "Interpolate twilight points."
+msgstr "Interpolación en la zona de crepúsculo."
+
+#: lib/extend/ftxerr18.c:156
+msgid "`DEBUG' opcode found."
+msgstr "Encontrado código de operación 'DEBUG'."
+
+#: lib/extend/ftxerr18.c:158
+msgid "`ENDF' in byte-code stream."
+msgstr "Encontrado código de operación 'ENDF' durante la ejecución."
+
+#: lib/extend/ftxerr18.c:160
+msgid "Out of code ranges."
+msgstr "Demasiados rangos de código."
+
+#: lib/extend/ftxerr18.c:162
+msgid "Nested function definitions."
+msgstr "Definiciones de funciones anidadas."
+
+#: lib/extend/ftxerr18.c:164
+msgid "Invalid code range."
+msgstr "Rango de código inválido."
+
+#: lib/extend/ftxerr18.c:166
+msgid "Invalid displacement."
+msgstr "Desplazamiento inválido."
+
+#: lib/extend/ftxerr18.c:168
+msgid "Endless loop encountered while executing instructions."
+msgstr "Encontrado bucle sin fin durante la ejecución de las instrucciones."
+
+#: lib/extend/ftxerr18.c:173
+msgid "Nested frame access."
+msgstr "Acceso anidado a trama."
+
+#: lib/extend/ftxerr18.c:175
+msgid "Invalid cache list."
+msgstr "Lista de 'cache' inválida."
+
+#: lib/extend/ftxerr18.c:177
+msgid "Could not find context."
+msgstr "No se puede encontrar el contexto."
+
+#: lib/extend/ftxerr18.c:179
+msgid "Unlisted object."
+msgstr "Objeto no listado."
+
+#: lib/extend/ftxerr18.c:184
+msgid "Raster pool overflow."
+msgstr "'Raster':Desbordamiento !."
+
+#: lib/extend/ftxerr18.c:186
+msgid "Raster: negative height encountered."
+msgstr "'Raster': Distancia negativa."
+
+#: lib/extend/ftxerr18.c:188
+msgid "Raster: invalid value."
+msgstr "'Raster': Valor inválido."
+
+#: lib/extend/ftxerr18.c:190
+msgid "Raster not initialized."
+msgstr "'Raster' no iniciado."
+
+#: lib/extend/ftxerr18.c:195
+msgid "Invalid kerning (kern) table format."
+msgstr "Formato de la tabla (kern) incorrecto."
+
+#: lib/extend/ftxerr18.c:197
+msgid "Invalid kerning (kern) table."
+msgstr "Tabla (kern) inválida."
+
+#: lib/extend/ftxerr18.c:199
+msgid "Invalid PostScript (post) table format."
+msgstr "Formato de tabla PostScript (post) incorrecto."
+
+#: lib/extend/ftxerr18.c:201
+msgid "Invalid PostScript (post) table."
+msgstr "Tabla PostScript (post) inválida."
+
+#: lib/extend/ftxerr18.c:208
+msgid "Invalid Error Number."
+msgstr "Número de Error Inválido."
+
+#: test/fterror.c:59
+msgid "Start of fterror.\n"
+msgstr "Inicio de fterror.\n"
+
+#: test/fterror.c:67
+msgid "End of fterror.\n"
+msgstr "Fin de fterror.\n"
+
+#: test/ftdump.c:145 test/ftlint.c:197
+msgid "Could not create glyph container.\n"
+msgstr "No se puede crear un contenedor de 'glyph'.\n"
+
+#: test/ftdump.c:152
+msgid " Could not create instance.\n"
+msgstr "No se puede crear instancia.\n"
+
+#: test/ftdump.c:158
+msgid "Could not create 2nd instance.\n"
+msgstr "No se puede crear una segunda instancia.\n"
+
+#: test/ftdump.c:162
+msgid "Memory footprint statistics:\n"
+msgstr "Estadísticas de asignación de memoria:\n"
+
+#. NOTE: In our current implementation, the face's execution
+#. context object is created lazily with the first
+#. instance. However, all later instances share the
+#. the same context.
+#: test/ftdump.c:170
+msgid "face object"
+msgstr "face object"
+
+#: test/ftdump.c:171
+msgid "glyph_object"
+msgstr "glyph object"
+
+#: test/ftdump.c:172
+msgid "instance object"
+msgstr "instance object"
+
+#: test/ftdump.c:176
+msgid "exec. context object"
+msgstr "exec. context object"
+
+#: test/ftdump.c:182
+msgid "total memory usage"
+msgstr "uso total de memoria"
+
+#: test/ftdump.c:259
+msgid "font name table entries\n"
+msgstr "entradas en la tabla de nombres\n"
+
+#: test/ftdump.c:288
+msgid "character map encodings\n"
+msgstr "codificaciones del mapa de caracteres\n"
+
+#: test/ftdump.c:294 test/ftdump.c:435
+msgid "The file doesn't seem to have any encoding table.\n"
+msgstr "El ficheto no parece tener ninguna tabla de codificación.\n"
+
+#: test/ftdump.c:298 test/ftdump.c:439
+#, c-format
+msgid ""
+"There are %d encodings:\n"
+"\n"
+msgstr ""
+"Hay %d codificaciones:\n"
+"\n"
+
+#: test/ftdump.c:303
+#, c-format
+msgid "encoding %2d: "
+msgstr "codificando %2d"
+
+#: test/ftdump.c:330 test/ftdump.c:339 test/ftdump.c:402
+#, c-format
+msgid "Unknown %d"
+msgstr "Desconocido %d"
+
+#: test/ftdump.c:409
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: test/ftdump.c:429
+msgid "ftxcmap test\n"
+msgstr ""
+
+#: test/ftdump.c:445
+#, fuzzy, c-format
+msgid "encoding %2d:\n"
+msgstr "codificando %2d"
+
+#: test/ftdump.c:481
+msgid "ftdump: simple TrueType Dumper -- part of the FreeType project\n"
+msgstr ""
+"ftdump: información sobre 'fonts' TrueType -- parte del proyecto FreeType\n"
+
+#: test/ftdump.c:484
+#, c-format
+msgid ""
+"Usage: %s fontname[.ttf|.ttc]\n"
+"\n"
+msgstr "Uso: %s nombre_de_font[.ttf|.ttc]\n"
+
+#: test/ftdump.c:515 test/ftlint.c:125
+#, c-format
+msgid "Error while initializing engine: %s\n"
+msgstr "Error durante la iniciación de la biblioteca: %s\n"
+
+#: test/ftdump.c:531
+#, c-format
+msgid "Error while opening %s.\n"
+msgstr "Error abriendo $s.\n"
+
+#: test/ftdump.c:532 test/ftlint.c:182 test/ftlint.c:199 test/ftlint.c:211
+#: test/ftlint.c:225
+#, c-format
+msgid "FreeType error message: %s\n"
+msgstr "Mensaje de error FreeType: %s\n"
+
+#: test/ftlint.c:87
+msgid ""
+"ftlint: simple TrueType instruction tester -- part of the FreeType project\n"
+msgstr ""
+"ftlint: verificador simple de instrucciones TrueType -- parte del proyecto "
+"FreeType\n"
+
+#: test/ftlint.c:90
+#, c-format
+msgid "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+msgstr "Uso: %s ppem nombre_de_font[.ttf|.ttc] [nombre_de_font_2..]\n"
+
+#: test/ftlint.c:180
+msgid "Could not find or open file.\n"
+msgstr "No se puede encontrar o abrir el fichero.\n"
+
+#: test/ftlint.c:209
+msgid "Could not create instance.\n"
+msgstr "No se puede crear una instancia.\n"
+
+#: test/ftlint.c:223
+#, c-format
+msgid "Could not set point size to %d.\n"
+msgstr "No se puede asignar el tamaño de punto a $d.\n"
+
+#: test/ftlint.c:239
+#, c-format
+msgid "glyph %4u: %s\n"
+msgstr "glyph %4u: %s\n"
+
+#: test/ftlint.c:252
+msgid "1 fail.\n"
+msgstr "1 fallo.\n"
+
+#: test/ftlint.c:254
+#, c-format
+msgid "%d fails.\n"
+msgstr "%d fallos.\n"
diff --git a/xc/extras/FreeType/po/fr.po b/xc/extras/FreeType/po/fr.po
new file mode 100644
index 000000000..404034228
--- /dev/null
+++ b/xc/extras/FreeType/po/fr.po
@@ -0,0 +1,446 @@
+# French messages for FreeType.
+# Copyright (C) 1998 David Turner
+# David Turner <turner@enst.fr>, 1998
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeType 1.0\n"
+"POT-Creation-Date: 1998-10-08 17:57+0000\n"
+"PO-Revision-Date: 1998-01-21\n"
+"Last-Translator: David Turner <turner@enst.fr>\n"
+"Language-Team: French\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/extend/ftxerr18.c:44
+msgid "Successful function call, no error."
+msgstr "Appel de fonction réussi. Pas d'erreur."
+
+#: lib/extend/ftxerr18.c:47
+msgid "Invalid face handle."
+msgstr "Handle de face invalide."
+
+#: lib/extend/ftxerr18.c:49
+msgid "Invalid instance handle."
+msgstr "Handle d'instance invalide."
+
+#: lib/extend/ftxerr18.c:51
+msgid "Invalid glyph handle."
+msgstr "Handle de glyphe invalide."
+
+#: lib/extend/ftxerr18.c:53
+msgid "Invalid charmap handle."
+msgstr "Handle de CharMap invalide."
+
+#: lib/extend/ftxerr18.c:55
+msgid "Invalid result address."
+msgstr "Mauvaise adresse de paramètre."
+
+#: lib/extend/ftxerr18.c:57
+msgid "Invalid glyph index."
+msgstr "Mauvais index de glyphe."
+
+#: lib/extend/ftxerr18.c:59
+msgid "Invalid argument."
+msgstr "Argument invalide"
+
+#: lib/extend/ftxerr18.c:61
+msgid "Could not open file."
+msgstr "Le fichier n'a pu être ouvert."
+
+#: lib/extend/ftxerr18.c:63
+msgid "File is not a TrueType collection."
+msgstr "Le fichier n'est pas une collection TrueType."
+
+#: lib/extend/ftxerr18.c:66
+msgid "Mandatory table missing."
+msgstr "Il manque une table requise."
+
+#: lib/extend/ftxerr18.c:68
+msgid "Invalid horizontal metrics (hmtx table broken)."
+msgstr "métriques horizontales (table hmtx) incorrectes."
+
+#: lib/extend/ftxerr18.c:70
+msgid "Invalid charmap format."
+msgstr "Format de CharMap invalide."
+
+#: lib/extend/ftxerr18.c:73
+msgid "Invalid file format."
+msgstr "Mauvais format de fichier."
+
+#: lib/extend/ftxerr18.c:76
+msgid "Invalid engine."
+msgstr "Mauvaise instance de librairie (engine)."
+
+#: lib/extend/ftxerr18.c:78
+msgid "Too many extensions (max: 8)."
+msgstr "Trop d'extensions utilisées (max: 8)."
+
+#: lib/extend/ftxerr18.c:80
+msgid "Extensions unsupported."
+msgstr "Extensions non disponibles."
+
+#: lib/extend/ftxerr18.c:82
+msgid "Invalid extension id."
+msgstr "Mauvais numéro d'extension."
+
+#: lib/extend/ftxerr18.c:85
+msgid "No vertical data in font."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:88
+msgid "Maximum Profile (maxp) table missing."
+msgstr "Table 'maxp' manquante."
+
+#: lib/extend/ftxerr18.c:90
+msgid "Font Header (head) table missing."
+msgstr "En-tête de police (head) manquant."
+
+#: lib/extend/ftxerr18.c:92
+msgid "Horizontal Header (hhea) table missing."
+msgstr "En-tête horizontal (hhea) manquant."
+
+#: lib/extend/ftxerr18.c:94
+msgid "Index to Location (loca) table missing."
+msgstr "Table des locations (loca) manquante."
+
+#: lib/extend/ftxerr18.c:96
+msgid "Naming (name) table missing."
+msgstr "Table de noms (name) manquante."
+
+#: lib/extend/ftxerr18.c:98
+msgid "Character to Glyph Index Mapping (cmap) tables missing."
+msgstr "Table de CharMaps (cmap) manquante."
+
+#: lib/extend/ftxerr18.c:100
+msgid "Horizontal Metrics (hmtx) table missing."
+msgstr "Métriques horizontales (hmtx) manquantes."
+
+#: lib/extend/ftxerr18.c:102
+msgid "OS/2 table missing."
+msgstr "Table OS/2 manquante."
+
+#: lib/extend/ftxerr18.c:104
+msgid "PostScript (post) table missing."
+msgstr "Table PostScript manquante."
+
+#: lib/extend/ftxerr18.c:109
+msgid "Out of memory."
+msgstr "Pas assez de mémoire."
+
+#: lib/extend/ftxerr18.c:114
+msgid "Invalid file offset."
+msgstr "Offset de fichier incorrect."
+
+#: lib/extend/ftxerr18.c:116
+msgid "Invalid file read."
+msgstr "Lecture de fichier incorrecte."
+
+#: lib/extend/ftxerr18.c:118
+msgid "Invalid frame access."
+msgstr "Accès de 'frame' invalide."
+
+#: lib/extend/ftxerr18.c:123
+msgid "Too many points."
+msgstr "Trop de points."
+
+#: lib/extend/ftxerr18.c:125
+msgid "Too many contours."
+msgstr "Trop de contours."
+
+#: lib/extend/ftxerr18.c:127
+msgid "Invalid composite glyph."
+msgstr "Glyph composite incorrect."
+
+#: lib/extend/ftxerr18.c:129
+msgid "Too many instructions."
+msgstr "Trop d'instructions."
+
+#: lib/extend/ftxerr18.c:134
+msgid "Invalid opcode."
+msgstr "Opcode inconnu."
+
+#: lib/extend/ftxerr18.c:136
+msgid "Too few arguments."
+msgstr "Arguments manquants."
+
+#: lib/extend/ftxerr18.c:138
+msgid "Stack overflow."
+msgstr "Débordement de pile."
+
+#: lib/extend/ftxerr18.c:140
+msgid "Code overflow."
+msgstr "Débordement du code."
+
+#: lib/extend/ftxerr18.c:142
+msgid "Bad argument."
+msgstr "Mauvais argument."
+
+#: lib/extend/ftxerr18.c:144
+msgid "Divide by zero."
+msgstr "Division par zéro."
+
+#: lib/extend/ftxerr18.c:146
+msgid "Storage overflow."
+msgstr "Débordement de capacite."
+
+#: lib/extend/ftxerr18.c:148
+msgid "Control Value (cvt) table overflow."
+msgstr "Débordement de la table CVT."
+
+#: lib/extend/ftxerr18.c:150
+msgid "Invalid reference."
+msgstr "Référence invalide."
+
+#: lib/extend/ftxerr18.c:152
+msgid "Invalid distance."
+msgstr "Distance incorrecte."
+
+#: lib/extend/ftxerr18.c:154
+msgid "Interpolate twilight points."
+msgstr "Interpolation dans la zone twilight."
+
+#: lib/extend/ftxerr18.c:156
+msgid "`DEBUG' opcode found."
+msgstr "Opcode `DEBUG' rencontré."
+
+#: lib/extend/ftxerr18.c:158
+msgid "`ENDF' in byte-code stream."
+msgstr "Opcode `ENDF' lors de l'exécution."
+
+#: lib/extend/ftxerr18.c:160
+msgid "Out of code ranges."
+msgstr "Plus de CodeRanges."
+
+#: lib/extend/ftxerr18.c:162
+msgid "Nested function definitions."
+msgstr "Définition de fonctions imbriquées."
+
+#: lib/extend/ftxerr18.c:164
+msgid "Invalid code range."
+msgstr "CodeRange invalide."
+
+#: lib/extend/ftxerr18.c:166
+msgid "Invalid displacement."
+msgstr "Déplacement invalide."
+
+#: lib/extend/ftxerr18.c:168
+msgid "Endless loop encountered while executing instructions."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:173
+msgid "Nested frame access."
+msgstr "Accès de 'frames' imbriqués."
+
+#: lib/extend/ftxerr18.c:175
+msgid "Invalid cache list."
+msgstr "Liste de cache incorrecte."
+
+#: lib/extend/ftxerr18.c:177
+msgid "Could not find context."
+msgstr "Contexte introuvable."
+
+#: lib/extend/ftxerr18.c:179
+msgid "Unlisted object."
+msgstr "Objet non listé."
+
+#: lib/extend/ftxerr18.c:184
+msgid "Raster pool overflow."
+msgstr "Raster: débordement !."
+
+#: lib/extend/ftxerr18.c:186
+msgid "Raster: negative height encountered."
+msgstr "Raster: Distance négative !."
+
+#: lib/extend/ftxerr18.c:188
+msgid "Raster: invalid value."
+msgstr "Raster: valeur incorrecte !."
+
+#: lib/extend/ftxerr18.c:190
+msgid "Raster not initialized."
+msgstr "Raster non initialisé !."
+
+#: lib/extend/ftxerr18.c:195
+msgid "Invalid kerning (kern) table format."
+msgstr "Format de table (kern) incorrect."
+
+#: lib/extend/ftxerr18.c:197
+msgid "Invalid kerning (kern) table."
+msgstr "Table de (kern) invalide."
+
+#: lib/extend/ftxerr18.c:199
+msgid "Invalid PostScript (post) table format."
+msgstr "Format de table (post) incorrect."
+
+#: lib/extend/ftxerr18.c:201
+msgid "Invalid PostScript (post) table."
+msgstr "Table de (post) invalide."
+
+#: lib/extend/ftxerr18.c:208
+msgid "Invalid Error Number."
+msgstr "Mauvais code d'erreur !."
+
+#: test/fterror.c:59
+msgid "Start of fterror.\n"
+msgstr "Début de fterror.\n"
+
+#: test/fterror.c:67
+msgid "End of fterror.\n"
+msgstr "Fin de fterror.\n"
+
+#: test/ftdump.c:145 test/ftlint.c:197
+msgid "Could not create glyph container.\n"
+msgstr "Un conteneur de glyphe n'a pu être créé.\n"
+
+#: test/ftdump.c:152
+msgid " Could not create instance.\n"
+msgstr "Une instance n'a pu être créée.\n"
+
+#: test/ftdump.c:158
+msgid "Could not create 2nd instance.\n"
+msgstr "Une instance secondaire n'a pu être créée.\n"
+
+#: test/ftdump.c:162
+msgid "Memory footprint statistics:\n"
+msgstr "Statistiques d'allocation mémoire:\n"
+
+#. NOTE: In our current implementation, the face's execution
+#. context object is created lazily with the first
+#. instance. However, all later instances share the
+#. the same context.
+#: test/ftdump.c:170
+msgid "face object"
+msgstr "objet face"
+
+#: test/ftdump.c:171
+msgid "glyph_object"
+msgstr "objet glyphe"
+
+#: test/ftdump.c:172
+msgid "instance object"
+msgstr "objet instance"
+
+#: test/ftdump.c:176
+msgid "exec. context object"
+msgstr "objet contexte"
+
+#: test/ftdump.c:182
+msgid "total memory usage"
+msgstr "consommation totale"
+
+#: test/ftdump.c:259
+msgid "font name table entries\n"
+msgstr "entrées de la table des noms\n"
+
+#: test/ftdump.c:288
+msgid "character map encodings\n"
+msgstr "codages caractères->glyphes\n"
+
+#: test/ftdump.c:294 test/ftdump.c:435
+msgid "The file doesn't seem to have any encoding table.\n"
+msgstr "Ce fichier ne semble pas possséder de table de codage.\n"
+
+#: test/ftdump.c:298 test/ftdump.c:439
+#, c-format
+msgid ""
+"There are %d encodings:\n"
+"\n"
+msgstr ""
+"Il y a %d encodages:\n"
+"\n"
+
+#: test/ftdump.c:303
+#, c-format
+msgid "encoding %2d: "
+msgstr "encodage %2d: "
+
+#: test/ftdump.c:330 test/ftdump.c:339 test/ftdump.c:402
+#, c-format
+msgid "Unknown %d"
+msgstr "Inconnu %d"
+
+#: test/ftdump.c:409
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: test/ftdump.c:429
+msgid "ftxcmap test\n"
+msgstr ""
+
+#: test/ftdump.c:445
+#, fuzzy, c-format
+msgid "encoding %2d:\n"
+msgstr "encodage %2d: "
+
+#: test/ftdump.c:481
+msgid "ftdump: simple TrueType Dumper -- part of the FreeType project\n"
+msgstr ""
+"ftdump: information sur fonte(s) TrueType -- extrait du Projet FreeType\n"
+
+#: test/ftdump.c:484
+#, c-format
+msgid ""
+"Usage: %s fontname[.ttf|.ttc]\n"
+"\n"
+msgstr ""
+"Usage: %s fontname[.ttf|.ttc]\n"
+"\n"
+
+#: test/ftdump.c:515 test/ftlint.c:125
+#, c-format
+msgid "Error while initializing engine: %s\n"
+msgstr "Erreur lors de l'initialisation de la librairie (engine): %s\n"
+
+#: test/ftdump.c:531
+#, c-format
+msgid "Error while opening %s.\n"
+msgstr "Erreur lors de l'ouverture de %s.\n"
+
+#: test/ftdump.c:532 test/ftlint.c:182 test/ftlint.c:199 test/ftlint.c:211
+#: test/ftlint.c:225
+#, c-format
+msgid "FreeType error message: %s\n"
+msgstr "Message d'erreur FreeType: %s\n"
+
+#: test/ftlint.c:87
+msgid ""
+"ftlint: simple TrueType instruction tester -- part of the FreeType project\n"
+msgstr ""
+"ftlint: un simple vérificateur de polices TrueType -- extrait du Projet "
+"FreeType\n"
+"Projet-FreeType\n"
+
+#: test/ftlint.c:90
+#, c-format
+msgid "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+msgstr ""
+"Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+"\n"
+
+#: test/ftlint.c:180
+msgid "Could not find or open file.\n"
+msgstr "Le fichier n'a pu être trouvé ou ouvert.\n"
+
+#: test/ftlint.c:209
+msgid "Could not create instance.\n"
+msgstr "Une instance n'a pu être créée.\n"
+
+#: test/ftlint.c:223
+#, c-format
+msgid "Could not set point size to %d.\n"
+msgstr "Une taille de police n'a pu être mise a %d points.\n"
+
+#: test/ftlint.c:239
+#, c-format
+msgid "glyph %4u: %s\n"
+msgstr "glyphe %4u: %s\n"
+
+#: test/ftlint.c:252
+msgid "1 fail.\n"
+msgstr "1 échec.\n"
+
+#: test/ftlint.c:254
+#, c-format
+msgid "%d fails.\n"
+msgstr "%d échecs.\n"
diff --git a/xc/extras/FreeType/po/freetype.pot b/xc/extras/FreeType/po/freetype.pot
new file mode 100644
index 000000000..c3a23a39d
--- /dev/null
+++ b/xc/extras/FreeType/po/freetype.pot
@@ -0,0 +1,433 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR Free Software Foundation, Inc.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 1998-10-20 09:10+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: ENCODING\n"
+
+#: lib/extend/ftxerr18.c:44
+msgid "Successful function call, no error."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:47
+msgid "Invalid face handle."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:49
+msgid "Invalid instance handle."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:51
+msgid "Invalid glyph handle."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:53
+msgid "Invalid charmap handle."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:55
+msgid "Invalid result address."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:57
+msgid "Invalid glyph index."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:59
+msgid "Invalid argument."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:61
+msgid "Could not open file."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:63
+msgid "File is not a TrueType collection."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:66
+msgid "Mandatory table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:68
+msgid "Invalid horizontal metrics (hmtx table broken)."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:70
+msgid "Invalid charmap format."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:73
+msgid "Invalid file format."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:76
+msgid "Invalid engine."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:78
+msgid "Too many extensions (max: 8)."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:80
+msgid "Extensions unsupported."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:82
+msgid "Invalid extension id."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:85
+msgid "No vertical data in font."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:88
+msgid "Maximum Profile (maxp) table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:90
+msgid "Font Header (head) table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:92
+msgid "Horizontal Header (hhea) table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:94
+msgid "Index to Location (loca) table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:96
+msgid "Naming (name) table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:98
+msgid "Character to Glyph Index Mapping (cmap) tables missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:100
+msgid "Horizontal Metrics (hmtx) table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:102
+msgid "OS/2 table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:104
+msgid "PostScript (post) table missing."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:109
+msgid "Out of memory."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:114
+msgid "Invalid file offset."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:116
+msgid "Invalid file read."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:118
+msgid "Invalid frame access."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:123
+msgid "Too many points."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:125
+msgid "Too many contours."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:127
+msgid "Invalid composite glyph."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:129
+msgid "Too many instructions."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:134
+msgid "Invalid opcode."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:136
+msgid "Too few arguments."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:138
+msgid "Stack overflow."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:140
+msgid "Code overflow."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:142
+msgid "Bad argument."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:144
+msgid "Divide by zero."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:146
+msgid "Storage overflow."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:148
+msgid "Control Value (cvt) table overflow."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:150
+msgid "Invalid reference."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:152
+msgid "Invalid distance."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:154
+msgid "Interpolate twilight points."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:156
+msgid "`DEBUG' opcode found."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:158
+msgid "`ENDF' in byte-code stream."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:160
+msgid "Out of code ranges."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:162
+msgid "Nested function definitions."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:164
+msgid "Invalid code range."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:166
+msgid "Invalid displacement."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:168
+msgid "Endless loop encountered while executing instructions."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:173
+msgid "Nested frame access."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:175
+msgid "Invalid cache list."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:177
+msgid "Could not find context."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:179
+msgid "Unlisted object."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:184
+msgid "Raster pool overflow."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:186
+msgid "Raster: negative height encountered."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:188
+msgid "Raster: invalid value."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:190
+msgid "Raster not initialized."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:195
+msgid "Invalid kerning (kern) table format."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:197
+msgid "Invalid kerning (kern) table."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:199
+msgid "Invalid PostScript (post) table format."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:201
+msgid "Invalid PostScript (post) table."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:208
+msgid "Invalid Error Number."
+msgstr ""
+
+#: test/fterror.c:59
+msgid "Start of fterror.\n"
+msgstr ""
+
+#: test/fterror.c:67
+msgid "End of fterror.\n"
+msgstr ""
+
+#: test/ftdump.c:148 test/ftlint.c:197
+msgid "Could not create glyph container.\n"
+msgstr ""
+
+#: test/ftdump.c:155
+msgid " Could not create instance.\n"
+msgstr ""
+
+#: test/ftdump.c:161
+msgid "Could not create 2nd instance.\n"
+msgstr ""
+
+#: test/ftdump.c:165
+msgid "Memory footprint statistics:\n"
+msgstr ""
+
+#: test/ftdump.c:173
+msgid "face object"
+msgstr ""
+
+#: test/ftdump.c:174
+msgid "glyph_object"
+msgstr ""
+
+#: test/ftdump.c:175
+msgid "instance object"
+msgstr ""
+
+#: test/ftdump.c:179
+msgid "exec. context object"
+msgstr ""
+
+#: test/ftdump.c:185
+msgid "total memory usage"
+msgstr ""
+
+#: test/ftdump.c:262
+msgid "font name table entries\n"
+msgstr ""
+
+#: test/ftdump.c:291
+msgid "character map encodings\n"
+msgstr ""
+
+#: test/ftdump.c:297 test/ftdump.c:438
+msgid "The file doesn't seem to have any encoding table.\n"
+msgstr ""
+
+#: test/ftdump.c:301 test/ftdump.c:442
+#, c-format
+msgid ""
+"There are %d encodings:\n"
+"\n"
+msgstr ""
+
+#: test/ftdump.c:306
+#, c-format
+msgid "encoding %2d: "
+msgstr ""
+
+#: test/ftdump.c:333 test/ftdump.c:342 test/ftdump.c:405
+#, c-format
+msgid "Unknown %d"
+msgstr ""
+
+#: test/ftdump.c:412
+msgid "Unknown"
+msgstr ""
+
+#: test/ftdump.c:432
+msgid "ftxcmap test\n"
+msgstr ""
+
+#: test/ftdump.c:448
+#, c-format
+msgid "encoding %2d:\n"
+msgstr ""
+
+#: test/ftdump.c:484
+msgid "ftdump: simple TrueType Dumper -- part of the FreeType project\n"
+msgstr ""
+
+#: test/ftdump.c:487
+#, c-format
+msgid ""
+"Usage: %s fontname[.ttf|.ttc]\n"
+"\n"
+msgstr ""
+
+#: test/ftdump.c:518 test/ftlint.c:125
+#, c-format
+msgid "Error while initializing engine: %s\n"
+msgstr ""
+
+#: test/ftdump.c:534
+#, c-format
+msgid "Error while opening %s.\n"
+msgstr ""
+
+#: test/ftdump.c:535 test/ftlint.c:182 test/ftlint.c:199 test/ftlint.c:211
+#: test/ftlint.c:225
+#, c-format
+msgid "FreeType error message: %s\n"
+msgstr ""
+
+#: test/ftlint.c:87
+msgid ""
+"ftlint: simple TrueType instruction tester -- part of the FreeType project\n"
+msgstr ""
+
+#: test/ftlint.c:90
+#, c-format
+msgid "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+msgstr ""
+
+#: test/ftlint.c:180
+msgid "Could not find or open file.\n"
+msgstr ""
+
+#: test/ftlint.c:209
+msgid "Could not create instance.\n"
+msgstr ""
+
+#: test/ftlint.c:223
+#, c-format
+msgid "Could not set point size to %d.\n"
+msgstr ""
+
+#: test/ftlint.c:239
+#, c-format
+msgid "glyph %4u: %s\n"
+msgstr ""
+
+#: test/ftlint.c:252
+msgid "1 fail.\n"
+msgstr ""
+
+#: test/ftlint.c:254
+#, c-format
+msgid "%d fails.\n"
+msgstr ""
diff --git a/xc/extras/FreeType/po/nl.po b/xc/extras/FreeType/po/nl.po
new file mode 100644
index 000000000..30b61bbeb
--- /dev/null
+++ b/xc/extras/FreeType/po/nl.po
@@ -0,0 +1,444 @@
+# Dutch messages for FreeType.
+# Copyright (C) 1998 Gertjan de Back
+# Gertjan de Back <Gertjan.de.Back@pi.net>, 1998.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeType 1.0\n"
+"POT-Creation-Date: 1998-10-08 17:57+0000\n"
+"PO-Revision-Date: 1998-01-21\n"
+"Last-Translator: Gertjan de Back <gertjan.de.back@pi.net>\n"
+"Language-Team: Dutch\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: lib/extend/ftxerr18.c:44
+msgid "Successful function call, no error."
+msgstr "Functieaanroep succesvol."
+
+#: lib/extend/ftxerr18.c:47
+msgid "Invalid face handle."
+msgstr "Ongeldige Face handle."
+
+#: lib/extend/ftxerr18.c:49
+msgid "Invalid instance handle."
+msgstr "Ongeldige Instance handle."
+
+#: lib/extend/ftxerr18.c:51
+msgid "Invalid glyph handle."
+msgstr "Ongeldige Glyph handle."
+
+#: lib/extend/ftxerr18.c:53
+msgid "Invalid charmap handle."
+msgstr "Ongeldige Charmap handle."
+
+#: lib/extend/ftxerr18.c:55
+msgid "Invalid result address."
+msgstr "Ongeldig resultaat adres."
+
+#: lib/extend/ftxerr18.c:57
+msgid "Invalid glyph index."
+msgstr "Ongeldige Glyph index."
+
+#: lib/extend/ftxerr18.c:59
+msgid "Invalid argument."
+msgstr "Ongeldig argument."
+
+#: lib/extend/ftxerr18.c:61
+msgid "Could not open file."
+msgstr "Bestand kon niet geopend worden."
+
+#: lib/extend/ftxerr18.c:63
+msgid "File is not a TrueType collection."
+msgstr "Bestand is geen TrueType collectie."
+
+#: lib/extend/ftxerr18.c:66
+msgid "Mandatory table missing."
+msgstr "Vereiste tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:68
+msgid "Invalid horizontal metrics (hmtx table broken)."
+msgstr "Ongeldige horizontale metriek (hmtx tabel defect)."
+
+#: lib/extend/ftxerr18.c:70
+msgid "Invalid charmap format."
+msgstr "Ongeldig charmap opmaak."
+
+#: lib/extend/ftxerr18.c:73
+msgid "Invalid file format."
+msgstr "Ongeldige bestandsopmaak."
+
+#: lib/extend/ftxerr18.c:76
+msgid "Invalid engine."
+msgstr "Ongeldige FreeType engine."
+
+#: lib/extend/ftxerr18.c:78
+msgid "Too many extensions (max: 8)."
+msgstr "Te veel uitbreidingen (max: 8)."
+
+#: lib/extend/ftxerr18.c:80
+msgid "Extensions unsupported."
+msgstr "Uitbreiding niet ondersteund."
+
+#: lib/extend/ftxerr18.c:82
+msgid "Invalid extension id."
+msgstr "Ongeldige uitbreiding id."
+
+#: lib/extend/ftxerr18.c:85
+msgid "No vertical data in font."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:88
+msgid "Maximum Profile (maxp) table missing."
+msgstr "`Maximum Profile (maxp)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:90
+msgid "Font Header (head) table missing."
+msgstr "`Font Header (head)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:92
+msgid "Horizontal Header (hhea) table missing."
+msgstr "`Horizontal Header (hhead)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:94
+msgid "Index to Location (loca) table missing."
+msgstr "`Index to Location (loca)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:96
+msgid "Naming (name) table missing."
+msgstr "`Naming (name)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:98
+msgid "Character to Glyph Index Mapping (cmap) tables missing."
+msgstr "`Character to Glyph Index Mapping (cmap)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:100
+msgid "Horizontal Metrics (hmtx) table missing."
+msgstr "`Horizontal Metrics (hmtx)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:102
+msgid "OS/2 table missing."
+msgstr "OS/2 tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:104
+msgid "PostScript (post) table missing."
+msgstr "`PostScript (post)' tabel ontbreekt."
+
+#: lib/extend/ftxerr18.c:109
+msgid "Out of memory."
+msgstr "Onvoldoende geheugen."
+
+#: lib/extend/ftxerr18.c:114
+msgid "Invalid file offset."
+msgstr "Bestand positie ongeldig."
+
+#: lib/extend/ftxerr18.c:116
+msgid "Invalid file read."
+msgstr "Lezen van bestand ongeldig."
+
+#: lib/extend/ftxerr18.c:118
+msgid "Invalid frame access."
+msgstr "Toegang tot frame ongeldig."
+
+#: lib/extend/ftxerr18.c:123
+msgid "Too many points."
+msgstr "Te veel punten."
+
+#: lib/extend/ftxerr18.c:125
+msgid "Too many contours."
+msgstr "Te veel contouren."
+
+#: lib/extend/ftxerr18.c:127
+msgid "Invalid composite glyph."
+msgstr "Samengestelde Glyph ongeldig."
+
+#: lib/extend/ftxerr18.c:129
+msgid "Too many instructions."
+msgstr "Te veel instructies."
+
+#: lib/extend/ftxerr18.c:134
+msgid "Invalid opcode."
+msgstr "Ongeldige opcode."
+
+#: lib/extend/ftxerr18.c:136
+msgid "Too few arguments."
+msgstr "Te weinig argumenten."
+
+#: lib/extend/ftxerr18.c:138
+msgid "Stack overflow."
+msgstr "Stack overloop."
+
+#: lib/extend/ftxerr18.c:140
+msgid "Code overflow."
+msgstr "Code overloop."
+
+#: lib/extend/ftxerr18.c:142
+msgid "Bad argument."
+msgstr "Foutief argument."
+
+#: lib/extend/ftxerr18.c:144
+msgid "Divide by zero."
+msgstr "Deling door nul."
+
+#: lib/extend/ftxerr18.c:146
+msgid "Storage overflow."
+msgstr "Opslag overloop."
+
+#: lib/extend/ftxerr18.c:148
+msgid "Control Value (cvt) table overflow."
+msgstr "`Control Value (cvt)' tabel overloop."
+
+#: lib/extend/ftxerr18.c:150
+msgid "Invalid reference."
+msgstr "Ongeldige referentie."
+
+#: lib/extend/ftxerr18.c:152
+msgid "Invalid distance."
+msgstr "Ongeldige afstand."
+
+#: lib/extend/ftxerr18.c:154
+msgid "Interpolate twilight points."
+msgstr "Interpolatie van schemer (twilight) punten."
+
+#: lib/extend/ftxerr18.c:156
+msgid "`DEBUG' opcode found."
+msgstr "`DEBUG'-opcode gevonden."
+
+#: lib/extend/ftxerr18.c:158
+msgid "`ENDF' in byte-code stream."
+msgstr "`ENDF' in bytecode-stroom."
+
+#: lib/extend/ftxerr18.c:160
+msgid "Out of code ranges."
+msgstr "Onvoldoende codegebieden."
+
+#: lib/extend/ftxerr18.c:162
+msgid "Nested function definitions."
+msgstr "Functiedefinities genest."
+
+#: lib/extend/ftxerr18.c:164
+msgid "Invalid code range."
+msgstr "Ongeldig codegebied."
+
+#: lib/extend/ftxerr18.c:166
+msgid "Invalid displacement."
+msgstr "Ongeldige verplaatsing."
+
+#: lib/extend/ftxerr18.c:168
+msgid "Endless loop encountered while executing instructions."
+msgstr ""
+
+#: lib/extend/ftxerr18.c:173
+msgid "Nested frame access."
+msgstr "Frame toegang genest."
+
+#: lib/extend/ftxerr18.c:175
+msgid "Invalid cache list."
+msgstr "Ongeldige cachelijst."
+
+#: lib/extend/ftxerr18.c:177
+msgid "Could not find context."
+msgstr "Context niet gevonden."
+
+#: lib/extend/ftxerr18.c:179
+msgid "Unlisted object."
+msgstr "Object niet aanwezig."
+
+#: lib/extend/ftxerr18.c:184
+msgid "Raster pool overflow."
+msgstr "Overloop van Raster pool."
+
+#: lib/extend/ftxerr18.c:186
+msgid "Raster: negative height encountered."
+msgstr "Raster: negatieve hoogte gevonden."
+
+#: lib/extend/ftxerr18.c:188
+msgid "Raster: invalid value."
+msgstr "Raster: ongeldige waarde."
+
+#: lib/extend/ftxerr18.c:190
+msgid "Raster not initialized."
+msgstr "Raster niet geinitialiseerd."
+
+#: lib/extend/ftxerr18.c:195
+msgid "Invalid kerning (kern) table format."
+msgstr "Ongeldige `Kerning (kern)' tabel opmaak."
+
+#: lib/extend/ftxerr18.c:197
+msgid "Invalid kerning (kern) table."
+msgstr "Ongeldige `Kerning (kern)' tabel."
+
+#: lib/extend/ftxerr18.c:199
+msgid "Invalid PostScript (post) table format."
+msgstr "Ongeldige `PostScript (post)' tabel opmaak."
+
+#: lib/extend/ftxerr18.c:201
+msgid "Invalid PostScript (post) table."
+msgstr "Ongeldige `PostScript (post)' tabel."
+
+#: lib/extend/ftxerr18.c:208
+msgid "Invalid Error Number."
+msgstr "Ongeldig foutnummer."
+
+#: test/fterror.c:59
+msgid "Start of fterror.\n"
+msgstr "Begin van fterror.\n"
+
+#: test/fterror.c:67
+msgid "End of fterror.\n"
+msgstr "Einde van fterror.\n"
+
+#: test/ftdump.c:145 test/ftlint.c:197
+msgid "Could not create glyph container.\n"
+msgstr "Aanmaken Glyph container mislukt.\n"
+
+#: test/ftdump.c:152
+msgid " Could not create instance.\n"
+msgstr "Aanmaken Instance mislukt.\n"
+
+#: test/ftdump.c:158
+msgid "Could not create 2nd instance.\n"
+msgstr "Aanmaken tweede Instance mislukt.\n"
+
+#: test/ftdump.c:162
+msgid "Memory footprint statistics:\n"
+msgstr "Statistieken gheugengebruik:\n"
+
+#. NOTE: In our current implementation, the face's execution
+#. context object is created lazily with the first
+#. instance. However, all later instances share the
+#. the same context.
+#: test/ftdump.c:170
+msgid "face object"
+msgstr "Face object"
+
+#: test/ftdump.c:171
+msgid "glyph_object"
+msgstr "Glyph object"
+
+#: test/ftdump.c:172
+msgid "instance object"
+msgstr "Instance object"
+
+#: test/ftdump.c:176
+msgid "exec. context object"
+msgstr "uitvoerbare context object"
+
+#: test/ftdump.c:182
+msgid "total memory usage"
+msgstr "totaal geheugengebruik"
+
+#: test/ftdump.c:259
+msgid "font name table entries\n"
+msgstr "namentabel in lettertype\n"
+
+#: test/ftdump.c:288
+msgid "character map encodings\n"
+msgstr "tekencodering tabellen\n"
+
+#: test/ftdump.c:294 test/ftdump.c:435
+msgid "The file doesn't seem to have any encoding table.\n"
+msgstr "Het bestand schijnt geen codering tabellen te bevatten.\n"
+
+#: test/ftdump.c:298 test/ftdump.c:439
+#, c-format
+msgid ""
+"There are %d encodings:\n"
+"\n"
+msgstr ""
+"Er zijn %d coderingen:\n"
+"\n"
+
+#: test/ftdump.c:303
+#, c-format
+msgid "encoding %2d: "
+msgstr "codering %2d: "
+
+#: test/ftdump.c:330 test/ftdump.c:339 test/ftdump.c:402
+#, c-format
+msgid "Unknown %d"
+msgstr "Onbekend %d"
+
+#: test/ftdump.c:409
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: test/ftdump.c:429
+msgid "ftxcmap test\n"
+msgstr ""
+
+#: test/ftdump.c:445
+#, fuzzy, c-format
+msgid "encoding %2d:\n"
+msgstr "codering %2d: "
+
+#: test/ftdump.c:481
+msgid "ftdump: simple TrueType Dumper -- part of the FreeType project\n"
+msgstr ""
+"ftdump: eenvoudige TrueType dumper -- onderdeel van het FreeType project\n"
+
+#: test/ftdump.c:484
+#, c-format
+msgid ""
+"Usage: %s fontname[.ttf|.ttc]\n"
+"\n"
+msgstr ""
+"Gebruik: %s fontname[.ttf|.ttc]\n"
+"\n"
+
+#: test/ftdump.c:515 test/ftlint.c:125
+#, c-format
+msgid "Error while initializing engine: %s\n"
+msgstr "Fout bij het starten van de FreeType engine: %s\n"
+
+#: test/ftdump.c:531
+#, c-format
+msgid "Error while opening %s.\n"
+msgstr "Fout bij het openen van %s.\n"
+
+#: test/ftdump.c:532 test/ftlint.c:182 test/ftlint.c:199 test/ftlint.c:211
+#: test/ftlint.c:225
+#, c-format
+msgid "FreeType error message: %s\n"
+msgstr "FreeType foutmelding: %s\n"
+
+#: test/ftlint.c:87
+msgid ""
+"ftlint: simple TrueType instruction tester -- part of the FreeType project\n"
+msgstr ""
+"ftlint: TrueType instructie tester -- onderdeel van het FreeType project\n"
+
+#: test/ftlint.c:90
+#, c-format
+msgid "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+msgstr ""
+"Gebruik: %s ppem fontname[.ttf|.ttc] [fontname2..]\n"
+"\n"
+
+#: test/ftlint.c:180
+msgid "Could not find or open file.\n"
+msgstr "Bestand niet gevonden of openen mislukt.\n"
+
+#: test/ftlint.c:209
+msgid "Could not create instance.\n"
+msgstr "Aanmaken Instance mislukt.\n"
+
+#: test/ftlint.c:223
+#, c-format
+msgid "Could not set point size to %d.\n"
+msgstr "Instellen puntgrootte %d mislukt.\n"
+
+#: test/ftlint.c:239
+#, c-format
+msgid "glyph %4u: %s\n"
+msgstr "Glyph %4u: %s\n"
+
+#: test/ftlint.c:252
+msgid "1 fail.\n"
+msgstr "1 misser.\n"
+
+#: test/ftlint.c:254
+#, c-format
+msgid "%d fails.\n"
+msgstr "%d missers.\n"
diff --git a/xc/extras/FreeType/readme.1st b/xc/extras/FreeType/readme.1st
new file mode 100644
index 000000000..f347ce923
--- /dev/null
+++ b/xc/extras/FreeType/readme.1st
@@ -0,0 +1,66 @@
+This text file contains an overview of this package's directory and
+file hierarchy.
+
+
+ docs/ documentation.
+ docs/image GIF images for documentation.
+
+ lib/ the C engine source directory.
+ lib/extend some standard engine extensions.
+ lib/arch/<system> system-specific configuration header files.
+
+ howto/ various system-specific howto, explaining how
+ to compile the library on different platforms.
+
+ test/ the C test programs.
+ test/arch/<system> system-specific graphics drivers for test
+ programs.
+
+ contrib/ contributions directory.
+ contrib/ttf2pk The ttf2pk TrueType to PK converter source
+ code.
+ contrib/ttf2pfb The ttf2pfb TrueType to PS font converter
+ source code.
+ contrib/ttf2bdf The ttf2bdf TrueType to BDF converter source
+ code.
+ contrib/ftos2 The FreeType/2 font server source code for
+ OS/2.
+
+ po/ Contributions to the internationalized error
+ message strings extension.
+
+ pascal/lib Pascal engine source directory.
+ pascal/test Pascal test program.
+
+
+The following files might be helpful:
+
+README A short and general introduction to FreeType and this
+ release.
+
+INSTALL The FreeType installation How-To. Everything you need
+ to know to build the library and the test programs.
+ This file contains only generic explanations. See the
+ "freetype/howto" directory for system-specific hints.
+
+license.txt The FreeType license, in text format.
+
+
+The following files are Unix-specific and can be ignored on other
+platforms:
+
+ft_conf.in generic library configuration header file for
+ autoconf.
+configure.in generic configure script for autoconf.
+configure configure script generated from configure.in by
+ autoconf.
+config.sub script needed by configure.
+config.guess script needed by configure.
+makefile.in generic makefile for configure.
+makesub.in generic makefile for libtool.
+ltconfig libtool configuration script.
+ltmain.sh libtool script.
+mkinstalldirs tool for generating subdirectories.
+
+
+--- end of readme.1st ---
diff --git a/xc/extras/FreeType/test/arch/amigaos/Makefile.gcc b/xc/extras/FreeType/test/arch/amigaos/Makefile.gcc
new file mode 100644
index 000000000..9687fba7b
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/amigaos/Makefile.gcc
@@ -0,0 +1,81 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for amiga using ADE.
+#
+# You will need GNU make.
+#
+# Use this file while in the 'test' directory with the following statement:
+#
+# make -f arch/amigaos/Makefile.gcc
+
+ARCH = arch/amigaos
+FT_MAKEFILE = $(ARCH)/Makefile.gcc
+
+CC = gcc
+
+LIBDIR = ../lib
+INCDIRS = -I$(LIBDIR) -I$(LIBDIR)/$(ARCH) -I. -I$(LIBDIR)/extend
+
+CFLAGS = -ansi -Wall -g -noixemul $(INCDIRS)
+# CFLAGS = -Wall -noixemul -O2 -Ilib $(INCDIRS)
+
+SRC = ftlint.c fttimer.c ftview.c ftzoom.c ftdump.c ftstring.c \
+ common.c
+
+GSRC = gmain.c display.c $(ARCH)/gw_amiga.c
+GOBJ = $(GSRC:.c=.o)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+%.exe:
+ $(CC) $(CFLAGS) -o $@ @^
+
+
+EXEFILES = ftzoom ftlint ftview fttimer ftdump ftstring
+
+.PHONY: all debug freetype freetype_debug \
+ clean distclean do_clean depend
+
+
+all: freetype $(EXEFILES)
+
+debug: freetype_debug $(EXEFILES)
+
+freetype:
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) all
+
+freetype_debug:
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) debug
+
+ftzoom: $(GOBJ) ftzoom.o common.o $(LIBDIR)/libttf.a
+ftview: $(GOBJ) ftview.o common.o $(LIBDIR)/libttf.a
+ftlint: ftlint.o common.o $(LIBDIR)/libttf.a
+ftdump: ftdump.o common.o $(LIBDIR)/libttf.a
+ftstring: $(GOBJ) ftstring.o common.o $(LIBDIR)/libttf.a
+fttimer: $(GOBJ) fttimer.o common.o $(LIBDIR)/libttf.a
+
+
+clean: do_clean
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) clean
+
+distclean: do_clean
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) distclean
+ -rm dep.end core
+ -rm $(EXE)
+
+do_clean:
+ -rm *.o
+ -rm arch/amigaos/*.o
+
+
+depend:
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) depend
+ $(CC) -E -M $(INCDIRS) $(SRC) $(GSRC) > dep.end
+
+ifeq (dep.end,$(wildcard dep.end))
+ include dep.end
+endif
+
+# end of Makefile.gcc
diff --git a/xc/extras/FreeType/test/arch/amigaos/TODO b/xc/extras/FreeType/test/arch/amigaos/TODO
new file mode 100644
index 000000000..d09a4e2d8
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/amigaos/TODO
@@ -0,0 +1,16 @@
+
+ * To test the window oriented driver.
+
+ * To improve the window oriented driver to use ROM functions like
+ WriteChunkyPixel() (or similar) instead of the current routine.
+
+ * To build a truetype.library from libttf.a
+
+ * truetype.datatype.
+
+ * Program to convert truetype fonts in Amiga fonts.
+
+ Suggestions, bug reports, code improvements, support for other compilers,
+ ... are welcome !
+
+ Send them to: map@medusa.es or to freetype@lists.lrz-muenchen.de
diff --git a/xc/extras/FreeType/test/arch/amigaos/gfsamiga.c b/xc/extras/FreeType/test/arch/amigaos/gfsamiga.c
new file mode 100644
index 000000000..8f7308b2b
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/amigaos/gfsamiga.c
@@ -0,0 +1,428 @@
+/*******************************************************************
+ *
+ * gfsamiga.c graphics utility fullscreen Amiga driver. 1.0
+ *
+ * This is the driver for fullscreen Amiga display, used by the
+ * graphics utility of the FreeType test suite.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ ******************************************************************/
+
+/* standard includes */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+/* AmigaOS includes */
+
+#include <exec/types.h>
+#include <exec/memory.h>
+#include <intuition/intuition.h>
+#include <intuition/screens.h>
+
+#ifdef __GNUC__
+
+#include <inline/exec.h>
+#include <inline/intuition.h>
+#include <inline/graphics.h>
+#include <inline/dos.h>
+
+#else
+
+#include <clib/exec_protos.h>
+#include <clib/intuition_protos.h>
+#include <clib/graphics_protos.h>
+#include <clib/dos_protos.h>
+
+#endif
+
+/* FreeType includes */
+
+#include "gdriver.h"
+#include "gmain.h"
+#include "gevents.h"
+
+/* some screen definitions */
+
+#define MONO_SCREEN_WIDTH 640
+#define MONO_SCREEN_HEIGHT 512
+#define MONO_SCREEN_DEPTH 1
+
+#define GRAY_SCREEN_WIDTH 320
+#define GRAY_SCREEN_HEIGHT 256
+#define GRAY_SCREEN_DEPTH 3
+
+#define DISPLAY_MEM ( 1024 * 64 )
+
+
+ /* external variables */
+
+ extern struct Library* SysBase;
+ extern struct Library* DOSBase;
+
+ extern int vio_ScanLineWidth;
+ extern char* Vio;
+ extern char gray_palette[5];
+
+ /* global variables */
+
+ struct Library* IntuitionBase = NULL;
+ struct Library* GfxBase = NULL;
+
+ typedef struct _Translator
+ {
+ char key;
+ GEvent event_class;
+ int event_info;
+ } Translator;
+
+#define NUM_Translators 20
+
+ static const Translator trans[NUM_Translators] =
+ {
+ { (char)27, event_Quit, 0 },
+ { 'q', event_Quit, 0 },
+
+ { 'x', event_Rotate_Glyph, -1 },
+ { 'c', event_Rotate_Glyph, 1 },
+ { 'v', event_Rotate_Glyph, -16 },
+ { 'b', event_Rotate_Glyph, 16 },
+
+ { '{', event_Change_Glyph, -10000 },
+ { '}', event_Change_Glyph, 10000 },
+ { '(', event_Change_Glyph, -1000 },
+ { ')', event_Change_Glyph, 1000 },
+ { '9', event_Change_Glyph, -100 },
+ { '0', event_Change_Glyph, 100 },
+ { 'i', event_Change_Glyph, -10 },
+ { 'o', event_Change_Glyph, 10 },
+ { 'k', event_Change_Glyph, -1 },
+ { 'l', event_Change_Glyph, 1 },
+
+ { '+', event_Scale_Glyph, 10 },
+ { '-', event_Scale_Glyph, -10 },
+ { 'u', event_Scale_Glyph, 1 },
+ { 'j', event_Scale_Glyph, -1 }
+ };
+
+
+ /* local variables */
+
+ static struct Screen* fts = NULL;
+ static struct Window* ftw = NULL;
+
+ static int graphx_mode;
+
+
+ /* exit gracefully */
+
+ static void AmigaCleanUp( void )
+ {
+ if ( ftw )
+ CloseWindow( ftw );
+
+ if ( fts )
+ CloseScreen( fts );
+
+ if ( IntuitionBase )
+ CloseLibrary( IntuitionBase );
+
+ if ( GfxBase )
+ CloseLibrary( GfxBase );
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ if ( Vio )
+ FreeMem( Vio, DISPLAY_MEM );
+ }
+
+
+ static void SetPalette( void )
+ {
+ short color[] = { 0x0000,
+ 0x0333,
+ 0x0777,
+ 0x0BBB,
+ 0x0FFF,
+ 0x0A00,
+ 0x00A0,
+ 0x000A
+ };
+ short i;
+
+
+ for ( i = 0; i < 8; i++ )
+ {
+ if ( i < 5 )
+ gray_palette[i] = i;
+
+ SetRGB4( &fts->ViewPort, i, (UBYTE)(color[i] >> 8 & 0x0f),
+ (UBYTE)(color[i] >> 4 & 0x0f),
+ (UBYTE)(color[i] & 0x0f ) );
+ }
+ }
+
+
+ /* open libraries & custom screen */
+
+ static int AmigaInit( void )
+ {
+ /* cleanup at exit */
+ if ( atexit( AmigaCleanUp ) )
+ {
+ PutStr( "atexit() failed\n" );
+ return -1;
+ }
+
+ /* open intuition library */
+
+ IntuitionBase = (struct Library*)OpenLibrary( "intuition.library", 37L );
+ if ( IntuitionBase == NULL )
+ {
+ PutStr( "Could not open intuition library\n" );
+ return -1;
+ }
+
+ /* Open graphics library */
+
+ GfxBase = OpenLibrary( "graphics.library", 37L );
+ if ( GfxBase == NULL )
+ {
+ PutStr( "Could not open graphics library\n" );
+ return -1;
+ }
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ {
+ /* open custom screen */
+ fts = (struct Screen*)OpenScreenTags(
+ NULL,
+ SA_DisplayID, (PAL_MONITOR_ID | LORES_KEY),
+ SA_Width, GRAY_SCREEN_WIDTH,
+ SA_Height, GRAY_SCREEN_HEIGHT,
+ SA_Depth, GRAY_SCREEN_DEPTH,
+ SA_ShowTitle, FALSE,
+ TAG_DONE );
+
+ if ( fts == NULL )
+ {
+ PutStr( "Could not open custom screen\n" );
+ return -1;
+ }
+
+ /* set gray palette */
+ SetPalette();
+ }
+ else
+ {
+ /* open custom screen */
+ fts = (struct Screen*)OpenScreenTags(
+ NULL,
+ SA_DisplayID, (PAL_MONITOR_ID | HIRESLACE_KEY),
+ SA_Width, MONO_SCREEN_WIDTH,
+ SA_Height, MONO_SCREEN_HEIGHT,
+ SA_Depth, MONO_SCREEN_DEPTH,
+ SA_ShowTitle, FALSE,
+ TAG_DONE );
+
+ if ( fts == NULL )
+ {
+ PutStr( "Could not open custom screen\n" );
+ return -1;
+ }
+ }
+
+ /* open intuition window */
+ ftw = OpenWindowTags(
+ NULL,
+ WA_Left, 0,
+ WA_Width, fts->Width,
+ WA_Top, 0,
+ WA_Height, fts->Height,
+ WA_IDCMP, IDCMP_VANILLAKEY | IDCMP_MOUSEBUTTONS,
+ WA_Flags, WFLG_BACKDROP | WFLG_BORDERLESS |
+ WFLG_RMBTRAP | WFLG_ACTIVATE,
+ WA_Gadgets, NULL,
+ WA_Title, NULL,
+ WA_CustomScreen, fts,
+ TAG_DONE );
+
+ if ( ftw == NULL )
+ {
+ PutStr( "Could not open intuition window\n" );
+ return -1;
+ }
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ {
+ Vio = (char*)AllocMem( DISPLAY_MEM, MEMF_ANY );
+
+ if ( !Vio )
+ {
+ PutStr( "Cannot AllocMem() display memory\n" );
+ return -1;
+ }
+
+ vio_Width = vio_ScanLineWidth = GRAY_SCREEN_WIDTH;
+ vio_Height = GRAY_SCREEN_HEIGHT;
+ }
+ else
+ {
+ Vio = (char*)fts->BitMap.Planes[0];
+ vio_ScanLineWidth = fts->BitMap.BytesPerRow;
+ vio_Width = MONO_SCREEN_WIDTH;
+ vio_Height = MONO_SCREEN_HEIGHT;
+ }
+
+ return 0;
+ }
+
+
+ /* get events in the window */
+
+ static char Get_Intuition_Event( void )
+ {
+ struct IntuiMessage* msg;
+ ULONG class;
+ USHORT code;
+
+
+ WaitPort( ftw->UserPort );
+
+ while ( ( msg = (struct IntuiMessage*)GetMsg( ftw->UserPort ) ) )
+ {
+ class = msg->Class;
+ code = msg->Code;
+
+ ReplyMsg( (struct Message*)msg );
+
+ switch ( class )
+ {
+ case IDCMP_MOUSEBUTTONS:
+ return (char)27;
+
+ case IDCMP_VANILLAKEY:
+ return (char)code;
+ }
+ }
+
+ return '\0';
+ }
+
+
+ /* set Amiga graphics mode */
+
+ int Driver_Set_Graphics( int mode )
+ {
+ graphx_mode = mode;
+
+
+ if ( AmigaInit() == -1 )
+ return 0; /* failure */
+
+ return 1; /* success */
+ }
+
+
+ /* restore screen to its original state */
+
+ int Driver_Restore_Mode( void )
+ {
+ /* do nothing */
+
+ return 1; /* success */
+ }
+
+
+ /* display bitmap */
+
+ int Driver_Display_Bitmap( char* buffer, int line, int col )
+ {
+ int y, z;
+ char* target;
+ char old = -1;
+
+
+ target = Vio + ( line - 1 ) * vio_ScanLineWidth;
+
+ for ( y = 0; y < line; y++ )
+ {
+ CopyMem( buffer, target, col );
+ target -= vio_ScanLineWidth;
+ buffer += col;
+ }
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ {
+ /* clear screen */
+ SetRast( &fts->RastPort, 0 );
+
+ /* draw glyph */
+ for ( y = 0; y < line; y++ )
+ {
+ for ( z = 0; z < col; z++ )
+ {
+ int c = Vio[y * vio_ScanLineWidth + z];
+
+ if ( c != 0 )
+ {
+ if ( old != c )
+ {
+ if ( c < 0 || c > 5 )
+ {
+ PutStr( "Unexpected value!\n" );
+ SetAPen( &fts->RastPort, 7 );
+ }
+ else
+ {
+ old = c;
+ SetAPen( &fts->RastPort, c );
+ }
+ }
+
+ WritePixel( &fts->RastPort, z, y );
+ }
+ }
+ }
+ }
+
+ return 1; /* success */
+ }
+
+
+ void Get_Event( TEvent* event )
+ {
+ int i;
+ char c;
+
+
+ c = Get_Intuition_Event();
+
+ if ( c != '\0' )
+ for ( i = 0; i < NUM_Translators; i++ )
+ {
+ if ( c == trans[i].key )
+ {
+ event->what = trans[i].event_class;
+ event->info = trans[i].event_info;
+ return;
+ }
+ }
+
+ /* unrecognized keystroke */
+
+ event->what = event_Keyboard;
+ event->info = (int)c;
+
+ return;
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/arch/amigaos/gw_amiga.c b/xc/extras/FreeType/test/arch/amigaos/gw_amiga.c
new file mode 100644
index 000000000..39a097bac
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/amigaos/gw_amiga.c
@@ -0,0 +1,519 @@
+/*******************************************************************
+ *
+ * gw_amiga.c graphics utility Intuition Amiga driver. 1.0
+ *
+ * This is the driver for windowed display under Amiga WorkBench,
+ * used by the graphics utility of the FreeType test suite.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.TXT. By continuing to use, modify or distribute
+ * this file you indicate that you have read the license and
+ * understand and accept it fully.
+ *
+ ******************************************************************/
+
+/* modified by Richard Griffith
+ open largest window we can, and adapt accordingly
+ gray and mono both appear black on white
+ display Header message in Window title
+ add simple menus
+ */
+
+/* standard includes */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+/* AmigaOS includes */
+
+#include <exec/types.h>
+#include <exec/memory.h>
+#include <intuition/intuition.h>
+#include <intuition/screens.h>
+#include <libraries/gadtools.h>
+
+#ifdef __GNUC__
+#include <inline/exec.h>
+#include <inline/intuition.h>
+#include <inline/graphics.h>
+#include <inline/dos.h>
+#include <inline/gadtools.h>
+#else
+#include <clib/exec_protos.h>
+#include <clib/intuition_protos.h>
+#include <clib/graphics_protos.h>
+#include <clib/dos_protos.h>
+#include <clib/gadtools_protos.h>
+#endif
+
+/* FreeType includes */
+
+#include "gdriver.h"
+#include "gmain.h"
+#include "gevents.h"
+
+
+/* some screen definitions */
+
+#define MONO_WINDOW_WIDTH 0xFFFF
+#define MONO_WINDOW_HEIGHT 0xFFFF
+
+#define GRAY_WINDOW_WIDTH 0xFFFF
+#define GRAY_WINDOW_HEIGHT 0xFFFF
+
+#define DISPLAY_MEM ( 1024 * 64 )
+
+
+ /* external variables */
+ extern struct Library* SysBase;
+ extern struct Library* DOSBase;
+
+ extern int vio_ScanLineWidth;
+ extern char* Vio;
+/* extern char gray_palette[5]; */
+
+ /* global variables */
+ struct Library* IntuitionBase = NULL;
+ struct Library* GfxBase = NULL;
+ struct Library *GadToolsBase = NULL;
+
+ typedef struct _Translator
+ {
+ char key;
+ GEvent event_class;
+ int event_info;
+ } Translator;
+
+#define NUM_Translators 20
+
+ static const Translator trans[NUM_Translators] =
+ {
+ { (char)27, event_Quit, 0 },
+ { 'q', event_Quit, 0 },
+
+ { 'x', event_Rotate_Glyph, -1 },
+ { 'c', event_Rotate_Glyph, 1 },
+ { 'v', event_Rotate_Glyph, -16 },
+ { 'b', event_Rotate_Glyph, 16 },
+
+ { '{', event_Change_Glyph, -10000 },
+ { '}', event_Change_Glyph, 10000 },
+ { '(', event_Change_Glyph, -1000 },
+ { ')', event_Change_Glyph, 1000 },
+ { '9', event_Change_Glyph, -100 },
+ { '0', event_Change_Glyph, 100 },
+ { 'i', event_Change_Glyph, -10 },
+ { 'o', event_Change_Glyph, 10 },
+ { 'k', event_Change_Glyph, -1 },
+ { 'l', event_Change_Glyph, 1 },
+
+ { '+', event_Scale_Glyph, 10 },
+ { '-', event_Scale_Glyph, -10 },
+ { 'u', event_Scale_Glyph, 1 },
+ { 'j', event_Scale_Glyph, -1 }
+ };
+
+
+ /* local variables */
+ static struct Screen* fts = NULL;
+ static struct Window* ftw = NULL;
+ static APTR VisualInfo = NULL;
+ static struct Menu *ftmenus = NULL;
+
+ static int graphx_mode;
+
+ static ULONG vio_allocsize;
+
+ static struct NewMenu ftNewMenu[] = {
+ {NM_TITLE, (STRPTR)"File", NULL, 0, NULL, NULL},
+ {NM_ITEM, (STRPTR)"Next", (STRPTR)"n", 0, 0L, (APTR)'n'},
+ {NM_ITEM, (STRPTR)"Previous",(STRPTR)"p", 0, 0L, (APTR)'p'},
+ {NM_ITEM, (STRPTR)NM_BARLABEL, NULL, 0, 0L, NULL},
+ {NM_ITEM, (STRPTR)"Quit", (STRPTR)"q", 0, 0L, (APTR)'q'},
+ {NM_TITLE, (STRPTR)"Scale", NULL, 0, NULL, NULL},
+ {NM_ITEM, (STRPTR)"Up", NULL, 0, NULL, NULL},
+ {NM_SUB, (STRPTR)"Fine", (STRPTR)"u", 0, 0L, (APTR)'u'},
+ {NM_SUB, (STRPTR)"Fast", (STRPTR)"+", 0, 0L, (APTR)'+'},
+ {NM_ITEM, (STRPTR)"Down", NULL, 0, NULL, NULL},
+ {NM_SUB, (STRPTR)"Fine", (STRPTR)"j", 0, 0L, (APTR)'j'},
+ {NM_SUB, (STRPTR)"Fast", (STRPTR)"-", 0, 0L, (APTR)'-'},
+ {NM_ITEM, (STRPTR)"Toggle Hinting", (STRPTR)"h", 0, 0L, (APTR)'h'},
+ {NM_TITLE, (STRPTR)"Glyph", NULL, 0, NULL, NULL},
+ {NM_ITEM, (STRPTR)"Next", NULL, 0, NULL, NULL},
+ {NM_SUB, (STRPTR)"1", (STRPTR)"l", 0, 0L, (APTR)'l'},
+ {NM_SUB, (STRPTR)"10", (STRPTR)"o", 0, 0L, (APTR)'o'},
+ {NM_SUB, (STRPTR)"100", (STRPTR)"0", 0, 0L, (APTR)'0'},
+ {NM_SUB, (STRPTR)"1000", (STRPTR)")", 0, 0L, (APTR)')'},
+ {NM_SUB, (STRPTR)"10000",(STRPTR)"}", 0, 0L, (APTR)'}'},
+ {NM_ITEM, (STRPTR)"Previous", NULL, 0, NULL, NULL},
+ {NM_SUB, (STRPTR)"1", (STRPTR)"k", 0, 0L, (APTR)'k'},
+ {NM_SUB, (STRPTR)"10", (STRPTR)"i", 0, 0L, (APTR)'i'},
+ {NM_SUB, (STRPTR)"100", (STRPTR)"9", 0, 0L, (APTR)'9'},
+ {NM_SUB, (STRPTR)"1000", (STRPTR)"(", 0, 0L, (APTR)'('},
+ {NM_SUB, (STRPTR)"10000",(STRPTR)"{", 0, 0L, (APTR)'{'},
+ {NM_TITLE, (STRPTR)"Rotate", NULL, 0, NULL, NULL},
+ {NM_ITEM, (STRPTR)"Clockwise", NULL, 0, NULL, NULL},
+ {NM_SUB, (STRPTR)"Fine", (STRPTR)"c", 0, 0L, (APTR)'c'},
+ {NM_SUB, (STRPTR)"Fast", (STRPTR)"b", 0, 0L, (APTR)'b'},
+ {NM_ITEM, (STRPTR)"Counter-clockwise", NULL, 0, NULL, NULL},
+ {NM_SUB, (STRPTR)"Fine", (STRPTR)"x", 0, 0L, (APTR)'x'},
+ {NM_SUB, (STRPTR)"Fast", (STRPTR)"v", 0, 0L, (APTR)'v'},
+ {NM_END, NULL, NULL, 0, 0L, NULL} };
+
+
+ /* Exit gracefully */
+ static void AmigaCleanUp( void )
+ {
+ if ( Vio )
+ FreeMem( Vio, vio_allocsize );
+
+ ReleasePen( fts->ViewPort.ColorMap, gray_palette[0] );
+ ReleasePen( fts->ViewPort.ColorMap, gray_palette[1] );
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ {
+ ReleasePen( fts->ViewPort.ColorMap, gray_palette[2] );
+ ReleasePen( fts->ViewPort.ColorMap, gray_palette[3] );
+ ReleasePen( fts->ViewPort.ColorMap, gray_palette[4] );
+ }
+
+ if ( ftmenus )
+ {
+ ClearMenuStrip( ftw );
+ FreeMenus( ftmenus );
+ }
+
+ if ( ftw )
+ CloseWindow( ftw );
+
+ if ( VisualInfo )
+ FreeVisualInfo( VisualInfo );
+
+ if ( GfxBase )
+ CloseLibrary( GfxBase );
+
+ if ( GadToolsBase )
+ CloseLibrary( GadToolsBase );
+
+ if ( IntuitionBase )
+ CloseLibrary( IntuitionBase );
+
+ }
+
+
+ /* open libraries & custom screen */
+ static int AmigaInit( void )
+ {
+ /* cleanup at exit */
+ if ( atexit( AmigaCleanUp ) )
+ {
+ PutStr( "atexit() failed\n" );
+ return -1;
+ }
+
+ /* open intuition library */
+ IntuitionBase = (struct Library*)OpenLibrary( "intuition.library", 39L );
+ if ( IntuitionBase == NULL )
+ {
+ PutStr( "Could not open intuition library\n" );
+ return -1;
+ }
+
+ /* open gaadtools library */
+ GadToolsBase = (struct Library*)OpenLibrary( "gadtools.library", 39L );
+ if ( GadToolsBase == NULL )
+ {
+ PutStr( "Could not open gadtools library\n" );
+ return -1;
+ }
+
+ /* open graphics library */
+ GfxBase = OpenLibrary( "graphics.library", 39L );
+ if ( GfxBase == NULL )
+ {
+ PutStr( "Could not open graphics library\n" );
+ return -1;
+ }
+
+ /* get public screen */
+ fts = LockPubScreen( NULL );
+
+ if ( fts == NULL )
+ {
+ PutStr( "Could not lock public screen\n" );
+ return -1;
+ }
+
+ if ( ! ( VisualInfo = GetVisualInfo( fts, TAG_DONE )))
+ {
+ PutStr( "Could not get VisualInfo\n" );
+ return -1;
+ }
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ {
+ vio_ScanLineWidth = GRAY_WINDOW_WIDTH;
+ vio_Width = GRAY_WINDOW_WIDTH;
+ vio_Height = GRAY_WINDOW_HEIGHT;
+
+ gray_palette[4] = ObtainBestPenA( fts->ViewPort.ColorMap,
+ 0x00000000, 0x00000000, 0x00000000, NULL );
+ gray_palette[3] = ObtainBestPenA( fts->ViewPort.ColorMap,
+ 0x33333300, 0x33333300, 0x33333300, NULL );
+ gray_palette[2] = ObtainBestPenA( fts->ViewPort.ColorMap,
+ 0x77777700, 0x77777700, 0x77777700, NULL );
+ gray_palette[1] = ObtainBestPenA( fts->ViewPort.ColorMap,
+ 0xBBBBBB00, 0xBBBBBB00, 0xBBBBBB00, NULL );
+ gray_palette[0] = ObtainBestPenA( fts->ViewPort.ColorMap,
+ 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFF00, NULL );
+ }
+ else
+ {
+ vio_ScanLineWidth = MONO_WINDOW_WIDTH / 8;
+ vio_Width = MONO_WINDOW_WIDTH;
+ vio_Height = MONO_WINDOW_HEIGHT;
+
+ gray_palette[0] = ObtainBestPenA( fts->ViewPort.ColorMap,
+ 0xFFFFFF00, 0xFFFFFF00, 0xFFFFFF00, NULL );
+ gray_palette[1] = ObtainBestPenA( fts->ViewPort.ColorMap,
+ 0x00000000, 0x00000000, 0x00000000, NULL );
+ }
+
+ if ( ! ( ftmenus = CreateMenus( ftNewMenu, GTMN_FrontPen, 0L, TAG_DONE)))
+ {
+ PutStr( "Could not create menus\n" );
+ return -1;
+ }
+
+ LayoutMenus( ftmenus, VisualInfo, GTMN_NewLookMenus, TRUE, TAG_DONE );
+
+ /* open intuition window */
+ ftw = OpenWindowTags(
+ NULL,
+ WA_InnerWidth, vio_Width,
+ WA_InnerHeight, vio_Height,
+ WA_IDCMP, IDCMP_MENUPICK | IDCMP_VANILLAKEY | IDCMP_CLOSEWINDOW,
+ /* WA_AutoAdjust, TRUE, */
+ WA_CloseGadget, TRUE,
+ WA_Activate, TRUE,
+ WA_DragBar, TRUE,
+ WA_SmartRefresh, TRUE,
+ WA_Gadgets, NULL,
+ WA_Flags, WFLG_DEPTHGADGET | WFLG_SMART_REFRESH,
+ WA_Title, (UBYTE*)"FreeType Project",
+ WA_NewLookMenus, TRUE,
+ WA_PubScreen, fts,
+ TAG_DONE );
+
+ if ( ftw == NULL )
+ {
+ PutStr( "Could not open intuition window\n" );
+ return -1;
+ }
+
+ SetMenuStrip( ftw, ftmenus );
+
+ UnlockPubScreen( NULL, fts );
+
+ vio_Height = ftw->Height - ftw->BorderTop - ftw->BorderBottom - 2;
+ vio_Width = (ftw->Width - ftw->BorderLeft - ftw->BorderRight) & 0xFFFFFC;
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ {
+ vio_ScanLineWidth = vio_Width;
+ } else {
+ vio_ScanLineWidth = vio_Width / 8;
+ }
+ vio_allocsize = vio_Height * vio_ScanLineWidth;
+
+ Vio = (char*)AllocMem( vio_allocsize, MEMF_ANY );
+ if ( Vio == NULL )
+ {
+ PutStr( "Could not allocate memory\n" );
+ return -1;
+ }
+
+ return 0;
+ }
+
+
+ /* get events in the window */
+ static char Get_Intuition_Event( void )
+ {
+ struct IntuiMessage* msg;
+ ULONG class;
+ USHORT code;
+ int rc;
+ struct MenuItem *n;
+
+
+ WaitPort( ftw->UserPort );
+
+ while ( ( msg = (struct IntuiMessage*)GetMsg( ftw->UserPort ) ) )
+ {
+ class = msg->Class;
+ code = msg->Code;
+
+ ReplyMsg( (struct Message*)msg );
+
+ switch( class )
+ {
+ case IDCMP_REFRESHWINDOW:
+ GT_BeginRefresh( ftw );
+ GT_EndRefresh( ftw, TRUE );
+ break;
+
+ case IDCMP_CLOSEWINDOW:
+ return (char)27;
+
+ case IDCMP_VANILLAKEY:
+ return (char)code;
+
+ case IDCMP_MENUPICK:
+ while( code != MENUNULL )
+ {
+ n = ItemAddress( ftmenus, code );
+ rc = (int)GTMENUITEM_USERDATA( n );
+ code = n->NextSelect;
+ } /* despite loop, we only do one */
+ return (char)rc;
+ }
+ }
+
+
+ return '\0';
+ }
+
+
+ /* Set Amiga graphics mode */
+ int Driver_Set_Graphics( int mode )
+ {
+ graphx_mode = mode;
+
+ if ( AmigaInit() == -1 )
+ return 0; /* failure */
+
+ return 1; /* success */
+ }
+
+
+ /* restore screen to its original state */
+ int Driver_Restore_Mode( void )
+ {
+ /* Do nothing */
+
+ return 1; /* success */
+ }
+
+
+ /* display bitmap */
+ int Driver_Display_Bitmap( char* buffer, int line, int col )
+ {
+ int y, z;
+ char* target;
+ char old = 0;
+ extern char Header[];
+
+ SetWindowTitles(ftw,Header,Header);
+
+
+ target = Vio + ( line - 1 ) * vio_ScanLineWidth;
+
+ for ( y = 0; y < line; y++ )
+ {
+ CopyMem( buffer, target, col );
+ target -= vio_ScanLineWidth;
+ buffer += col;
+ }
+
+ /* clear window */
+ /* SetRast( ftw->RPort, gray_palette[0] ); */
+
+ SetAPen( ftw->RPort, gray_palette[0] );
+
+ RectFill( ftw->RPort, ftw->BorderLeft, ftw->BorderTop,
+ ftw->Width - ftw->BorderRight - 1,
+ ftw->Height - ftw->BorderBottom - 1 );
+
+ if ( graphx_mode != Graphics_Mode_Gray )
+ {
+ SetAPen( ftw->RPort, gray_palette[1] );
+ old = 1;
+ }
+
+ /* Draw glyph */
+ for ( y = 0; y < line; y++ )
+ {
+ for ( z = 0; z < col; z++ )
+ {
+ int c = Vio[y * vio_ScanLineWidth + z];
+
+ if ( graphx_mode == Graphics_Mode_Gray )
+ {
+ if ( c != 0 && c != gray_palette[0] )
+ {
+ if ( old != c )
+ {
+ old = c;
+ /* printf("x = %d, y = %d, color = %d\n", z, y, c ); */
+ SetAPen( ftw->RPort, c );
+ }
+
+ WritePixel( ftw->RPort, ftw->BorderLeft + z, ftw->BorderTop + y );
+ }
+ }
+ else
+ {
+ int mask = 0x80;
+ int counter = 0;
+
+ while ( mask )
+ {
+ if ( mask & c )
+ WritePixel( ftw->RPort, ftw->BorderLeft + z * 8 + counter,
+ ftw->BorderTop + y );
+
+ counter++;
+ mask >>= 1;
+ }
+ }
+ }
+ }
+
+ return 1; /* success */
+ }
+
+
+ void Get_Event( TEvent* event )
+ {
+ int i;
+ char c;
+
+
+ c = Get_Intuition_Event();
+
+ if ( c != '\0' )
+ for ( i = 0; i < NUM_Translators; i++ )
+ {
+ if ( c == trans[i].key )
+ {
+ event->what = trans[i].event_class;
+ event->info = trans[i].event_info;
+ return;
+ }
+ }
+
+ /* unrecognized keystroke */
+
+ event->what = event_Keyboard;
+ event->info = (int)c;
+
+ return;
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/arch/amigaos/smakefile b/xc/extras/FreeType/test/arch/amigaos/smakefile
new file mode 100644
index 000000000..69b25bbb8
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/amigaos/smakefile
@@ -0,0 +1,159 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for amiga using SAS/C
+# and smake
+#
+# Use this file while in the 'test/arch/amigaos' directory with
+# the following statements:
+#
+# smake assign
+# smake
+#
+# the 'assign' step creates an assignment to simplify referencing
+# the core library module, as smake has quite a few limitations in
+# dealing with multi-directory projects.
+
+OBJB = ttapi.o ttcache.o ttcalc.o ttcmap.o ttdebug.o \
+ ttextend.o ttfile.o ttgload.o ttinterp.o ttload.o \
+ ttmemory.o ttmutex.o ttobjs.o ttraster.o
+
+OBJS = freetype.o
+
+OBJX = ftxgasp.o ftxkern.o ftxpost.o ftxcmap.o ftxwidth.o ftxerr18.o
+
+CORE = FT:lib/
+COREXT = $(CORE)extend/
+TST = FT:test/
+
+OPTIMIZER = optimize optcomp=5 optdep=4 optinlocal optrdep=4
+
+SCFLAGS = idlen=40 idir=$(CORE)arch/amigaos idir=$(CORE)
+
+TSCFLAGS = $(SCFLAGS) idir=$(TST) idir=$(COREXT)
+
+LIB=ttf.lib
+TOPTS=$(TSCFLAGS) link lib=$(LIB) lib=lib:scm.lib lib=lib:sc.lib lib=lib:amiga.lib
+
+EXE = ftzoom ftlint ftview fttimer ftdump ftstring ftstrpnm
+
+TOBJ = gw_amiga.o gmain.o common.o
+
+all: ttf.lib $(EXE)
+
+assign:
+ assign FT: ///
+
+ttf.lib: $(OBJS) $(OBJX)
+ oml $@ r $(OBJS) $(OBJX)
+
+ttfdbg.lib: $(OBJB) $(OBJX)
+ oml $@ r $(OBJB) $(OBJX)
+
+clean:
+ -delete \#?.o
+ -delete //\#?.o
+ -delete \#?.lib
+ -delete $(EXE)
+
+
+#
+# freetype library core single object
+#
+freetype.o: $(CORE)arch/amigaos/freetype.c
+ sc $(SCFLAGS) code=far $(OPTIMIZER) objname=$@ $<
+
+#
+# freetype library core as separate objects
+#
+ttapi.o: $(CORE)ttapi.c
+ sc $(SCFLAGS) objname=$@ $<
+ttcache.o: $(CORE)ttcache.c
+ sc $(SCFLAGS) objname=$@ $<
+ttcalc.o: $(CORE)ttcalc.c
+ sc $(SCFLAGS) objname=$@ $<
+ttcmap.o: $(CORE)ttcmap.c
+ sc $(SCFLAGS) objname=$@ $<
+ttdebug.o: $(CORE)ttdebug.c
+ sc $(SCFLAGS) objname=$@ $<
+ttextend.o: $(CORE)ttextend.c
+ sc $(SCFLAGS) objname=$@ $<
+ttfile.o: $(CORE)ttfile.c
+ sc $(SCFLAGS) objname=$@ $<
+ttgload.o: $(CORE)ttgload.c
+ sc $(SCFLAGS) objname=$@ $<
+ttinterp.o: $(CORE)ttinterp.c
+ sc $(SCFLAGS) objname=$@ $<
+ttload.o: $(CORE)ttload.c
+ sc $(SCFLAGS) objname=$@ $<
+ttmemory.o: $(CORE)ttmemory.c
+ sc $(SCFLAGS) objname=$@ $<
+ttmutex.o: $(CORE)ttmutex.c
+ sc $(SCFLAGS) objname=$@ $<
+ttobjs.o: $(CORE)ttobjs.c
+ sc $(SCFLAGS) objname=$@ $<
+ttraster.o: $(CORE)ttraster.c
+ sc $(SCFLAGS) objname=$@ $<
+
+#
+# library extentions
+#
+ftxgasp.o: $(COREXT)ftxgasp.c
+ sc $(SCFLAGS) objname=$@ $<
+ftxkern.o: $(COREXT)ftxkern.c
+ sc $(SCFLAGS) objname=$@ $<
+ftxpost.o: $(COREXT)ftxpost.c
+ sc $(SCFLAGS) objname=$@ $<
+ftxcmap.o: $(COREXT)ftxcmap.c
+ sc $(SCFLAGS) objname=$@ $<
+ftxwidth.o: $(COREXT)ftxwidth.c
+ sc $(SCFLAGS) objname=$@ $<
+ftxerr18.o: $(COREXT)ftxerr18.c
+ sc $(SCFLAGS) objname=$@ $<
+
+#
+# Test programs
+#
+
+ftzoom: $(TST)ftzoom.c $(TOBJ) $(LIB)
+ sc $(TST)ftzoom.c programname=$@ $(TOBJ) $(TOPTS)
+
+ftzoom_shear: ftzoom_shear.c $(TOBJ) $(LIB)
+ sc ftzoom_shear.c programname=$@ $(TOBJ) $(TOPTS)
+
+ftzoom_bold: ftzoom_bold.c $(TOBJ) $(LIB)
+ sc ftzoom_bold.c programname=$@ $(TOBJ) $(TOPTS)
+
+ftlint: $(TST)ftlint.c common.o $(LIB)
+ sc $(TST)ftlint.c programname=$@ common.o $(TOPTS)
+
+ftdump: $(TST)ftdump.c common.o $(LIB)
+ sc $(TST)ftdump.c programname=$@ common.o $(TOPTS)
+
+# use unsigned char so full latin1 set may be used in string argument
+ftstring: $(TST)ftstring.c $(TOBJ) display.o $(LIB)
+ sc $(TST)ftstring.c uchar programname=$@ $(TOBJ) display.o $(TOPTS)
+
+ftview: $(TST)ftview.c $(TOBJ) display.o $(LIB)
+ sc $(TST)ftview.c programname=$@ $(TOBJ) display.o $(TOPTS)
+
+fttimer: $(TST)fttimer.c $(TOBJ) $(LIB)
+ sc $(TST)fttimer.c programname=$@ $(TOBJ) $(TOPTS)
+
+ftstrpnm: $(TST)ftstrpnm.c common.o $(LIB)
+ sc $(TST)ftstrpnm.c programname=$@ common.o $(TOPTS)
+
+#
+# Test program support modules
+#
+
+gw_amiga.o: gw_amiga.c
+ sc gw_amiga.c $(TSCFLAGS)
+
+common.o: $(TST)common.c
+ sc $(TSCFLAGS) objname=$@ $<
+
+display.o: $(TST)display.c
+ sc $(TSCFLAGS) objname=$@ $<
+
+gmain.o: $(TST)gmain.c
+ sc $(TSCFLAGS) objname=$@ $<
diff --git a/xc/extras/FreeType/test/arch/msdos/Makefile.dm b/xc/extras/FreeType/test/arch/msdos/Makefile.dm
new file mode 100644
index 000000000..16fb6e4ef
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/msdos/Makefile.dm
@@ -0,0 +1,121 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc and djgpp under MSDOS.
+#
+# You will need dmake.
+#
+# Use this file while in the 'test' directory with the following statement:
+#
+# dmake -r -f arch/msdos/Makefile.dm
+
+ARCH = arch/msdos
+FT_MAKEFILE = $(ARCH)/Makefile.dm
+FT_MAKE = dmake -r
+
+.IMPORT: COMSPEC
+SHELL := $(COMSPEC)
+SHELLFLAGS := /c
+GROUPSHELL := $(SHELL)
+GROUPFLAGS := $(SHELLFLAGS)
+GROUPSUFFIX := .bat
+SHELLMETAS := *"?<>&|
+
+CC = gcc
+
+LIBDIR = ../lib
+LIBDIR_DOS = ..\lib
+INCDIRS = -I$(LIBDIR) -I$(LIBDIR)/$(ARCH) -I. -I$(LIBDIR)/extend
+
+CFLAGS = -Wall -ansi -O2 -g $(INCDIRS)
+# CFLAGS = -ansi -Wall -O2 -s $(INCDIRS)
+
+# full-screen MSDOS driver
+GDRIVER = $(ARCH)/gfs_dos.c
+
+SRC = ftlint.c fttimer.c ftview.c ftzoom.c ftdump.c ftstring.c \
+ common.c
+
+GSRC = gmain.c display.c $(GDRIVER)
+GOBJ = $(GSRC:.c=.o)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+%.exe:
+ $(CC) $(CFLAGS) -o $@ @$(mktmp $(&:t"\n")\n)
+
+
+EXEFILES = ftview.exe ftlint.exe fttimer.exe ftdump.exe \
+ ftstring.exe ftzoom.exe
+
+.PHONY: all debug freetype freetype_debug \
+ clean distclean do_clean do_distclean depend
+
+
+all: freetype $(EXEFILES)
+
+debug: freetype_debug $(EXEFILES)
+
+freetype:
+[
+ cd $(LIBDIR_DOS)
+ $(FT_MAKE) -f $(FT_MAKEFILE) all
+ cd $(MAKEDIR)
+]
+
+freetype_debug:
+[
+ cd $(LIBDIR_DOS)
+ $(FT_MAKE) -f $(FT_MAKEFILE) debug
+ cd $(MAKEDIR)
+]
+
+ftzoom.exe: $(GOBJ) ftzoom.o common.o $(LIBDIR)/libttf.a
+ftview.exe: $(GOBJ) ftview.o common.o $(LIBDIR)/libttf.a
+ftlint.exe: ftlint.o common.o $(LIBDIR)/libttf.a
+ftdump.exe: ftdump.o common.o $(LIBDIR)/libttf.a
+ftstring.exe: $(GOBJ) ftstring.o common.o $(LIBDIR)/libttf.a
+fttimer.exe: $(GOBJ) fttimer.o common.o $(LIBDIR)/libttf.a
+
+
+clean: do_clean
+[
+ cd $(LIBDIR_DOS)
+ $(FT_MAKE) -f $(FT_MAKEFILE) clean
+ cd $(MAKEDIR)
+]
+
+distclean: do_clean do_distclean
+[
+ cd $(LIBDIR_DOS)
+ $(FT_MAKE) -f $(FT_MAKEFILE) distclean
+ cd $(MAKEDIR)
+]
+
+do_distclean:
+-[
+ del dep.end
+ del *.exe
+ del core
+]
+
+do_clean:
+-[
+ del *.o
+ del arch\msdos\gfs_dos.o
+]
+
+#depend: $(SRC) $(GSRC)
+#[
+# cd $(LIBDIR_DOS)
+# $(FT_MAKE) -f $(FT_MAKEFILE) depend
+# cd $(MAKEDIR)
+# $(CC) -E -M $(INCDIRS) @$(mktmp $(<:t"\n")\n) > dep.end
+#]
+#
+#ifeq (dep.end,$(wildcard dep.end))
+# include dep.end
+#endif
+
+# end of Makefile.dm
diff --git a/xc/extras/FreeType/test/arch/msdos/Makefile.gcc b/xc/extras/FreeType/test/arch/msdos/Makefile.gcc
new file mode 100644
index 000000000..e88448b7b
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/msdos/Makefile.gcc
@@ -0,0 +1,87 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc and djgpp under MSDOS.
+#
+# You will need a recent GNU make DOS port.
+#
+# Use this file while in the 'test' directory with the following statement:
+#
+# make -f arch/msdos/Makefile.gcc
+
+ARCH = arch/msdos
+FT_MAKEFILE = $(ARCH)/Makefile.gcc
+
+CC = gcc
+
+LIBDIR = ../lib
+INCDIRS = -I$(LIBDIR) -I$(LIBDIR)/$(ARCH) -I. -I$(LIBDIR)/extend
+
+CFLAGS = -Wall -ansi -O2 -g $(INCDIRS)
+# CFLAGS = -ansi -Wall -O2 -s $(INCDIRS)
+
+# full-screen MSDOS driver
+GDRIVER = $(ARCH)/gfs_dos.c
+
+SRC = ftlint.c fttimer.c ftview.c ftzoom.c ftdump.c ftstring.c ftstrpnm.c \
+ common.c
+
+GSRC = gmain.c display.c $(GDRIVER)
+GOBJ = $(GSRC:.c=.o)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+%.exe:
+ $(CC) $(CFLAGS) -o $@ $^
+
+
+EXEFILES = ftview.exe ftlint.exe fttimer.exe ftdump.exe \
+ ftstring.exe ftzoom.exe ftstrpnm.exe
+
+.PHONY: all debug freetype freetype_debug \
+ clean distclean do_clean depend
+
+
+all: freetype $(EXEFILES)
+
+debug: freetype_debug $(EXEFILES)
+
+freetype:
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) all
+
+freetype_debug:
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) debug
+
+ftzoom.exe: $(GOBJ) ftzoom.o common.o $(LIBDIR)/libttf.a
+ftview.exe: $(GOBJ) ftview.o common.o $(LIBDIR)/libttf.a
+ftlint.exe: ftlint.o common.o $(LIBDIR)/libttf.a
+ftdump.exe: ftdump.o common.o $(LIBDIR)/libttf.a
+ftstring.exe: $(GOBJ) ftstring.o common.o $(LIBDIR)/libttf.a
+fttimer.exe: $(GOBJ) fttimer.o common.o $(LIBDIR)/libttf.a
+ftstrpnm.exe: ftstrpnm.o common.c $(LIBDIR)/libttf.a
+
+
+clean: do_clean
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) clean
+
+distclean: do_clean
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) distclean
+ -del dep.end
+ -del *.exe
+ -del core
+
+do_clean:
+ -del *.o
+ -del response
+ -del arch\msdos\gfs_dos.o
+
+depend: $(SRC) $(GSRC)
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) depend
+ $(CC) -E -M $(INCDIRS) $^ > dep.end
+
+ifeq (dep.end,$(wildcard dep.end))
+ include dep.end
+endif
+
+# end of Makefile.gcc
diff --git a/xc/extras/FreeType/test/arch/msdos/gfs_dos.c b/xc/extras/FreeType/test/arch/msdos/gfs_dos.c
new file mode 100644
index 000000000..eb0a39505
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/msdos/gfs_dos.c
@@ -0,0 +1,291 @@
+/*******************************************************************
+ *
+ * gfs_dos.c graphics utility fullscreen Dos driver. 1.0
+ *
+ * This is the driver for fullscreen Dos display, used by the
+ * graphics utility of the FreeType test suite.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "gdriver.h"
+#include "gmain.h"
+#include "gevents.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <memory.h>
+
+
+/* The following #ifdef are used to define the following macros : */
+/* */
+/* - int86 : function to call an interrupt */
+/* - reg_ax : the 'ax' register as stored in the REGS struct */
+/* */
+
+/* ---- DJGPP dos compiler support --------------------------------------- */
+
+/* DJGPP v1.x */
+#if !defined( __DJGPP__ ) && defined( __GO32__ )
+
+#define DJGPP1
+#undef __STRICT_ANSI__
+#include <sys/nearptr.h>
+#include <dos.h>
+#include <strings.h>
+#include <conio.h>
+
+#define reg_ax regs.x.ax
+
+#endif
+
+/* DJGPP v2.x */
+#ifdef __DJGPP__
+
+#define DJGPP2
+#include <bios.h>
+#include <conio.h>
+#include <sys/movedata.h>
+#define int86 _int86
+#define reg_ax regs.x.ax
+
+#endif
+
+/* ---- Borland C 3.1 dos support ---------------------------------------- */
+
+#ifdef __BORLANDC__
+
+#include <dos.h> /* Includes the declaration of int86 */
+
+#define reg_ax regs.x.ax
+
+#endif
+
+/* ---- EMX/Dos compiler support ----------------------------------------- */
+
+#ifdef __EMX__
+
+#include <dos.h>
+#include <sys/hw.h>
+#include <conio.h> /* for getch */
+ extern _read_kbd(); /* to avoid an ANSI warning during compilation */
+
+#define int86 _int86
+#define reg_ax regs.x.ax
+
+#endif
+
+/* ---- WATCOM Dos/16 & Dos/32 support ----------------------------------- */
+
+#ifdef __WATCOMC__
+
+#include <i86.h>
+
+#define reg_ax regs.w.ax
+
+#ifdef __386__
+#define int86 int386
+#endif
+
+#endif
+
+
+#if !defined( reg_ax ) || !defined( int86 )
+#error Your compiler is not (yet) supported. Check the source file!
+#endif
+
+
+ typedef struct _Translator
+ {
+ char key;
+ GEvent event_class;
+ int event_info;
+ } Translator;
+
+#define NUM_Translators 20
+
+ static const Translator trans[NUM_Translators] =
+ {
+ { (char)27, event_Quit, 0 },
+ { 'q', event_Quit, 0 },
+
+ { 'x', event_Rotate_Glyph, -1 },
+ { 'c', event_Rotate_Glyph, 1 },
+ { 'v', event_Rotate_Glyph, -16 },
+ { 'b', event_Rotate_Glyph, 16 },
+
+ { '{', event_Change_Glyph, -10000 },
+ { '}', event_Change_Glyph, 10000 },
+ { '(', event_Change_Glyph, -1000 },
+ { ')', event_Change_Glyph, 1000 },
+ { '9', event_Change_Glyph, -100 },
+ { '0', event_Change_Glyph, 100 },
+ { 'i', event_Change_Glyph, -10 },
+ { 'o', event_Change_Glyph, 10 },
+ { 'k', event_Change_Glyph, -1 },
+ { 'l', event_Change_Glyph, 1 },
+
+ { '+', event_Scale_Glyph, 10 },
+ { '-', event_Scale_Glyph, -10 },
+ { 'u', event_Scale_Glyph, 1 },
+ { 'j', event_Scale_Glyph, -1 }
+ };
+
+
+ /* Set Graphics Mode */
+
+ int Driver_Set_Graphics( int mode )
+ {
+ union REGS regs;
+
+
+ switch ( mode )
+ {
+ case Graphics_Mode_Mono: /* Standard VGA 640x480x16 mode */
+ reg_ax = 0x12;
+ int86( 0x10, &regs, &regs );
+
+ vio_ScanLineWidth = 80;
+ vio_Width = 640;
+ vio_Height = 480;
+ break;
+
+ case Graphics_Mode_Gray: /* Standard VGA 320x200x256 mode */
+ reg_ax = 0x13;
+ int86( 0x10, &regs, &regs );
+
+ vio_ScanLineWidth = 320;
+ vio_Width = 320;
+ vio_Height = 200;
+
+ /* default gray_palette takes the gray levels of the standard VGA */
+ /* 256 colors mode */
+
+ gray_palette[0] = 0;
+ gray_palette[1] = 23;
+ gray_palette[2] = 27;
+ gray_palette[3] = 29;
+ gray_palette[4] = 31;
+ break;
+
+ default:
+ return 0; /* failure */
+ }
+
+#ifdef __EMX__
+ Vio = _memaccess( 0xA0000, 0xAFFFF, 1 );
+#elif defined( DJGPP1 ) || defined( DJGPP2 )
+ Vio = (char *)0xA0000;
+#elif defined( __WATCOMC__ ) && defined( __386__ )
+ Vio = (char *)0xA0000;
+#else
+ Vio = (char*)MK_FP( 0xA000, 0 );
+#endif
+
+ return 1; /* success */
+ }
+
+
+ /* Revert to text mode */
+
+ int Driver_Restore_Mode()
+ {
+ union REGS regs;
+
+
+ reg_ax = 0x3;
+ int86( 0x10, &regs, &regs );
+
+ return 1; /* success */
+ }
+
+
+ int Driver_Display_Bitmap( char* buffer, int line, int col )
+ {
+ int y, used_col;
+ char* target;
+
+
+#ifdef DJGPP2
+ char cbuf = 0;
+ int i;
+ for( i = 0; i < vio_Height*vio_ScanLineWidth; i++ )
+ dosmemput( &cbuf, 1, (unsigned long) Vio+i );
+#else
+
+#ifdef DJGPP1
+ __djgpp_nearptr_enable();
+ Vio += __djgpp_conventional_base;
+
+#else
+
+ memset( Vio, 0, vio_Height * vio_ScanLineWidth );
+
+#endif /* DJGPP1 */
+
+#endif /* DJGPP2 */
+
+ if ( line > vio_Height )
+ line = vio_Height;
+ if ( col > vio_ScanLineWidth )
+ used_col = vio_ScanLineWidth;
+ else
+ used_col = col;
+
+ target = Vio + ( line - 1 ) * vio_ScanLineWidth;
+
+ for ( y = 0; y < line; y++ )
+ {
+#ifdef DJGPP2
+ dosmemput( buffer, used_col, (unsigned long)target );
+#else
+ memcpy( target, buffer, used_col );
+#endif
+ target -= vio_ScanLineWidth;
+ buffer += col;
+ }
+
+#ifdef DJGPP1
+ __djgpp_nearptr_disable();
+ Vio -= __djgpp_conventional_base;
+#endif
+
+ return 1; /* success */
+ }
+
+
+ void Get_Event( TEvent* event )
+ {
+ int i;
+ char c;
+
+
+ c = getch();
+
+ for ( i = 0; i < NUM_Translators; i++ )
+ {
+ if ( c == trans[i].key )
+ {
+ event->what = trans[i].event_class;
+ event->info = trans[i].event_info;
+ return;
+ }
+ }
+
+ /* unrecognized keystroke */
+
+ event->what = event_Keyboard;
+ event->info = (int)c;
+ return;
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/arch/os2/Makefile.dm b/xc/extras/FreeType/test/arch/os2/Makefile.dm
new file mode 100644
index 000000000..f143dae4b
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/os2/Makefile.dm
@@ -0,0 +1,135 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc under OS/2
+#
+# You will need dmake.
+#
+# Use this file while in the 'test' directory with the following statement:
+#
+# dmake -r -f arch/os2/Makefile.dm
+
+ARCH = arch/os2
+FT_MAKEFILE = $(ARCH)/Makefile.dm
+FT_MAKE = dmake -r
+
+.IMPORT: COMSPEC
+SHELL := $(COMSPEC)
+SHELLFLAGS := /c
+GROUPSHELL := $(SHELL)
+GROUPFLAGS := $(SHELLFLAGS)
+GROUPSUFFIX := .cmd
+SHELLMETAS := *"?<>&|
+
+CC = gcc
+
+LIBDIR = ../lib
+LIBDIR_OS2 = $(subst,/,\ $(LIBDIR))
+INCDIRS = -I$(LIBDIR) -I$(LIBDIR)/$(ARCH) -I. -I$(LIBDIR)/extend
+
+# CFLAGS = -Wall -ansi -O2 -g $(INCDIRS)
+CFLAGS = -ansi -Wall -O2 -s -Zcrtdll $(INCDIRS)
+
+# full-screen MSDOS driver
+GFSDRIVER = $(ARCH)/gfs_os2.c
+GPMDRIVER = $(ARCH)/gpm_os2.c
+GPM_DEF = $(ARCH)/gpm_os2.def
+
+DISPLAY = display.c
+
+SRC = ftlint.c fttimer.c ftview.c ftzoom.c ftdump.c ftstring.c ftstrpnm.c \
+ common.c
+
+GSRC = gmain.c display.c
+GFSSRC = $(GSRC) $(GFSDRIVER)
+GPMSRC = $(GSRC) $(GPMDRIVER)
+
+GFSOBJ = $(GFSSRC:.c=.o)
+GPMOBJ = $(GPMSRC:.c=.o)
+
+ALLSRC = $(SRC) $(GSRC) $(GFSDRIVER) $(GPMDRIVER)
+ALLOBJ = $(ALLSRC:.c=.o)
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+%.exe:
+ $(CC) $(CFLAGS) -o $@ @$(mktmp $(&:t"\n")\n)
+
+
+EXEFILES = ftview.exe ftviewfs.exe \
+ ftlint.exe \
+ fttimer.exe fttimefs.exe \
+ ftdump.exe \
+ ftstring.exe ftstrfs.exe \
+ ftzoom.exe ftzoomfs.exe \
+ ftstrpnm.exe
+
+.PHONY: all debug freetype freetype_debug \
+ clean distclean do_clean do_distclean depend
+
+
+all: freetype $(EXEFILES)
+
+debug: freetype_debug $(EXEFILES)
+
+
+freetype:
+[
+ cd $(LIBDIR_OS2)
+ $(FT_MAKE) -f $(FT_MAKEFILE) all
+ cd $(MAKEDIR)
+]
+
+freetype_debug:
+[
+ cd $(LIBDIR_OS2)
+ $(FT_MAKE) -f $(FT_MAKEFILE) debug
+ cd $(MAKEDIR)
+]
+
+ftzoom.exe: $(GPMOBJ) ftzoom.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+ftzoomfs.exe: $(GFSOBJ) ftzoom.o common.o $(LIBDIR)/libttf.a
+ftview.exe: $(GPMOBJ) ftview.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+ftviewfs.exe: $(GFSOBJ) ftview.o common.o $(LIBDIR)/libttf.a
+ftlint.exe: ftlint.o common.o $(LIBDIR)/libttf.a
+ftdump.exe: ftdump.o common.o $(LIBDIR)/libttf.a
+ftstring.exe: $(GPMOBJ) ftstring.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+ftstrfs.exe: $(GFSOBJ) ftstring.o common.o $(LIBDIR)/libttf.a
+ftstrpnm.exe: ftstrpnm.o common.o $(LIBDIR)/libttf.a
+fttimer.exe: $(GPMOBJ) fttimer.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+fttimefs.exe: $(GFSOBJ) fttimer.o common.o $(LIBDIR)/libttf.a
+
+
+clean: do_clean
+[
+ cd $(LIBDIR_OS2)
+ $(FT_MAKE) -f $(FT_MAKEFILE) clean
+ cd $(MAKEDIR)
+]
+
+distclean: do_clean do_distclean
+[
+ cd $(LIBDIR_OS2)
+ $(FT_MAKE) -f $(FT_MAKEFILE) distclean
+ cd $(MAKEDIR)
+]
+
+do_distclean:
+ -+del dep.end $(EXEFILES) core
+
+do_clean:
+ -+del $(subst,/,\ $(ALLOBJ))
+
+# depend: $(ALLSRC)
+#[
+# cd $(LIBDIR_OS2)
+# $(FT_MAKE) -f $(FT_MAKEFILE) depend
+# cd $(MAKEDIR)
+# $(CC) -E -M $(INCDIRS) @$(mktmp $(<:t"\n")\n) > dep.end
+#]
+#
+# ifeq (dep.end,$(wildcard dep.end))
+# include dep.end
+# endif
+
+# end of Makefile.dm
diff --git a/xc/extras/FreeType/test/arch/os2/Makefile.emx b/xc/extras/FreeType/test/arch/os2/Makefile.emx
new file mode 100644
index 000000000..8859b3e2b
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/os2/Makefile.emx
@@ -0,0 +1,100 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for emx-gcc under OS/2.
+#
+# You will need GNU make.
+#
+# Use this file while in the 'test' directory with the following statement:
+#
+# make -f arch/os2/Makefile.emx
+
+ARCH = arch/os2
+FT_MAKEFILE = $(ARCH)/Makefile.emx
+
+CC = gcc
+
+LIBDIR = ../lib
+INCDIRS = -I$(LIBDIR) -I$(LIBDIR)/extend -I$(LIBDIR)/$(ARCH) -I.
+
+# CFLAGS = -Wall -ansi -O2 -g $(INCDIRS)
+CFLAGS = -ansi -Wall -O2 -s -Zcrtdll $(INCDIRS)
+
+GFSDRIVER = $(ARCH)/gfs_os2.c
+GPMDRIVER = $(ARCH)/gpm_os2.c
+GPM_DEF = $(ARCH)/gpm_os2.def
+
+SRC = fttimer.c ftview.c ftlint.c ftzoom.c ftdump.c ftstring.c ftstrpnm.c \
+ common.c
+
+GSRC = gmain.c display.c
+GFSSRC = $(GSRC) $(GFSDRIVER)
+GPMSRC = $(GSRC) $(GPMDRIVER)
+GFSOBJ = $(GFSSRC:.c=.o)
+GPMOBJ = $(GPMSRC:.c=.o)
+
+ALLSRC = $(SRC) $(GSRC) $(GFSDRIVER) $(GPMDRIVER)
+ALLOBJ = $(ALLSRC:.c=.o)
+
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+%.exe:
+ $(CC) $(CFLAGS) -o $@ $^
+
+
+EXEFILES = ftview.exe ftviewfs.exe \
+ fttimer.exe fttimefs.exe \
+ ftlint.exe \
+ ftdump.exe \
+ ftstring.exe ftstrfs.exe \
+ ftstrpnm.exe \
+ ftzoom.exe ftzoomfs.exe
+
+.PHONY: all debug freetype freetype_debug \
+ clean distclean do_clean depend
+
+
+all: freetype $(EXEFILES)
+
+debug: freetype_debug $(EXEFILES)
+
+freetype:
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) all
+
+freetype_debug:
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) debug
+
+ftzoom.exe: $(GPMOBJ) ftzoom.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+ftzoomfs.exe: $(GFSOBJ) ftzoom.o common.o $(LIBDIR)/libttf.a
+ftview.exe: $(GPMOBJ) ftview.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+ftviewfs.exe: $(GFSOBJ) ftview.o common.o $(LIBDIR)/libttf.a
+ftlint.exe: ftlint.o common.o $(LIBDIR)/libttf.a
+ftdump.exe: ftdump.o common.o $(LIBDIR)/libttf.a
+ftstring.exe: $(GPMOBJ) ftstring.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+ftstrfs.exe: $(GFSOBJ) ftstring.o common.o $(LIBDIR)/libttf.a
+ftstrpnm.exe: ftstrpnm.o common.o $(LIBDIR)/libttf.a
+fttimer.exe: $(GPMOBJ) fttimer.o common.o $(LIBDIR)/libttf.a $(GPM_DEF)
+fttimefs.exe: $(GFSOBJ) fttimer.o common.o $(LIBDIR)/libttf.a
+
+
+clean: do_clean
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) clean
+
+distclean: do_clean
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) distclean
+ -del dep.end $(EXEFILES) core
+
+do_clean:
+ -del $(subst /,\,$(ALLOBJ))
+
+
+depend: $(ALLSRC)
+ $(MAKE) -C $(LIBDIR) -f $(FT_MAKEFILE) depend
+ $(CC) -E -M $(INCDIRS) $^ > dep.end
+
+ifeq (dep.end,$(wildcard dep.end))
+ include dep.end
+endif
+
+# end of Makefile.emx
diff --git a/xc/extras/FreeType/test/arch/os2/Makefile.icc b/xc/extras/FreeType/test/arch/os2/Makefile.icc
new file mode 100644
index 000000000..fe90a6428
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/os2/Makefile.icc
@@ -0,0 +1,121 @@
+# This file is part of the FreeType project.
+#
+# It builds the library and test programs for IBM VisualAge C++ under OS/2.
+#
+# You will need nmake.
+#
+# Use this file while in the 'test' directory with the following statement:
+#
+# nmake -f arch\os2\Makefile.icc
+
+ARCH = arch\os2
+FT_MAKEFILE = $(ARCH)\Makefile.icc
+FT_MAKE = $(MAKE) -nologo
+
+CC = icc
+
+LIBDIR = ..\lib
+INCDIRS = -I$(LIBDIR) -I$(LIBDIR)\extend -I$(LIBDIR)\$(ARCH) -I.
+CFLAGS = -O+ -Gd+ -Gn+ -Gl+ -Ti- -Tm- -Q+ -Wpro- -Wcnd- $(INCDIRS)
+
+# Fullscreen OS/2 driver
+GFSDRIVER_SRC = $(ARCH)\gfs_os2.c
+GFSDRIVER = $(ARCH)\gfs_os2.obj
+
+# PM OS/2 Driver
+GPMDRIVER = $(ARCH)\gpm_os2.obj
+GPMDRIVER_SRC = $(ARCH)\gpm_os2.c
+GPM_DEF = $(ARCH)\gpm_os2.def
+
+SRC = gmain.c display.c \
+ ftzoom.c ftview.c fttimer.c ftlint.c ftdump.c ftstring.c \
+ $(GFSDRIVER_SRC)
+
+COMMON = common.obj
+GFSOBJS = gmain.obj display.obj $(GFSDRIVER) common.obj
+GPMOBJS = gmain.obj display.obj $(GPMDRIVER) common.obj
+OBJ1 = ftzoom.obj
+OBJ2 = fttimer.obj
+OBJ3 = ftview.obj
+OBJ4 = ftlint.obj
+OBJ5 = ftdump.obj
+OBJ6 = ftstring.obj
+
+
+EXEFILES = fttimefs.exe fttimer.exe \
+ ftzoom.exe ftzoomfs.exe \
+ ftviewfs.exe ftview.exe \
+ ftlint.exe \
+ ftdump.exe \
+ ftstring.exe ftstrfs.exe
+
+
+all: freetype $(EXEFILES)
+
+debug: freetype_debug $(EXEFILES)
+
+
+freetype:
+ cd $(LIBDIR)
+ $(FT_MAKE) -f $(FT_MAKEFILE) all
+ cd ..\test
+
+freetype_debug:
+ cd $(LIBDIR)
+ $(FT_MAKE) -f $(FT_MAKEFILE) debug
+ cd ..\test
+
+$(GFSDRIVER): $(GFSDRIVER_SRC)
+ $(CC) $(CFLAGS) /c /Fo$@ $** -I.
+
+$(GPMDRIVER): $(GPMDRIVER_SRC)
+ $(CC) $(CFLAGS) /c /Fo$@ $** -I.
+
+ftzoomfs.exe: $(GFSOBJS) $(OBJ1) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) /Fe$@ $**
+
+ftzoom.exe: $(GPMOBJS) $(OBJ1) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) $(GPM_DEF) /Fe$@ $**
+
+fttimefs.exe: $(GFSOBJS) $(OBJ2) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) /Fe$@ $**
+
+fttimer.exe: $(GPMOBJS) $(OBJ2) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) $(GPM_DEF) /Fe$@ $**
+
+ftviewfs.exe: $(GFSOBJS) $(OBJ3) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) /Fe$@ $**
+
+ftview.exe: $(GPMOBJS) $(OBJ3) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) $(GPM_DEF) /Fe$@ $**
+
+ftlint.exe: $(OBJ4) $(LIBDIR)\libttf.lib common.obj
+ $(CC) $(CFLAGS) /Fe$@ $**
+
+ftdump.exe: $(OBJ5) $(LIBDIR)\libttf.lib common.obj
+ $(CC) $(CFLAGS) /Fe$@ $**
+
+ftstrfs.exe: $(GFSOBJS) $(OBJ6) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) /Fe$@ $**
+
+ftstring.exe: $(GPMOBJS) $(OBJ6) $(LIBDIR)\libttf.lib
+ $(CC) $(CFLAGS) $(GPM_DEF) /Fe$@ $**
+
+
+clean: do_clean
+ cd $(LIBDIR)
+ $(FT_MAKE) -f $(FT_MAKEFILE) clean
+ cd ..\test
+
+distclean: do_clean
+ cd $(LIBDIR)
+ $(FT_MAKE) -f $(FT_MAKEFILE) distclean
+ cd ..\test
+ -del *.exe
+
+do_clean:
+ -del *.obj
+ -del $(GFSDRIVER)
+ -del $(GPMDRIVER)
+
+# end of Makefile.icc
diff --git a/xc/extras/FreeType/test/arch/os2/Makefile.wat b/xc/extras/FreeType/test/arch/os2/Makefile.wat
new file mode 100644
index 000000000..313d91b55
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/os2/Makefile.wat
@@ -0,0 +1,138 @@
+# This file is part of the FreeType project
+#
+# This builds the test programs with the Watcom compiler
+#
+# You'll need Watcom's wmake
+#
+# Invoke by "wmake -f arch\os2\Makefile.wat" when in the "test" directory
+
+ARCH = arch\os2
+FT_MAKEFILE = $(ARCH)\Makefile.wat
+FT_MAKE = wmake -h
+
+.EXTENSIONS:
+.EXTENSIONS: .exe .obj .c .h
+.obj:.
+.c:.
+.h:.;..\lib
+
+CC = wcl386
+
+LIBDIR = ..\lib
+INCDIRS = -I$(LIBDIR) -I$(LIBDIR)\$(ARCH) -I$(LIBDIR)\extend
+LIBFILE = $(LIBDIR)\libttf.lib
+
+LINK_OPTS =
+
+OBJ_CFLAGS = /c /otexanl+ /s /w4 /zq $(INCDIRS)
+
+CCFLAGS = /otexanl+ /s /w4 /zq $(INCDIRS)
+
+GFSDRIVER = $(ARCH)\gfs_os2.obj
+GFSDRIVER_SRC = $(ARCH)\gfs_os2.c
+
+GPMDRIVER = $(ARCH)\gpm_os2.obj
+GPMDRIVER_SRC = $(ARCH)\gpm_os2.c
+GPMDRIVER_DEF = $(ARCH)\gpm_os2.def
+
+DISPLAYSRC = display.c
+
+SRC = gmain.c display.c &
+ fttimer.c ftview.c ftlint.c ftzoom.c ftdump.c ftstring.c &
+ $(GPMDRIVER_SRC) $(GFSDRIVER_SRC)
+
+GFSOBJ = gmain.obj $(GFSDRIVER)
+GPMOBJ = gmain.obj $(GPMDRIVER)
+
+PM = $(LIBFILE) $(GPMOBJ) common.obj
+FS = $(LIBFILE) $(GFSOBJ) common.obj
+
+DISP = display.obj
+
+
+# graphics utility and test driver
+
+EXEFILES = ftview.exe ftviewfs.exe &
+ fttimer.exe fttimefs.exe &
+ ftlint.exe &
+ ftdump.exe &
+ ftstring.exe ftstrfs.exe &
+ ftzoom.exe ftzoomfs.exe
+
+
+all: freetype $(EXEFILES)
+
+debug: freetype_debug $(EXEFILES)
+
+
+freetype: .symbolic
+ cd ..\lib
+ $(FT_MAKE) -f $(FT_MAKEFILE) all
+ cd ..\test
+
+freetype_debug: .symbolic
+ cd ..\lib
+ $(FT_MAKE) -f $(FT_MAKEFILE) debug
+ cd ..\test
+
+# implicit rules
+#
+.c.obj :
+ $(CC) $(OBJ_CFLAGS) $[* /fo=$[*.obj
+
+
+# the full-screen graphics driver
+#
+$(GFSDRIVER): $(GFSDRIVER_SRC)
+ $(CC) $(OBJ_CFLAGS) $[*.c /fo=$[*.obj
+
+# the pm graphics driver
+#
+$(GPMDRIVER): $(GPMDRIVER_SRC)
+ $(CC) $(OBJ_CFLAGS) $[*.c /fo=$[*.obj
+
+ftzoom.exe : ftzoom.obj $(LIBFILE) $(PM) $(GPMDRIVER_DEF)
+ $(CC) $(CCFLAGS) -l=os2v2_pm $(PM) $[*.c /fe=$[*.exe
+
+ftzoomfs.exe : ftzoom.obj $(LIBFILE) $(FS)
+ $(CC) $(CCFLAGS) $(FS) $[@ /fe=$^*.exe
+
+ftview.exe : ftview.obj $(LIBFILE) $(PM) $(DISP) $(GPMDRIVER_DEF)
+ $(CC) $(CCFLAGS) -l=os2v2_pm $(PM) $(DISP) $[*.c /fe=$[*.exe
+
+ftviewfs.exe : ftview.obj $(LIBFILE) $(FS) $(DISP)
+ $(CC) $(CCFLAGS) $(FS) $(DISP) $[*.c /fe=ftviewfs.exe
+
+ftstring.exe : ftstring.obj $(LIBFILE) $(PM) $(GPMDRIVER_DEF)
+ $(CC) $(CCFLAGS) -l=os2v2_pm $(PM) $(DISP) $[*.c /fe=$[*.exe
+
+ftstrfs.exe : ftstring.obj $(LIBFILE) $(FS) $(DISP)
+ $(CC) $(CCFLAGS) $(FS) $(DISP) $[*.c /fe=ftstrfs.exe
+
+fttimer.exe: fttimer.obj $(LIBFILE) $(PM) $(GPMDRIVER_DEF)
+ $(CC) $(CCFLAGS) -l=os2v2_pm $(PM) $[*.c /fe=$[*.exe
+
+fttimefs.exe: fttimer.obj $(LIBFILE) $(FS)
+ $(CC) $(CCFLAGS) $(FS) $[*.c /fe=fttimefs.exe
+
+ftlint.exe: ftlint.obj $(LIBFILE)
+ $(CC) $(CCFLAGS) $(LIBFILE) common.obj $[*.c /fe=$[*.exe
+
+ftdump.exe: ftdump.obj $(LIBFILE)
+ $(CC) $(CCFLAGS) $(LIBFILE) common.obj $[*.c /fe=$[*.exe
+
+clean: .symbolic
+ @-erase *.obj
+ @-erase $(ARCH)\*.obj
+
+distclean: .symbolic clean
+ @-erase *.exe
+ @-erase *.err
+ cd ..\lib
+ $(FT_MAKE) -f $(FT_MAKEFILE) distclean
+ cd ..\test
+
+new: .symbolic
+ @-wtouch *.c
+
+# end of Makefile.wat
diff --git a/xc/extras/FreeType/test/arch/os2/gfs_os2.c b/xc/extras/FreeType/test/arch/os2/gfs_os2.c
new file mode 100644
index 000000000..4587171dc
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/os2/gfs_os2.c
@@ -0,0 +1,218 @@
+/*******************************************************************
+ *
+ * gfs_os2.c graphics utility fullscreen OS/2 driver. 1.0
+ *
+ * This is the driver for fullscreen OS/2 display, used by the
+ * graphics utility of the FreeType test suite.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "gdriver.h"
+#include "gmain.h"
+#include "gevents.h"
+
+#define INCL_SUB
+#include <os2.h>
+
+#ifdef __EMX__
+#include <os2thunk.h>
+#endif
+
+#if defined(__EMX__)||defined(__IBMC__)
+#include <conio.h> /* for getch */
+ extern _read_kbd(); /* to avoid an ANSI warning during compilation */
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+ typedef struct _Translator
+ {
+ char key;
+ GEvent event_class;
+ int event_info;
+ } Translator;
+
+#define NUM_Translators 20
+
+ static const Translator trans[NUM_Translators] =
+ {
+ { (char)27, event_Quit, 0 },
+ { 'q', event_Quit, 0 },
+
+ { 'x', event_Rotate_Glyph, -1 },
+ { 'c', event_Rotate_Glyph, 1 },
+ { 'v', event_Rotate_Glyph, -16 },
+ { 'b', event_Rotate_Glyph, 16 },
+
+ { '{', event_Change_Glyph, -10000 },
+ { '}', event_Change_Glyph, 10000 },
+ { '(', event_Change_Glyph, -1000 },
+ { ')', event_Change_Glyph, 1000 },
+ { '9', event_Change_Glyph, -100 },
+ { '0', event_Change_Glyph, 100 },
+ { 'i', event_Change_Glyph, -10 },
+ { 'o', event_Change_Glyph, 10 },
+ { 'k', event_Change_Glyph, -1 },
+ { 'l', event_Change_Glyph, 1 },
+
+ { '+', event_Scale_Glyph, 10 },
+ { '-', event_Scale_Glyph, -10 },
+ { 'u', event_Scale_Glyph, 1 },
+ { 'j', event_Scale_Glyph, -1 }
+ };
+
+
+ static VIOMODEINFO OrgMode;
+ static long VioBufOfs;
+
+
+ /* BIOS video modes */
+
+ static VIOMODEINFO VioMode_640x480x16 =
+ {
+ sizeof ( VIOMODEINFO ),
+ VGMT_OTHER + VGMT_GRAPHICS,
+ COLORS_16,
+ 80,
+ 35,
+ 640,
+ 480
+ };
+
+ static VIOMODEINFO VioMode_320x200x256 =
+ {
+ sizeof ( VIOMODEINFO ),
+ VGMT_OTHER + VGMT_GRAPHICS,
+ 8,
+ 40,
+ 25,
+ 320,
+ 200
+ };
+
+ static VIOPHYSBUF VioBuf =
+ {
+ (void*)0xA0000L,
+ 64*1024
+ };
+
+
+ /* Restores screen to its original state */
+
+ int Driver_Restore_Mode()
+ {
+ VioSetMode( &OrgMode, 0 );
+ return 1;
+ }
+
+
+ /* Sets graphics mode */
+
+ int Driver_Set_Graphics( int mode )
+ {
+ int rc;
+
+
+ OrgMode.cb = sizeof ( VIOMODEINFO );
+ VioGetMode( &OrgMode, 0 );
+
+ switch ( mode )
+ {
+ case Graphics_Mode_Mono:
+ rc = VioSetMode( &VioMode_640x480x16, 0 );
+ vio_ScanLineWidth = 80;
+ vio_Width = 640;
+ vio_Height = 480;
+ break;
+
+ case Graphics_Mode_Gray:
+ rc = VioSetMode( &VioMode_320x200x256, 0 );
+ vio_ScanLineWidth = 320;
+ vio_Width = 320;
+ vio_Height = 200;
+
+ /* default gray_palette takes the gray levels of the standard VGA */
+ /* 256 colors mode */
+
+ gray_palette[0] = 0;
+ gray_palette[1] = 23;
+ gray_palette[2] = 27;
+ gray_palette[3] = 29;
+ gray_palette[4] = 31;
+ break;
+
+ default:
+ rc = -1;
+ break;
+ }
+
+ if ( rc ) return 0; /* failure */
+
+ if ( VioGetPhysBuf( &VioBuf, 0 ) ) return 0; /* Could not access VRAM */
+
+ VioBufOfs = (long)MAKEP( VioBuf.asel[0], 0 );
+
+ memset( (void*)VioBufOfs, 0, 64 * 1024 );
+
+ Vio = (char*)VioBufOfs;
+
+ return 1; /* success */
+ }
+
+
+ int Driver_Display_Bitmap( char* buffer, int line, int col )
+ {
+ int y;
+ char* target;
+
+ target = Vio + ( line - 1 ) * vio_ScanLineWidth;
+
+ for ( y = 0; y < line; y++ )
+ {
+ memcpy( target, buffer, col );
+ target -= vio_ScanLineWidth;
+ buffer += col;
+ }
+
+ return 1; /* success */
+ }
+
+
+ void Get_Event( TEvent* event )
+ {
+ int i;
+ char c;
+
+
+ c = getch();
+
+ for ( i = 0; i < NUM_Translators; i++ )
+ {
+ if ( c == trans[i].key )
+ {
+ event->what = trans[i].event_class;
+ event->info = trans[i].event_info;
+ return;
+ }
+ }
+
+ /* unrecognized keystroke */
+
+ event->what = event_Keyboard;
+ event->info = (int)c;
+ return;
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/arch/os2/gpm_os2.c b/xc/extras/FreeType/test/arch/os2/gpm_os2.c
new file mode 100644
index 000000000..727001ab5
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/os2/gpm_os2.c
@@ -0,0 +1,652 @@
+/*******************************************************************
+ *
+ * gpm_os2.c graphics OS/2 Presentation Manager Window driver. 0.2
+ *
+ * This is the driver for windowed OS/2 display, used by the
+ * graphics utility of the FreeType test suite.
+ *
+ * written by Eric Olson (eolson@imag.net)
+ *
+ * Borrowing liberally from the other FreeType drivers.
+ * Some bitmap manipulations are derived from fastgpi.c,
+ * a sample program written by Donald Graft (dgraft@gate.net).
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "gdriver.h"
+#include "gmain.h"
+#include "gevents.h"
+
+#define INCL_DOS
+#define INCL_WIN
+#define INCL_GPI
+#define INCL_SUB
+
+#include <os2.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define VIO_WIDTH 640u /* these can be changed but VIO_WIDTH should remain */
+#define VIO_HEIGHT 360u /* for now a multiple of 32 to avoid padding issues */
+#define MAG_WIDTH VIO_WIDTH
+#define MAG_HEIGHT 120u
+#define MAX_MAG 16 /* should be less than Min(MAG_WIDTH, MAG_HEIGHT) */
+
+
+ typedef struct _Translator
+ {
+ char key;
+ GEvent event_class;
+ int event_info;
+ } Translator;
+
+#define NUM_Translators 20
+
+ static const Translator trans[NUM_Translators] =
+ {
+ { (char)27, event_Quit, 0 },
+ { 'q', event_Quit, 0 },
+
+ { 'x', event_Rotate_Glyph, -1 },
+ { 'c', event_Rotate_Glyph, 1 },
+ { 'v', event_Rotate_Glyph, -16 },
+ { 'b', event_Rotate_Glyph, 16 },
+
+ { '{', event_Change_Glyph, -10000 },
+ { '}', event_Change_Glyph, 10000 },
+ { '(', event_Change_Glyph, -1000 },
+ { ')', event_Change_Glyph, 1000 },
+ { '9', event_Change_Glyph, -100 },
+ { '0', event_Change_Glyph, 100 },
+ { 'i', event_Change_Glyph, -10 },
+ { 'o', event_Change_Glyph, 10 },
+ { 'k', event_Change_Glyph, -1 },
+ { 'l', event_Change_Glyph, 1 },
+
+ { '+', event_Scale_Glyph, 10 },
+ { '-', event_Scale_Glyph, -10 },
+ { 'u', event_Scale_Glyph, 1 },
+ { 'j', event_Scale_Glyph, -1 }
+ };
+
+
+ static HAB habt;
+ static HAB hab;
+ static HWND hwndFrame, hwndClient;
+ static HWND hwndTitle;
+ static HDC hdcMemory;
+ static HPS hpsMemory = (HPS) NULL;
+
+ /* Threads and semaphores */
+ TID MessageThread;
+ HMTX hmtxPSMemoryLock;
+ HEV hevKeyLock;
+
+ /* Bitmap information */
+ static PBITMAPINFO2 pbmi;
+ static HBITMAP hbm;
+ BYTE Bitmap[VIO_WIDTH * VIO_HEIGHT];
+ BOOL ready = FALSE;
+
+ /* Coordinates for the bitblt of whole graphic area */
+ POINTL aptlFull[4] = {{ 0u, MAG_HEIGHT },
+ { VIO_WIDTH, VIO_HEIGHT + MAG_HEIGHT },
+ { 0u, 0u },
+ { VIO_WIDTH, VIO_HEIGHT }};
+
+ /* Coordinates for the magnification bitblt */
+ POINTL aptlMagd[4] = {{ 0u, 0u },
+ { MAG_WIDTH, MAG_HEIGHT }, /* target */
+ { 0u, 0u },
+ { VIO_WIDTH, VIO_HEIGHT }}; /* source */
+
+ /* level of magnification and center of magnification window */
+ static int magnification=1;
+ static POINTL view_target = {0, 0};
+ static SIZEL mag_win_size;
+
+ /* local event to pass on */
+ TEvent ourevent = { event_Rotate_Glyph, 0 };
+
+ /* grayscale vs b/w mode */
+ int Colourmode;
+
+ /* array defined in the test programs */
+ extern char Header[];
+
+
+ void RunPMWindow( ULONG );
+ MRESULT EXPENTRY Message_Process( HWND, ULONG, MPARAM, MPARAM );
+
+
+
+ /* restores screen to its original state */
+
+ int Driver_Restore_Mode()
+ {
+ /* PMWindow has probably already destroyed itself */
+ if ( hwndFrame )
+ WinDestroyWindow( hwndFrame );
+
+ WinReleasePS( hpsMemory );
+ WinTerminate( habt );
+
+ return 1;
+ }
+
+
+ /* set graphics mode */
+
+ int Driver_Set_Graphics( int mode )
+ {
+ LONG palette[5];
+ int x;
+ POINTL coords;
+ SIZEL sizl = { 0, 0 };
+
+ PTIB thread_block;
+ PPIB process_block;
+
+ /* XXX : This is a very nasty hack, it fools OS/2 and let the program */
+ /* call PM functions, even though stdin/stdout/stderr are still */
+ /* directed to the standard i/o streams.. */
+ /* The program must be compiled with WINDOWCOMPAT */
+ /* */
+ /* Credits go to Michal for finding this !! */
+ /* */
+ DosGetInfoBlocks( &thread_block, &process_block );
+ process_block->pib_ultype = 3;
+
+ /* save mono vs grayscale status */
+ Colourmode = mode;
+
+ /* event semaphore to signal reraster event */
+ DosCreateEventSem( NULL, &hevKeyLock, 0, TRUE );
+
+ /* mutex semaphore for access to the presentation space */
+ DosCreateMutexSem( NULL, &hmtxPSMemoryLock, 0, FALSE );
+
+ /* Start thread with Presentation Manager window */
+ DosCreateThread( &MessageThread, (PFNTHREAD)RunPMWindow, 0UL, 0UL, 32920 );
+
+ /* open anchor block to permit Gpi calls from this thread */
+ habt = WinInitialize( 0 );
+
+ /* create device context and presentation space for our graphic */
+ hdcMemory = DevOpenDC( hab, OD_MEMORY, (PSZ)"*", 0L, 0L, 0L );
+
+ DosRequestMutexSem( hmtxPSMemoryLock, SEM_INDEFINITE_WAIT );
+ hpsMemory = GpiCreatePS(
+ habt, hdcMemory, &sizl,
+ PU_PELS | GPIT_MICRO | GPIA_ASSOC | GPIF_DEFAULT );
+ GpiSetBackMix( hpsMemory, BM_OVERPAINT );
+
+ /* create bitmap for raster image of graphic */
+
+ /* find some memory for the bitmap header */
+ DosAllocMem( (PPVOID)&pbmi,
+ sizeof ( BITMAPINFO2 ) + sizeof ( RGB2 ) * 256,
+ PAG_COMMIT | PAG_READ | PAG_WRITE);
+ /* 256 should really be 2 if not grayscale */
+
+ /* initialize the header to appropriate values */
+ memset( pbmi, 0, sizeof ( BITMAPINFO2 ) + sizeof ( RGB2 ) * 256 );
+
+ pbmi->cbFix = sizeof ( BITMAPINFOHEADER2 );
+ pbmi->cx = VIO_WIDTH;
+ pbmi->cy = VIO_HEIGHT;
+ pbmi->cPlanes = 1;
+
+ switch ( mode )
+ {
+ case Graphics_Mode_Mono:
+ pbmi->cBitCount = 1;
+ break;
+
+ case Graphics_Mode_Gray:
+ pbmi->cBitCount = 8;
+ break;
+ }
+
+ hbm = GpiCreateBitmap( hpsMemory, (PBITMAPINFOHEADER2)pbmi,
+ 0L, NULL, NULL );
+
+ /* associate it with the presentation space */
+ GpiSetBitmap( hpsMemory, hbm );
+ pbmi->cbFix = sizeof ( BITMAPINFOHEADER2 );
+ GpiQueryBitmapInfoHeader( hbm, (PBITMAPINFOHEADER2) pbmi );
+
+ switch ( mode )
+ {
+ case Graphics_Mode_Mono:
+ DosReleaseMutexSem( hmtxPSMemoryLock );
+
+ vio_ScanLineWidth = VIO_WIDTH / 8;
+ vio_Width = VIO_WIDTH;
+ vio_Height = VIO_HEIGHT;
+
+ gray_palette[0] = 0; /* to avoid testing for grayscale... */
+ break;
+
+ case Graphics_Mode_Gray:
+ vio_ScanLineWidth = VIO_WIDTH;
+ vio_Width = VIO_WIDTH;
+ vio_Height = VIO_HEIGHT;
+
+ /* set gray_palette by convoluted procedure */
+
+ /* create logical color palette */
+ palette[0] = 0xffffffL; /* White */
+ palette[1] = 0xbbbbbbL;
+ palette[2] = 0x777777L; /* Gray */
+ palette[3] = 0x333333L;
+ palette[4] = 0L; /* Black */
+
+ GpiCreateLogColorTable( hpsMemory, (ULONG)LCOL_PURECOLOR,
+ (LONG)LCOLF_CONSECRGB, (LONG)0L,
+ (LONG)5L, (PLONG)palette );
+
+ /* plot to presentation space in all five gray shades */
+ for (x = 0 ; x < 5 ; x++)
+ {
+ GpiSetColor( hpsMemory, (LONG)x );
+ coords.x = x;
+ coords.y = 0;
+ GpiSetPel( hpsMemory, &coords );
+ }
+
+ /* retrieve the 5 pixels as gray_palette */
+ GpiQueryBitmapInfoHeader( hbm, (PBITMAPINFOHEADER2) pbmi );
+ GpiQueryBitmapBits( hpsMemory, 0L, (LONG)VIO_HEIGHT - 2,
+ &Bitmap[0], pbmi );
+ for ( x = 0; x < 5; x++ )
+ {
+ gray_palette[x] = Bitmap[x];
+ }
+
+ /* initialization in case we paint before Driver_Display is called */
+ memset( &Bitmap[0], gray_palette[0], vio_Height * vio_ScanLineWidth );
+ DosReleaseMutexSem( hmtxPSMemoryLock );
+ break;
+
+ default:
+ return 0; /* Unknown mode */
+ }
+
+ return 1; /* success even if windows were not setup right */
+ }
+
+
+ int Driver_Display_Bitmap( char* buffer, int lines, int cols )
+ {
+ int y, target;
+
+
+ /* copy the bitmap and blt to presentation space */
+ if ( (lines == vio_Height) & (cols == vio_ScanLineWidth) )
+ memcpy( &Bitmap[0], buffer, lines * cols );
+ else
+ {
+ memset( &Bitmap[0], gray_palette[0], vio_Height * vio_ScanLineWidth );
+ /* temporary hack to center any bitmap */
+ target = ( vio_Height - lines ) / 2 * vio_ScanLineWidth +
+ ( vio_ScanLineWidth - cols ) / 2;
+
+ for ( y = 0 ; y < lines ; y++ )
+ {
+ memcpy( &Bitmap[target], buffer, cols );
+ target += vio_ScanLineWidth;
+ buffer += cols;
+ }
+ }
+
+ /* Get permission and write to in-memory ps */
+ DosRequestMutexSem( hmtxPSMemoryLock, SEM_INDEFINITE_WAIT );
+ GpiSetBitmapBits( hpsMemory, 0L, (LONG)VIO_HEIGHT - 2, &Bitmap[0], pbmi );
+ DosReleaseMutexSem( hmtxPSMemoryLock );
+ ready = TRUE;
+
+ /* Invalidate and ask for redraw now */
+ WinInvalidateRect( hwndClient, NULL, FALSE );
+ WinUpdateWindow( hwndFrame );
+
+ return 1; /* success */
+ }
+
+
+ void Get_Event( TEvent* event )
+ {
+ ULONG ulRequestCount;
+
+
+ /* the Get_Event function blocks until there is an event to process */
+ DosWaitEventSem( hevKeyLock, SEM_INDEFINITE_WAIT );
+ DosQueryEventSem( hevKeyLock, &ulRequestCount );
+ DosResetEventSem( hevKeyLock, &ulRequestCount );
+ event->what = ourevent.what;
+ event->info = ourevent.info;
+ return;
+ }
+
+
+ void RunPMWindow( ULONG dummy )
+ {
+ unsigned char classname[] = "DisplayClass";
+ ULONG flClassFlags;
+ static HMQ hmq;
+ QMSG qmsg;
+
+
+ if ( (hab = WinInitialize( 0 )) == 0 )
+ {
+ printf( "Error doing WinInitialize()\n" );
+ return;
+ }
+
+ if ( (hmq = WinCreateMsgQueue( hab, 0 )) == (HMQ)NULL )
+ {
+ printf( "Error doing WinCreateMsgQueue()\n" );
+ return;
+ }
+
+ if ( !WinRegisterClass( hab, (PSZ)classname, (PFNWP)Message_Process,
+ CS_SIZEREDRAW, 0 ) )
+ {
+ printf( "Error doing WinRegisterClass()\n" );
+ return;
+ }
+
+ flClassFlags = FCF_TITLEBAR | FCF_MINBUTTON | FCF_DLGBORDER |
+ FCF_TASKLIST | FCF_SYSMENU;
+ if ( (hwndFrame = WinCreateStdWindow( HWND_DESKTOP,
+ WS_VISIBLE,
+ &flClassFlags,
+ (PSZ)classname,
+ (PSZ)"FreeType PM Graphics",
+ WS_VISIBLE,
+ 0, 0, &hwndClient )) == 0 )
+ {
+ printf( "Error doing WinCreateStdWindow()\n" );
+ return;
+ }
+
+ /* find the title window handle */
+ hwndTitle = WinWindowFromID( hwndFrame, FID_TITLEBAR );
+
+ /* set Window size and position */
+ WinSetWindowPos(
+ hwndFrame, 0L,
+ (SHORT)60,
+ (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ) -
+ ( VIO_HEIGHT + MAG_HEIGHT + 100 ),
+ (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYDLGFRAME ) * 2 +
+ VIO_WIDTH,
+ (SHORT)WinQuerySysValue( HWND_DESKTOP, SV_CYTITLEBAR ) +
+ WinQuerySysValue( HWND_DESKTOP, SV_CYDLGFRAME ) * 2 +
+ VIO_HEIGHT + MAG_HEIGHT,
+ SWP_SIZE | SWP_MOVE ) ;
+
+ /* run the message queue till the end */
+ while ( WinGetMsg( hab, &qmsg, (HWND)NULL, 0, 0 ) )
+ WinDispatchMsg( hab, &qmsg );
+
+ /* clean-up */
+ WinDestroyWindow( hwndFrame );
+ hwndFrame = (HWND)NULL;
+ WinDestroyMsgQueue( hmq );
+ WinTerminate( hab );
+
+ /* await death... */
+ while ( 1 )
+ DosSleep( 100 );
+ }
+
+
+ void Adjust_Mag_Rectangle( void )
+ {
+ SIZEL source,
+ target;
+
+
+ /* Step 1, find optimal source size for this mag and window size */
+ source.cx = mag_win_size.cx / magnification;
+ if (source.cx > vio_Width) source.cx = vio_Width;
+ source.cy = mag_win_size.cy / magnification;
+ if (source.cy > vio_Height) source.cy = vio_Height;
+
+ target.cx = source.cx * magnification;
+ target.cy = source.cy * magnification;
+
+ aptlMagd[0].x = (mag_win_size.cx - target.cx) / 2;
+ aptlMagd[0].y = (mag_win_size.cy - target.cy) / 2;
+ aptlMagd[1].x = aptlMagd[0].x + target.cx - 1;
+ aptlMagd[1].y = aptlMagd[0].x + target.cy - 1;
+
+ /* Step 2, try crosshairs point dependent coordinates */
+ aptlMagd[2].x = view_target.x - source.cx / 2;
+ aptlMagd[2].y = view_target.y - source.cy / 2;
+ if (aptlMagd[2].x < 0 ) aptlMagd[2].x = 0;
+ if (aptlMagd[2].y < 0 ) aptlMagd[2].y = 0;
+ if (aptlMagd[2].x > vio_Width - source.cx)
+ aptlMagd[2].x = vio_Width - source.cx;
+ if (aptlMagd[2].y > vio_Height - source.cy)
+ aptlMagd[2].y = vio_Height - source.cy;
+
+ aptlMagd[3].x = aptlMagd[2].x + source.cx - 1;
+ aptlMagd[3].y = aptlMagd[2].y + source.cy - 1;
+
+ } /* End of Adjust_Mag_Rectangle; */
+
+
+ /* Message processing for our PM Window class */
+ MRESULT EXPENTRY Message_Process( HWND handle, ULONG mess,
+ MPARAM parm1, MPARAM parm2 )
+ {
+ static HDC hdc;
+ static HPS hps;
+ static BOOL minimized;
+
+ POINTL top_corner, bottom_corner;
+ SWP swp;
+ int i;
+
+
+ switch( mess )
+ {
+ case WM_DESTROY:
+ /* warn the main thread to quit if it didn't know */
+ ourevent.what = event_Quit;
+ ourevent.info = 0;
+ DosPostEventSem( hevKeyLock );
+ break;
+
+ case WM_CREATE:
+ /* set original magnification */
+ magnification = 4;
+ minimized = FALSE;
+
+ /* create Device Context and Presentation Space for screen. */
+ /* could we use a cached one ? */
+ hdc = WinOpenWindowDC( handle );
+ mag_win_size.cx = 0;
+ mag_win_size.cy = 0;
+ hps = GpiCreatePS( hab, hdc, &mag_win_size,
+ PU_PELS | GPIT_MICRO | GPIA_ASSOC | GPIF_DEFAULT );
+
+ /* Set to size of magnifier window */
+ mag_win_size.cx = MAG_WIDTH;
+ mag_win_size.cy = MAG_HEIGHT;
+ Adjust_Mag_Rectangle();
+
+ /* take the input focus */
+ WinFocusChange( HWND_DESKTOP, handle, 0L );
+ break;
+
+ case WM_BUTTON1DOWN:
+ if ( MOUSEMSG( &mess )->y >= MAG_HEIGHT )
+ {
+ view_target.x = MOUSEMSG( &mess )->x;
+ view_target.y = MOUSEMSG( &mess )->y - MAG_HEIGHT;
+ Adjust_Mag_Rectangle();
+ WinInvalidateRect( hwndClient, NULL, FALSE );
+ }
+
+ return WinDefWindowProc( handle, mess, parm1, parm2 );
+ break;
+
+ case WM_MINMAXFRAME:
+ /* to update minimized if changed */
+ swp = *((PSWP) parm1);
+ if ( swp.fl & SWP_MINIMIZE )
+ minimized = TRUE;
+ if ( swp.fl & SWP_RESTORE )
+ minimized = FALSE;
+ return WinDefWindowProc( handle, mess, parm1, parm2 );
+ break;
+
+ case WM_ERASEBACKGROUND:
+ case WM_PAINT:
+ /* reset the window title only if not minimized */
+ if ( !minimized )
+ WinSetWindowText( hwndTitle, Header );
+
+ /* copy the memory image of the screen out to the real screen */
+ DosRequestMutexSem( hmtxPSMemoryLock, SEM_INDEFINITE_WAIT );
+ WinBeginPaint( handle, hps, NULL );
+
+ /* main image and magnified picture */
+ GpiBitBlt( hps, hpsMemory, 4L, aptlFull, ROP_SRCCOPY, BBO_AND );
+ GpiBitBlt( hps, hpsMemory, 4L, aptlMagd, ROP_SRCCOPY, BBO_AND );
+
+ /* double-dash the magnifing bounding box. Paint the mag liner? */
+ if ( magnification != 1 )
+ {
+ GpiSetLineType( hps, LINETYPE_LONGDASH );
+
+ bottom_corner.x = aptlMagd[2].x - 1;
+ bottom_corner.y = aptlMagd[2].y + MAG_HEIGHT - 1;
+ top_corner.x = aptlMagd[3].x ;
+ top_corner.y = aptlMagd[3].y + MAG_HEIGHT;
+
+ GpiMove( hps, &bottom_corner );
+ GpiBox( hps, DRO_OUTLINE, &top_corner, 0L, 0L );
+
+#if 0
+ GpiSetClipRegion();
+ GpiErase();
+#endif
+ }
+
+ WinEndPaint( hps );
+ DosReleaseMutexSem( hmtxPSMemoryLock );
+ break;
+
+ case WM_CHAR:
+ if ( CHARMSG( &mess )->fs & KC_KEYUP )
+ break;
+
+ switch ( CHARMSG( &mess )->vkey )
+ {
+ case VK_ESC:
+ ourevent.what = event_Quit;
+ ourevent.info = 0;
+ DosPostEventSem( hevKeyLock );
+ break;
+
+ case VK_PAGEDOWN:
+ if ( magnification < MAX_MAG )
+ {
+ magnification += 1;
+ Adjust_Mag_Rectangle();
+ WinInvalidateRect( handle, NULL, FALSE );
+ }
+ break;
+
+ case VK_PAGEUP:
+ if ( magnification > 1 )
+ {
+ magnification -= 1;
+ Adjust_Mag_Rectangle();
+ WinInvalidateRect( handle, NULL, FALSE );
+ }
+ break;
+
+ case VK_LEFT:
+ if ( view_target.x > 0 )
+ {
+ view_target.x -= 1;
+ Adjust_Mag_Rectangle();
+ WinInvalidateRect( handle, NULL, FALSE );
+ }
+ break;
+
+ case VK_RIGHT:
+ if ( view_target.x < VIO_WIDTH - 1 )
+ {
+ view_target.x += 1;
+ Adjust_Mag_Rectangle();
+ WinInvalidateRect( handle, NULL, FALSE );
+ }
+ break;
+
+ case VK_DOWN:
+ if ( view_target.y > 0 )
+ {
+ view_target.y -= 1;
+ Adjust_Mag_Rectangle();
+ WinInvalidateRect( handle, NULL, FALSE );
+ }
+ break;
+
+ case VK_UP:
+ if ( view_target.y < VIO_HEIGHT - 1 )
+ {
+ view_target.y += 1;
+ Adjust_Mag_Rectangle();
+ WinInvalidateRect( handle, NULL, FALSE );
+ }
+ break;
+
+ case VK_F1: /* bring up help and about dialog window */
+ break;
+ }
+
+ if ( CHARMSG( &mess )->fs & KC_CHAR )
+ {
+ char c = (CHAR)CHARMSG( &mess )->chr ;
+
+
+ for ( i = 0; i < NUM_Translators; i++ )
+ {
+ if ( c == trans[i].key )
+ {
+ ourevent.what = trans[i].event_class;
+ ourevent.info = trans[i].event_info;
+ DosPostEventSem( hevKeyLock );
+ return (MRESULT)TRUE;
+ }
+ }
+
+ /* unrecognized keystroke */
+ ourevent.what = event_Keyboard;
+ ourevent.info = (int)c;
+ DosPostEventSem( hevKeyLock );
+ }
+ break;
+
+ default:
+ return WinDefWindowProc( handle, mess, parm1, parm2 );
+ }
+
+ return (MRESULT) FALSE;
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/arch/os2/gpm_os2.def b/xc/extras/FreeType/test/arch/os2/gpm_os2.def
new file mode 100644
index 000000000..4a77c632c
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/os2/gpm_os2.def
@@ -0,0 +1,5 @@
+NAME WINDOWCOMPAT
+
+DESCRIPTION 'FreeType Graphics'
+HEAPSIZE 8192
+STACKSIZE 40888
diff --git a/xc/extras/FreeType/test/arch/unix/Makefile.in b/xc/extras/FreeType/test/arch/unix/Makefile.in
new file mode 100644
index 000000000..ee91902c3
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/unix/Makefile.in
@@ -0,0 +1,152 @@
+# This file is part of the FreeType project.
+#
+# test/arch/unix/Makefile.in
+
+ARCH = arch/unix
+
+top_builddir=..
+
+VPATH = @srcdir@/../..
+srcdir = @srcdir@/../..
+
+RM = @RM@
+RMF = @RM@ -f
+RMDIR = @RMDIR@
+
+INSTALL = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+
+CC = @CC@
+CPP = @CPP@
+
+LIBTOOL = $(top_builddir)/libtool
+MKINSTALLDIRS = $(srcdir)/../mkinstalldirs
+
+include $(top_builddir)/MakeSub
+
+FT_LIBDIR = $(srcdir)/../lib
+INCDIRS = -I. -I$(srcdir) -I$(top_builddir) \
+ -I$(FT_LIBDIR) -I$(FT_LIBDIR)/extend
+
+CFLAGS = @CFLAGS@ @X_CFLAGS@ @XX_CFLAGS@
+CPPFLAGS = @CPPFLAGS@
+FT_CFLAGS = $(INCDIRS) $(CFLAGS) $(CPPFLAGS) -DX11 -DLOCALEDIR='"@LOCALEDIR@"'
+
+FT_LIBS = @X_LIBS@ @X_PRE_LIBS@ @X_EXTRA_LIBS@ @LIBS@
+
+SRC = $(srcdir)/common.c \
+ $(srcdir)/ftdump.c \
+ $(srcdir)/fterror.c \
+ $(srcdir)/ftlint.c \
+ $(srcdir)/ftstring.c \
+ $(srcdir)/ftstrpnm.c \
+ $(srcdir)/fttimer.c \
+ $(srcdir)/ftview.c \
+ $(srcdir)/ftzoom.c \
+ $(srcdir)/gmain.c \
+ $(srcdir)/$(ARCH)/gwin_x11.c
+
+DISPOBJS = common.o gmain.o display.o gwin_x11.o
+
+PROGRAMS = ftview fttimer ftlint ftdump ftzoom ftstring ftstrpnm fterror
+
+# set this variable to nil if you don't need to use Electric-Fence
+EFENCE =
+#EFENCE = -lefence
+
+
+# variables used to compile either with libtool or not
+#
+PROCESS = $(LIBTOOL) --mode=link $(CC) $(FT_CFLAGS)
+#PROCESS = $(CC) $(FT_CFLAGS)
+
+LIBTTF = $(top_builddir)/lib/libttf.la
+#LIBTTF =$(top_builddir)/lib/libttf.a
+
+.c.o:
+ $(CC) -c $(FT_CFLAGS) $<
+
+
+all: $(PROGRAMS)
+
+
+gwin_x11.o: $(srcdir)/$(ARCH)/gwin_x11.c
+ $(CC) -c $(FT_CFLAGS) $(srcdir)/$(ARCH)/gwin_x11.c
+
+ftzoom: ftzoom.o $(DISPOBJS) $(LIBTTF)
+ $(PROCESS) -o ftzoom ftzoom.o $(DISPOBJS) \
+ $(EFENCE) $(LIBTTF) $(FT_LIBS) -lX11
+
+fttimer: fttimer.o $(DISPOBJS) $(LIBTTF)
+ $(PROCESS) -o fttimer fttimer.o $(DISPOBJS) \
+ $(EFENCE) $(LIBTTF) $(FT_LIBS) -lX11
+
+ftview: ftview.o $(DISPOBJS) $(LIBTTF)
+ $(PROCESS) -o ftview ftview.o $(DISPOBJS) \
+ $(EFENCE) $(LIBTTF) $(FT_LIBS) -lX11
+
+ftlint: ftlint.o common.o $(LIBTTF)
+ $(PROCESS) -o ftlint ftlint.o common.o \
+ $(EFENCE) $(LIBTTF) $(FT_LIBS)
+
+ftdump: ftdump.o common.o $(LIBTTF)
+ $(PROCESS) -o ftdump ftdump.o common.o \
+ $(EFENCE) $(LIBTTF) $(FT_LIBS)
+
+ftstring: ftstring.o $(DISPOBJS) $(LIBTTF)
+ $(PROCESS) -o ftstring ftstring.o $(DISPOBJS) \
+ $(EFENCE) $(LIBTTF) $(FT_LIBS) -lX11
+
+# ftstrpnm does not need any extra libraries
+ftstrpnm: ftstrpnm.o common.o $(LIBTTF)
+ $(PROCESS) -o ftstrpnm ftstrpnm.o common.o \
+ $(EFENCE) $(LIBTTF)
+
+fterror: fterror.o common.o $(LIBTTF)
+ $(PROCESS) -o fterror fterror.o common.o \
+ $(EFENCE) $(LIBTTF) $(FT_LIBS)
+
+install: $(PROGRAMS)
+ $(MKINSTALLDIRS) $(bindir)
+ for P in $(PROGRAMS) ; do \
+ $(LIBTOOL) --mode=install $(INSTALL_PROGRAM) $$P $(bindir)/$$P ; \
+ done
+
+uninstall:
+ -for P in $(PROGRAMS) ; do \
+ $(LIBTOOL) --mode=uninstall $(RM) $(bindir)/$$P ; \
+ done
+
+clean: do_clean
+
+distclean: do_clean
+ -$(RMF) $(PROGRAMS)
+ -$(RMF) *~ *.orig core *.core
+ -$(RMF) config.cache config.log config.status
+ -$(RMF) $(ARCH)/Makefile
+ -$(RMF) .libs/*
+ -$(RMDIR) .libs
+
+do_clean:
+ -$(RMF) *.o
+
+depend:
+ (echo '/^#.* PUT NO STUFF BELOW/,$$d' ; echo w ; echo q) | \
+ ed - $(ARCH)/Makefile
+ echo '# Dependencies generated by make depend: PUT NO STUFF BELOW' \
+ >> $(ARCH)/Makefile
+ for file in $(SRC) ; do \
+ $(CPP) $(CPPFLAGS) $(INCDIRS) $$file | \
+ sed -n -e 's|^# [1-9][0-9]* "\([^/].*\.h\)".*|\1|p' \
+ -e 's|^# [1-9][0-9]* "\($(srcdir)/.*\.h\)".*|\1|p' | \
+ sed -e 's|/\./|.|g' -e "s/^/`basename $$file .c`.o: /" ; \
+ done | \
+ sort -u | \
+ awk '{ if (LINE == 1) \
+ { line = last = $$1 } \
+ else if ($$1 != last) \
+ { print line ; line = last = $$1 } \
+ line = line " " $$2 } \
+ END { print line }' >> $(ARCH)/Makefile
+
+# Dependencies generated by make depend: PUT NO STUFF BELOW
diff --git a/xc/extras/FreeType/test/arch/unix/gwin_x11.c b/xc/extras/FreeType/test/arch/unix/gwin_x11.c
new file mode 100644
index 000000000..b353a8bd2
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/unix/gwin_x11.c
@@ -0,0 +1,450 @@
+/*******************************************************************
+ *
+ * gwin_x11.c graphics utility X-Window driver. 1.0
+ *
+ * This is the driver for windowed display under X11, used by the
+ * graphics utility of the FreeType test suite.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "gdriver.h"
+#include "gmain.h"
+#include "gevents.h"
+
+#include "freetype.h"
+#include "common.h" /* for Panic() */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/cursorfont.h>
+
+ /* Translator added to ease changes to control keys */
+
+ typedef struct _Translator
+ {
+ char key;
+ GEvent event_class;
+ int event_info;
+ } Translator;
+
+#define NUM_Translators 20
+
+ static const Translator trans[NUM_Translators] =
+ {
+ { (char)27, event_Quit, 0 },
+ { 'q', event_Quit, 0 },
+
+ { 'x', event_Rotate_Glyph, -1 },
+ { 'c', event_Rotate_Glyph, 1 },
+ { 'v', event_Rotate_Glyph, -16 },
+ { 'b', event_Rotate_Glyph, 16 },
+
+ { '{', event_Change_Glyph, -10000 },
+ { '}', event_Change_Glyph, 10000 },
+ { '(', event_Change_Glyph, -1000 },
+ { ')', event_Change_Glyph, 1000 },
+ { '9', event_Change_Glyph, -100 },
+ { '0', event_Change_Glyph, 100 },
+ { 'i', event_Change_Glyph, -10 },
+ { 'o', event_Change_Glyph, 10 },
+ { 'k', event_Change_Glyph, -1 },
+ { 'l', event_Change_Glyph, 1 },
+
+ { '+', event_Scale_Glyph, 10 },
+ { '-', event_Scale_Glyph, -10 },
+ { 'u', event_Scale_Glyph, 1 },
+ { 'j', event_Scale_Glyph, -1 }
+ };
+
+ /* End of translators addition. See Get_Event() below */
+
+ extern char Header[]; /* defined in the test programs */
+
+ static Window win;
+ static GC gcblack;
+ static XColor color[5];
+
+ Display* display;
+ static char* displayname = "";
+
+ static XImage* image;
+
+ static Visual* visual;
+ static Colormap colormap;
+ static int depth;
+ static Bool gray;
+
+ static Cursor idle;
+ static Cursor busy;
+
+ static int win_origin_x, win_origin_y,
+ win_width, win_height;
+ static int image_width, image_height;
+
+ long vioBufOfs;
+
+
+
+ /* restore acreen to its original state */
+
+ int Driver_Restore_Mode( void )
+ {
+ XUnmapWindow( display, win );
+ XCloseDisplay( display );
+
+ return 1; /* success */
+ }
+
+
+ /* set graphics mode */
+
+ void x11init( void )
+ {
+ int screen_num, i;
+ XTextProperty xtp;
+ XSizeHints xsh;
+ XSetWindowAttributes xswa;
+
+#if 1
+ unsigned short colors[5] = { 0, 16, 32, 48, 63 }; /* gamma = 1.0 */
+#else
+ unsigned short colors[5] = { 0, 34, 46, 55, 63 }; /* gamma = 2.2 */
+#endif
+
+
+ XrmInitialize();
+
+ if( !( display = XOpenDisplay( displayname ) ) )
+ Panic( "ERROR: cannot open display\n" );
+
+ screen_num = DefaultScreen ( display );
+ colormap = DefaultColormap( display, screen_num );
+ depth = DefaultDepth ( display, screen_num );
+ visual = DefaultVisual ( display, screen_num );
+
+ idle = XCreateFontCursor( display, XC_left_ptr );
+ busy = XCreateFontCursor( display, XC_watch );
+
+ if ( gray )
+ {
+ int count;
+ XPixmapFormatValues* formats;
+
+
+ formats = XListPixmapFormats( display, &count );
+ vio_ScanLineWidth = 0;
+
+ while ( count > 0 )
+ {
+ --count;
+ if ( formats[count].depth == depth )
+ {
+ int bits;
+
+ bits = win_width * formats[count].bits_per_pixel;
+ if ( bits % formats[count].scanline_pad )
+ {
+ bits -= bits % formats[count].scanline_pad;
+ bits += formats[count].scanline_pad;
+ }
+
+ vio_ScanLineWidth = bits / 8;
+ break;
+ }
+ }
+ if ( !vio_ScanLineWidth )
+ Panic( "ERROR: the display doesn't offer a suitable pixmap format\n" );
+
+ XFree( formats );
+ }
+
+ Vio = (char*)malloc( win_height * vio_ScanLineWidth );
+
+ if ( !Vio )
+ Panic( "ERROR: cannot malloc display memory\n" );
+
+ xswa.border_pixel = BlackPixel( display, screen_num );
+ xswa.background_pixel = WhitePixel( display, screen_num );
+ xswa.cursor = busy;
+
+ xswa.event_mask = KeyPressMask | ExposureMask;
+
+ win = XCreateWindow( display,
+ RootWindow( display, screen_num ),
+ win_origin_x,
+ win_origin_y,
+ win_width,
+ win_height,
+ 10,
+ depth,
+ InputOutput,
+ visual,
+ CWBackPixel | CWBorderPixel | CWEventMask | CWCursor,
+ &xswa );
+
+ XMapWindow( display, win );
+
+ gcblack = XCreateGC( display, RootWindow( display, screen_num ),
+ 0L, NULL );
+ XSetForeground( display, gcblack, BlackPixel( display, screen_num ) );
+ XSetBackground( display, gcblack, WhitePixel( display, screen_num ) );
+
+ /* allocate colors */
+
+ if ( gray )
+ for ( i = 0; i < 5; i++ )
+ {
+ gray_palette[i] = i;
+
+ color[i].red =
+ color[i].green =
+ color[i].blue = 65535 - ( colors[i] * 65535 ) / 63;
+
+ if ( !XAllocColor( display, colormap, &color[i] ) )
+ Panic( "ERROR: cannot allocate Color\n" );
+ }
+
+ image = XCreateImage( display,
+ visual,
+ gray ? depth : 1,
+ gray ? ZPixmap : XYBitmap,
+ 0,
+ (char*)Vio,
+ win_width,
+ win_height,
+ 8,
+ 0 );
+ if ( !image )
+ Panic( "ERROR: cannot create image\n" );
+
+ if ( !gray )
+ {
+ image->byte_order = MSBFirst;
+ image->bitmap_bit_order = MSBFirst;
+ }
+
+ /* make window manager happy :-) */
+ xtp.value = (unsigned char*)"FreeType";
+ xtp.encoding = 31;
+ xtp.format = 8;
+ xtp.nitems = strlen( (char*)xtp.value );
+
+ xsh.x = win_origin_x;
+ xsh.y = win_origin_y;
+
+ xsh.width = win_width;
+ xsh.height = win_height;
+ xsh.flags = (PPosition | PSize);
+ xsh.flags = 0;
+
+ XSetWMProperties( display, win, &xtp, &xtp, NULL, 0, &xsh, NULL, NULL );
+ }
+
+
+ int Driver_Set_Graphics( int mode )
+ {
+ if ( mode == Graphics_Mode_Gray )
+ {
+ gray = 1;
+ vio_ScanLineWidth = 320;
+
+ win_origin_x = 0;
+ win_origin_y = 0;
+ win_width = 320;
+ win_height = 200;
+ }
+ else if ( mode == Graphics_Mode_Mono )
+ {
+ gray = 0;
+ vio_ScanLineWidth = 80;
+
+ win_origin_x = 0;
+ win_origin_y = 0;
+ win_width = 640;
+ win_height = 450;
+ }
+ else
+ Panic( "ERROR: mode %d not supported\n", mode );
+
+ vio_Width = win_width;
+ vio_Height = win_height;
+
+ x11init();
+
+ return 1; /* success */
+ }
+
+
+ void Put_Image( int x, int y, int w, int h )
+ {
+ XPutImage( display, win, gcblack, image, x, y, x, y, w, h );
+ }
+
+
+ int Driver_Display_Bitmap( char* buffer, int line, int col )
+ {
+ int z, y, used_col;
+ char* target;
+
+
+ XClearWindow( display, win );
+
+ /* this displays the Header string in the window title */
+ XStoreName( display, win, Header );
+
+ if ( line > win_height )
+ line = win_height;
+
+ if ( !gray )
+ {
+ if ( col > vio_ScanLineWidth )
+ used_col = vio_ScanLineWidth;
+ else
+ used_col = col;
+
+ target = Vio + ( line - 1 ) * vio_ScanLineWidth;
+
+ for ( y = 0; y < line; y++ )
+ {
+ memcpy( (char*)target, buffer, used_col );
+ target -= vio_ScanLineWidth;
+ buffer += col;
+ }
+
+ Put_Image( 0, 0, used_col * 8, line );
+ image_width = used_col * 8;
+ image_height = line;
+ }
+ else
+ {
+ if ( col > win_width )
+ used_col = win_width;
+ else
+ used_col = col;
+
+ for ( y = line - 1; y >= 0; y-- )
+ {
+ char* bufp;
+
+
+ bufp = buffer;
+
+ for ( z = 0; z < used_col; z++ )
+ {
+ int c;
+
+
+ c = *bufp++;
+
+ if ( c < 0 || c >= 5 ) /* security check */
+ {
+ /* Message( "weird grayshade: %d\n", c ); */
+ c = 0;
+ }
+ XPutPixel( image, z, y, color[c].pixel );
+ }
+
+ buffer += col;
+ }
+
+ Put_Image( 0, 0, used_col, line );
+ image_width = used_col;
+ image_height = line;
+ }
+
+ return 1;
+ }
+
+
+ /* This function maps X keystrokes into GEvents. Note that */
+ /* currently only keystrokes events exit this function. */
+
+ void Get_Event( TEvent* event )
+ {
+ static char key_buffer[10];
+ static int key_cursor = 0;
+ static int key_number = 0;
+ static XEvent x_event;
+ KeySym key;
+
+ int i, bool_exit;
+ char c;
+
+ XComposeStatus compose;
+
+
+ bool_exit = key_cursor < key_number;
+
+ XDefineCursor( display, win, idle );
+
+ while ( !bool_exit )
+ {
+ XNextEvent( display, &x_event );
+
+ switch ( x_event.type )
+ {
+ case KeyPress:
+ key_number = XLookupString( &x_event.xkey,
+ key_buffer,
+ sizeof ( key_buffer ),
+ &key,
+ &compose );
+ key_cursor = 0;
+
+ if ( key_number > 0 )
+ bool_exit = 1;
+ break;
+
+ case MappingNotify:
+ XRefreshKeyboardMapping( &x_event.xmapping );
+ break;
+
+ case Expose:
+#if 0
+ Put_Image( x_event.xexpose.x,
+ x_event.xexpose.y,
+ x_event.xexpose.width,
+ x_event.xexpose.height );
+#else
+ /* we always redraw the whole image */
+ Put_Image( 0, 0, image_width, image_height );
+#endif
+ break;
+
+ /* You should add more cases to handle mouse events, etc. */
+ }
+ }
+
+ XDefineCursor( display, win, busy );
+ XFlush ( display );
+
+ c = key_buffer[key_cursor++];
+
+ for ( i = 0; i < NUM_Translators; i++ )
+ {
+ if ( c == trans[i].key )
+ {
+ event->what = trans[i].event_class;
+ event->info = trans[i].event_info;
+ return;
+ }
+ }
+
+ event->what = event_Keyboard;
+ event->info = (int)c;
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/arch/win32/Driver32.c b/xc/extras/FreeType/test/arch/win32/Driver32.c
new file mode 100644
index 000000000..4031c8661
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/Driver32.c
@@ -0,0 +1,104 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+#include <windows.h>
+#include "gdriver.h"
+#include "freetype.h"
+//#include <varargs.h>
+#include <stdarg.h>
+#include <string.h>
+#include <stdio.h>
+#include <setjmp.h>
+HANDLE evgetevent,evdriverdisplaybitmap,this_wnd,main_thread,listbox,bitmap;
+TEvent evevent;
+char message_32[256];
+char *ev_buffer;
+jmp_buf Env;
+long TTMemory_Allocated = 0; // just to have a clean link with ftdump
+// save last rendered image Data
+int save_lines,save_cols,exit_code;
+char *save_buffer;
+extern int vio_Width,vio_Height,vio_ScanLineWidth;
+extern TT_Raster_Map Bit;
+HDC hdc,memdc;
+HBITMAP hbm,hbm1;
+
+//________________________________________________________________________________
+void Get_Event(TEvent *event)
+{
+ WaitForSingleObject(evgetevent,INFINITE); // wait for completion
+ *event=evevent; //set by message handler before posting waited upon event
+ return;
+}
+
+int Driver_Set_Graphics( int mode )
+{ RECT rect;
+ GetClientRect(bitmap,&rect);
+ vio_Width=rect.right-rect.left;
+ vio_Height = rect.bottom-rect.top;
+ vio_ScanLineWidth=vio_Width;
+ return 1;
+
+ }
+int Driver_Restore_Mode()
+{return 1;}
+
+int Driver_Display_Bitmap( char* buffer, int lines, int cols )
+ {
+ long rc;
+ int i;
+ char *top,*bottom;
+ HANDLE rgdi;
+ RECT rect;
+ char *w_buffer;
+// bitmap=listbox;
+ hdc=GetDC(bitmap);
+ memdc=CreateCompatibleDC(hdc);
+ GetClientRect(bitmap,&rect);
+ //hbm=CreateCompatibleBitmap(hdc,lines,cols);
+ // need to set upside down bitmap .
+ if (buffer != save_buffer) //new buffer
+ {
+ if (save_buffer!=NULL)
+ free(save_buffer);
+ save_buffer=(char *)malloc(Bit.size);
+ memcpy(save_buffer,buffer,Bit.size);
+ }
+ w_buffer=malloc(Bit.size); // hope it succeeds
+ top=buffer;
+ bottom=w_buffer+Bit.size-cols;
+ for(i=0;i<Bit.size;i+=cols)
+ {
+ memcpy(bottom,top,cols);
+ top+=cols;
+ bottom-=cols;
+ };
+ save_lines=lines;
+ save_cols=cols;
+ hbm=CreateBitmap(vio_Width,vio_Height,1,1,w_buffer);
+ rgdi=SelectObject(memdc,hbm);
+ // rc=SetBitmapBits(hbm,Bit.size,buffer); //redundant
+ rc=StretchBlt(hdc,0,0,rect.right,rect.bottom,memdc,0,0,rect.right,rect.bottom,MERGECOPY);
+ ReleaseDC(bitmap,hdc);
+ DeleteObject(memdc);
+ rc=UpdateWindow(bitmap);
+ return 1;
+ }
+
+
+int call_test_program(int (*program)(int,char**),int argc,char **argv)
+{int rc;
+// prepare return address ( for exit)
+if(0==setjmp(Env)) //env set : call prog
+ rc=program(argc,argv);
+ return rc;
+}
+
+void force_exit(int code)
+{ char *p=NULL;
+ longjmp(Env,code);
+ //disable piping
+} \ No newline at end of file
diff --git a/xc/extras/FreeType/test/arch/win32/ReadMe.txt b/xc/extras/FreeType/test/arch/win32/ReadMe.txt
new file mode 100644
index 000000000..4356a2f42
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/ReadMe.txt
@@ -0,0 +1,17 @@
+The purpose of this application is to serve as a running environment for
+some of the freetype project test programs:
+currently available programa aree ftdump,ftlint,,ftstring,ftview;
+others may be convinced to run but you may need to change the source
+code to avoid duplicate problems with the linker.
+This work has been based on a large amount of guesswork
+and a small amount of my (little) spare time;
+however it seems to be working pretty well as far as I can tell
+( -g -r options are not working but I don't care 'bout them).
+It can be compiled both under MS VC++ Version 4.X and Version 5.
+and has been tested under Windows 95 & NT 4.0 .
+
+Have Fun .
+ Giancarlo Ramat
+ (gcramat@radiostudio.it)
+
+ \ No newline at end of file
diff --git a/xc/extras/FreeType/test/arch/win32/Resource.h b/xc/extras/FreeType/test/arch/win32/Resource.h
new file mode 100644
index 000000000..f1a409420
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/Resource.h
@@ -0,0 +1,24 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by testw32.rc
+//
+#define IDD_TESTW32_DIALOG 102
+#define IDR_MAINFRAME 128
+#define IDC_FONT_NAME 1000
+#define IDC_BITMAP 1001
+#define IDC_LIST_BOX 1002
+#define IDC_SELECT_ACTION 1003
+#define IDC_ACTION 1004
+#define IDC_TEST_PROGRAM 1005
+#define IDC_OPTIONS 1007
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 130
+#define _APS_NEXT_COMMAND_VALUE 32771
+#define _APS_NEXT_CONTROL_VALUE 1008
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/xc/extras/FreeType/test/arch/win32/StdAfx.cpp b/xc/extras/FreeType/test/arch/win32/StdAfx.cpp
new file mode 100644
index 000000000..7b5c0a771
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/StdAfx.cpp
@@ -0,0 +1,6 @@
+// stdafx.cpp : source file that includes just the standard includes
+// testw32.pch will be the pre-compiled header
+// stdafx.obj will contain the pre-compiled type information
+
+#include "stdafx.h"
+
diff --git a/xc/extras/FreeType/test/arch/win32/StdAfx.h b/xc/extras/FreeType/test/arch/win32/StdAfx.h
new file mode 100644
index 000000000..30170c575
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/StdAfx.h
@@ -0,0 +1,25 @@
+// stdafx.h : include file for standard system include files,
+// or project specific include files that are used frequently, but
+// are changed infrequently
+//
+
+#if !defined(AFX_STDAFX_H__70F52CAD_06A4_11D2_9AC4_0060978849F3__INCLUDED_)
+#define AFX_STDAFX_H__70F52CAD_06A4_11D2_9AC4_0060978849F3__INCLUDED_
+
+#if _MSC_VER >= 1000
+#pragma once
+#endif // _MSC_VER >= 1000
+
+#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers
+
+#include <afxwin.h> // MFC core and standard components
+#include <afxext.h> // MFC extensions
+#ifndef _AFX_NO_AFXCMN_SUPPORT
+#include <afxcmn.h> // MFC support for Windows Common Controls
+#endif // _AFX_NO_AFXCMN_SUPPORT
+
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_STDAFX_H__70F52CAD_06A4_11D2_9AC4_0060978849F3__INCLUDED_)
diff --git a/xc/extras/FreeType/test/arch/win32/TESTW32.DSP b/xc/extras/FreeType/test/arch/win32/TESTW32.DSP
new file mode 100644
index 000000000..2b1a1d740
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/TESTW32.DSP
@@ -0,0 +1,190 @@
+# Microsoft Developer Studio Project File - Name="testw32" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 5.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=testw32 - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "testw32.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "testw32.mak" CFG="testw32 - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "testw32 - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "testw32 - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "testw32 - Win32 Release"
+
+# PROP BASE Use_MFC 6
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 6
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x410 /d "NDEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x410 /d "NDEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386
+# ADD LINK32 /nologo /subsystem:windows /machine:I386
+
+!ELSEIF "$(CFG)" == "testw32 - Win32 Debug"
+
+# PROP BASE Use_MFC 6
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 6
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /Yu"stdafx.h" /FD /c
+# ADD CPP /nologo /G5 /MDd /W3 /Gm /Zi /Od /I "../../../LIB" /I "../" /I "../../../lib/arch/win32" /I "../../" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "WIN32_GR_TEST" /FD /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
+# ADD BASE RSC /l 0x410 /d "_DEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x410 /d "_DEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 freetype.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"..\..\..\lib\arch\win32\release" /libpath:"..\..\..\lib\arch\win32\debug" /FORCE:MULTIPLE /FORCE:UNRESOLVED
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF
+
+# Begin Target
+
+# Name "testw32 - Win32 Release"
+# Name "testw32 - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\display.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\driver32.c
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\gmain.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\hack_common.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\hack_ftdump.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\hack_ftlint.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\hack_ftstring.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\hack_fttimer.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\hack_ftview.c
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.cpp
+# ADD CPP /Yc"stdafx.h"
+# End Source File
+# Begin Source File
+
+SOURCE=.\testw32.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\testw32.rc
+
+!IF "$(CFG)" == "testw32 - Win32 Release"
+
+!ELSEIF "$(CFG)" == "testw32 - Win32 Debug"
+
+!ENDIF
+
+# End Source File
+# Begin Source File
+
+SOURCE=.\testw32Dlg.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\Resource.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\StdAfx.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\testw32.h
+# End Source File
+# Begin Source File
+
+SOURCE=.\testw32Dlg.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+# Begin Source File
+
+SOURCE=.\res\testw32.ico
+# End Source File
+# Begin Source File
+
+SOURCE=.\res\testw32.rc2
+# End Source File
+# End Group
+# Begin Source File
+
+SOURCE=.\ReadMe.txt
+# End Source File
+# End Target
+# End Project
diff --git a/xc/extras/FreeType/test/arch/win32/TESTW32.DSW b/xc/extras/FreeType/test/arch/win32/TESTW32.DSW
new file mode 100644
index 000000000..6c37bebc5
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/TESTW32.DSW
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 5.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "testw32"=.\testw32.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/xc/extras/FreeType/test/arch/win32/TESTW32.H b/xc/extras/FreeType/test/arch/win32/TESTW32.H
new file mode 100644
index 000000000..e8740af71
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/TESTW32.H
@@ -0,0 +1,50 @@
+// testw32.h : main header file for the TESTW32 application
+//
+
+#if !defined(AFX_TESTW32_H__70F52CA9_06A4_11D2_9AC4_0060978849F3__INCLUDED_)
+#define AFX_TESTW32_H__70F52CA9_06A4_11D2_9AC4_0060978849F3__INCLUDED_
+
+#if _MSC_VER >= 1000
+#pragma once
+#endif // _MSC_VER >= 1000
+
+#ifndef __AFXWIN_H__
+ #error include 'stdafx.h' before including this file for PCH
+#endif
+
+#include "resource.h" // main symbols
+
+/////////////////////////////////////////////////////////////////////////////
+// CTestw32App:
+// See testw32.cpp for the implementation of this class
+//
+
+class CTestw32App : public CWinApp
+{
+public:
+ CTestw32App();
+
+// Overrides
+ // ClassWizard generated virtual function overrides
+ //{{AFX_VIRTUAL(CTestw32App)
+ public:
+ virtual BOOL InitInstance();
+ virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
+ //}}AFX_VIRTUAL
+
+// Implementation
+
+ //{{AFX_MSG(CTestw32App)
+ // NOTE - the ClassWizard will add and remove member functions here.
+ // DO NOT EDIT what you see in these blocks of generated code !
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+};
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_TESTW32_H__70F52CA9_06A4_11D2_9AC4_0060978849F3__INCLUDED_)
diff --git a/xc/extras/FreeType/test/arch/win32/Testw32.cpp b/xc/extras/FreeType/test/arch/win32/Testw32.cpp
new file mode 100644
index 000000000..5591d6f47
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/Testw32.cpp
@@ -0,0 +1,79 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+// testw32.cpp : Defines the class behaviors for the application.
+//
+
+#include "stdafx.h"
+#include "testw32.h"
+#include "testw32Dlg.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+// CTestw32App
+
+BEGIN_MESSAGE_MAP(CTestw32App, CWinApp)
+ //{{AFX_MSG_MAP(CTestw32App)
+ // NOTE - the ClassWizard will add and remove mapping macros here.
+ // DO NOT EDIT what you see in these blocks of generated code!
+ //}}AFX_MSG
+ ON_COMMAND(ID_HELP, CWinApp::OnHelp)
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CTestw32App construction
+
+CTestw32App::CTestw32App()
+{
+ // TODO: add construction code here,
+ // Place all significant initialization in InitInstance
+}
+
+/////////////////////////////////////////////////////////////////////////////
+// The one and only CTestw32App object
+
+CTestw32App theApp;
+
+/////////////////////////////////////////////////////////////////////////////
+// CTestw32App initialization
+
+BOOL CTestw32App::InitInstance()
+{
+ // Standard initialization
+ // If you are not using these features and wish to reduce the size
+ // of your final executable, you should remove from the following
+ // the specific initialization routines you do not need.
+
+ CTestw32Dlg dlg;
+ m_pMainWnd = &dlg;
+ int nResponse = dlg.DoModal();
+ if (nResponse == IDOK)
+ {
+ // TODO: Place code here to handle when the dialog is
+ // dismissed with OK
+ }
+ else if (nResponse == IDCANCEL)
+ {
+ // TODO: Place code here to handle when the dialog is
+ // dismissed with Cancel
+ }
+
+ // Since the dialog has been closed, return FALSE so that we exit the
+ // application, rather than start the application's message pump.
+ return FALSE;
+}
+
+BOOL CTestw32App::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
+{
+ // TODO: Add your specialized code here and/or call the base class
+
+ return CWinApp::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
+}
diff --git a/xc/extras/FreeType/test/arch/win32/Testw32.mak b/xc/extras/FreeType/test/arch/win32/Testw32.mak
new file mode 100644
index 000000000..1d999e87c
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/Testw32.mak
@@ -0,0 +1,533 @@
+# Microsoft Developer Studio Generated NMAKE File, Format Version 4.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+!IF "$(CFG)" == ""
+CFG=testw32 - Win32 Debug
+!MESSAGE No configuration specified. Defaulting to testw32 - Win32 Debug.
+!ENDIF
+
+!IF "$(CFG)" != "testw32 - Win32 Release" && "$(CFG)" !=\
+ "testw32 - Win32 Debug"
+!MESSAGE Invalid configuration "$(CFG)" specified.
+!MESSAGE You can specify a configuration when running NMAKE on this makefile
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "Testw32.mak" CFG="testw32 - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "testw32 - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "testw32 - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+!ERROR An invalid configuration is specified.
+!ENDIF
+
+!IF "$(OS)" == "Windows_NT"
+NULL=
+!ELSE
+NULL=nul
+!ENDIF
+################################################################################
+# Begin Project
+# PROP Target_Last_Scanned "testw32 - Win32 Debug"
+MTL=mktyplib.exe
+RSC=rc.exe
+CPP=cl.exe
+
+!IF "$(CFG)" == "testw32 - Win32 Release"
+
+# PROP BASE Use_MFC 6
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 6
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+OUTDIR=.\Release
+INTDIR=.\Release
+
+ALL : "$(OUTDIR)\Testw32.exe" "$(OUTDIR)\Testw32.pch"
+
+CLEAN :
+ -@erase ".\Release\Testw32.pch"
+ -@erase ".\Release\Testw32.exe"
+ -@erase ".\Release\hack_ftview.obj"
+ -@erase ".\Release\testw32.obj"
+ -@erase ".\Release\hack_fttimer.obj"
+ -@erase ".\Release\hack_common.obj"
+ -@erase ".\Release\Driver32.obj"
+ -@erase ".\Release\StdAfx.obj"
+ -@erase ".\Release\hack_ftlint.obj"
+ -@erase ".\Release\testw32Dlg.obj"
+ -@erase ".\Release\Gmain.obj"
+ -@erase ".\Release\hack_ftdump.obj"
+ -@erase ".\Release\hack_ftstring.obj"
+ -@erase ".\Release\Display.obj"
+ -@erase ".\Release\testw32.res"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yu"stdafx.h" /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\lib" /I "..\..\" /I "..\..\..\" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /YX"stdafx.h" /c
+CPP_PROJ=/nologo /MD /W3 /GX /O2 /I "..\..\..\lib" /I "..\..\" /I "..\..\..\"\
+ /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS"\
+ /Fp"$(INTDIR)/Testw32.pch" /YX"stdafx.h" /Fo"$(INTDIR)/" /c
+CPP_OBJS=.\Release/
+CPP_SBRS=
+# ADD BASE MTL /nologo /D "NDEBUG" /win32
+# ADD MTL /nologo /D "NDEBUG" /win32
+MTL_PROJ=/nologo /D "NDEBUG" /win32
+# ADD BASE RSC /l 0x410 /d "NDEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x410 /d "NDEBUG" /d "_AFXDLL"
+RSC_PROJ=/l 0x410 /fo"$(INTDIR)/testw32.res" /d "NDEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/Testw32.bsc"
+BSC32_SBRS=
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386
+# ADD LINK32 freetype.lib /nologo /subsystem:windows /machine:I386
+LINK32_FLAGS=freetype.lib /nologo /subsystem:windows /incremental:no\
+ /pdb:"$(OUTDIR)/Testw32.pdb" /machine:I386 /out:"$(OUTDIR)/Testw32.exe"
+LINK32_OBJS= \
+ "$(INTDIR)/hack_ftview.obj" \
+ "$(INTDIR)/testw32.obj" \
+ "$(INTDIR)/hack_fttimer.obj" \
+ "$(INTDIR)/hack_common.obj" \
+ "$(INTDIR)/Driver32.obj" \
+ "$(INTDIR)/StdAfx.obj" \
+ "$(INTDIR)/hack_ftlint.obj" \
+ "$(INTDIR)/testw32Dlg.obj" \
+ "$(INTDIR)/Gmain.obj" \
+ "$(INTDIR)/hack_ftdump.obj" \
+ "$(INTDIR)/hack_ftstring.obj" \
+ "$(INTDIR)/Display.obj" \
+ "$(INTDIR)/testw32.res"
+
+"$(OUTDIR)\Testw32.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ELSEIF "$(CFG)" == "testw32 - Win32 Debug"
+
+# PROP BASE Use_MFC 6
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 6
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+OUTDIR=.\Debug
+INTDIR=.\Debug
+
+ALL : "$(OUTDIR)\Testw32.exe" "$(OUTDIR)\Testw32.pch"
+
+CLEAN :
+ -@erase ".\Debug\vc40.pdb"
+ -@erase ".\Debug\vc40.idb"
+ -@erase ".\Debug\Testw32.pch"
+ -@erase ".\Debug\Testw32.exe"
+ -@erase ".\Debug\StdAfx.obj"
+ -@erase ".\Debug\Display.obj"
+ -@erase ".\Debug\hack_ftlint.obj"
+ -@erase ".\Debug\hack_fttimer.obj"
+ -@erase ".\Debug\hack_ftdump.obj"
+ -@erase ".\Debug\Driver32.obj"
+ -@erase ".\Debug\hack_ftview.obj"
+ -@erase ".\Debug\testw32Dlg.obj"
+ -@erase ".\Debug\testw32.obj"
+ -@erase ".\Debug\Gmain.obj"
+ -@erase ".\Debug\hack_ftstring.obj"
+ -@erase ".\Debug\hack_common.obj"
+ -@erase ".\Debug\testw32.res"
+ -@erase ".\Debug\Testw32.ilk"
+ -@erase ".\Debug\Testw32.pdb"
+
+"$(OUTDIR)" :
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"
+
+# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Yu"stdafx.h" /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "c:\winlib\freetype.orig\test" /I "..\..\..\lib" /I "..\..\..\lib\arch\win32" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /YX"stdafx.h" /c
+CPP_PROJ=/nologo /MDd /W3 /Gm /GX /Zi /Od /I "c:\winlib\freetype.orig\test" /I\
+ "..\..\..\lib" /I "..\..\..\lib\arch\win32" /D "WIN32" /D "_DEBUG" /D\
+ "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"$(INTDIR)/Testw32.pch" /YX"stdafx.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c
+CPP_OBJS=.\Debug/
+CPP_SBRS=
+# ADD BASE MTL /nologo /D "_DEBUG" /win32
+# ADD MTL /nologo /D "_DEBUG" /win32
+MTL_PROJ=/nologo /D "_DEBUG" /win32
+# ADD BASE RSC /l 0x410 /d "_DEBUG" /d "_AFXDLL"
+# ADD RSC /l 0x410 /d "_DEBUG" /d "_AFXDLL"
+RSC_PROJ=/l 0x410 /fo"$(INTDIR)/testw32.res" /d "_DEBUG" /d "_AFXDLL"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+BSC32_FLAGS=/nologo /o"$(OUTDIR)/Testw32.bsc"
+BSC32_SBRS=
+LINK32=link.exe
+# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386
+# ADD LINK32 ..\..\..\lib\arch\win32\debug\freetype.lib /nologo /subsystem:windows /debug /machine:I386
+LINK32_FLAGS=..\..\..\lib\arch\win32\debug\freetype.lib /nologo\
+ /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)/Testw32.pdb" /debug\
+ /machine:I386 /out:"$(OUTDIR)/Testw32.exe"
+LINK32_OBJS= \
+ "$(INTDIR)/StdAfx.obj" \
+ "$(INTDIR)/Display.obj" \
+ "$(INTDIR)/hack_ftlint.obj" \
+ "$(INTDIR)/hack_fttimer.obj" \
+ "$(INTDIR)/hack_ftdump.obj" \
+ "$(INTDIR)/Driver32.obj" \
+ "$(INTDIR)/hack_ftview.obj" \
+ "$(INTDIR)/testw32Dlg.obj" \
+ "$(INTDIR)/testw32.obj" \
+ "$(INTDIR)/Gmain.obj" \
+ "$(INTDIR)/hack_ftstring.obj" \
+ "$(INTDIR)/hack_common.obj" \
+ "$(INTDIR)/testw32.res"
+
+"$(OUTDIR)\Testw32.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)
+ $(LINK32) @<<
+ $(LINK32_FLAGS) $(LINK32_OBJS)
+<<
+
+!ENDIF
+
+.c{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_OBJS)}.obj:
+ $(CPP) $(CPP_PROJ) $<
+
+.c{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cpp{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+.cxx{$(CPP_SBRS)}.sbr:
+ $(CPP) $(CPP_PROJ) $<
+
+################################################################################
+# Begin Target
+
+# Name "testw32 - Win32 Release"
+# Name "testw32 - Win32 Debug"
+
+!IF "$(CFG)" == "testw32 - Win32 Release"
+
+!ELSEIF "$(CFG)" == "testw32 - Win32 Debug"
+
+!ENDIF
+
+################################################################################
+# Begin Source File
+
+SOURCE=.\ReadMe.txt
+
+!IF "$(CFG)" == "testw32 - Win32 Release"
+
+!ELSEIF "$(CFG)" == "testw32 - Win32 Debug"
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\testw32.cpp
+DEP_CPP_TESTW=\
+ ".\StdAfx.h"\
+ ".\testw32.h"\
+ ".\testw32Dlg.h"\
+
+
+"$(INTDIR)\testw32.obj" : $(SOURCE) $(DEP_CPP_TESTW) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\testw32Dlg.cpp
+DEP_CPP_TESTW3=\
+ ".\StdAfx.h"\
+ ".\testw32.h"\
+ ".\testw32Dlg.h"\
+ ".\..\..\gdriver.h"\
+ ".\..\..\gevents.h"\
+
+
+"$(INTDIR)\testw32Dlg.obj" : $(SOURCE) $(DEP_CPP_TESTW3) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\StdAfx.cpp
+DEP_CPP_STDAF=\
+ ".\StdAfx.h"\
+
+
+!IF "$(CFG)" == "testw32 - Win32 Release"
+
+# ADD CPP /Yc"stdafx.h"
+
+BuildCmds= \
+ $(CPP) /nologo /MD /W3 /GX /O2 /I "..\..\..\lib" /I "..\..\" /I "..\..\..\" /D\
+ "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS"\
+ /Fp"$(INTDIR)/Testw32.pch" /Yc"stdafx.h" /Fo"$(INTDIR)/" /c $(SOURCE) \
+
+
+"$(INTDIR)\StdAfx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+ $(BuildCmds)
+
+"$(INTDIR)\Testw32.pch" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+ $(BuildCmds)
+
+!ELSEIF "$(CFG)" == "testw32 - Win32 Debug"
+
+# ADD CPP /Yc"stdafx.h"
+
+BuildCmds= \
+ $(CPP) /nologo /MDd /W3 /Gm /GX /Zi /Od /I "c:\winlib\freetype.orig\test" /I\
+ "..\..\..\lib" /I "..\..\..\lib\arch\win32" /D "WIN32" /D "_DEBUG" /D\
+ "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fp"$(INTDIR)/Testw32.pch" /Yc"stdafx.h"\
+ /Fo"$(INTDIR)/" /Fd"$(INTDIR)/" /c $(SOURCE) \
+
+
+"$(INTDIR)\StdAfx.obj" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+ $(BuildCmds)
+
+"$(INTDIR)\Testw32.pch" : $(SOURCE) $(DEP_CPP_STDAF) "$(INTDIR)"
+ $(BuildCmds)
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\testw32.rc
+DEP_RSC_TESTW32=\
+ ".\res\testw32.ico"\
+ ".\res\testw32.rc2"\
+
+
+"$(INTDIR)\testw32.res" : $(SOURCE) $(DEP_RSC_TESTW32) "$(INTDIR)"
+ $(RSC) $(RSC_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\hack_ftview.c
+DEP_CPP_HACK_=\
+ ".\..\..\ftview.c"\
+ ".\..\..\..\lib\freetype.h"\
+ ".\..\..\common.h"\
+ ".\..\..\gmain.h"\
+ ".\..\..\gevents.h"\
+ ".\..\..\gdriver.h"\
+ ".\..\..\display.h"\
+ "..\..\..\Lib\Fterrid.h"\
+ "..\..\..\Lib\Ftnameid.h"\
+
+NODEP_CPP_HACK_=\
+ ".\..\..\std.h"\
+ ".\..\..\graflink.h"\
+ ".\..\..\armsup.c"\
+
+
+"$(INTDIR)\hack_ftview.obj" : $(SOURCE) $(DEP_CPP_HACK_) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\hack_common.c
+DEP_CPP_HACK_C=\
+ ".\..\..\common.c"\
+ ".\..\..\common.h"\
+
+
+"$(INTDIR)\hack_common.obj" : $(SOURCE) $(DEP_CPP_HACK_C) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\hack_ftdump.c
+
+!IF "$(CFG)" == "testw32 - Win32 Release"
+
+DEP_CPP_HACK_F=\
+ ".\..\..\ftdump.c"\
+ ".\..\..\..\lib\freetype.h"\
+ ".\..\..\common.h"\
+ ".\..\..\..\lib\ttobjs.h"\
+ "..\..\..\Lib\Fterrid.h"\
+ "..\..\..\Lib\Ftnameid.h"\
+ ".\..\..\..\lib\ttconfig.h"\
+ ".\..\..\..\lib\ttengine.h"\
+ ".\..\..\..\lib\ttmutex.h"\
+ ".\..\..\..\lib\ttcache.h"\
+ ".\..\..\..\lib\tttables.h"\
+ ".\..\..\..\lib\ttcmap.h"\
+ ".\..\..\..\lib\tttypes.h"\
+
+NODEP_CPP_HACK_F=\
+ ".\..\..\std.h"\
+ ".\..\..\graflink.h"\
+ ".\..\..\armsup.c"\
+ ".\..\..\ftxerr18.h"\
+ ".\..\..\..\lib\ft_conf.h"\
+
+
+"$(INTDIR)\hack_ftdump.obj" : $(SOURCE) $(DEP_CPP_HACK_F) "$(INTDIR)"
+
+
+!ELSEIF "$(CFG)" == "testw32 - Win32 Debug"
+
+DEP_CPP_HACK_F=\
+ ".\..\..\ftdump.c"\
+
+
+"$(INTDIR)\hack_ftdump.obj" : $(SOURCE) $(DEP_CPP_HACK_F) "$(INTDIR)"
+
+
+!ENDIF
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\hack_ftlint.c
+DEP_CPP_HACK_FT=\
+ ".\..\..\ftlint.c"\
+ ".\..\..\..\lib\freetype.h"\
+ "..\..\..\Lib\Fterrid.h"\
+ "..\..\..\Lib\Ftnameid.h"\
+
+NODEP_CPP_HACK_FT=\
+ ".\..\..\std.h"\
+ ".\..\..\graflink.h"\
+ ".\..\..\armsup.c"\
+ ".\..\..\ftxerr18.h"\
+
+
+"$(INTDIR)\hack_ftlint.obj" : $(SOURCE) $(DEP_CPP_HACK_FT) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\hack_ftstring.c
+DEP_CPP_HACK_FTS=\
+ ".\..\..\ftstring.c"\
+ ".\..\..\..\lib\freetype.h"\
+ ".\..\..\common.h"\
+ ".\..\..\gmain.h"\
+ ".\..\..\gevents.h"\
+ ".\..\..\gdriver.h"\
+ ".\..\..\display.h"\
+ "..\..\..\Lib\Fterrid.h"\
+ "..\..\..\Lib\Ftnameid.h"\
+
+NODEP_CPP_HACK_FTS=\
+ ".\..\..\std.h"\
+ ".\..\..\graflink.h"\
+ ".\..\..\armsup.c"\
+
+
+"$(INTDIR)\hack_ftstring.obj" : $(SOURCE) $(DEP_CPP_HACK_FTS) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\hack_fttimer.c
+DEP_CPP_HACK_FTT=\
+ ".\..\..\fttimer.c"\
+ ".\..\..\..\lib\freetype.h"\
+ ".\..\..\common.h"\
+ ".\..\..\gmain.h"\
+ ".\..\..\gdriver.h"\
+ ".\..\..\gevents.h"\
+ "..\..\..\Lib\Fterrid.h"\
+ "..\..\..\Lib\Ftnameid.h"\
+
+
+"$(INTDIR)\hack_fttimer.obj" : $(SOURCE) $(DEP_CPP_HACK_FTT) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=.\Driver32.c
+DEP_CPP_DRIVE=\
+ ".\..\..\gdriver.h"\
+ ".\..\..\..\lib\freetype.h"\
+ "..\..\..\Lib\Fterrid.h"\
+ "..\..\..\Lib\Ftnameid.h"\
+
+
+"$(INTDIR)\Driver32.obj" : $(SOURCE) $(DEP_CPP_DRIVE) "$(INTDIR)"
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=\Winlib\freetype.orig\Test\Gmain.c
+DEP_CPP_GMAIN=\
+ ".\..\..\gmain.h"\
+ ".\..\..\gdriver.h"\
+
+
+"$(INTDIR)\Gmain.obj" : $(SOURCE) $(DEP_CPP_GMAIN) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+################################################################################
+# Begin Source File
+
+SOURCE=\Winlib\freetype.orig\Test\Display.c
+DEP_CPP_DISPL=\
+ ".\..\..\..\lib\freetype.h"\
+ ".\..\..\gmain.h"\
+ ".\..\..\display.h"\
+ "..\..\..\Lib\Fterrid.h"\
+ "..\..\..\Lib\Ftnameid.h"\
+
+
+"$(INTDIR)\Display.obj" : $(SOURCE) $(DEP_CPP_DISPL) "$(INTDIR)"
+ $(CPP) $(CPP_PROJ) $(SOURCE)
+
+
+# End Source File
+# End Target
+# End Project
+################################################################################
diff --git a/xc/extras/FreeType/test/arch/win32/hack_common.c b/xc/extras/FreeType/test/arch/win32/hack_common.c
new file mode 100644
index 000000000..df573255e
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/hack_common.c
@@ -0,0 +1,8 @@
+
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+#define exit(code) force_exit(code)
+#include <common.c>
diff --git a/xc/extras/FreeType/test/arch/win32/hack_ftdump.c b/xc/extras/FreeType/test/arch/win32/hack_ftdump.c
new file mode 100644
index 000000000..9b2a25ea9
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/hack_ftdump.c
@@ -0,0 +1,9 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+#define exit(code) force_exit(code)
+#define main(A,B) ftdump(A,B)
+#include <ftdump.c>
diff --git a/xc/extras/FreeType/test/arch/win32/hack_ftlint.c b/xc/extras/FreeType/test/arch/win32/hack_ftlint.c
new file mode 100644
index 000000000..80468ac87
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/hack_ftlint.c
@@ -0,0 +1,9 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+#define exit(code) force_exit(code)
+#define main(A,B) ftlint(A,B)
+#include <ftlint.c>
diff --git a/xc/extras/FreeType/test/arch/win32/hack_ftstring.c b/xc/extras/FreeType/test/arch/win32/hack_ftstring.c
new file mode 100644
index 000000000..39953be56
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/hack_ftstring.c
@@ -0,0 +1,9 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+#define exit(code) force_exit(code)
+#define main(A,B) ftstring(A,B)
+#include <ftstring.c>
diff --git a/xc/extras/FreeType/test/arch/win32/hack_fttimer.c b/xc/extras/FreeType/test/arch/win32/hack_fttimer.c
new file mode 100644
index 000000000..b438db367
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/hack_fttimer.c
@@ -0,0 +1,9 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+#define exit(code) force_exit(code)
+#define main(A,B) fttimer(A,B)
+#include <fttimer.c>
diff --git a/xc/extras/FreeType/test/arch/win32/hack_ftview.c b/xc/extras/FreeType/test/arch/win32/hack_ftview.c
new file mode 100644
index 000000000..dc9b26515
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/hack_ftview.c
@@ -0,0 +1,9 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+#define exit(code) force_exit(code)
+#define main(A,B) ftview(A,B)
+#include <ftview.c>
diff --git a/xc/extras/FreeType/test/arch/win32/testw32.mdp b/xc/extras/FreeType/test/arch/win32/testw32.mdp
new file mode 100644
index 000000000..51d051996
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/testw32.mdp
Binary files differ
diff --git a/xc/extras/FreeType/test/arch/win32/testw32.rc b/xc/extras/FreeType/test/arch/win32/testw32.rc
new file mode 100644
index 000000000..558133664
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/testw32.rc
@@ -0,0 +1,202 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Italian (Italy) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)
+#ifdef _WIN32
+LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
+ "#define _AFX_NO_OLE_RESOURCES\r\n"
+ "#define _AFX_NO_TRACKER_RESOURCES\r\n"
+ "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
+ "\r\n"
+ "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)\r\n"
+ "#ifdef _WIN32\r\n"
+ "LANGUAGE 16, 1\r\n"
+ "#pragma code_page(1252)\r\n"
+ "#endif\r\n"
+ "#include ""res\\testw32.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
+ "#include ""l.ita\\afxres.rc"" // Standard components\r\n"
+ "#endif\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDR_MAINFRAME ICON DISCARDABLE "res\\testw32.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_TESTW32_DIALOG DIALOGEX 0, 0, 331, 274
+STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "testw32"
+FONT 8, "MS Sans Serif"
+BEGIN
+ DEFPUSHBUTTON "Run",IDOK,105,100,28,14
+ PUSHBUTTON "Exit",IDCANCEL,105,116,28,14
+ CONTROL "",IDC_BITMAP,"Static",SS_BLACKRECT,146,47,178,120
+ LISTBOX IDC_LIST_BOX,7,171,317,97,LBS_NOINTEGRALHEIGHT |
+ WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
+ PUSHBUTTON "<-Select Action (q to quit test pgm)",IDC_SELECT_ACTION,
+ 34,56,110,15
+ EDITTEXT IDC_ACTION,23,56,9,12,ES_AUTOHSCROLL
+ COMBOBOX IDC_TEST_PROGRAM,13,12,90,64,CBS_DROPDOWN | CBS_SORT |
+ WS_VSCROLL | WS_TABSTOP
+ LTEXT "Test Program",IDC_STATIC,13,1,60,8
+ EDITTEXT IDC_OPTIONS,111,12,204,12,ES_AUTOHSCROLL
+ LTEXT "Options/Arguments",IDC_STATIC,109,2,73,8
+ LTEXT "Show Window",IDC_STATIC,146,37,70,8
+END
+
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "041004B0"
+ BEGIN
+ VALUE "CompanyName", "\0"
+ VALUE "FileDescription", "testw32 Applicazione MFC\0"
+ VALUE "FileVersion", "1, 0, 0, 1\0"
+ VALUE "InternalName", "testw32\0"
+ VALUE "LegalCopyright", "Copyright (C) 1998\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "testw32.EXE\0"
+ VALUE "ProductName", "testw32 Applicazione\0"
+ VALUE "ProductVersion", "1, 0, 0, 1\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x410, 1200
+ END
+END
+
+#endif // !_MAC
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO DISCARDABLE
+BEGIN
+ IDD_TESTW32_DIALOG, DIALOG
+ BEGIN
+ LEFTMARGIN, 7
+ RIGHTMARGIN, 324
+ BOTTOMMARGIN, 268
+ END
+END
+#endif // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog Info
+//
+
+IDD_TESTW32_DIALOG DLGINIT
+BEGIN
+ IDC_TEST_PROGRAM, 0x403, 7, 0
+0x5446, 0x4956, 0x5745, "\000"
+ IDC_TEST_PROGRAM, 0x403, 7, 0
+0x5446, 0x5544, 0x504d, "\000"
+ IDC_TEST_PROGRAM, 0x403, 9, 0
+0x5446, 0x5453, 0x4952, 0x474e, "\000"
+ IDC_TEST_PROGRAM, 0x403, 7, 0
+0x5446, 0x494c, 0x544e, "\000"
+ 0
+END
+
+#endif // Italian (Italy) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#define _AFX_NO_SPLITTER_RESOURCES
+#define _AFX_NO_OLE_RESOURCES
+#define _AFX_NO_TRACKER_RESOURCES
+#define _AFX_NO_PROPERTY_RESOURCES
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)
+#ifdef _WIN32
+LANGUAGE 16, 1
+#pragma code_page(1252)
+#endif
+#include "res\testw32.rc2" // non-Microsoft Visual C++ edited resources
+#include "l.ita\afxres.rc" // Standard components
+#endif
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/xc/extras/FreeType/test/arch/win32/testw32Dlg.cpp b/xc/extras/FreeType/test/arch/win32/testw32Dlg.cpp
new file mode 100644
index 000000000..b523b01cf
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/testw32Dlg.cpp
@@ -0,0 +1,358 @@
+/*********************************************************/
+/* Test program driver for freetype on Win32 Platform */
+/* CopyRight(left) G. Ramat 1998 (gcramat@radiostudio.it)*/
+/* */
+/*********************************************************/
+
+// testw32Dlg.cpp : implementation file
+//
+
+#include "stdafx.h"
+#include "testw32.h"
+#include "testw32Dlg.h"
+#include "gdriver.h"
+#include "gevents.h"
+#include <fcntl.h>
+#include <errno.h>
+#include <io.h>
+CWnd *button_OK,*button_Cancel;
+DWORD thrd_spool; // output spooler
+HANDLE spool_thread;
+
+//Sync data:
+extern "C" {
+ HANDLE evgetevent,evdriverdisplaybitmap,this_cwnd,main_thread,listbox,bitmap;
+ TEvent evevent;
+ char *ev_buffer;
+ int ev_lines,ev_columns;
+ char *save_buffer;
+ int save_lines,save_cols,exit_code;
+ int ftview(int,char**);
+ int ftdump(int,char**);
+ int ftlint(int,char**);
+ int ftstring(int,char**);
+ int ftstrpnm(int,char**);
+ int ftzoom(int,char**);
+ int call_test_program(int (*)(int,char**),int,char **);
+
+}
+//pipe handling variables
+int pipe_std[2]={2*0},pipe_err[2]={2*0},error;
+int old_std,old_err;
+//end of pipe handling variables
+
+
+#define TEST_PROG_N 4
+//Sync data end
+char ProgramName[16];
+char fontname[16];
+char fullfont[MAX_PATH];
+char *argv[255];
+int argc;
+DWORD WINAPI ThreadHead(LPVOID );
+DWORD WINAPI ThreadSpool(LPVOID );
+void readpipe(int);
+
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+extern main(int,char **);
+extern int X_Link;
+
+/////////////////////////////////////////////////////////////////////////////
+// CTestw32Dlg dialog
+
+CTestw32Dlg::CTestw32Dlg(CWnd* pParent /*=NULL*/)
+ : CDialog(CTestw32Dlg::IDD, pParent)
+{
+ //{{AFX_DATA_INIT(CTestw32Dlg)
+ // NOTE: the ClassWizard will add member initialization here
+ //}}AFX_DATA_INIT
+ // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
+ m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
+}
+
+void CTestw32Dlg::DoDataExchange(CDataExchange* pDX)
+{
+ CDialog::DoDataExchange(pDX);
+ //{{AFX_DATA_MAP(CTestw32Dlg)
+ // NOTE: the ClassWizard will add DDX and DDV calls here
+ //}}AFX_DATA_MAP
+}
+
+BEGIN_MESSAGE_MAP(CTestw32Dlg, CDialog)
+ //{{AFX_MSG_MAP(CTestw32Dlg)
+ ON_WM_PAINT()
+ ON_WM_QUERYDRAGICON()
+ ON_BN_CLICKED(IDC_SELECT_ACTION, OnSelectAction)
+ ON_WM_DESTROY()
+ //}}AFX_MSG_MAP
+END_MESSAGE_MAP()
+
+/////////////////////////////////////////////////////////////////////////////
+// CTestw32Dlg message handlers
+
+BOOL CTestw32Dlg::OnInitDialog()
+{ int error;
+ FILE *retf;
+ CDialog::OnInitDialog();
+
+ // Set the icon for this dialog. The framework does this automatically
+ // when the application's main window is not a dialog
+ SetIcon(m_hIcon, TRUE); // Set big icon
+ SetIcon(m_hIcon, FALSE); // Set small icon
+
+ // TODO: Add extra initialization here
+ //save CWnd objects for utility fns;
+ evgetevent=CreateEvent(NULL,FALSE,FALSE,"Get_Event");
+ evdriverdisplaybitmap=CreateEvent(NULL,FALSE,FALSE,"Driver_Display_Bitmap");
+ listbox=(GetDlgItem(IDC_LIST_BOX))->m_hWnd;
+ bitmap=(GetDlgItem(IDC_BITMAP))->m_hWnd;
+ button_OK=GetDlgItem(IDOK);
+ button_Cancel=GetDlgItem(IDCANCEL);
+ error=_pipe(pipe_std,1024,_O_TEXT);
+// error=_pipe(pipe_err,1024,_O_TEXT);
+ // enable piping
+ if(-1==_fileno(stdout))
+ {retf=freopen("throwaway_stdout.tmp","wt",stdout);
+ }
+ if(-1==_fileno(stderr))
+ {retf=freopen("throwaway_stderr.tmp","wt",stderr);
+ }
+ old_std=dup(_fileno(stdout));
+ old_err=dup(_fileno(stderr));
+ error=dup2(pipe_std[1],_fileno(stdout));
+ error=dup2(pipe_std[1],_fileno(stderr)); //error=dup2(pipe_err[1],_fileno(stderr));
+ save_buffer=NULL;
+// error=write(pipe_std[1],"Pipe_test:Write\n",16);
+// error=fprintf(stdout,"Pipe_test:fprintf");
+// error=fflush(stdout);
+// activate spooler
+ spool_thread=CreateThread(NULL,0,ThreadSpool,NULL,0,&thrd_spool);
+
+
+ return TRUE; // return TRUE unless you set the focus to a control
+}
+
+// If you add a minimize button to your dialog, you will need the code below
+// to draw the icon. For MFC applications using the document/view model,
+// this is automatically done for you by the framework.
+
+void CTestw32Dlg::OnPaint()
+{
+ if (IsIconic())
+ {
+ CPaintDC dc(this); // device context for painting
+
+ SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
+
+ // Center icon in client rectangle
+ int cxIcon = GetSystemMetrics(SM_CXICON);
+ int cyIcon = GetSystemMetrics(SM_CYICON);
+ CRect rect;
+ GetClientRect(&rect);
+ int x = (rect.Width() - cxIcon + 1) / 2;
+ int y = (rect.Height() - cyIcon + 1) / 2;
+
+ // Draw the icon
+ dc.DrawIcon(x, y, m_hIcon);
+ }
+ else
+ {
+ CDialog::OnPaint();
+ }
+}
+
+// The system calls this to obtain the cursor to display while the user drags
+// the minimized window.
+HCURSOR CTestw32Dlg::OnQueryDragIcon()
+{
+ return (HCURSOR) m_hIcon;
+}
+
+void CTestw32Dlg::OnOK()
+{
+ DWORD thrd_id;
+ char Options[256];
+ char *p,*pb,*pe;
+ int i;
+ // TODO: Add extra validation here
+ GetDlgItemText(IDC_TEST_PROGRAM,ProgramName,sizeof(ProgramName)-1);
+ GetDlgItemText(IDC_OPTIONS,Options,sizeof(Options)-1);
+ argv[0]=ProgramName;
+ p=Options;
+ i=1;
+ while (*p!=0)
+ {
+ while (*p==' ') p++;
+ pb=p;
+ while (*p>' ') p++;
+ pe=p;
+ if (pe>pb)
+ {
+ argv[i]=new char[1+pe-pb];
+ strncpy(argv[i],pb,pe-pb);
+ argv[i][pe-pb]=0;
+ i++;
+ }
+ }
+ argv[0]=ProgramName;
+ argc=i;
+ main_thread=CreateThread(NULL,0,ThreadHead,NULL,0,&thrd_id);
+
+// CDialog::OnOK();
+}
+
+DWORD WINAPI ThreadHead(LPVOID Parm)
+{ int i,rc;
+
+struct {
+ char pname[16];
+ int (*program)(int,char**);
+} tab[TEST_PROG_N]=
+{
+ {"FTVIEW",&ftview},
+ {"FTDUMP",&ftdump},
+ {"FTLINT",&ftlint},
+ {"FTSTRING",&ftstring}
+// {"FTSTRPNM",&ftstrpnm},
+// {"FTZOOM",&ftzoom}
+};
+//disable Ok button
+ rc=button_OK->EnableWindow(FALSE);
+ rc=button_Cancel->EnableWindow(FALSE);
+
+ for (i=0;(i< TEST_PROG_N) &&strcmp(tab[i].pname,ProgramName);i++);
+ if (i>= TEST_PROG_N)
+ {
+ MessageBox(NULL,"Please select a valid Test Program Name","FreeType Test ",MB_ICONQUESTION);
+ }
+ else
+ call_test_program(tab[i].program,argc,(char **)&argv);
+ //enable buttons again
+ rc=button_OK->EnableWindow(TRUE);
+ rc=button_Cancel->EnableWindow(TRUE);
+ rc=fflush(stdout);
+ rc=fflush(stderr);
+ ExitThread(1);
+ return 1;
+}
+
+
+
+void translate_command(char nChar)
+{ int rc,i;
+ // TODO: Add your message handler code here and/or call default
+ typedef struct _Translator
+ {
+ char key;
+ GEvent event_class;
+ int event_info;
+ } Translator;
+
+#define NUM_Translators 20
+
+ static const Translator trans[ NUM_Translators] =
+ {
+ { 'q', event_Quit, 0 },
+ { (char)27, event_Quit, 0 },
+
+ { 'x', event_Rotate_Glyph, -1 },
+ { 'c', event_Rotate_Glyph, 1 },
+ { 'v', event_Rotate_Glyph, -16 },
+ { 'b', event_Rotate_Glyph, 16 },
+
+ { '{', event_Change_Glyph, -10000 },
+ { '}', event_Change_Glyph, 10000 },
+ { '(', event_Change_Glyph, -1000 },
+ { ')', event_Change_Glyph, 1000 },
+ { '9', event_Change_Glyph, -100 },
+ { '0', event_Change_Glyph, 100 },
+ { 'i', event_Change_Glyph, -10 },
+ { 'o', event_Change_Glyph, 10 },
+ { 'k', event_Change_Glyph, -1 },
+ { 'l', event_Change_Glyph, 1 },
+
+ { '+', event_Scale_Glyph, 10 },
+ { '-', event_Scale_Glyph, -10 },
+ { 'u', event_Scale_Glyph, 1 },
+ { 'j', event_Scale_Glyph, -1 }
+ };
+ for ( i = 0; i < NUM_Translators; i++ )
+ {
+ if ( nChar == trans[i].key )
+ {
+ evevent.what = trans[i].event_class;
+ evevent.info = trans[i].event_info;
+ break;
+ }
+ }
+ if (i>= NUM_Translators)
+ {
+ evevent.what=event_Keyboard;
+ evevent.what=nChar;
+ }
+ rc=SetEvent(evgetevent);
+}
+
+void CTestw32Dlg::OnSelectAction()
+{
+ char c[2];
+ GetDlgItemText(IDC_ACTION,c,2);
+ translate_command(c[0]);
+}
+
+
+DWORD WINAPI ThreadSpool(LPVOID Parm)
+{
+ while(1)
+ {
+ if (pipe_std[0]) readpipe(pipe_std[0]); // will never get out of there !!!!
+// if (pipe_err[0]) readpipe(pipe_err[0]);
+ Sleep(1000);
+ }
+ return 1;
+}
+
+void readpipe(int h)
+ { int i,j,rc;
+
+ char buffer[1024],line[1024];
+ rc=1;
+ while(rc)
+ {
+ rc=read(h,buffer,sizeof(buffer));
+ if (rc)
+ { j=0;
+ for(i=0;i<rc;i++)
+ {
+ if (buffer[i]=='\n')
+ { line[j]=0;
+ ::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line);
+ j=0;
+ }
+ else
+ line[j++]=buffer[i];
+ }
+ line[j]=0; //flush the buffer
+ ::SendMessage((HWND)listbox,LB_ADDSTRING,0,(LPARAM)line);
+ }
+ }
+
+}
+
+
+void CTestw32Dlg::OnDestroy()
+{ int rc;
+ CDialog::OnDestroy();
+ if (spool_thread!=0)
+ {
+ rc=TerminateThread(spool_thread,2);
+ spool_thread=0;
+ }
+ dup2(old_std,_fileno(stdout));
+ dup2(old_err,_fileno(stderr));
+}
diff --git a/xc/extras/FreeType/test/arch/win32/testw32Dlg.h b/xc/extras/FreeType/test/arch/win32/testw32Dlg.h
new file mode 100644
index 000000000..238800360
--- /dev/null
+++ b/xc/extras/FreeType/test/arch/win32/testw32Dlg.h
@@ -0,0 +1,51 @@
+// testw32Dlg.h : header file
+//
+
+#if !defined(AFX_TESTW32DLG_H__70F52CAB_06A4_11D2_9AC4_0060978849F3__INCLUDED_)
+#define AFX_TESTW32DLG_H__70F52CAB_06A4_11D2_9AC4_0060978849F3__INCLUDED_
+
+#if _MSC_VER >= 1000
+#pragma once
+#endif // _MSC_VER >= 1000
+
+/////////////////////////////////////////////////////////////////////////////
+// CTestw32Dlg dialog
+
+class CTestw32Dlg : public CDialog
+{
+// Construction
+public:
+ CTestw32Dlg(CWnd* pParent = NULL); // standard constructor
+
+// Dialog Data
+ //{{AFX_DATA(CTestw32Dlg)
+ enum { IDD = IDD_TESTW32_DIALOG };
+ // NOTE: the ClassWizard will add data members here
+ //}}AFX_DATA
+
+ // ClassWizard generated virtual function overrides
+ //{{AFX_VIRTUAL(CTestw32Dlg)
+ protected:
+ virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
+ //}}AFX_VIRTUAL
+
+// Implementation
+protected:
+ HICON m_hIcon;
+
+ // Generated message map functions
+ //{{AFX_MSG(CTestw32Dlg)
+ virtual BOOL OnInitDialog();
+ afx_msg void OnPaint();
+ afx_msg HCURSOR OnQueryDragIcon();
+ virtual void OnOK();
+ afx_msg void OnSelectAction();
+ afx_msg void OnDestroy();
+ //}}AFX_MSG
+ DECLARE_MESSAGE_MAP()
+};
+
+//{{AFX_INSERT_LOCATION}}
+// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
+
+#endif // !defined(AFX_TESTW32DLG_H__70F52CAB_06A4_11D2_9AC4_0060978849F3__INCLUDED_)
diff --git a/xc/extras/FreeType/test/common.c b/xc/extras/FreeType/test/common.c
new file mode 100644
index 000000000..465802da1
--- /dev/null
+++ b/xc/extras/FreeType/test/common.c
@@ -0,0 +1,245 @@
+/*
+ * This is a cheap replacement for getopt() because that routine is not
+ * available on some platforms and behaves differently on other platforms.
+ * This code was written from scratch without looking at any other
+ * implementation.
+ *
+ * This code is hereby expressly placed in the public domain.
+ * mleisher@crl.nmsu.edu (Mark Leisher)
+ * 10 October 1997
+ */
+
+#ifndef lint
+#ifdef __GNUC__
+ static char rcsid[] __attribute__ ((unused)) = "$Id: common.c,v 1.1.1.1 1999/12/05 01:23:05 daryll Exp $";
+#else
+ static char rcsid[] = "$Id: common.c,v 1.1.1.1 1999/12/05 01:23:05 daryll Exp $";
+#endif
+#endif
+
+#include "common.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+
+ /*
+ * Externals visible to programs.
+ */
+
+ int ft_opterr = 1;
+ int ft_optind = 1;
+ char* ft_optarg;
+
+ /*
+ * Internal variables that are used to detect when the global values
+ * need to be reset.
+ */
+
+ static int cmdac;
+#ifdef __STDC__
+ static const char* cmdname;
+ static char* const* cmdav;
+#else
+ static char* cmdname;
+ static char** cmdav;
+#endif
+
+ int
+#ifdef __STDC__
+ ft_getopt( int ac, char* const* av, const char* pat )
+#else
+ ft_getopt( ac, av, pat )
+ int ac;
+ char** av;
+ char* pat;
+#endif
+ {
+ int opt;
+#ifdef __STDC__
+ const char* p;
+ const char* pp;
+#else
+ char* p;
+ char* pp;
+#endif
+
+ /*
+ * If there is no pattern, indicate the parsing is done.
+ */
+ if ( pat == 0 || *pat == 0 )
+ return -1;
+
+ /*
+ * Always reset the option argument to NULL.
+ */
+ ft_optarg = 0;
+
+ /*
+ * If the number of arguments or argument list do not match the last
+ * values seen, reset the internal pointers and the globals.
+ */
+ if ( ac != cmdac || av != cmdav )
+ {
+ ft_optind = 1;
+ cmdac = ac;
+ cmdav = av;
+
+ /*
+ * Determine the command name in case it is needed for warning
+ * messages.
+ */
+ for ( cmdname = 0, p = av[0]; *p; p++ )
+ {
+ if ( *p == '/' || *p == '\\' )
+ cmdname = p;
+ }
+ /*
+ * Skip the path separator if the name was assigned.
+ */
+ if ( cmdname )
+ cmdname++;
+ else
+ cmdname = av[0];
+ }
+
+ /*
+ * If the next index is greater than or equal to the number of
+ * arguments, then the command line is done.
+ */
+ if ( ft_optind >= ac )
+ return -1;
+
+ /*
+ * Test the next argument for one of three cases:
+ * 1. The next argument does not have an initial '-'.
+ * 2. The next argument is '-'.
+ * 3. The next argument is '--'.
+ *
+ * In either of these cases, command line processing is done.
+ */
+ if ( av[ft_optind][0] != '-' ||
+ strcmp( av[ft_optind], "-" ) == 0 ||
+ strcmp( av[ft_optind], "--" ) == 0 )
+ return -1;
+
+ /*
+ * Point at the next command line argument and increment the
+ * command line index.
+ */
+ p = av[ft_optind++];
+
+ /*
+ * Look for the first character of the command line option.
+ */
+ for ( opt = *(p + 1), pp = pat; *pp && *pp != opt; pp++ )
+ ;
+
+ /*
+ * If nothing in the pattern was recognized, then issue a warning
+ * and return a '?'.
+ */
+ if ( *pp == 0 )
+ {
+ if ( ft_opterr )
+ fprintf( stderr, "%s: illegal option -- %c\n", cmdname, opt );
+ return '?';
+ }
+
+ /*
+ * If the option expects an argument, get it.
+ */
+ if ( *(pp + 1) == ':' && (ft_optarg = av[ft_optind]) == 0 )
+ {
+ /*
+ * If the option argument is NULL, issue a warning and return a '?'.
+ */
+ if ( ft_opterr )
+ fprintf( stderr, "%s: option requires an argument -- %c\n",
+ cmdname, opt );
+ opt = '?';
+ }
+ else if ( ft_optarg )
+ /*
+ * Increment the option index past the argument.
+ */
+ ft_optind++;
+
+ /*
+ * Return the option character.
+ */
+ return opt;
+ }
+
+
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ft_basename(): */
+/* */
+/* a stupid but useful function... */
+/* */
+/* rewritten by DavidT to get rid of GPLed programs in the FreeType engine. */
+/* */
+/****************************************************************************/
+
+ char*
+#ifdef __STDC__
+ ft_basename ( const char* name )
+#else
+ ft_basename ( name )
+ char* name;
+#endif
+ {
+#ifdef __STDC__
+ const char* base;
+ const char* current;
+#else
+ char* base;
+ char* current;
+#endif
+ char c;
+
+
+ base = name;
+ current = name;
+
+ c = *current;
+
+ while ( c )
+ {
+ if ( c == '/' || c == '\\' )
+ base = current + 1;
+
+ current++;
+ c = *current;
+ }
+
+ return (char*)base;
+ }
+
+
+#ifdef __STDC__
+ void Panic( const char* fmt, ... )
+#else
+ void Panic( fmt )
+ const char* fmt;
+#endif
+ {
+ va_list ap;
+
+
+ va_start( ap, fmt );
+ vprintf( fmt, ap );
+ va_end( ap );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/common.h b/xc/extras/FreeType/test/common.h
new file mode 100644
index 000000000..aa9b450b4
--- /dev/null
+++ b/xc/extras/FreeType/test/common.h
@@ -0,0 +1,53 @@
+/*
+ * This is a cheap replacement for getopt() because that routine is not
+ * available on some platforms and behaves differently on other platforms.
+ *
+ * This code is hereby expressly placed in the public domain.
+ * mleisher@crl.nmsu.edu (Mark Leisher)
+ * 10 October 1997
+ */
+
+#ifndef COMMON_H
+#define COMMON_H
+
+/* Note that by default, both functions are implemented in common.c */
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+ extern int ft_opterr;
+ extern int ft_optind;
+ extern char* ft_optarg;
+
+ extern int ft_getopt(
+#ifdef __STDC__
+ int argc,
+ char* const* argv,
+ const char* pattern
+#endif
+ );
+
+
+ extern char* ft_basename(
+#ifdef __STDC__
+ const char* name
+#endif
+ );
+
+ /* print a message and exit */
+ extern void Panic (
+#ifdef __STDC__
+ const char* fmt, ...
+#endif
+ );
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* COMMON_H */
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/display.c b/xc/extras/FreeType/test/display.c
new file mode 100644
index 000000000..018eca7e1
--- /dev/null
+++ b/xc/extras/FreeType/test/display.c
@@ -0,0 +1,297 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* display.c: Display component used by all test programs. */
+/* */
+/* This file is used to display glyphs and strings in a target window */
+/* using the graphics drivers provided by gmain.c, gevents.h, etc. */
+/* */
+/* Its role is to be shared and heavely commented to let people understand */
+/* how we do the job... */
+/* */
+/****************************************************************************/
+
+#include "freetype.h"
+#include "gmain.h"
+#include "display.h"
+#include <stdlib.h> /* malloc() and free() */
+#include <string.h> /* memset() */
+
+ /* The target bitmap or pixmap -- covering the full display window/screen */
+ TT_Raster_Map Bit;
+
+ /* A smaller intermediate bitmap used to render individual glyphs when */
+ /* font smoothing mode is activated. It is then or-ed to `Bit'. */
+ TT_Raster_Map Small_Bit;
+
+/* The magic of or-ing gray-levels: */
+/* */
+/* When gray-level mode (a.k.a. font-smoothing) is on, `Bit' is an 8-bit */
+/* pixmap of the size of the display window or screen. */
+/* */
+/* The gray-level palette to use for display is system-dependent, and */
+/* given by the "gray_palette" variable defined in 'gmain.c'. It is */
+/* set up by the graphics driver, and we cannot assume anything about its */
+/* values. */
+/* */
+/* The function TT_Get_Glyph_Pixmap() can use any palette to render each */
+/* individual glyph, however we'll later need to "or" the glyph to */
+/* the display pixmap `Bit' to be able to form strings of text by */
+/* juxtaposing several glyphs together. */
+/* */
+/* If we use the gray_palette directly, we'll encounter trouble doing */
+/* the "or". Example: */
+/* */
+/* Suppose that gray_palette = { 0, 32, 64, 128, 255 } */
+/* */
+/* Let's render a glyph with this palette and "or" it to */
+/* the `Bit' pixmap. If, by chance, we superpose two distinct non-zero */
+/* colors, we will get strange results, like 32+64 = 96, which isn't in */
+/* our gray palette! */
+/* */
+/* There are two ways to solve this problem: */
+/* */
+/* - perform a "slow or" where we check all possible combinations */
+/* and solve conflicts. */
+/* */
+/* - render all pixmaps using a special "virtual" palette that eases */
+/* the "oring" process, then convert the whole display pixmap to */
+/* "display" colors at once. */
+/* */
+/* We choose the second solution, of course; this means that: */
+/* */
+/* - the virtual palette used is simply = { 0, 1, 2, 3, 4 }, defined in */
+/* the variable "palette" below. The `Bit' and `Small_Bit' pixmaps will */
+/* always contain pixels within these values, with the exception of */
+/* post-render display, where `Bit' will be converted to display values */
+/* by the Convert_To_Display_Palette() function. */
+/* */
+/* - as or-ing values between 0 and 4 will give us values between */
+/* 0 and 7, we use a second palette, called "bounding_palette" */
+/* to maintain all values within the virtual palette. */
+/* */
+/* in effect bounding_palette = { 0, 1, 2, 3, 4, 4, 4, 4 } */
+/* */
+/* which means that (3|4) == 7 => 4 after bounding */
+/* */
+
+ /* the virtual palette */
+ unsigned char virtual_palette[5] = { 0, 1, 2, 3, 4 };
+
+ /* Or-ing the possible palette values gets us from 0 to 7 */
+ /* We must bound check these... */
+ unsigned char bounded_palette[8] = { 0, 1, 2, 3, 4, 4, 4, 4 };
+
+
+ /* Clears the Bit bitmap/pixmap */
+ void Clear_Display( void )
+ {
+ memset( Bit.bitmap, 0, Bit.size );
+ }
+
+
+ /* Clears the Small_Bit pixmap */
+ void Clear_Small( void )
+ {
+ memset( Small_Bit.bitmap, 0, Small_Bit.size );
+ }
+
+
+ /* Initialize the display bitmap named Bit */
+ int Init_Display( int font_smoothing )
+ {
+ Bit.rows = vio_Height; /* the whole window */
+ Bit.width = vio_Width;
+ Bit.flow = TT_Flow_Up;
+
+ if ( font_smoothing )
+ Bit.cols = (Bit.width+3) & -4; /* must be 32-bits aligned */
+ else
+ Bit.cols = (Bit.width+7) >> 3;
+
+ Bit.size = (long)Bit.cols * Bit.rows;
+
+ if ( Bit.bitmap )
+ free( Bit.bitmap );
+ Bit.bitmap = malloc( (int)Bit.size );
+ if ( !Bit.bitmap )
+ return -1;
+
+ Clear_Display();
+ return 0;
+ }
+
+
+ /* Convert the display pixmap from virtual to display palette */
+ void Convert_To_Display_Palette( void )
+ {
+ unsigned char* p;
+ long i;
+
+ p = Bit.bitmap;
+ for ( i = 0; i < Bit.size; i++ )
+ {
+ *p = gray_palette[(int)*p];
+ p++;
+ }
+ }
+
+
+ /* Init Small Bitmap */
+ int Init_Small( int x_ppem, int y_ppem )
+ {
+ if ( Small_Bit.bitmap )
+ free( Small_Bit.bitmap );
+
+ Small_Bit.rows = y_ppem + 32;
+ Small_Bit.width = x_ppem + 32;
+ Small_Bit.cols = ( Small_Bit.width+3 ) & -4; /* pad to 32-bits */
+ Small_Bit.flow = TT_Flow_Up;
+ Small_Bit.size = Small_Bit.rows * Small_Bit.cols;
+
+ Small_Bit.bitmap = malloc( (int)Small_Bit.size );
+ if ( Small_Bit.bitmap )
+ return -1;
+
+ Clear_Small();
+ return 0;
+ }
+
+
+ /* Render a single glyph into the display bit/pixmap */
+ /* */
+ /* Note that in b/w mode, we simply render the glyph directly into */
+ /* the display map, as the scan-line converter or-es the glyph into */
+ /* the target bitmap. */
+ /* */
+ /* In gray mode, however, the glyph is first rendered indivdually in */
+ /* the Small_Bit map, then 'or-ed' with bounding into the display */
+ /* pixmap. */
+ /* */
+
+ TT_Error Render_Single_Glyph( int font_smoothing,
+ TT_Glyph glyph,
+ int x_offset,
+ int y_offset )
+ {
+ if ( !font_smoothing )
+ return TT_Get_Glyph_Bitmap( glyph, &Bit,
+ (long)x_offset*64, (long)y_offset*64 );
+ else
+ {
+ TT_Glyph_Metrics metrics;
+
+ TT_Error error;
+ TT_F26Dot6 x, y, xmin, ymin, xmax, ymax;
+ int ioff, iread;
+ char *off, *read, *_off, *_read;
+
+
+ /* font-smoothing mode */
+
+ /* we begin by grid-fitting the bounding box */
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+
+ xmin = metrics.bbox.xMin & -64;
+ ymin = metrics.bbox.yMin & -64;
+ xmax = (metrics.bbox.xMax+63) & -64;
+ ymax = (metrics.bbox.yMax+63) & -64;
+
+ /* now render the glyph in the small pixmap */
+
+ /* IMPORTANT NOTE: the offset parameters passed to the function */
+ /* TT_Get_Glyph_Bitmap() must be integer pixel values, i.e., */
+ /* multiples of 64. HINTING WILL BE RUINED IF THIS ISN'T THE CASE! */
+ /* This is why we _did_ grid-fit the bounding box, especially xmin */
+ /* and ymin. */
+
+ Clear_Small();
+ error = TT_Get_Glyph_Pixmap( glyph, &Small_Bit, -xmin, -ymin );
+ if ( error )
+ return error;
+
+ /* Blit-or the resulting small pixmap into the biggest one */
+ /* We do that by hand, and provide also clipping. */
+
+ xmin = (xmin >> 6) + x_offset;
+ ymin = (ymin >> 6) + y_offset;
+ xmax = (xmax >> 6) + x_offset;
+ ymax = (ymax >> 6) + y_offset;
+
+ /* Take care of comparing xmin and ymin with signed values! */
+ /* This was the cause of strange misplacements when Bit.rows */
+ /* was unsigned. */
+
+ if ( xmin >= (int)Bit.width ||
+ ymin >= (int)Bit.rows ||
+ xmax < 0 ||
+ ymax < 0 )
+ return TT_Err_Ok; /* nothing to do */
+
+ /* Note that the clipping check is performed _after_ rendering */
+ /* the glyph in the small bitmap to let this function return */
+ /* potential error codes for all glyphs, even hidden ones. */
+
+ /* In exotic glyphs, the bounding box may be larger than the */
+ /* size of the small pixmap. Take care of that here. */
+
+ if ( xmax-xmin + 1 > Small_Bit.width )
+ xmax = xmin + Small_Bit.width - 1;
+
+ if ( ymax-ymin + 1 > Small_Bit.rows )
+ ymax = ymin + Small_Bit.rows - 1;
+
+ /* set up clipping and cursors */
+
+ iread = 0;
+ if ( ymin < 0 )
+ {
+ iread -= ymin * Small_Bit.cols;
+ ioff = 0;
+ ymin = 0;
+ }
+ else
+ ioff = ymin * Bit.cols;
+
+ if ( ymax >= Bit.rows )
+ ymax = Bit.rows-1;
+
+ if ( xmin < 0 )
+ {
+ iread -= xmin;
+ xmin = 0;
+ }
+ else
+ ioff += xmin;
+
+ if ( xmax >= Bit.width )
+ xmax = Bit.width - 1;
+
+ _read = (char*)Small_Bit.bitmap + iread;
+ _off = (char*)Bit.bitmap + ioff;
+
+ for ( y = ymin; y <= ymax; y++ )
+ {
+ read = _read;
+ off = _off;
+
+ for ( x = xmin; x <= xmax; x++ )
+ {
+ *off = bounded_palette[*off | *read];
+ off++;
+ read++;
+ }
+ _read += Small_Bit.cols;
+ _off += Bit.cols;
+ }
+
+ return TT_Err_Ok;
+ }
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/display.h b/xc/extras/FreeType/test/display.h
new file mode 100644
index 000000000..7a4259558
--- /dev/null
+++ b/xc/extras/FreeType/test/display.h
@@ -0,0 +1,71 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* display.h: Display component interface used by test programs */
+/* */
+/* This file is used to display glyphs and strings in a target window */
+/* using the graphics drivers provided by gmain.c, gevents.h, etc. */
+/* */
+/* Its role is to be shared and heavely commented to let people understand */
+/* how we do the job... */
+/* */
+/* See comments in display.c for a full description! */
+/* */
+/****************************************************************************/
+
+#ifndef DISPLAY_H
+#define DISPLAY_H
+
+ /* The target bitmap or pixmap -- covering the full display window/screen */
+ extern TT_Raster_Map Bit;
+
+ /* A smaller intermediate bitmap used to render individual glyphs when */
+ /* font smoothing mode is activated. It is then or-ed to `Bit'. */
+ extern TT_Raster_Map Small_Bit;
+
+ /* the virtual palette */
+ extern unsigned char virtual_palette[5];
+
+ /* Or-ing the possible palette values gets us from 0 to 7 */
+ /* We must bound check these... */
+ extern unsigned char bounded_palette[8];
+
+
+ /* Clears the Bit bitmap/pixmap */
+ void Clear_Display( void );
+
+ /* Clears the Small_Bit pixmap */
+ void Clear_Small( void );
+
+ /* Initialize the display bitmap named Bit */
+ int Init_Display( int font_smoothing );
+
+ /* Initialize Small Bitmap */
+ int Init_Small( int x_ppem, int y_ppem );
+
+ /* Convert the display pixmap from virtual to display palette */
+ void Convert_To_Display_Palette( void );
+
+ /* Render a single glyph into the display bit/pixmap. */
+ /* */
+ /* Note that in b/w mode, we simply render the glyph directly into */
+ /* the display map, as the scan-line converter or-es the glyph into */
+ /* the target bitmap. */
+ /* */
+ /* In gray mode, however, the glyph is first rendered individually in */
+ /* the Small_Bit map, then 'or-ed' with bounding into the display */
+ /* pixmap. */
+ /* */
+ TT_Error Render_Single_Glyph( int font_smoothing,
+ TT_Glyph glyph,
+ int x_offset,
+ int y_offset );
+
+#endif /* DISPLAY_H */
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/fdebug.c b/xc/extras/FreeType/test/fdebug.c
new file mode 100644
index 000000000..8a60f12be
--- /dev/null
+++ b/xc/extras/FreeType/test/fdebug.c
@@ -0,0 +1,203 @@
+/****************************************************************************}
+{* *}
+{* The FreeType project - a Free and Portable Quality TrueType Renderer. *}
+{* *}
+{* Copyright 1996-1998 by *}
+{* D. Turner, R.Wilhelm, and W. Lemberg *}
+{* *}
+{* fdebug : A very simple TrueType bytecode debugger. *}
+{* *}
+{* NOTE : You must compile the interpreter with the DEBUG macro *}
+{* defined in order to link this program !! *}
+{* *}
+{****************************************************************************/
+
+#ifdef HAVE_CONIO_H
+#include <conio.h>
+#endif
+
+#ifdef ARM
+#include "std.h"
+#include "graflink.h"
+#endif
+
+#include "freetype.h"
+#include "tttypes.h"
+#include "tterror.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h> /* libc ANSI */
+
+
+#ifdef ARM
+#include "armsup.c" /* pull in our routines */
+#endif
+
+#define Pi 3.1415926535
+
+#define MAXPTSIZE 500 /* dtp */
+#define Center_X (Bit.width/2) /* dtp */
+#define Center_Y (Bit.rows/2) /* dtp */
+
+#define Profile_Buff_Size 64000 /* Size of the render pool */
+ /* Minimum is around 4 Kb */
+ /* experiment to see how its */
+ /* size impacts on raster */
+
+ /* performance.. */
+#define Font_Buff_Size 256000 /* this buffer holds all */
+ /* font specific data. */
+
+#define Border 10
+
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+
+ TT_Face_Properties properties;
+
+ int num_glyphs;
+ int num_pts;
+ int num_ctr;
+
+ int glyfArray;
+
+ PShort epts_ctr;
+
+ /* DTP important font metrics */
+ Long cur_LeftSB,
+ cur_Ascent,
+ cur_Descent,
+ cur_AdvanceWidth;
+
+ Int ptsize;
+
+ float ymin,
+ ymax,
+ xmax,
+ xmin,
+ xsize; /* DTP testing precision */
+
+ float resR;
+
+ Int Rotation;
+ Int Fail;
+ Int Num;
+ unsigned char autorun;
+
+ char GrayLines[1024];
+ int gray_render;
+
+
+ Bool LoadTrueTypeChar( Int idx )
+ {
+ Short numP, numC;
+
+ Int i;
+
+ /* Reset_Context( instance->exec ); */
+
+ if ( TT_Load_Glyph( instance, glyph, idx, TTLOAD_DEFAULT ) )
+ return FAILURE;
+
+
+ return SUCCESS;
+ }
+
+
+
+ int main( int argc, char** argv )
+ {
+
+ int i;
+ char filename[128+4];
+ char* execname;
+
+ TT_Init_FreeType(&engine);
+
+ num_pts = 0;
+ num_ctr = 0;
+
+ execname = argv[0];
+
+ if ( argc != 4 )
+ {
+ Message( "Test: simple TrueType interpreter tester - part of the FreeType project\n" );
+ Message( "-----------------------------------------------------------------------\n\n");
+ Message( "Usage: %s glyphnum ppem fontname[.ttf]\n\n", execname );
+ exit( EXIT_FAILURE );
+ }
+
+ if ( sscanf( argv[1], "%d", &Num ) == EOF )
+ Num = 0;
+
+ if ( sscanf( argv[2], "%d", &ptsize ) == EOF )
+ ptsize = 64;
+
+ i = strlen( argv[3] );
+ while ( i > 0 && argv[3][i] != '\\' )
+ {
+ if ( argv[3][i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = 0;
+
+ strncpy( filename, argv[3], 128 );
+ if ( i >= 0 )
+ strncpy( filename + strlen(filename), ".ttf", 4 );
+
+ if ( TT_Open_Face( engine, filename , &face) )
+ {
+ Message( "Error, could not find/open %s\n\n", filename );
+ exit( EXIT_FAILURE );
+ }
+
+ TT_Get_Face_Properties( face, &properties );
+
+/*
+ FOut = fopen( "h:\\work\\freetype\\p2.txt", "wt" );
+
+ fprintf( FOut, "Original CVT\n" );
+ Dump_CVT( resident->cvt, resident->cvtSize );
+*/
+ num_glyphs = properties.num_Glyphs;
+
+ if ( TT_New_Instance( face, &instance ) )
+ {
+ Message( "ERROR: Could not open instance from %s\n", filename );
+ exit( EXIT_FAILURE );
+ }
+
+ if ( TT_New_Glyph( face, &glyph ) )
+ Panic( "ERROR: could not create glyph container\n" );
+
+ TT_Set_Instance_Resolutions( instance, 96, 96 );
+
+ if ( TT_Set_Instance_CharSize( instance, ptsize*64 ) )
+ Panic( "ERROR: could not reset execution context\n" );
+/*
+ fprintf( FOut, "Scaled CVT\n" );
+ Dump_CVT( instance->cvt, instance->cvtSize );
+*/
+ LoadTrueTypeChar(Num);
+
+/*
+ fprintf( FOut, "Hinted CVT\n" );
+ Dump_CVT( instance->cvt, instance->cvtSize );
+
+ fclose( FOut );
+*/
+ TT_Close_Face(face);
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/ftdump.c b/xc/extras/FreeType/test/ftdump.c
new file mode 100644
index 000000000..d8067457f
--- /dev/null
+++ b/xc/extras/FreeType/test/ftdump.c
@@ -0,0 +1,571 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ftdump: Simple TrueType font file resource profiler. */
+/* */
+/* This program dumps various properties of a given font file. */
+/* */
+/* */
+/* */
+/* NOTE: This is just a test program that is used to show off and */
+/* debug the current engine. */
+/* */
+/****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "freetype.h"
+#include "common.h" /* for Panic.. */
+
+/*
+ * The following comment should be ignored. The "ttobjs.h" file does
+ * already include ft_conf.h.
+ *
+ * ------------------------------------------------------------------
+ *
+ * IGNORE> Basically, an external program using FreeType shouldn't depend on an
+ * IGNORE> internal file of the FreeType library, especially not on ft_conf.h -- but
+ * IGNORE> to avoid another configure script which tests for the existence of the
+ * IGNORE> i18n stuff we include ft_conf.h here since we can be sure that our test
+ * IGNORE> programs use the same configuration options as the library itself.
+ */
+
+#include "ttobjs.h" /* We're going to access internal tables directly */
+#include "ftxcmap.h"
+
+#ifdef HAVE_LIBINTL_H
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#include "ftxerr18.h"
+#include <libintl.h>
+#else
+#define gettext( x ) ( x )
+#endif
+
+
+ TT_Error error;
+
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+
+ TT_Instance_Metrics imetrics;
+ TT_Outline outline;
+ TT_Glyph_Metrics metrics;
+
+ TT_Face_Properties properties;
+
+ int num_glyphs;
+ int ptsize;
+
+ int Fail;
+ int Num;
+
+
+ int flag_memory = 1;
+ int flag_names = 1;
+ int flag_encodings = 1;
+ int flag_cmap = 1;
+
+ extern long TTMemory_Allocated;
+
+ long org_memory, old_memory, cur_memory;
+
+ const char* Apple_Encodings[33] =
+ {
+ "Roman", "Japanese", "Chinese", "Korean", "Arabic", "Hebrew",
+ "Greek", "Russian", "RSymbol", "Devanagari", "Gurmukhi",
+ "Gujarati", "Oriya", "Bengali", "Tamil", "Telugu", "Kannada",
+ "Malayalam", "Sinhalese", "Burmese", "Khmer", "Tai", "Laotian",
+ "Georgian", "Armenian", "Maldivian/Simplif. Chinese", "Tibetan",
+ "Mongolian", "Geez", "Slavic", "Vietnamese", "Sindhi", "Uninterpreted"
+ };
+
+ struct
+ {
+ long initial_overhead;
+ long face_object;
+ long glyph_object;
+ long first_instance;
+ long second_instance;
+
+ } memory_footprint;
+
+
+ /* We ignore error message strings with this function */
+
+#ifndef HAVE_LIBINTL_H
+ static char* TT_ErrToString18( TT_Error error )
+ {
+ static char temp[32];
+
+
+ sprintf( temp, "0x%04lx", error );
+ return temp;
+ }
+#endif
+
+
+ void Save_Memory( long* var )
+ {
+ *var = TTMemory_Allocated - old_memory;
+ old_memory += *var;
+ }
+
+#define FOOTPRINT( field ) Save_Memory( &memory_footprint.##field )
+
+
+ static void
+ Print_Mem( long val, char* string )
+ {
+ printf( "%6ld bytes (%4ldkByte): %s\n",
+ val,
+ (val+1023) / 1024,
+ string );
+ }
+
+#define PRINT_MEM( field, string ) \
+ Print_Mem( memory_footprint.##field, string )
+
+
+ /* Print the memory footprint */
+
+ void Print_Memory( void )
+ {
+ /* create glyph */
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ Panic( gettext( "Could not create glyph container.\n" ) );
+
+ FOOTPRINT( glyph_object );
+
+ /* create instance */
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ Panic( gettext(" Could not create instance.\n" ) );
+
+ FOOTPRINT( first_instance );
+
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ Panic( gettext( "Could not create 2nd instance.\n" ) );
+
+ FOOTPRINT( second_instance );
+
+ printf( gettext( "Memory footprint statistics:\n" ) );
+ printf( "-----------------------------------------------\n" );
+
+ /* NOTE: In our current implementation, the face's execution */
+ /* context object is created lazily with the first */
+ /* instance. However, all later instances share the */
+ /* the same context. */
+
+ PRINT_MEM( face_object, gettext( "face object" ) );
+ PRINT_MEM( glyph_object, gettext( "glyph_object" ) );
+ PRINT_MEM( second_instance, gettext( "instance object" ) );
+
+ Print_Mem( memory_footprint.first_instance -
+ memory_footprint.second_instance,
+ gettext( "exec. context object" ) );
+
+ printf( "-----------------------------------------------\n" );
+ Print_Mem( memory_footprint.face_object +
+ memory_footprint.glyph_object +
+ memory_footprint.first_instance,
+ gettext( "total memory usage" ) );
+
+ printf( "\n" );
+ }
+
+
+ static char name_buffer[257];
+ static int name_len = 0;
+
+
+ static char* LookUp_Name( int index )
+ {
+ unsigned short i, n;
+
+ unsigned short platform, encoding, language, id;
+ char* string;
+ unsigned short string_len;
+
+ int j, found;
+
+
+ n = properties.num_Names;
+
+ for ( i = 0; i < n; i++ )
+ {
+ TT_Get_Name_ID( face, i, &platform, &encoding, &language, &id );
+ TT_Get_Name_String( face, i, &string, &string_len );
+
+ if ( id == index )
+ {
+
+ /* The following code was inspired from Mark Leisher's */
+ /* ttf2bdf package */
+
+ found = 0;
+
+ /* Try to find a Microsoft English name */
+
+ if ( platform == 3 )
+ for ( j = 1; j >= 0; j-- )
+ if ( encoding == j ) /* Microsoft ? */
+ if ( (language & 0x3FF) == 0x009 ) /* English language */
+ {
+ found = 1;
+ break;
+ }
+
+ if ( !found && platform == 0 && language == 0 )
+ found = 1;
+
+ /* Found a Unicode Name. */
+
+ if ( found )
+ {
+ if ( string_len > 512 )
+ string_len = 512;
+
+ name_len = 0;
+
+ for ( i = 1; i < string_len; i += 2 )
+ name_buffer[name_len++] = string[i];
+
+ name_buffer[name_len] = '\0';
+
+ return name_buffer;
+ }
+ }
+ }
+
+ /* Not found */
+ return NULL;
+ }
+
+
+ static void
+ Print_Names( void )
+ {
+ printf( gettext( "font name table entries\n" ) );
+ printf( "-----------------------------------------------\n" );
+
+ if ( LookUp_Name( 4 ) )
+ printf( "%s - ", name_buffer );
+
+ if ( LookUp_Name( 5 ) )
+ printf( "%s\n\n", name_buffer );
+
+ if ( LookUp_Name( 0 ) )
+ printf( "%s\n\n", name_buffer );
+
+ if ( LookUp_Name( 7 ) )
+ printf( name_buffer );
+
+ printf( "\n" );
+ printf( "-----------------------------------------------\n\n" );
+ }
+
+
+ static void
+ Print_Encodings( void )
+ {
+ unsigned short n, i;
+ unsigned short platform, encoding;
+ char* platStr, *encoStr;
+
+ char tempStr[128];
+
+ printf( gettext( "character map encodings\n" ) );
+ printf( "-----------------------------------------------\n" );
+
+ n = properties.num_CharMaps;
+ if ( n == 0 )
+ {
+ printf( gettext( "The file doesn't seem to have any encoding table.\n" ) );
+ return;
+ }
+
+ printf( gettext( "There are %d encodings:\n\n" ), n );
+
+ for ( i = 0; i < n; i++ )
+ {
+ TT_Get_CharMap_ID( face, i, &platform, &encoding );
+ printf( gettext( "encoding %2d: " ), i );
+
+ platStr = encoStr = NULL;
+
+ switch ( platform )
+ {
+ case TT_PLATFORM_APPLE_UNICODE:
+ platStr = "Apple Unicode";
+ switch ( encoding )
+ {
+ case TT_APPLE_ID_DEFAULT:
+ encoStr = "";
+ break;
+
+ case TT_APPLE_ID_UNICODE_1_1:
+ encoStr = "(v.1.1)";
+ break;
+
+ case TT_APPLE_ID_ISO_10646:
+ encoStr = "(ISO 10646-1:1993)";
+ break;
+
+ case TT_APPLE_ID_UNICODE_2_0:
+ encoStr = "(v.2.0)";
+ break;
+
+ default:
+ sprintf( tempStr, gettext( "Unknown %d" ), encoding );
+ encoStr = tempStr;
+ }
+ break;
+
+ case TT_PLATFORM_MACINTOSH:
+ platStr = "Apple";
+ if ( encoding > 32 )
+ {
+ sprintf( tempStr, gettext( "Unknown %d" ), encoding );
+ encoStr = tempStr;
+ }
+ else
+ encoStr = (char*)Apple_Encodings[encoding];
+ break;
+
+ case TT_PLATFORM_ISO:
+ platStr = "Iso";
+ switch ( encoding )
+ {
+ case TT_ISO_ID_7BIT_ASCII:
+ platStr = "Ascii";
+ encoStr = "7-bit";
+ break;
+
+ case TT_ISO_ID_10646:
+ encoStr = "10646";
+ break;
+
+ case TT_ISO_ID_8859_1:
+ encoStr = "8859-1";
+ break;
+
+ default:
+ sprintf( tempStr, "%d", encoding );
+ encoStr = tempStr;
+ }
+ break;
+
+ case TT_PLATFORM_MICROSOFT:
+ platStr = "Windows";
+ switch ( encoding )
+ {
+ case TT_MS_ID_SYMBOL_CS:
+ encoStr = "Symbol";
+ break;
+
+ case TT_MS_ID_UNICODE_CS:
+ encoStr = "Unicode";
+ break;
+
+ case TT_MS_ID_SJIS:
+ encoStr = "Shift-JIS";
+ break;
+
+ case TT_MS_ID_GB2312:
+ encoStr = "GB2312";
+ break;
+
+ case TT_MS_ID_BIG_5:
+ encoStr = "Big 5";
+ break;
+
+ case TT_MS_ID_WANSUNG:
+ encoStr = "WanSung";
+ break;
+
+ case TT_MS_ID_JOHAB:
+ encoStr = "Johab";
+ break;
+
+ default:
+ sprintf( tempStr, gettext( "Unknown %d" ), encoding );
+ encoStr = tempStr;
+ }
+ break;
+
+ default:
+ sprintf( tempStr, "%d - %d", platform, encoding );
+ platStr = gettext( "Unknown" );
+ encoStr = tempStr;
+ }
+
+ printf( "%s %s\n", platStr, encoStr );
+ }
+
+ printf( "\n" );
+ printf( "-----------------------------------------------\n\n" );
+ }
+
+ static void
+ Print_Cmap( void )
+ {
+ TT_CharMap charmap;
+ TT_UShort id;
+ TT_Long first,next,last;
+ unsigned short n, i;
+ unsigned short platform, encoding;
+
+ printf( gettext( "ftxcmap test\n" ) );
+ printf( "-----------------------------------------------\n" );
+
+ n = properties.num_CharMaps;
+ if ( n == 0 )
+ {
+ printf( gettext( "The file doesn't seem to have any encoding table.\n" ) );
+ return;
+ }
+
+ printf( gettext( "There are %d encodings:\n\n" ), n );
+
+ for ( i = 0; i < n; i++ )
+ {
+
+ TT_Get_CharMap_ID( face, i, &platform, &encoding );
+ printf( gettext( "encoding %2d:\n" ), i );
+
+ TT_Get_CharMap( face, i, &charmap);
+
+ first = TT_CharMap_First ( charmap, &id);
+ next = TT_CharMap_Next ( charmap, id, &id);
+ last = TT_CharMap_Last ( charmap, &id);
+
+ printf("first: %ld\n",first);
+ printf("next: %ld\n",next);
+ printf("last: %ld\n",last);
+
+ }
+
+ printf( "\n" );
+ printf( "-----------------------------------------------\n\n" );
+ }
+
+
+ int main( int argc, char** argv )
+ {
+ int i;
+ char filename[128 + 4];
+ char alt_filename[128 + 4];
+ char* execname;
+
+#ifdef HAVE_LIBINTL_H
+ setlocale( LC_ALL, "" );
+ bindtextdomain( "freetype", LOCALEDIR );
+ textdomain( "freetype" );
+#endif
+
+ execname = argv[0];
+
+ if ( argc != 2 )
+ {
+ printf( gettext( "ftdump: simple TrueType Dumper -- part of the FreeType project\n" ) );
+ printf( "--------------------------------------------------------------\n" );
+ printf( "\n" );
+ printf( gettext( "Usage: %s fontname[.ttf|.ttc]\n\n" ), execname );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ i = strlen( argv[1] );
+ while ( i > 0 && argv[1][i] != '\\' )
+ {
+ if ( argv[1][i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = '\0';
+ alt_filename[128] = '\0';
+
+ strncpy( filename, argv[1], 128 );
+ strncpy( alt_filename, argv[1], 128 );
+
+ if ( i >= 0 )
+ {
+ strncpy( filename + strlen( filename ), ".ttf", 4 );
+ strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+ }
+
+ /* Initialize engine */
+
+ old_memory = 0;
+
+ if ( (error = TT_Init_FreeType( &engine )) )
+ Panic( gettext( "Error while initializing engine: %s\n" ),
+ TT_ErrToString18( error ) );
+
+ FOOTPRINT( initial_overhead );
+
+ /* Open and Load face */
+
+ error = TT_Open_Face( engine, filename, &face );
+ if ( error == TT_Err_Could_Not_Open_File )
+ {
+ strcpy( filename, alt_filename );
+ error = TT_Open_Face( engine, alt_filename, &face );
+ }
+
+ if ( error )
+ {
+ printf( gettext( "Error while opening %s.\n" ), filename );
+ Panic( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ }
+
+ FOOTPRINT( face_object );
+
+ /* get face properties and allocate preload arrays */
+
+ TT_Get_Face_Properties( face, &properties );
+ num_glyphs = properties.num_Glyphs;
+
+ /* Now do various dumps */
+
+ if ( flag_names )
+ Print_Names();
+
+ if ( flag_encodings )
+ Print_Encodings();
+
+ if ( flag_cmap )
+ Print_Cmap();
+
+ if ( flag_memory )
+ Print_Memory();
+
+
+ TT_Close_Face( face );
+
+ TT_Done_FreeType( engine );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+}
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/fterror.c b/xc/extras/FreeType/test/fterror.c
new file mode 100644
index 000000000..5587ad47e
--- /dev/null
+++ b/xc/extras/FreeType/test/fterror.c
@@ -0,0 +1,75 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* E. Dieterich */
+/* */
+/* fterror: test errstr functionality. */
+/* */
+/****************************************************************************/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "freetype.h"
+#include "ftxerr18.h"
+
+/*
+ * Basically, an external program using FreeType shouldn't depend on an
+ * internal file of the FreeType library, especially not on ft_conf.h -- but
+ * to avoid another configure script which tests for the existence of the
+ * i18n stuff we include ft_conf.h here since we can be sure that our test
+ * programs use the same configuration options as the library itself.
+ */
+
+#include "ft_conf.h"
+
+
+#ifdef HAVE_LIBINTL_H
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#include <libintl.h>
+
+#else /* HAVE_LIBINTL_H */
+
+#define gettext( x ) ( x )
+
+#endif /* HAVE_LIBINTL_H */
+
+
+ int main( void )
+ {
+ int i;
+#ifdef HAVE_LIBINTL_H
+ char* domain;
+
+
+ setlocale( LC_ALL, "" );
+ bindtextdomain( "freetype", LOCALEDIR );
+ domain = textdomain( "freetype" );
+#endif
+
+#if 0
+ printf( "domain: %s\n", domain = textdomain( "" ) );
+#endif
+ printf( gettext("Start of fterror.\n" ) );
+
+ for ( i = 0; i < 10; i++ )
+ printf( "Code: %i, %s\n", i, TT_ErrToString18( i ) );
+
+#if 0
+ printf( "domain: %s\n", domain = textdomain( "" ) );
+#endif
+ printf( gettext( "End of fterror.\n" ) );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/ftlint.c b/xc/extras/FreeType/test/ftlint.c
new file mode 100644
index 000000000..07b1a53db
--- /dev/null
+++ b/xc/extras/FreeType/test/ftlint.c
@@ -0,0 +1,275 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ftlint: a simple TrueType instruction tester. */
+/* */
+/* NOTE: This is just a test program that is used to show off and */
+/* debug the current engine. */
+/* */
+/****************************************************************************/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "freetype.h"
+
+/*
+ * Basically, an external program using FreeType shouldn't depend on an
+ * internal file of the FreeType library, especially not on ft_conf.h -- but
+ * to avoid another configure script which tests for the existence of the
+ * i18n stuff we include ft_conf.h here since we can be sure that our test
+ * programs use the same configuration options as the library itself.
+ */
+
+#include "ft_conf.h"
+
+
+#ifdef HAVE_LIBINTL_H
+
+#ifdef HAVE_LOCALE_H
+#include <locale.h>
+#endif
+
+#include <libintl.h>
+#include "ftxerr18.h"
+
+#else /* !HAVE_LIBINTL */
+
+#define gettext( x ) ( x )
+
+ /* We ignore error message strings with this function */
+
+ static char* TT_ErrToString18( TT_Error error )
+ {
+ static char temp[32];
+
+ sprintf( temp, "0x%04lx", error );
+ return temp;
+ }
+
+#endif /* !HAVE_LIBINTL */
+
+
+ TT_Error error;
+
+ TT_Engine engine;
+
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+
+ TT_Outline outline;
+ TT_Glyph_Metrics metrics;
+
+ TT_Face_Properties properties;
+
+ unsigned int num_glyphs;
+ int ptsize;
+
+ int Fail;
+ int Num;
+
+
+ static TT_Error LoadTrueTypeChar( int idx )
+ {
+ return TT_Load_Glyph( instance, glyph, idx, TTLOAD_DEFAULT );
+ }
+
+
+ static void Usage( char* name )
+ {
+ printf( gettext( "ftlint: simple TrueType instruction tester -- part of the FreeType project\n" ) );
+ printf( "--------------------------------------------------------------------------\n" );
+ printf( "\n" );
+ printf( gettext( "Usage: %s ppem fontname[.ttf|.ttc] [fontname2..]\n" ), name );
+ printf( "\n" );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ int main( int argc, char** argv )
+ {
+ int i, file_index;
+ unsigned int id;
+ char filename[128 + 4];
+ char alt_filename[128 + 4];
+ char* execname;
+ char* fname;
+
+
+#ifdef HAVE_LIBINTL_H
+ setlocale( LC_ALL, "" );
+ bindtextdomain( "freetype", LOCALEDIR );
+ textdomain( "freetype" );
+#endif
+
+ execname = argv[0];
+
+ if ( argc < 3 )
+ Usage( execname );
+
+ if ( sscanf( argv[1], "%d", &ptsize ) != 1 )
+ Usage( execname );
+
+ /* Initialize engine */
+ if ( (error = TT_Init_FreeType( &engine )) )
+ {
+ fprintf( stderr,
+ gettext( "Error while initializing engine: %s\n" ),
+ TT_ErrToString18( error ) );
+ exit( EXIT_FAILURE );
+ }
+
+ /* Now check all files */
+ for ( file_index = 2; file_index < argc; file_index++ )
+ {
+ fname = argv[file_index];
+ i = strlen( fname );
+ while ( i > 0 && fname[i] != '\\' && fname[i] != '/' )
+ {
+ if ( fname[i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = '\0';
+ alt_filename[128] = '\0';
+
+ strncpy( filename, fname, 128 );
+ strncpy( alt_filename, fname, 128 );
+
+ if ( i >= 0 )
+ {
+ strncpy( filename + strlen( filename ), ".ttf", 4 );
+ strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+ }
+
+ /* Load face */
+ error = TT_Open_Face( engine, filename, &face );
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ {
+ strcpy( filename, alt_filename );
+ error = TT_Open_Face( engine, alt_filename, &face );
+ }
+
+ i = strlen( filename );
+ fname = filename;
+
+ while ( i >= 0 )
+ if ( filename[i] == '/' || filename[i] == '\\' )
+ {
+ fname = filename + i + 1;
+ i = -1;
+ }
+ else
+ i--;
+
+ printf( "%s: ", fname );
+
+ if ( error )
+ {
+ printf( "ERROR\n ");
+ printf( gettext( "Could not find or open file.\n" ) );
+ printf( " ");
+ printf( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ goto Fail_Face;
+ }
+
+ /* get face properties */
+
+ TT_Get_Face_Properties( face, &properties );
+ num_glyphs = properties.num_Glyphs;
+
+ /* create glyph */
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ {
+ printf( "ERROR\n ");
+ printf( gettext( "Could not create glyph container.\n" ) );
+ printf( " ");
+ printf( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ goto Fail_Glyph;
+ }
+
+ /* create instance */
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ {
+ printf( "ERROR\n ");
+ printf( gettext( "Could not create instance.\n" ) );
+ printf( " ");
+ printf( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ goto Fail_Instance;
+ }
+
+ error = TT_Set_Instance_PixelSizes( instance,
+ ptsize,
+ ptsize,
+ ptsize*3/4 );
+ if ( error )
+ {
+ printf( "ERROR\n ");
+ printf( gettext( "Could not set point size to %d.\n" ), ptsize );
+ printf( " ");
+ printf( gettext( "FreeType error message: %s\n" ),
+ TT_ErrToString18( error ) );
+ goto Fail_Set;
+ }
+
+ Fail = 0;
+
+ for ( id = 0; id < num_glyphs; id++ )
+ {
+ if ( (error = LoadTrueTypeChar( id )) )
+ {
+ if ( Fail < 10 )
+ {
+ printf( !Fail ? "ERROR\n " : " " );
+ printf( gettext( "glyph %4u: %s\n" ),
+ id, TT_ErrToString18( error ) );
+ }
+ Fail++;
+ }
+ }
+
+ if ( Fail == 0 )
+ printf( "OK.\n" );
+ else
+ {
+ printf( " " );
+ if ( Fail == 1 )
+ printf( gettext( "1 fail.\n" ) );
+ else
+ printf( gettext( "%d fails.\n" ), Fail );
+ }
+
+ Fail_Set:
+ TT_Done_Instance( instance );
+ Fail_Instance:
+ TT_Done_Glyph( glyph );
+ Fail_Glyph:
+ TT_Close_Face( face );
+ Fail_Face:
+ ;
+ }
+
+ TT_Done_FreeType( engine );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/ftstring.c b/xc/extras/FreeType/test/ftstring.c
new file mode 100644
index 000000000..ec293a646
--- /dev/null
+++ b/xc/extras/FreeType/test/ftstring.c
@@ -0,0 +1,486 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ftstring: Making string text from individual glyph information. */
+/* */
+/* Keys: */
+/* */
+/* + : fast scale up */
+/* - : fast scale down */
+/* u : fine scale down */
+/* j : fine scale up */
+/* */
+/* h : toggle hinting */
+/* */
+/* ESC : exit */
+/* */
+/* */
+/* NOTE: This is just a test program that is used to show off and */
+/* debug the current engine. */
+/* */
+/****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "freetype.h"
+#include "common.h" /* for Panic() and Message() only */
+
+#include "gmain.h"
+#include "gevents.h"
+#include "gdriver.h"
+#include "display.h"
+
+#define Pi 3.1415926535
+
+#define MAXPTSIZE 500 /* dtp */
+#define Center_X ( Bit.width / 2 ) /* dtp */
+#define Center_Y ( Bit.rows / 2 ) /* dtp */
+
+ char Header[128];
+
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+ TT_CharMap char_map;
+
+ TT_Glyph_Metrics metrics;
+ TT_Outline outline;
+ TT_Face_Properties properties;
+ TT_Instance_Metrics imetrics;
+
+ int num_glyphs;
+
+ int ptsize;
+ int hinted;
+
+ int Rotation;
+ int Fail;
+ int Num;
+ unsigned char autorun;
+
+ int gray_render;
+
+ short glyph_code[128];
+ int num_codes;
+
+/* Convert an ASCII string to a string of glyph indexes. */
+/* */
+/* IMPORTANT NOTE: */
+/* */
+/* There is no portable way to convert from any system's char. code */
+/* to Unicode. This function simply takes a char. string as argument */
+/* and "interprets" each character as a Unicode char. index with no */
+/* further check. */
+/* */
+/* This mapping is only valid for the ASCII character set (i.e., */
+/* codes 32 to 127); all other codes (like accentuated characters) */
+/* will produce more or less random results, depending on the system */
+/* being run. */
+
+ static void CharToUnicode( char* source )
+ {
+ unsigned short i, n;
+ unsigned short platform, encoding;
+
+ /* First, look for a Unicode charmap */
+
+ n = properties.num_CharMaps;
+
+ for ( i = 0; i < n; i++ )
+ {
+ TT_Get_CharMap_ID( face, i, &platform, &encoding );
+ if ( (platform == 3 && encoding == 1 ) ||
+ (platform == 0 && encoding == 0 ) )
+ {
+ TT_Get_CharMap( face, i, &char_map );
+ i = n + 1;
+ }
+ }
+
+ if ( i == n )
+ Panic( "Sorry, but this font doesn't contain any Unicode mapping table\n" );
+
+ for ( n = 0; n < 128 && source[n]; n++ )
+ glyph_code[n] = TT_Char_Index( char_map, (short)source[n] );
+
+#if 0
+ /* Note, if you have a function, say ToUnicode(), to convert from */
+ /* char codes to Unicode, use the following line instead: */
+
+ glyph_code[n] = TT_Char_Index( char_map, ToUnicode( source[n] ) );
+#endif
+
+ num_codes = n;
+ }
+
+
+ static TT_Error Reset_Scale( int pointSize )
+ {
+ TT_Error error;
+
+
+ if ( (error = TT_Set_Instance_CharSize( instance, pointSize*64 )) )
+ {
+ RestoreScreen();
+ printf( "error = 0x%x\n", (int)error );
+ Panic( "could not reset instance\n" );
+ }
+
+ TT_Get_Instance_Metrics( instance, &imetrics );
+
+ /* now re-allocate the small bitmap */
+ if ( gray_render )
+ {
+ Init_Small( imetrics.x_ppem, imetrics.y_ppem );
+ Clear_Small();
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static TT_Error LoadTrueTypeChar( int idx, int hint )
+ {
+ int flags;
+
+
+ flags = TTLOAD_SCALE_GLYPH;
+ if ( hint )
+ flags |= TTLOAD_HINT_GLYPH;
+
+ return TT_Load_Glyph( instance, glyph, idx, flags );
+ }
+
+
+ static TT_Error Render_All( void )
+ {
+ TT_F26Dot6 x, y, z, minx, miny, maxx, maxy;
+ int i;
+
+ TT_Error error;
+
+
+ /* On the first pass, we compute the compound bounding box */
+
+ x = y = 0;
+
+ minx = miny = maxx = maxy = 0;
+
+ for ( i = 0; i < num_codes; i++ )
+ {
+ if ( !(error = LoadTrueTypeChar( glyph_code[i], hinted )) )
+ {
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+
+ z = x + metrics.bbox.xMin;
+ if ( minx > z )
+ minx = z;
+
+ z = x + metrics.bbox.yMax;
+ if ( maxx < z )
+ maxx = z;
+
+ z = y + metrics.bbox.yMin;
+ if ( miny > z )
+ miny = z;
+
+ z = y + metrics.bbox.yMax;
+ if ( maxy < z )
+ maxy = z;
+
+ x += metrics.advance & -64;
+ }
+ else
+ Fail++;
+ }
+
+ /* We now center the bbox inside the target bitmap */
+
+ minx = ( minx & -64 ) >> 6;
+ miny = ( miny & -64 ) >> 6;
+
+ maxx = ( (maxx+63) & -64 ) >> 6;
+ maxy = ( (maxy+63) & -64 ) >> 6;
+
+ maxx -= minx;
+ maxy -= miny;
+
+ minx = (Bit.width - maxx)/2;
+ miny = (Bit.rows + miny)/2;
+
+ maxx += minx;
+ maxy += maxy;
+
+ /* On the second pass, we render each glyph to its centered position. */
+ /* This is slow, because we reload each glyph to render it! */
+
+ x = minx;
+ y = miny;
+
+ for ( i = 0; i < num_codes; i++ )
+ {
+ if ( !(error = LoadTrueTypeChar( glyph_code[i], hinted )) )
+ {
+ TT_Get_Glyph_Metrics( glyph, &metrics );
+
+ Render_Single_Glyph( gray_render, glyph, x, y );
+
+ x += metrics.advance/64;
+ }
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static int Process_Event( TEvent* event )
+ {
+ switch ( event->what )
+ {
+ case event_Quit: /* ESC or q */
+ return 0;
+
+ case event_Keyboard:
+ if ( event->info == 'h' ) /* Toggle hinting */
+ hinted = !hinted;
+ break;
+
+ case event_Rotate_Glyph:
+ break;
+
+ case event_Scale_Glyph:
+ ptsize += event->info;
+ if ( ptsize < 1 ) ptsize = 1;
+ if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE;
+ break;
+
+ case event_Change_Glyph:
+ break;
+ }
+
+ return 1;
+ }
+
+
+ static void usage( char* execname )
+ {
+ printf( "\n" );
+ printf( "ftstring: simple String Test Display -- part of the FreeType project\n" );
+ printf( "--------------------------------------------------------------------\n" );
+ printf( "\n" );
+ printf( "Usage: %s [options below] ppem fontname[.ttf|.ttc] [string]\n",
+ execname );
+ printf( "\n" );
+ printf( " -g gray-level rendering (default: none)\n" );
+ printf( " -r R use resolution R dpi (default: 96 dpi)\n" );
+ printf( "\n" );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ int main( int argc, char** argv )
+ {
+ int i, old_ptsize, orig_ptsize, file;
+ int XisSetup = 0;
+ char filename[128 + 4];
+ char alt_filename[128 + 4];
+ char* execname;
+ int option;
+ int res = 96;
+
+ TT_Error error;
+ TEvent event;
+
+
+ execname = argv[0];
+
+ while ( 1 )
+ {
+ option = ft_getopt( argc, argv, "gr:" );
+
+ if ( option == -1 )
+ break;
+
+ switch ( option )
+ {
+ case 'g':
+ gray_render = 1;
+ break;
+
+ case 'r':
+ res = atoi( ft_optarg );
+ if ( res < 1 )
+ usage( execname );
+ break;
+
+ default:
+ usage( execname );
+ break;
+ }
+ }
+
+ argc -= ft_optind;
+ argv += ft_optind;
+
+ if ( argc <= 1 )
+ usage( execname );
+
+ if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )
+ orig_ptsize = 64;
+
+ file = 1;
+
+ /* Initialize engine */
+
+ if ( (error = TT_Init_FreeType( &engine )) )
+ Panic( "Error while initializing engine, code = 0x%x.\n", error );
+
+ ptsize = orig_ptsize;
+ hinted = 1;
+
+ i = strlen( argv[file] );
+ while ( i > 0 && argv[file][i] != '\\' && argv[file][i] != '/' )
+ {
+ if ( argv[file][i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = '\0';
+ alt_filename[128] = '\0';
+
+ strncpy( filename, argv[file], 128 );
+ strncpy( alt_filename, argv[file], 128 );
+
+ if ( i >= 0 )
+ {
+ strncpy( filename + strlen( filename ), ".ttf", 4 );
+ strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+ }
+
+ /* Load face */
+
+ error = TT_Open_Face( engine, filename, &face );
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ {
+ strcpy( filename, alt_filename );
+ error = TT_Open_Face( engine, alt_filename, &face );
+ }
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ Panic( "Could not find/open %s.\n", filename );
+ else if (error)
+ Panic( "Error while opening %s, error code = 0x%x.\n",
+ filename, error );
+
+ /* get face properties and allocate preload arrays */
+
+ TT_Get_Face_Properties( face, &properties );
+
+ num_glyphs = properties.num_Glyphs;
+
+ /* create glyph */
+
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ Panic( "Could not create glyph container.\n" );
+
+ /* create instance */
+
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ Panic( "Could not create instance for %s.\n", filename );
+
+ error = TT_Set_Instance_Resolutions( instance, res, res );
+ if ( error )
+ Panic( "Could not set device resolutions." );
+
+ if ( !XisSetup )
+ {
+ XisSetup = 1;
+
+ if ( gray_render )
+ {
+ if ( !SetGraphScreen( Graphics_Mode_Gray ) )
+ Panic( "Could not set up grayscale graphics mode.\n" );
+
+ TT_Set_Raster_Gray_Palette( engine, virtual_palette );
+ }
+ else
+ {
+ if ( !SetGraphScreen( Graphics_Mode_Mono ) )
+ Panic( "Could not set up mono graphics mode.\n" );
+ }
+ }
+
+ Init_Display( gray_render );
+
+ Reset_Scale( ptsize );
+
+ old_ptsize = ptsize;
+
+ Fail = 0;
+ Num = 0;
+
+ CharToUnicode( ( argv[2] ? argv[2] :
+ "The quick brown fox jumps over the lazy dog" ) );
+
+ for ( ;; )
+ {
+ int key;
+
+
+ Clear_Display();
+ Render_All();
+ if ( gray_render )
+ Convert_To_Display_Palette();
+
+ sprintf( Header, "%s: ptsize: %4d hinting: %s",
+ ft_basename( filename ), ptsize,
+ hinted ? "on" : "off" );
+
+ Display_Bitmap_On_Screen( Bit.bitmap, Bit.rows, Bit.cols );
+
+#ifndef X11
+#ifndef OS2
+ Print_XY( 0, 0, Header );
+#endif
+#endif
+
+ Get_Event( &event );
+ if ( !( key = Process_Event( &event ) ) )
+ goto Fin;
+
+ if ( ptsize != old_ptsize )
+ {
+ if ( Reset_Scale( ptsize ) )
+ Panic( "Could not resize font.\n" );
+
+ old_ptsize = ptsize;
+ }
+ }
+
+ Fin:
+ RestoreScreen();
+
+ TT_Done_FreeType( engine );
+
+ printf( "Execution completed successfully.\n" );
+ printf( "Fails = %d.\n", Fail );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+}
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/ftstrpnm.c b/xc/extras/FreeType/test/ftstrpnm.c
new file mode 100644
index 000000000..e505dacaa
--- /dev/null
+++ b/xc/extras/FreeType/test/ftstrpnm.c
@@ -0,0 +1,511 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ftstrpnm: convert text to image (in PGM or PBM format) */
+/* */
+/* NOTE: This is just a test program that is used to show off and */
+/* debug the current engine. */
+/* */
+/****************************************************************************/
+
+#define PROGNAME "ftstrpnm"
+
+#include "freetype.h"
+
+#include "common.h" /* for ft_getopt() */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define TT_VALID( handle ) ( ( handle ).z != NULL )
+
+
+ /* Global variables */
+
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+
+ TT_Face_Properties properties;
+
+ TT_Raster_Map bit;
+ TT_Raster_Map small_bit; /* used when font-smoothing is enabled */
+
+ int pnm_width, pnm_height;
+ int pnm_x_shift, pnm_y_shift;
+
+
+ /* Loaded glyphs for all characters */
+
+ TT_Glyph *glyphs = NULL;
+
+
+ /* Options */
+
+ int dpi = 96;
+ int ptsize = 12;
+ int hinted = 1;
+ int smooth = 0;
+ int border = 0;
+
+
+ /* raster map management */
+
+ static void Init_Raster_Map( TT_Raster_Map* bit, int width, int height )
+ {
+ bit->rows = height;
+ bit->width = ( width + 3 ) & -4;
+ bit->flow = TT_Flow_Down;
+
+ if ( smooth )
+ {
+ bit->cols = bit->width;
+ bit->size = bit->rows * bit->width;
+ }
+ else
+ {
+ bit->cols = ( bit->width + 7 ) / 8; /* convert to # of bytes */
+ bit->size = bit->rows * bit->cols; /* number of bytes in buffer */
+ }
+
+ bit->bitmap = (void *) malloc( bit->size );
+ if ( !bit->bitmap )
+ Panic( "Not enough memory to allocate bitmap!\n" );
+ }
+
+
+ static void Done_Raster_Map( TT_Raster_Map *bit )
+ {
+ free( bit->bitmap );
+ bit->bitmap = NULL;
+ }
+
+
+ static void Clear_Raster_Map( TT_Raster_Map* bit )
+ {
+ memset( bit->bitmap, 0, bit->size );
+ }
+
+
+ static void Blit_Or( TT_Raster_Map* dst, TT_Raster_Map* src,
+ int x_off, int y_off )
+ {
+ int x, y;
+ int x1, x2, y1, y2;
+ char *s, *d;
+
+
+ /* clipping */
+
+ x1 = x_off < 0 ? -x_off : 0;
+ y1 = y_off < 0 ? -y_off : 0;
+
+ x2 = (int)dst->cols - x_off;
+ if ( x2 > src->cols )
+ x2 = src->cols;
+
+ y2 = (int)dst->rows - y_off;
+ if ( y2 > src->rows )
+ y2 = src->rows;
+
+ if ( x1 >= x2 )
+ return;
+
+ /* do the real work now */
+
+ for ( y = y1; y < y2; ++y )
+ {
+ s = ( (char*)src->bitmap ) + y * src->cols + x1;
+ d = ( (char*)dst->bitmap ) + ( y + y_off ) * dst->cols + x1 + x_off;
+
+ for ( x = x1; x < x2; ++x )
+ *d++ |= *s++;
+ }
+ }
+
+
+ static void Dump_Raster_Map( TT_Raster_Map* bit, FILE* file )
+ {
+ /* kudos for this code snippet go to Norman Walsh */
+
+ char* bmap;
+ int i;
+
+
+ bmap = (char *)bit->bitmap;
+
+ if ( smooth )
+ {
+ fprintf( file, "P5\n%d %d\n4\n", pnm_width, pnm_height );
+ for ( i = bit->size - 1; i >= 0; --i )
+ bmap[i] = bmap[i] > 4 ? 0 : 4 - bmap[i];
+ for ( i = pnm_height; i > 0; --i, bmap += bit->cols )
+ fwrite( bmap, 1, pnm_width, file );
+ }
+ else
+ {
+ fprintf( file, "P4\n%d %d\n", pnm_width, pnm_height );
+ for ( i = pnm_height; i > 0; --i, bmap += bit->cols )
+ fwrite( bmap, 1, (pnm_width+7) / 8, file );
+ }
+
+ fflush( file );
+ }
+
+
+ /* glyph management */
+
+ static void Load_Glyphs( char* txt, int txtlen )
+ {
+ unsigned short i, n, code, load_flags;
+ unsigned short num_glyphs = 0, no_cmap = 0;
+ unsigned short platform, encoding;
+ TT_Error error;
+ TT_CharMap char_map;
+
+
+ /* First, look for a Unicode charmap */
+
+ n = properties.num_CharMaps;
+
+ for ( i = 0; i < n; i++ )
+ {
+ TT_Get_CharMap_ID( face, i, &platform, &encoding );
+ if ( (platform == 3 && encoding == 1 ) ||
+ (platform == 0 && encoding == 0 ) )
+ {
+ TT_Get_CharMap( face, i, &char_map );
+ break;
+ }
+ }
+
+ if ( i == n )
+ {
+ TT_Face_Properties properties;
+
+
+ TT_Get_Face_Properties( face, &properties );
+
+ no_cmap = 1;
+ num_glyphs = properties.num_Glyphs;
+ }
+
+
+ /* Second, allocate the array */
+
+ glyphs = (TT_Glyph*)malloc( 256 * sizeof ( TT_Glyph ) );
+ memset( glyphs, 0, 256 * sizeof ( TT_Glyph ) );
+
+ /* Finally, load the glyphs you need */
+
+ load_flags = TTLOAD_SCALE_GLYPH;
+ if ( hinted )
+ load_flags |= TTLOAD_HINT_GLYPH;
+
+ for ( i = 0; i < txtlen; ++i )
+ {
+ unsigned char j = txt[i];
+
+
+ if ( TT_VALID( glyphs[j] ) )
+ continue;
+
+ if ( no_cmap )
+ {
+ code = (j - ' ' + 1) < 0 ? 0 : (j - ' ' + 1);
+ if ( code >= num_glyphs )
+ code = 0;
+ }
+ else
+ code = TT_Char_Index( char_map, j );
+
+ (void)(
+ ( error = TT_New_Glyph( face, &glyphs[j] ) ) ||
+ ( error = TT_Load_Glyph( instance, glyphs[j], code, load_flags ) )
+ );
+
+ if ( error )
+ Panic( "Cannot allocate and load glyph: error 0x%x.\n", error );
+ }
+ }
+
+
+ static void Done_Glyphs( void )
+ {
+ int i;
+
+
+ if ( !glyphs )
+ return;
+
+ for ( i = 0; i < 256; ++i )
+ TT_Done_Glyph( glyphs[i] );
+
+ free( glyphs );
+
+ glyphs = NULL;
+ }
+
+
+ /* face & instance management */
+
+ static void Init_Face( const char* filename )
+ {
+ TT_Error error;
+
+
+ /* load the typeface */
+
+ error = TT_Open_Face( engine, filename, &face );
+ if ( error )
+ {
+ if ( error == TT_Err_Could_Not_Open_File )
+ Panic( "Could not find/open %s.\n", filename );
+ else
+ Panic( "Error while opening %s, error code = 0x%x.\n",
+ filename, error );
+ }
+
+ TT_Get_Face_Properties( face, &properties );
+
+ /* create and initialize instance */
+
+ (void) (
+ ( error = TT_New_Instance( face, &instance ) ) ||
+ ( error = TT_Set_Instance_Resolutions( instance, dpi, dpi ) ) ||
+ ( error = TT_Set_Instance_CharSize( instance, ptsize*64 ) )
+ );
+
+ if ( error )
+ Panic( "Could not create and initialize instance: error 0x%x.\n",
+ error );
+ }
+
+
+ static void Done_Face( void )
+ {
+ TT_Done_Instance( instance );
+ TT_Close_Face( face );
+ }
+
+
+ /* rasterization stuff */
+
+ static void Init_Raster_Areas( const char* txt, int txtlen )
+ {
+ int i, upm, ascent, descent;
+ TT_Face_Properties properties;
+ TT_Instance_Metrics imetrics;
+ TT_Glyph_Metrics gmetrics;
+
+
+ /* allocate the large bitmap */
+
+ TT_Get_Face_Properties( face, &properties );
+ TT_Get_Instance_Metrics( instance, &imetrics );
+
+ upm = properties.header->Units_Per_EM;
+ ascent = ( properties.horizontal->Ascender * imetrics.y_ppem ) / upm;
+ descent = ( properties.horizontal->Descender * imetrics.y_ppem ) / upm;
+
+ pnm_width = 2 * border;
+ pnm_height = 2 * border + ascent - descent;
+
+ for ( i = 0; i < txtlen; ++i )
+ {
+ unsigned char j = txt[i];
+
+
+ if ( !TT_VALID( glyphs[j] ) )
+ continue;
+
+ TT_Get_Glyph_Metrics( glyphs[j], &gmetrics );
+ pnm_width += gmetrics.advance / 64;
+ }
+
+ Init_Raster_Map( &bit, pnm_width, pnm_height );
+ Clear_Raster_Map( &bit );
+
+ pnm_x_shift = border;
+ pnm_y_shift = border - descent;
+
+ /* allocate the small bitmap if you need it */
+
+ if ( smooth )
+ Init_Raster_Map( &small_bit, imetrics.x_ppem + 32, pnm_height );
+ }
+
+
+ static void Done_Raster_Areas( void )
+ {
+ Done_Raster_Map( &bit );
+ if ( smooth )
+ Done_Raster_Map( &small_bit );
+ }
+
+
+ static void Render_Glyph( TT_Glyph glyph,
+ int x_off, int y_off,
+ TT_Glyph_Metrics* gmetrics )
+ {
+ if ( !smooth )
+ TT_Get_Glyph_Bitmap( glyph, &bit, x_off * 64, y_off * 64);
+ else
+ {
+ TT_F26Dot6 xmin, ymin, xmax, ymax;
+
+
+ /* grid-fit the bounding box */
+
+ xmin = gmetrics->bbox.xMin & -64;
+ ymin = gmetrics->bbox.yMin & -64;
+ xmax = (gmetrics->bbox.xMax + 63) & -64;
+ ymax = (gmetrics->bbox.yMax + 63) & -64;
+
+ /* now render the glyph in the small pixmap */
+ /* and blit-or the resulting small pixmap into the biggest one */
+
+ Clear_Raster_Map( &small_bit );
+ TT_Get_Glyph_Pixmap( glyph, &small_bit, -xmin, -ymin );
+ Blit_Or( &bit, &small_bit, xmin/64 + x_off, -ymin/64 - y_off );
+ }
+ }
+
+
+ static void Render_All_Glyphs( char* txt, int txtlen )
+ {
+ int i;
+ TT_F26Dot6 x, y, adjx;
+ TT_Glyph_Metrics gmetrics;
+
+
+ x = pnm_x_shift;
+ y = pnm_y_shift;
+
+ for ( i = 0; i < txtlen; i++ )
+ {
+ unsigned char j = txt[i];
+
+ if ( !TT_VALID( glyphs[j] ) )
+ continue;
+
+ TT_Get_Glyph_Metrics( glyphs[j], &gmetrics );
+
+ adjx = x; /* ??? lsb */
+ Render_Glyph( glyphs[j], adjx, y, &gmetrics );
+
+ x += gmetrics.advance / 64;
+ }
+ }
+
+
+ static void usage( void )
+ {
+ printf( "\n" );
+ printf( "%s: simple text to image converter -- part of the FreeType project\n", PROGNAME );
+ printf( "\n" );
+ printf( "Usage: %s [options below] filename [string]\n", PROGNAME );
+ printf( "\n" );
+ printf( " -g gray-level rendering (default: off)\n" );
+ printf( " -h hinting off (default: on)\n" );
+ printf( " -r X resolution X dpi (default: 96)\n" );
+ printf( " -p X pointsize X pt (default: 12)\n" );
+ printf( " -b X border X pixels wide (default: 0)\n" );
+ printf( "\n" );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ int main( int argc, char** argv )
+ {
+ int option, txtlen;
+ char *txt, *filename;
+ TT_Error error;
+
+
+ /* Parse options */
+
+ while ( 1 )
+ {
+ option = ft_getopt( argc, argv, "ghr:p:b:" );
+
+ if ( option == -1 )
+ break;
+
+ switch ( option )
+ {
+ case 'g':
+ smooth = 1;
+ break;
+ case 'h':
+ hinted = 0;
+ break;
+ case 'r':
+ dpi = atoi( ft_optarg );
+ break;
+ case 'p':
+ ptsize = atoi( ft_optarg );
+ break;
+ case 'b':
+ border = atoi( ft_optarg );
+ break;
+
+ default:
+ usage();
+ break;
+ }
+ }
+
+ argc -= ft_optind;
+ argv += ft_optind;
+
+ if ( argc <= 0 || argc > 2 || dpi <= 0 || ptsize <= 0 || border < 0 )
+ usage();
+
+ filename = argv[0];
+
+ if ( argc > 1 )
+ txt = argv[1];
+ else
+ txt = "The quick brown fox jumps over the lazy dog";
+
+ txtlen = strlen( txt );
+
+ /* Initialize engine and other stuff */
+
+ error = TT_Init_FreeType( &engine );
+ if ( error )
+ Panic( "Error while initializing engine, code = 0x%x.\n", error );
+
+ Init_Face( filename );
+ Load_Glyphs( txt, txtlen );
+ Init_Raster_Areas( txt, txtlen );
+
+ /* Do the real work now */
+
+ Render_All_Glyphs( txt, txtlen );
+ Dump_Raster_Map( &bit, stdout );
+
+ /* Clean up */
+
+ Done_Raster_Areas();
+ Done_Glyphs();
+ Done_Face();
+
+ /* That's all, folks! */
+
+ TT_Done_FreeType( engine );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+}
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/fttimer.c b/xc/extras/FreeType/test/fttimer.c
new file mode 100644
index 000000000..843768134
--- /dev/null
+++ b/xc/extras/FreeType/test/fttimer.c
@@ -0,0 +1,455 @@
+/****************************************************************************/
+/* */
+/* The FreeType project - a Free and Portable Quality TrueType Renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* fttimer: A simple performance benchmark. Now with graylevel rendering */
+/* with the '-g' option. */
+/* */
+/* Be aware that the timer program benchmarks different things */
+/* in each release of the FreeType library. Thus, performance */
+/* should only be compared between similar release numbers. */
+/* */
+/* */
+/* NOTE: This is just a test program that is used to show off and */
+/* debug the current engine. In no way does it shows the final */
+/* high-level interface that client applications will use. */
+/* */
+/****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "freetype.h"
+#include "common.h" /* for Panic() */
+
+#include "gmain.h"
+#include "gdriver.h"
+#include "gevents.h"
+
+#ifndef __USE_MISC
+#define __USE_MISC /* MkLinux needs this to get a definition of
+ CLOCKS_PER_SEC */
+#endif
+
+#include <time.h> /* for clock() */
+
+/* SunOS 4.1.* does not define CLOCKS_PER_SEC, so include <sys/param.h> */
+/* to get the HZ macro which is the equivalent. */
+#if defined(__sun__) && !defined(SVR4) && !defined(__SVR4)
+#include <sys/param.h>
+#define CLOCKS_PER_SEC HZ
+#endif
+
+#define MAX_GLYPHS 512 /* Maximum number of glyphs rendered at one time */
+
+ char Header[128];
+
+ TT_Error error;
+
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+
+ TT_Outline outline;
+ TT_Glyph_Metrics metrics;
+
+ TT_Face_Properties properties;
+
+ TT_F26Dot6* cur_x;
+ TT_F26Dot6* cur_y;
+
+ unsigned short* cur_endContour;
+ unsigned char* cur_touch;
+
+ TT_Outline outlines[MAX_GLYPHS];
+
+ int num_glyphs;
+ int tab_glyphs;
+ int cur_glyph;
+ int cur_point;
+ unsigned short cur_contour;
+
+ TT_Raster_Map Bit;
+
+ int Fail;
+ int Num;
+
+ short visual; /* display glyphs while rendering */
+ short gray_render; /* smooth fonts with gray levels */
+
+
+ static void Clear_Buffer();
+
+
+/*******************************************************************/
+/* */
+/* Get_Time: */
+/* */
+/* Returns the current time in milliseconds. */
+/* */
+/*******************************************************************/
+
+ long Get_Time( void )
+ {
+ return clock() * 1000 / CLOCKS_PER_SEC;
+ }
+
+
+/*******************************************************************/
+/* */
+/* Init_Engine: */
+/* */
+/* Allocates bitmap, render pool and other structs... */
+/* */
+/*******************************************************************/
+
+ void Init_Engine( void )
+ {
+ Bit.rows = vio_Height; /* The whole window */
+ Bit.width = vio_Width;
+
+ if ( gray_render )
+ {
+ Bit.cols = Bit.width;
+ Bit.flow = TT_Flow_Up;
+ Bit.size = Bit.rows * Bit.width;
+ }
+ else
+ {
+ Bit.cols = (Bit.width + 7) / 8; /* convert to # of bytes */
+ Bit.flow = TT_Flow_Up;
+ Bit.size = Bit.rows * Bit.cols; /* number of bytes in buffer */
+ }
+
+ Bit.bitmap = (void*)malloc( Bit.size );
+ if ( !Bit.bitmap )
+ Panic( "ERROR: not enough memory to allocate bitmap!\n" );
+
+ Clear_Buffer();
+ }
+
+
+/*******************************************************************/
+/* */
+/* Clear_Buffer: */
+/* */
+/* Clears current bitmap. */
+/* */
+/*******************************************************************/
+
+ static void Clear_Buffer( void )
+ {
+ if ( gray_render )
+ memset( Bit.bitmap, gray_palette[0], Bit.size );
+ else
+ memset( Bit.bitmap, 0, Bit.size );
+ }
+
+
+/*******************************************************************/
+/* */
+/* LoadTrueTypeChar: */
+/* */
+/* Loads a glyph into memory. */
+/* */
+/*******************************************************************/
+
+ TT_Error LoadTrueTypeChar( int idx )
+ {
+ error = TT_Load_Glyph( instance, glyph, idx, TTLOAD_DEFAULT );
+ if ( error )
+ return error;
+
+ TT_Get_Glyph_Outline( glyph, &outline );
+
+ outline.second_pass = 0;
+ outline.high_precision = 0;
+ outline.dropout_mode = 0;
+
+ /* debugging */
+#if 0
+ if ( idx == 0 && !visual )
+ {
+ printf( "points = %d\n", outline.points );
+ for ( j = 0; j < outline.points; j++ )
+ printf( "%02x (%01hx,%01hx)\n",
+ j, outline.xCoord[j], outline.yCoord[j] );
+ printf( "\n" );
+ }
+#endif
+
+ /* create a new outline */
+ TT_New_Outline( outline.n_points,
+ outline.n_contours,
+ &outlines[cur_glyph] );
+
+ /* copy the glyph outline into it */
+ outline.high_precision = 0;
+ outline.second_pass = 0;
+ TT_Copy_Outline( &outline, &outlines[cur_glyph] );
+
+ /* translate it */
+ TT_Translate_Outline( &outlines[cur_glyph],
+ vio_Width * 16,
+ vio_Height * 16 );
+ cur_glyph++;
+
+ return TT_Err_Ok;
+ }
+
+
+/*******************************************************************/
+/* */
+/* ConvertRaster: */
+/* */
+/* Performs scan conversion. */
+/* */
+/*******************************************************************/
+
+ TT_Error ConvertRaster( int index )
+ {
+ outlines[index].second_pass = 0;
+ outlines[index].high_precision = 0;
+
+ if ( gray_render )
+ return TT_Get_Outline_Pixmap( engine, &outlines[index], &Bit );
+ else
+ return TT_Get_Outline_Bitmap( engine, &outlines[index], &Bit );
+ }
+
+
+ int main( int argc, char** argv )
+ {
+ int i, total, mode, base, rendered_glyphs;
+ char filename[128 + 4];
+ char alt_filename[128 + 4];
+ char* execname;
+
+ long t, t0, tz0;
+
+
+ execname = argv[0];
+
+ gray_render = 0;
+ visual = 0;
+
+ while ( argc > 1 && argv[1][0] == '-' )
+ {
+ switch ( argv[1][1] )
+ {
+ case 'g':
+ gray_render = 1;
+ break;
+
+ case 'v':
+ visual = 1;
+ break;
+
+ default:
+ Panic( "Unknown argument '%s'!\n", argv[1] );
+ }
+ argc--;
+ argv++;
+ }
+
+ if ( argc != 2 )
+ {
+ fprintf( stderr, "fttimer: simple performance timer -- part of the FreeType project\n" );
+ fprintf( stderr,"-----------------------------------------------------------------\n\n" );
+ fprintf( stderr,"Usage: %s [-g] [-v] fontname[.ttf|.ttc]\n\n", execname );
+ fprintf( stderr," where '-g' asks for gray-levels rendering\n" );
+ fprintf( stderr," '-v' displays while rendering (slower)\n" );
+
+ exit( EXIT_FAILURE );
+ }
+
+ i = strlen( argv[1] );
+ while ( i > 0 && argv[1][i] != '\\' )
+ {
+ if ( argv[1][i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = '\0';
+ alt_filename[128] = '\0';
+
+ strncpy( filename, argv[1], 128 );
+ strncpy( alt_filename, argv[1], 128 );
+
+ if ( i >= 0 )
+ {
+ strncpy( filename + strlen( filename ), ".ttf", 4 );
+ strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+ }
+
+ /* Initialize engine */
+
+ if ( (error = TT_Init_FreeType( &engine )) )
+ Panic( "Error while initializing engine, code = 0x%x.\n", error );
+
+ /* Load face */
+
+ error = TT_Open_Face( engine, filename, &face );
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ {
+ strcpy( filename, alt_filename );
+ error = TT_Open_Face( engine, alt_filename, &face );
+ }
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ Panic( "Could not find/open %s.\n", filename );
+ else if ( error )
+ Panic( "Error while opening %s, error code = 0x%x.\n",
+ filename, error );
+
+ /* get face properties and allocate preload arrays */
+
+ TT_Get_Face_Properties( face, &properties );
+
+ num_glyphs = properties.num_Glyphs;
+
+ tab_glyphs = MAX_GLYPHS;
+ if ( tab_glyphs > num_glyphs )
+ tab_glyphs = num_glyphs;
+
+ /* create glyph */
+
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ Panic( "Could not create glyph container.\n" );
+
+ /* create instance */
+
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ Panic( "Could not create instance for %s.\n", filename );
+
+ error = TT_Set_Instance_CharSize( instance, 400*64 );
+ if ( error )
+ Panic( "Could not reset instance for %s.\n", filename );
+
+ if ( gray_render )
+ mode = Graphics_Mode_Gray;
+ else
+ mode = Graphics_Mode_Mono;
+
+ if ( visual )
+ {
+ if ( !SetGraphScreen( mode ) )
+ Panic( "Could not set graphics mode.\n" );
+ TT_Set_Raster_Gray_Palette( engine, gray_palette );
+ }
+ else
+ {
+ /* This is the default bitmap size used */
+ vio_Width = 640;
+ vio_Height = 450;
+ }
+
+ Init_Engine();
+
+ Num = 0;
+ Fail = 0;
+
+ total = num_glyphs;
+ base = 0;
+
+ rendered_glyphs = 0;
+
+ t0 = 0; /* Initial time */
+
+ tz0 = Get_Time();
+
+ while ( total > 0 )
+ {
+ /* First, preload 'tab_glyphs' in memory */
+
+ cur_glyph = 0;
+ cur_point = 0;
+ cur_contour = 0;
+
+ printf( "loading %d glyphs", tab_glyphs );
+
+ for ( Num = 0; Num < tab_glyphs; Num++ )
+ {
+ error = LoadTrueTypeChar( base + Num );
+ if ( error )
+ Fail++;
+
+ total--;
+ }
+
+ base += tab_glyphs;
+
+ if ( tab_glyphs > total )
+ tab_glyphs = total;
+
+ printf( ", rendering... " );
+
+ /* Now, render the loaded glyphs */
+
+ t = Get_Time();
+
+ for ( Num = 0; Num < cur_glyph; Num++ )
+ {
+ if ( (error = ConvertRaster( Num )) )
+ Fail++;
+ else
+ {
+ rendered_glyphs ++;
+
+ if ( visual )
+ {
+ sprintf( Header, "Glyph: %5d", Num );
+ Display_Bitmap_On_Screen( Bit.bitmap, Bit.rows, Bit.cols );
+
+ Clear_Buffer();
+ }
+ }
+ }
+
+ t = Get_Time() - t;
+ if ( t < 0 )
+ t += 100 * 60 * 60;
+
+ printf( " = %f s\n", (double)t / 1000 );
+ t0 += t;
+
+ /* Now free all loaded outlines */
+ for ( Num = 0; Num < cur_glyph; Num++ )
+ TT_Done_Outline( &outlines[Num] );
+ }
+
+ tz0 = Get_Time() - tz0;
+
+ if ( visual )
+ RestoreScreen();
+
+ TT_Close_Face( face );
+
+ printf( "\n" );
+ printf( "rendered glyphs = %d\n", rendered_glyphs );
+ printf( "render time = %f s\n", (double)t0 / 1000 );
+ printf( "fails = %d\n", Fail );
+ printf( "average glyphs/s = %f\n",
+ (double)rendered_glyphs / t0 * 1000 );
+
+ printf( "total timing = %f s\n", (double)tz0 / 1000 );
+ printf( "Fails = %d\n", Fail );
+
+ TT_Done_FreeType( engine );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/ftview.c b/xc/extras/FreeType/test/ftview.c
new file mode 100644
index 000000000..7893e7947
--- /dev/null
+++ b/xc/extras/FreeType/test/ftview.c
@@ -0,0 +1,461 @@
+/****************************************************************************/
+/* */
+/* The FreeType project -- a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ftview: A simple font viewer. Now supports hinting and grayscaling */
+/* with the '-g' option. */
+/* */
+/* */
+/* Keys: */
+/* */
+/* x : fine counter-clockwise rotation */
+/* c : fine clockwise rotation */
+/* */
+/* v : fast counter-clockwise rotation */
+/* b : fast clockwise rotation */
+/* */
+/* + : fast scale up */
+/* - : fast scale down */
+/* u : fine scale down */
+/* j : fine scale up */
+/* */
+/* l : go to next glyph */
+/* k : go to previous glyph */
+/* */
+/* o : go to tenth next glyph */
+/* i : go to tenth previous glyph */
+/* */
+/* 0 : go to hundredth next glyph */
+/* 9 : go to hundredth previous glyph */
+/* */
+/* ) : go to 1000th next glyph */
+/* ( : go to 1000th previous glyph */
+/* */
+/* } : go to 10000th next glyph */
+/* { : go to 10000th previous glyph */
+/* */
+/* n : go to next (or last) .ttf file */
+/* p : go to previous (or first) .ttf file */
+/* */
+/* h : toggle hinting */
+/* */
+/* ESC : exit */
+/* */
+/* */
+/* NOTE: This is just a test program that is used to show off and */
+/* debug the current engine. */
+/* */
+/****************************************************************************/
+
+#ifdef ARM
+#include "std.h"
+#include "graflink.h"
+#endif
+
+#include "freetype.h"
+#include "common.h" /* for Panic() only */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "gmain.h"
+#include "gevents.h"
+#include "gdriver.h"
+#include "display.h"
+
+#ifdef ARM
+#include "armsup.c" /* pull in our routines */
+#endif
+
+#include "common.h"
+
+#define Pi 3.1415926535
+
+#define MAXPTSIZE 500 /* dtp */
+#define Center_X ( Bit.width / 2 ) /* dtp */
+#define Center_Y ( Bit.rows / 2 ) /* dtp */
+
+ char Header[128];
+
+ TT_Engine engine;
+
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph glyph;
+ TT_CharMap char_map;
+
+ TT_Big_Glyph_Metrics metrics;
+ TT_Outline outline;
+ TT_Face_Properties properties;
+ TT_Instance_Metrics imetrics;
+
+ int num_glyphs;
+
+ int ptsize;
+ int hinted;
+
+ int Rotation;
+ int Fail;
+ int Num;
+ unsigned char autorun;
+
+ int gray_render;
+
+
+ static TT_Error Reset_Scale( int pointSize )
+ {
+ TT_Error error;
+
+
+ if ( (error = TT_Set_Instance_CharSize( instance, pointSize*64 )) )
+ {
+ RestoreScreen();
+ fprintf( stderr, "Error = 0x%x.\n", (int)error );
+ Panic( "Could not reset instance.\n" );
+ }
+ TT_Get_Instance_Metrics( instance, &imetrics );
+
+ /* now re-allocates the small bitmap */
+ if ( gray_render )
+ {
+ Init_Small( imetrics.x_ppem, imetrics.y_ppem );
+ Clear_Small();
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static TT_Error LoadTrueTypeChar( int idx, int hint )
+ {
+ int flags;
+
+ flags = TTLOAD_SCALE_GLYPH;
+ if ( hint )
+ flags |= TTLOAD_HINT_GLYPH;
+
+ return TT_Load_Glyph( instance, glyph, idx, flags );
+ }
+
+
+ static TT_Error Render_All( int first_glyph, int ptsize )
+ {
+ TT_F26Dot6 start_x, start_y, step_x, step_y, x, y;
+ int i;
+
+ TT_Error error;
+
+
+ start_x = 4;
+ start_y = vio_Height - ( ( ptsize * 96 + 36 ) / 72 + 10 );
+
+ step_x = imetrics.x_ppem + 4;
+ step_y = imetrics.y_ppem + 10;
+
+ x = start_x;
+ y = start_y;
+
+ i = first_glyph;
+
+ while ( i < num_glyphs )
+ {
+ if ( !(error = LoadTrueTypeChar( i, hinted )) )
+ {
+ TT_Get_Glyph_Outline( glyph, &outline );
+ TT_Get_Glyph_Big_Metrics( glyph, &metrics );
+
+ Render_Single_Glyph( gray_render, glyph, x, y );
+
+ x += ( metrics.horiAdvance / 64 ) + 1;
+
+ if ( x + imetrics.x_ppem > vio_Width )
+ {
+ x = start_x;
+ y -= step_y;
+
+ if ( y < 10 )
+ return TT_Err_Ok;
+ }
+ }
+ else
+ Fail++;
+
+ i++;
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static int Process_Event( TEvent* event )
+ {
+ switch ( event->what )
+ {
+ case event_Quit: /* ESC or q */
+ return 0;
+
+ case event_Keyboard:
+ if ( event->info == 'n' ) /* Next file */
+ return 'n';
+ if ( event->info == 'p' ) /* Previous file */
+ return 'p';
+ if ( event->info == 'h' ) /* Toggle hinting */
+ hinted = !hinted;
+ break;
+
+ case event_Rotate_Glyph:
+ Rotation = ( Rotation + event->info ) & 1023;
+ break;
+
+ case event_Scale_Glyph:
+ ptsize += event->info;
+ if ( ptsize < 1 ) ptsize = 1;
+ if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE;
+ break;
+
+ case event_Change_Glyph:
+ Num += event->info;
+ if ( Num < 0 ) Num = 0;
+ if ( Num >= num_glyphs ) Num = num_glyphs - 1;
+ break;
+ }
+
+ return 1;
+ }
+
+
+ static void usage( char* execname )
+ {
+ fprintf( stderr, "\n" );
+ fprintf( stderr, "ftview: simple TrueType interpreter tester -- part of the FreeType project\n" );
+ fprintf( stderr, "--------------------------------------------------------------------------\n" );
+ fprintf( stderr, "\n" );
+ fprintf( stderr, "Usage: %s [options below] ppem fontname[.ttf|.ttc] ...\n",
+ execname );
+ fprintf( stderr, "\n" );
+ fprintf( stderr, " -g gray-level rendering (default: none)\n" );
+ fprintf( stderr, " -r R use resolution R dpi (default: 96 dpi)\n" );
+ fprintf( stderr, "\n" );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ int main( int argc, char** argv )
+ {
+ int i, old_ptsize, orig_ptsize, file;
+ int XisSetup = 0;
+ char filename[128 + 4];
+ char alt_filename[128 + 4];
+ char* execname;
+ int option;
+ int res = 96;
+
+ TT_Error error;
+ TEvent event;
+
+
+ execname = ft_basename( argv[0] );
+
+ while ( 1 )
+ {
+ option = ft_getopt( argc, argv, "gr:" );
+
+ if ( option == -1 )
+ break;
+
+ switch ( option )
+ {
+ case 'g':
+ gray_render = 1;
+ break;
+
+ case 'r':
+ res = atoi( ft_optarg );
+ if ( res < 1 )
+ usage( execname );
+ break;
+
+ default:
+ usage( execname );
+ break;
+ }
+ }
+
+ argc -= ft_optind;
+ argv += ft_optind;
+
+ if ( argc <= 1 )
+ usage( execname );
+
+ if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 )
+ orig_ptsize = 64;
+
+ file = 1;
+
+ /* Initialize engine */
+
+ if ( (error = TT_Init_FreeType( &engine )) )
+ Panic( "Error while initializing engine, code = 0x%x.\n", error );
+
+ NewFile:
+ ptsize = orig_ptsize;
+ hinted = 1;
+
+ i = strlen( argv[file] );
+ while ( i > 0 && argv[file][i] != '\\' && argv[file][i] != '/' )
+ {
+ if ( argv[file][i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = '\0';
+ alt_filename[128] = '\0';
+
+ strncpy( filename, argv[file], 128 );
+ strncpy( alt_filename, argv[file], 128 );
+
+ if ( i >= 0 )
+ {
+ strncpy( filename + strlen( filename ), ".ttf", 4 );
+ strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+ }
+
+ /* Load face */
+
+ error = TT_Open_Face( engine, filename, &face );
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ {
+ strcpy( filename, alt_filename );
+ error = TT_Open_Face( engine, alt_filename, &face );
+ }
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ Panic( "Could not find/open %s.\n", filename );
+ else if ( error )
+ Panic( "Error while opening %s, code = 0x%x.\n", filename, error );
+
+ /* get face properties and allocate preload arrays */
+
+ TT_Get_Face_Properties( face, &properties );
+
+ num_glyphs = properties.num_Glyphs;
+
+ /* create glyph */
+
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ Panic( "Could not create glyph container.\n" );
+
+ /* create instance */
+
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ Panic( "Could not create instance for %s.\n", filename );
+
+ error = TT_Set_Instance_Resolutions( instance, res, res );
+ if ( error )
+ Panic( "Could not set device resolutions." );
+
+ if ( !XisSetup )
+ {
+ XisSetup = 1;
+
+ if ( gray_render )
+ {
+ if ( !SetGraphScreen( Graphics_Mode_Gray ) )
+ Panic( "Could not set up grayscale graphics mode.\n" );
+
+ TT_Set_Raster_Gray_Palette( engine, virtual_palette );
+ }
+ else
+ {
+ if ( !SetGraphScreen( Graphics_Mode_Mono ) )
+ Panic( "Could not set up mono graphics mode.\n" );
+ }
+ }
+
+ Init_Display( gray_render );
+
+ Reset_Scale( ptsize );
+
+ old_ptsize = ptsize;
+
+ Fail = 0;
+ Num = 0;
+
+ for ( ;; )
+ {
+ int key;
+
+
+ Clear_Display();
+ Render_All( Num, ptsize );
+ if ( gray_render )
+ Convert_To_Display_Palette();
+
+ sprintf( Header, "%s: Glyph: %4d ptsize: %4d hinting: %s",
+ ft_basename( filename ), Num, ptsize,
+ hinted ? "on" : "off" );
+ Display_Bitmap_On_Screen( Bit.bitmap, Bit.rows, Bit.cols );
+
+#ifndef X11
+#ifndef OS2
+ Print_XY( 0, 0, Header );
+#endif
+#endif
+
+ Get_Event( &event );
+ if ( !( key = Process_Event( &event ) ) )
+ goto Fin;
+
+ if ( key == 'n' )
+ {
+ TT_Close_Face( face );
+
+ if ( file < argc - 1 )
+ file++;
+
+ goto NewFile;
+ }
+
+ if ( key == 'p' )
+ {
+ TT_Close_Face( face );
+
+ if ( file > 1 )
+ file--;
+
+ goto NewFile;
+ }
+
+ if ( ptsize != old_ptsize )
+ {
+ if ( Reset_Scale( ptsize ) )
+ Panic( "Could not resize font.\n" );
+
+ old_ptsize = ptsize;
+ }
+ }
+
+ Fin:
+ RestoreScreen();
+
+ TT_Done_FreeType( engine );
+
+ printf( "Execution completed successfully.\n" );
+ printf( "Fails = %d\n", Fail );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+}
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/ftzoom.c b/xc/extras/FreeType/test/ftzoom.c
new file mode 100644
index 000000000..39ef3dad9
--- /dev/null
+++ b/xc/extras/FreeType/test/ftzoom.c
@@ -0,0 +1,726 @@
+/****************************************************************************/
+/* */
+/* The FreeType project - a free and portable quality TrueType renderer. */
+/* */
+/* Copyright 1996-1998 by */
+/* D. Turner, R.Wilhelm, and W. Lemberg */
+/* */
+/* ftzoom : A simple glyph viewer. Now supports graylevel rendering */
+/* with the '-g' option. */
+/* */
+/* use -p <platformID> together with -e <encodingID> to select */
+/* a cmap; */
+/* */
+/* */
+/* Keys : */
+/* */
+/* x : fine counter_clockwise rotation */
+/* c : fine clockwise rotation */
+/* */
+/* v : fast counter_clockwise rotation */
+/* b : fast clockwise rotation */
+/* */
+/* + : fast scale up */
+/* - : fast scale down */
+/* u : fine scale down */
+/* j : fine scale up */
+/* */
+/* l : go to next glyph */
+/* k : go to previous glyph */
+/* */
+/* o : go to tenth next glyph */
+/* i : go to tenth previous glyph */
+/* */
+/* 0 : go to hundredth next glyph */
+/* 9 : go to hundredth previous glyph */
+/* */
+/* ) : go to 1000th next glyph */
+/* ( : go to 1000th previous glyph */
+/* */
+/* } : go to 10000th next glyph */
+/* { : go to 10000th previous glyph */
+/* */
+/* q : */
+/* ESC : exit */
+/* */
+/* */
+/* NOTE 1: This is just a test program that is used to show off and */
+/* debug the current engine. In no way does it show the final */
+/* high-level interface that client applications will use. */
+/* */
+/* NOTE 2: The 'post' engine is used to display the PS glyph names. */
+/* Use the `-n' switch if you don't want that. */
+/* */
+/****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include "freetype.h"
+#include "common.h" /* for Panic() only */
+#include "ftxpost.h"
+
+#include "gmain.h"
+#include "gevents.h"
+#include "gdriver.h"
+
+
+#define Pi 3.1415926535
+
+#define MAXPTSIZE 500 /* dtp */
+
+ char Header[128];
+
+ TT_Engine engine;
+ TT_Face face;
+ TT_Instance instance;
+ TT_Glyph org_glyph; /* original glyph */
+ TT_Glyph glyph; /* rotated glyph */
+ TT_CharMap char_map;
+
+ TT_Glyph_Metrics metrics;
+ TT_Outline org_outline; /* original glyph outline */
+ TT_Outline outline; /* rotated glyph oultine */
+ TT_Face_Properties properties;
+ TT_Instance_Metrics imetrics;
+
+ int num_glyphs;
+ int xcenter_upem;
+ int ycenter_upem;
+ int units_per_em;
+
+ int ptsize;
+ int old_ptsize;
+ int rotation;
+ int old_rotation;
+
+ TT_Matrix matrix;
+ TT_Matrix zoom_matrix;
+ int apply_matrix;
+ int xcenter;
+ int ycenter;
+ int xoffset;
+ int yoffset;
+
+ TT_Raster_Map Bit;
+
+ int Fail;
+ int Num;
+ int Code;
+ unsigned char autorun;
+
+ int gray_render = 0;
+ int hinted = 1;
+ int use_cmap = 0;
+ int zoom_factor = 1;
+ int grid = 0;
+ int use_post = 1;
+
+
+ static void ClearData( void );
+
+ char palette[5] = { 0, 1, 2, 3, 4 };
+
+
+ void Init_Raster_Area( void )
+ {
+ Bit.rows = vio_Height; /* The whole window */
+ Bit.width = vio_Width;
+ Bit.flow = TT_Flow_Up;
+
+ if ( gray_render )
+ {
+ Bit.cols = Bit.width;
+ Bit.size = Bit.rows * Bit.width;
+ }
+ else
+ {
+ Bit.cols = ( Bit.width + 7 ) / 8; /* convert to # of bytes */
+ Bit.size = Bit.rows * Bit.cols; /* number of bytes in buffer */
+ }
+
+ Bit.bitmap = (void*)malloc( (int)Bit.size );
+ if ( !Bit.bitmap )
+ Panic( "Not enough memory to allocate bitmap!\n" );
+
+ ClearData();
+ }
+
+
+ static void ClearData( void )
+ {
+ if ( gray_render )
+ memset( Bit.bitmap, gray_palette[0], Bit.size );
+ else
+ memset( Bit.bitmap, 0, Bit.size );
+ }
+
+
+ static TT_Error Reset_PtSize( int pointSize )
+ {
+ TT_Error error;
+
+
+ if ( (error = TT_Set_Instance_CharSize( instance, pointSize*64 )) )
+ {
+ RestoreScreen();
+ printf( "Error = 0x%x.\n", (int)error );
+ Panic( "Could not reset instance.\n" );
+ }
+
+ TT_Get_Instance_Metrics( instance, &imetrics );
+
+ xcenter = imetrics.x_ppem * xcenter_upem / units_per_em / 4;
+ ycenter = imetrics.y_ppem * ycenter_upem / units_per_em / 4;
+
+ xoffset = vio_Width/2 - xcenter;
+ yoffset = vio_Height/2 - ycenter;
+
+ return TT_Err_Ok;
+ }
+
+
+ static void Copy_Outline( TT_Outline* from,
+ TT_Outline* to )
+ {
+ int n;
+
+
+ to->points = from->points;
+ to->contours = from->contours;
+
+ n = 2 * from->n_points * sizeof ( TT_F26Dot6 );
+
+ memcpy( to->points, from->points, n );
+ memcpy( to->flags, from->flags, from->n_points * sizeof(char) );
+
+ n = from->n_contours * sizeof ( short );
+ memcpy( to->contours, from->contours, n );
+ }
+
+
+ static TT_Error Reset_Rotation( int rotation )
+ {
+ Copy_Outline( &org_outline, &outline );
+
+ if ( rotation )
+ {
+ float angle;
+
+
+ TT_Set_Instance_Transform_Flags( instance, 1, 0 );
+
+ angle = rotation * Pi / 512;
+
+ matrix.xx = (TT_Fixed) (cos( angle ) * (1<<16));
+ matrix.xy = (TT_Fixed) (sin( angle ) * (1<<16));
+ matrix.yx = - matrix.xy;
+ matrix.yy = matrix.xx;
+
+ apply_matrix = 1;
+ }
+ else
+ apply_matrix = 0;
+
+ if ( zoom_factor != 1 )
+ {
+ zoom_matrix.xx = zoom_matrix.yy = zoom_factor * (1<<16);
+ zoom_matrix.xy = zoom_matrix.yx = 0;
+ }
+
+ return TT_Err_Ok;
+ }
+
+
+ static TT_Error LoadTrueTypeChar( int idx, int hint )
+ {
+ TT_Error error;
+ int flags;
+
+
+ flags = TTLOAD_SCALE_GLYPH;
+ if ( hint )
+ flags |= TTLOAD_HINT_GLYPH;
+
+ error = TT_Load_Glyph( instance, glyph, idx, flags );
+ if ( error )
+ return error;
+
+ if ( apply_matrix || zoom_factor != 1 )
+ {
+ TT_Get_Glyph_Outline( glyph, &outline );
+ TT_Translate_Outline( &outline, -xcenter*64, -ycenter*64 );
+ if ( apply_matrix )
+ TT_Transform_Outline( &outline, &matrix );
+ if ( zoom_factor != 1 )
+ TT_Transform_Outline( &outline, &zoom_matrix );
+ TT_Translate_Outline( &outline, xcenter*64, ycenter*64 );
+ }
+
+ return error;
+ }
+
+
+ static TT_Error ConvertRaster( void )
+ {
+ if ( gray_render )
+ return TT_Get_Glyph_Pixmap( glyph, &Bit, xoffset*64, yoffset*64 );
+ else
+ return TT_Get_Glyph_Bitmap( glyph, &Bit, xoffset*64, yoffset*64 );
+ }
+
+
+ static void DrawGrid( void )
+ {
+ char *bmap, mask;
+ int x, y, shift, toggle;
+
+
+ bmap = (char *) Bit.bitmap;
+
+ for ( y = 0; y < Bit.rows; ++y )
+ {
+ if ( ( y - xoffset ) % zoom_factor == 0 )
+ {
+ if ( gray_render )
+ for ( x = y & 1; x < Bit.cols; x += 2 )
+ bmap[x] = 4 - bmap[x];
+ else {
+ mask = y & 1 ? 0x55 : 0xAA;
+ for ( x = 0; x < Bit.cols; ++x )
+ bmap[x] ^= mask;
+ }
+ }
+ else
+ {
+ toggle = y & 1;
+
+ if ( gray_render )
+ {
+ for ( x = xoffset % zoom_factor; x < Bit.cols; x += zoom_factor )
+ if ( ( x & 1 ) == toggle )
+ bmap[x] = 4 - bmap[x];
+ }
+ else
+ {
+ /* tricky business */
+ shift = xoffset % zoom_factor;
+ for ( x = 0; x < Bit.cols; ++x )
+ {
+ for ( mask = 0; shift < 8; shift += zoom_factor )
+ if ( ( shift & 1 ) == toggle )
+ mask |= 0x80 >> shift;
+ bmap[x] ^= mask;
+ shift -= 8;
+ }
+ }
+ }
+ bmap += Bit.cols;
+ }
+ }
+
+
+ static int Process_Event( TEvent* event )
+ {
+ switch ( event->what )
+ {
+ case event_Quit: /* ESC or q */
+ return 0;
+
+ case event_Keyboard:
+ if ( event->info == 'h' ) /* Toggle hinting */
+ hinted = !hinted;
+ break;
+
+ case event_Rotate_Glyph:
+ rotation = ( rotation + event->info ) & 1023;
+ break;
+
+ case event_Scale_Glyph:
+ ptsize += event->info;
+ if ( ptsize < 1 )
+ ptsize = 1;
+ if ( ptsize > MAXPTSIZE / zoom_factor )
+ ptsize = MAXPTSIZE / zoom_factor;
+ break;
+
+ case event_Change_Glyph:
+ if ( use_cmap )
+ {
+ if ( event->info < 0 )
+ {
+ if ( Code > -event->info )
+ Code += event->info;
+ else
+ Code = 0;
+
+ for ( ; Code >= 0; Code-- )
+ {
+ Num = TT_Char_Index( char_map, Code );
+ if ( Num > 0 )
+ break;
+ }
+ }
+ else
+ {
+ if ( Code < 65536 - event->info - 1 )
+ Code += event->info;
+ else
+ Code = 65536 - 1;
+
+ for ( ; Code < 65536; Code++ )
+ {
+ Num = TT_Char_Index( char_map, Code );
+ if ( Num > 0 )
+ break;
+ }
+ }
+ }
+ else
+ {
+ if ( event->info < 0 )
+ {
+ if ( Num > -event->info )
+ Num += event->info;
+ else
+ Num = 0;
+ }
+ else
+ {
+ if ( Num < num_glyphs - event->info - 1 )
+ Num += event->info;
+ else
+ Num = num_glyphs - 1;
+ }
+ }
+ break;
+ }
+
+ return 1;
+ }
+
+
+ void usage( char* execname )
+ {
+ printf( "\n" );
+ printf( "ftzoom: simple TrueType glyph viewer -- part of the FreeType project\n" );
+ printf( "--------------------------------------------------------------------\n" );
+ printf( "\n" );
+ printf( "Usage: %s [options below] fontname[.ttf|.ttc]\n", execname );
+ printf( "\n" );
+ printf( " -g gray-level rendering (default: none)\n" );
+ printf( " -r R use resolution R dpi (default: 96 dpi)\n" );
+ printf( " -z Z Z:1 magnification (default: 1:1)\n" );
+ printf( " -p id platform id (default: none)\n" );
+ printf( " -e id encoding id (default: none)\n" );
+ printf( " -n don't use the `post' table\n" );
+ printf( " If either -p or -e is not set, no cmap will be used.\n" );
+ printf( "\n" );
+
+ exit( EXIT_FAILURE );
+ }
+
+
+ /* stack check dtp */
+
+ int main( int argc, char** argv )
+ {
+ int i, xpos, ypos;
+ int platform = -1, encoding = -1;
+ char filename[128 + 4];
+ char alt_filename[128 + 4];
+ char* execname;
+ int option;
+ int res = 96;
+ TT_Error error;
+ TT_Post post;
+
+ TEvent event;
+
+
+ execname = argv[0];
+ gray_render = 0;
+
+ while ( 1 )
+ {
+ option = ft_getopt( argc, argv, "e:gnp:r:z:" );
+
+ if ( option == -1 )
+ break;
+
+ switch ( option )
+ {
+ case 'e':
+ encoding = atoi( ft_optarg );
+ break;
+
+ case 'g':
+ gray_render = 1;
+ break;
+
+ case 'n':
+ use_post = 0;
+ break;
+
+ case 'p':
+ platform = atoi( ft_optarg );
+ break;
+
+ case 'r':
+ res = atoi( ft_optarg );
+ if ( res < 1 )
+ usage( execname );
+ break;
+
+ case 'z':
+ zoom_factor = atoi( ft_optarg );
+ if ( zoom_factor < 1 || zoom_factor > 16 )
+ usage( execname );
+ if ( zoom_factor > 4 )
+ grid = 1;
+ break;
+
+ default:
+ usage( execname );
+ break;
+ }
+ }
+
+ if ( ft_optind == argc )
+ usage( execname );
+
+ i = strlen( argv[ft_optind] );
+ while ( i > 0 && argv[ft_optind][i] != '\\' && argv[ft_optind][i] != '/' )
+ {
+ if ( argv[ft_optind][i] == '.' )
+ i = 0;
+ i--;
+ }
+
+ filename[128] = '\0';
+ alt_filename[128] = '\0';
+
+ strncpy( filename, argv[ft_optind], 128 );
+ strncpy( alt_filename, argv[ft_optind], 128 );
+
+ if ( i >= 0 )
+ {
+ strncpy( filename + strlen( filename ), ".ttf", 4 );
+ strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 );
+ }
+
+ if ( platform >= 0 || encoding >= 0 )
+ use_cmap = 1;
+
+ /* Initialization */
+ TT_Init_FreeType( &engine );
+
+ /* Initialization of the post extension */
+ if ( use_post )
+ TT_Init_Post_Extension( engine );
+
+ /* Load face */
+
+ error = TT_Open_Face( engine, filename, &face );
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ {
+ strcpy( filename, alt_filename );
+ error = TT_Open_Face( engine, alt_filename, &face );
+ }
+
+ if ( error == TT_Err_Could_Not_Open_File )
+ Panic( "Could not find/open %s.\n", filename );
+ else if ( error )
+ Panic( "Error while opening %s, error code = 0x%x.\n",
+ filename, error );
+
+ /* get face properties and allocate preload arrays */
+
+ TT_Get_Face_Properties( face, &properties );
+
+ num_glyphs = properties.num_Glyphs;
+ xcenter_upem = (properties.header->xMax - properties.header->xMin) / 2;
+ ycenter_upem = (properties.header->yMax - properties.header->yMin) / 2;
+ units_per_em = properties.header->Units_Per_EM;
+
+ /* load full post table */
+ if ( use_post )
+ {
+ error = TT_Load_PS_Names( face, &post );
+ if ( error )
+ Panic( "Could not load PS names.\n" );
+ }
+
+ /* create glyph */
+
+ error = TT_New_Glyph( face, &org_glyph );
+ if ( error )
+ Panic( "Could not create glyph container.\n" );
+
+ error = TT_New_Glyph( face, &glyph );
+ if ( error )
+ Panic( "Could not create glyph container.\n" );
+
+ /* create instance */
+
+ error = TT_New_Instance( face, &instance );
+ if ( error )
+ Panic( "Could not create instance for %s.\n", filename );
+
+ error = TT_Set_Instance_Resolutions( instance, res, res );
+ if ( error )
+ Panic( "Could not set device resolutions." );
+
+ if ( gray_render )
+ {
+ if ( !SetGraphScreen( Graphics_Mode_Gray ) )
+ Panic( "Could not set up grayscale graphics mode.\n" );
+
+ TT_Set_Raster_Gray_Palette( engine, gray_palette );
+ }
+ else
+ {
+ if ( !SetGraphScreen( Graphics_Mode_Mono ) )
+ Panic( "Could not set up mono graphics mode.\n" );
+ }
+
+ Init_Raster_Area();
+
+ old_ptsize = ptsize = 150 / zoom_factor;
+ old_rotation = rotation = 0;
+
+ Reset_PtSize ( ptsize );
+ Reset_Rotation( rotation );
+
+ if ( use_cmap )
+ {
+ unsigned short num_cmap;
+ unsigned short cmap_plat;
+ unsigned short cmap_enc;
+
+
+ num_cmap = properties.num_CharMaps;
+ for ( i = 0; i < num_cmap; i++ )
+ {
+ error = TT_Get_CharMap_ID( face, i, &cmap_plat, &cmap_enc );
+ if ( error )
+ Panic( "Cannot query cmap, error = 0x%x.\n", error );
+ if ( cmap_plat == platform && cmap_enc == encoding )
+ break;
+ }
+
+ if ( i == num_cmap )
+ Panic( "Invalid platform and/or encoding ID.\n" );
+
+ error = TT_Get_CharMap( face, i, &char_map );
+ if ( error )
+ Panic( "Cannot load cmap, error = 0x%x.\n", error );
+
+ num_glyphs = 1 << 16;
+ }
+
+ Code = 0;
+ Num = 0;
+ autorun = 0;
+ Fail = 0;
+ xpos = 0;
+ ypos = 0;
+
+ for ( ;; )
+ {
+ char *glyphname;
+
+
+ glyphname = NULL;
+
+ ClearData();
+
+ if ( ptsize != old_ptsize )
+ {
+ Reset_PtSize( ptsize );
+ old_ptsize = ptsize;
+ }
+
+ if ( rotation != old_rotation )
+ {
+ Reset_Rotation( rotation );
+ old_rotation = rotation;
+ }
+
+ if ( (error = LoadTrueTypeChar( Num, hinted )) == TT_Err_Ok )
+ {
+ ConvertRaster();
+ if ( grid )
+ DrawGrid();
+
+ if ( use_post )
+ (void)TT_Get_PS_Name(face, Num, &glyphname);
+
+ if ( use_cmap )
+ sprintf( Header, "\"%s\": index = %3d, code = 0x%x, hinting = %s",
+ use_post ? glyphname : "", Num, Code,
+ hinted ? "ON" : "OFF" );
+ else
+ sprintf( Header, "\"%s\": index = %3d, hinting = %s",
+ use_post ? glyphname : "", Num, hinted ? "ON" : "OFF" );
+ }
+ else {
+ Fail++;
+ sprintf( Header, "\"%s\": index = %3d, hinting = %s (ERROR 0x%lx)",
+ glyphname ? glyphname : "", Num,
+ hinted ? "ON" : "OFF", error );
+ }
+
+ Display_Bitmap_On_Screen( Bit.bitmap, Bit.rows, Bit.cols );
+
+#ifndef X11
+#ifndef OS2
+ Print_XY( 20, 0, Header );
+#endif
+#endif
+
+#if 0
+ if ( autorun )
+ {
+ xpos += cur_AdvanceWidth;
+ if ( xpos + cur_AdvanceWidth > 640 )
+ {
+ xpos = 0;
+ ypos += ( cur_Ascent - cur_Descent ) / 64;
+ /* is == TRUETYPE DEFINED Precision */
+ }
+
+ Num = autorun++;
+ if( !autorun )
+ {
+ xpos = 0;
+ ypos += ( cur_Ascent - cur_Descent ) / 64;
+ /* is == TRUETYPE DEFINED Precision */
+ }
+ }
+ else
+#endif
+ {
+ Get_Event( &event );
+ if ( !Process_Event( &event ) ) goto Fin;
+ }
+ }
+
+ Fin:
+
+ RestoreScreen();
+
+ TT_Done_FreeType( engine );
+
+ printf( "Fails = %d.\n", Fail );
+
+ exit( EXIT_SUCCESS ); /* for safety reasons */
+
+ return 0; /* never reached */
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/gdriver.h b/xc/extras/FreeType/test/gdriver.h
new file mode 100644
index 000000000..b91b758e0
--- /dev/null
+++ b/xc/extras/FreeType/test/gdriver.h
@@ -0,0 +1,55 @@
+/*******************************************************************
+ *
+ * gdriver.h : Graphics utility driver generic interface 1.1
+ *
+ * Generic interface for all drivers of the graphics utility used
+ * by the FreeType test programs.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 GDRIVER_H
+#define GDRIVER_H
+
+ /* Note that we now support an event based model, even with */
+ /* full-screen modes. It is the responsability of the driver */
+ /* to map its events to the TEvent structure when called */
+ /* through Get_Event. */
+
+ /* The event classes are defined in the file 'gevents.h' included */
+ /* by the test programs, not by the graphics utility. */
+
+ typedef struct _TEvent
+ {
+ int what; /* event class */
+ int info; /* event parameter */
+ } TEvent;
+
+
+ /* Get last event. In full-screen modes, a keystroke must be */
+ /* translated to an event class with a parameter. */
+ void Get_Event( TEvent* event );
+
+ /* A call to this function must set the graphics mode, the Vio */
+ /* variable, as well as the values vio_ScanLineWidth, vio_Width */
+ /* and vio_Height. */
+ int Driver_Set_Graphics( int mode );
+
+ /* Restore previous mode or release display buffer/window */
+ int Driver_Restore_Mode( void );
+
+ /* display bitmap on screen */
+ int Driver_Display_Bitmap( char* buffer, int line, int col );
+
+#endif /* GDRIVER_H */
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/gevents.h b/xc/extras/FreeType/test/gevents.h
new file mode 100644
index 000000000..8ef3ffaf8
--- /dev/null
+++ b/xc/extras/FreeType/test/gevents.h
@@ -0,0 +1,43 @@
+/*******************************************************************
+ *
+ * gevents.h test programs events definition 1.1
+ *
+ * This file defines the events used by the FreeType test programs
+ * It is _not_ included by 'gmain.c'. This file is also used by the
+ * drivers to translate their own events in GEvents.
+ *
+ * Not a very good design, but we're not rewriting X...
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 GEVENTS_H
+#define GEVENTS_H
+
+ typedef enum _GEvent
+ {
+ event_None,
+ event_Quit, /* Quit program */
+
+ event_Keyboard, /* unknown keystroke */
+
+ event_Change_Glyph,
+ event_Rotate_Glyph,
+ event_Scale_Glyph,
+
+ event_Change_ScanType,
+ event_Change_Instructions
+ } GEvent;
+
+#endif /* GEVENTS_H */
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/gmain.c b/xc/extras/FreeType/test/gmain.c
new file mode 100644
index 000000000..016fc4f88
--- /dev/null
+++ b/xc/extras/FreeType/test/gmain.c
@@ -0,0 +1,468 @@
+/*******************************************************************
+ *
+ * gmain.c graphics utility main body 1.1
+ *
+ * This file defines a common implementation of the graphics
+ * utility used by the FreeType test programs. It relies on
+ * system-specific drivers, like 'gfs_os.c', which interface is
+ * described in the file 'gdriver.h'.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 "gmain.h"
+#include "gdriver.h"
+
+#ifndef FAILURE
+#define FAILURE 0
+#endif
+
+#ifndef SUCCESS
+#define SUCCESS 1
+#endif
+
+ char* Vio; /* pointer to VRAM or display buffer */
+
+ int vio_ScanLineWidth; /* scan line width in bytes */
+
+ int vio_Width;
+ int vio_Height;
+
+ int gcursor_x = 0;
+ int gcursor_y = 0;
+
+ int gwindow_width = 0;
+ int gwindow_height = 0;
+
+ unsigned char gray_palette[5];
+
+
+ typedef void TFunction_Print_8x8_Char( int x,
+ int y,
+ unsigned char c );
+
+ TFunction_Print_8x8_Char* Print_8x8_Char;
+
+ /* font characters */
+
+ unsigned char font_8x8[2048] =
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x7E, 0x81, 0xA5, 0x81, 0xBD, 0x99, 0x81, 0x7E,
+ 0x7E, 0xFF, 0xDB, 0xFF, 0xC3, 0xE7, 0xFF, 0x7E,
+ 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00,
+ 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x10, 0x00,
+ 0x38, 0x7C, 0x38, 0xFE, 0xFE, 0x92, 0x10, 0x7C,
+ 0x00, 0x10, 0x38, 0x7C, 0xFE, 0x7C, 0x38, 0x7C,
+ 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00,
+ 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF,
+ 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00,
+ 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF,
+ 0x0F, 0x07, 0x0F, 0x7D, 0xCC, 0xCC, 0xCC, 0x78,
+ 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18,
+ 0x3F, 0x33, 0x3F, 0x30, 0x30, 0x70, 0xF0, 0xE0,
+ 0x7F, 0x63, 0x7F, 0x63, 0x63, 0x67, 0xE6, 0xC0,
+ 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99,
+ 0x80, 0xE0, 0xF8, 0xFE, 0xF8, 0xE0, 0x80, 0x00,
+ 0x02, 0x0E, 0x3E, 0xFE, 0x3E, 0x0E, 0x02, 0x00,
+ 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18,
+ 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00,
+ 0x7F, 0xDB, 0xDB, 0x7B, 0x1B, 0x1B, 0x1B, 0x00,
+ 0x3E, 0x63, 0x38, 0x6C, 0x6C, 0x38, 0x86, 0xFC,
+ 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00,
+ 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF,
+ 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00,
+ 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00,
+ 0x00, 0x18, 0x0C, 0xFE, 0x0C, 0x18, 0x00, 0x00,
+ 0x00, 0x30, 0x60, 0xFE, 0x60, 0x30, 0x00, 0x00,
+ 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xFE, 0x00, 0x00,
+ 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00,
+ 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00,
+ 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00,
+ 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00,
+ 0x18, 0x7E, 0xC0, 0x7C, 0x06, 0xFC, 0x18, 0x00,
+ 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00,
+ 0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00,
+ 0x30, 0x30, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x00,
+ 0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x00,
+ 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00,
+ 0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30,
+ 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
+ 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x80, 0x00,
+ 0x7C, 0xCE, 0xDE, 0xF6, 0xE6, 0xC6, 0x7C, 0x00,
+ 0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xFC, 0x00,
+ 0x78, 0xCC, 0x0C, 0x38, 0x60, 0xCC, 0xFC, 0x00,
+ 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00,
+ 0x1C, 0x3C, 0x6C, 0xCC, 0xFE, 0x0C, 0x1E, 0x00,
+ 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00,
+ 0x38, 0x60, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00,
+ 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00,
+ 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00,
+ 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0x18, 0x70, 0x00,
+ 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x00,
+ 0x00, 0x18, 0x18, 0x00, 0x00, 0x18, 0x18, 0x30,
+ 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00,
+ 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00,
+ 0x60, 0x30, 0x18, 0x0C, 0x18, 0x30, 0x60, 0x00,
+ 0x3C, 0x66, 0x0C, 0x18, 0x18, 0x00, 0x18, 0x00,
+ 0x7C, 0xC6, 0xDE, 0xDE, 0xDC, 0xC0, 0x7C, 0x00,
+ 0x30, 0x78, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0x00,
+ 0xFC, 0x66, 0x66, 0x7C, 0x66, 0x66, 0xFC, 0x00,
+ 0x3C, 0x66, 0xC0, 0xC0, 0xC0, 0x66, 0x3C, 0x00,
+ 0xF8, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00,
+ 0xFE, 0x62, 0x68, 0x78, 0x68, 0x62, 0xFE, 0x00,
+ 0xFE, 0x62, 0x68, 0x78, 0x68, 0x60, 0xF0, 0x00,
+ 0x3C, 0x66, 0xC0, 0xC0, 0xCE, 0x66, 0x3A, 0x00,
+ 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00,
+ 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0x1E, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00,
+ 0xE6, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0xE6, 0x00,
+ 0xF0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xFE, 0x00,
+ 0xC6, 0xEE, 0xFE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00,
+ 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00,
+ 0x38, 0x6C, 0xC6, 0xC6, 0xC6, 0x6C, 0x38, 0x00,
+ 0xFC, 0x66, 0x66, 0x7C, 0x60, 0x60, 0xF0, 0x00,
+ 0x7C, 0xC6, 0xC6, 0xC6, 0xD6, 0x7C, 0x0E, 0x00,
+ 0xFC, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0xE6, 0x00,
+ 0x7C, 0xC6, 0xE0, 0x78, 0x0E, 0xC6, 0x7C, 0x00,
+ 0xFC, 0xB4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xFC, 0x00,
+ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
+ 0xC6, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
+ 0xC6, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0xC6, 0x00,
+ 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x78, 0x00,
+ 0xFE, 0xC6, 0x8C, 0x18, 0x32, 0x66, 0xFE, 0x00,
+ 0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x00,
+ 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00,
+ 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00,
+ 0x10, 0x38, 0x6C, 0xC6, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,
+ 0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
+ 0xE0, 0x60, 0x60, 0x7C, 0x66, 0x66, 0xDC, 0x00,
+ 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00,
+ 0x1C, 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0x76, 0x00,
+ 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
+ 0x38, 0x6C, 0x64, 0xF0, 0x60, 0x60, 0xF0, 0x00,
+ 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
+ 0xE0, 0x60, 0x6C, 0x76, 0x66, 0x66, 0xE6, 0x00,
+ 0x30, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78,
+ 0xE0, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0xE6, 0x00,
+ 0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0x00, 0x00, 0xCC, 0xFE, 0xFE, 0xD6, 0xD6, 0x00,
+ 0x00, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
+ 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
+ 0x00, 0x00, 0xDC, 0x66, 0x66, 0x7C, 0x60, 0xF0,
+ 0x00, 0x00, 0x76, 0xCC, 0xCC, 0x7C, 0x0C, 0x1E,
+ 0x00, 0x00, 0xDC, 0x76, 0x62, 0x60, 0xF0, 0x00,
+ 0x00, 0x00, 0x7C, 0xC0, 0x70, 0x1C, 0xF8, 0x00,
+ 0x10, 0x30, 0xFC, 0x30, 0x30, 0x34, 0x18, 0x00,
+ 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
+ 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00,
+ 0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00,
+ 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00,
+ 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
+ 0x00, 0x00, 0xFC, 0x98, 0x30, 0x64, 0xFC, 0x00,
+ 0x1C, 0x30, 0x30, 0xE0, 0x30, 0x30, 0x1C, 0x00,
+ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00,
+ 0xE0, 0x30, 0x30, 0x1C, 0x30, 0x30, 0xE0, 0x00,
+ 0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x38, 0x6C, 0xC6, 0xC6, 0xFE, 0x00,
+ 0x7C, 0xC6, 0xC0, 0xC6, 0x7C, 0x0C, 0x06, 0x7C,
+ 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
+ 0x1C, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
+ 0x7E, 0x81, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0x00,
+ 0xCC, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
+ 0xE0, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
+ 0x30, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
+ 0x00, 0x00, 0x7C, 0xC6, 0xC0, 0x78, 0x0C, 0x38,
+ 0x7E, 0x81, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00,
+ 0xCC, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
+ 0xE0, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00,
+ 0xCC, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0x7C, 0x82, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00,
+ 0xE0, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0xC6, 0x10, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00,
+ 0x30, 0x30, 0x00, 0x78, 0xCC, 0xFC, 0xCC, 0x00,
+ 0x1C, 0x00, 0xFC, 0x60, 0x78, 0x60, 0xFC, 0x00,
+ 0x00, 0x00, 0x7F, 0x0C, 0x7F, 0xCC, 0x7F, 0x00,
+ 0x3E, 0x6C, 0xCC, 0xFE, 0xCC, 0xCC, 0xCE, 0x00,
+ 0x78, 0x84, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
+ 0x00, 0xCC, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
+ 0x00, 0xE0, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
+ 0x78, 0x84, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
+ 0x00, 0xE0, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
+ 0x00, 0xCC, 0x00, 0xCC, 0xCC, 0x7C, 0x0C, 0xF8,
+ 0xC3, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x00,
+ 0xCC, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00,
+ 0x18, 0x18, 0x7E, 0xC0, 0xC0, 0x7E, 0x18, 0x18,
+ 0x38, 0x6C, 0x64, 0xF0, 0x60, 0xE6, 0xFC, 0x00,
+ 0xCC, 0xCC, 0x78, 0x30, 0xFC, 0x30, 0xFC, 0x30,
+ 0xF8, 0xCC, 0xCC, 0xFA, 0xC6, 0xCF, 0xC6, 0xC3,
+ 0x0E, 0x1B, 0x18, 0x3C, 0x18, 0x18, 0xD8, 0x70,
+ 0x1C, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x76, 0x00,
+ 0x38, 0x00, 0x70, 0x30, 0x30, 0x30, 0x78, 0x00,
+ 0x00, 0x1C, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00,
+ 0x00, 0x1C, 0x00, 0xCC, 0xCC, 0xCC, 0x76, 0x00,
+ 0x00, 0xF8, 0x00, 0xB8, 0xCC, 0xCC, 0xCC, 0x00,
+ 0xFC, 0x00, 0xCC, 0xEC, 0xFC, 0xDC, 0xCC, 0x00,
+ 0x3C, 0x6C, 0x6C, 0x3E, 0x00, 0x7E, 0x00, 0x00,
+ 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x7C, 0x00, 0x00,
+ 0x18, 0x00, 0x18, 0x18, 0x30, 0x66, 0x3C, 0x00,
+ 0x00, 0x00, 0x00, 0xFC, 0xC0, 0xC0, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xFC, 0x0C, 0x0C, 0x00, 0x00,
+ 0xC6, 0xCC, 0xD8, 0x36, 0x6B, 0xC2, 0x84, 0x0F,
+ 0xC3, 0xC6, 0xCC, 0xDB, 0x37, 0x6D, 0xCF, 0x03,
+ 0x18, 0x00, 0x18, 0x18, 0x3C, 0x3C, 0x18, 0x00,
+ 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00,
+ 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00,
+ 0x22, 0x88, 0x22, 0x88, 0x22, 0x88, 0x22, 0x88,
+ 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA,
+ 0xDB, 0xF6, 0xDB, 0x6F, 0xDB, 0x7E, 0xD7, 0xED,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
+ 0x36, 0x36, 0x36, 0x36, 0xF6, 0x36, 0x36, 0x36,
+ 0x00, 0x00, 0x00, 0x00, 0xFE, 0x36, 0x36, 0x36,
+ 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18,
+ 0x36, 0x36, 0xF6, 0x06, 0xF6, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36,
+ 0x00, 0x00, 0xFE, 0x06, 0xF6, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0xF6, 0x06, 0xFE, 0x00, 0x00, 0x00,
+ 0x36, 0x36, 0x36, 0x36, 0xFE, 0x00, 0x00, 0x00,
+ 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00,
+ 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
+ 0x36, 0x36, 0x36, 0x36, 0x37, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x37, 0x30, 0x3F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3F, 0x30, 0x37, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0xF7, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x37, 0x30, 0x37, 0x36, 0x36, 0x36,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x36, 0x36, 0xF7, 0x00, 0xF7, 0x36, 0x36, 0x36,
+ 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
+ 0x36, 0x36, 0x36, 0x36, 0xFF, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0x3F, 0x00, 0x00, 0x00,
+ 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18,
+ 0x00, 0x00, 0x00, 0x00, 0x3F, 0x36, 0x36, 0x36,
+ 0x36, 0x36, 0x36, 0x36, 0xFF, 0x36, 0x36, 0x36,
+ 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0,
+ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x76, 0xDC, 0xC8, 0xDC, 0x76, 0x00,
+ 0x00, 0x78, 0xCC, 0xF8, 0xCC, 0xF8, 0xC0, 0xC0,
+ 0x00, 0xFC, 0xCC, 0xC0, 0xC0, 0xC0, 0xC0, 0x00,
+ 0x00, 0x00, 0xFE, 0x6C, 0x6C, 0x6C, 0x6C, 0x00,
+ 0xFC, 0xCC, 0x60, 0x30, 0x60, 0xCC, 0xFC, 0x00,
+ 0x00, 0x00, 0x7E, 0xD8, 0xD8, 0xD8, 0x70, 0x00,
+ 0x00, 0x66, 0x66, 0x66, 0x66, 0x7C, 0x60, 0xC0,
+ 0x00, 0x76, 0xDC, 0x18, 0x18, 0x18, 0x18, 0x00,
+ 0xFC, 0x30, 0x78, 0xCC, 0xCC, 0x78, 0x30, 0xFC,
+ 0x38, 0x6C, 0xC6, 0xFE, 0xC6, 0x6C, 0x38, 0x00,
+ 0x38, 0x6C, 0xC6, 0xC6, 0x6C, 0x6C, 0xEE, 0x00,
+ 0x1C, 0x30, 0x18, 0x7C, 0xCC, 0xCC, 0x78, 0x00,
+ 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00,
+ 0x06, 0x0C, 0x7E, 0xDB, 0xDB, 0x7E, 0x60, 0xC0,
+ 0x38, 0x60, 0xC0, 0xF8, 0xC0, 0x60, 0x38, 0x00,
+ 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x00,
+ 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00,
+ 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00,
+ 0x60, 0x30, 0x18, 0x30, 0x60, 0x00, 0xFC, 0x00,
+ 0x18, 0x30, 0x60, 0x30, 0x18, 0x00, 0xFC, 0x00,
+ 0x0E, 0x1B, 0x1B, 0x18, 0x18, 0x18, 0x18, 0x18,
+ 0x18, 0x18, 0x18, 0x18, 0x18, 0xD8, 0xD8, 0x70,
+ 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00,
+ 0x00, 0x76, 0xDC, 0x00, 0x76, 0xDC, 0x00, 0x00,
+ 0x38, 0x6C, 0x6C, 0x38, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+ 0x0F, 0x0C, 0x0C, 0x0C, 0xEC, 0x6C, 0x3C, 0x1C,
+ 0x58, 0x6C, 0x6C, 0x6C, 0x6C, 0x00, 0x00, 0x00,
+ 0x70, 0x98, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+
+ void Print_8x8_Mono( int x, int y, unsigned char c )
+ {
+ int offset, i;
+ unsigned char* bitm;
+
+ if ( !Vio )
+ return;
+
+ offset = x + y * vio_ScanLineWidth * 8;
+ bitm = font_8x8 + (int)c * 8;
+
+ for ( i = 0; i < 8; i++ )
+ {
+ Vio[offset] = *bitm;
+ bitm++;
+ offset += vio_ScanLineWidth;
+ }
+ }
+
+
+ void Print_8x8_Gray( int x, int y, unsigned char c )
+ {
+ int offset, i, bit;
+ unsigned char* bitm;
+
+ if ( !Vio )
+ return;
+
+ offset = x * 8 + y * vio_ScanLineWidth * 8;
+ bitm = font_8x8 + (int)c * 8;
+
+ for ( i = 0; i < 8; i++ )
+ {
+ bit = 0x80;
+ while ( bit > 0 )
+ {
+ if ( bit & *bitm )
+ Vio[offset] = (char)0x0f;
+ else
+ Vio[offset] = 0x00;
+
+ bit >>= 1;
+ offset++;
+ }
+ offset += vio_ScanLineWidth - 8;
+ bitm++;
+ }
+ }
+
+
+ int SetGraphScreen( int mode )
+ {
+ gcursor_x = 0;
+ gcursor_y = 0;
+
+ switch( mode )
+ {
+ case Graphics_Mode_Mono:
+ if ( !Driver_Set_Graphics( mode ) )
+ return FAILURE;
+
+ gwindow_width = vio_ScanLineWidth;
+ gwindow_height = vio_Height / 8;
+
+ Print_8x8_Char = Print_8x8_Mono;
+ break;
+
+ case Graphics_Mode_Gray:
+ if ( !Driver_Set_Graphics( mode ) )
+ return FAILURE;
+
+ gwindow_width = vio_ScanLineWidth / 8;
+ gwindow_height = vio_Height / 8;
+
+ Print_8x8_Char = Print_8x8_Gray;
+ break;
+
+ default:
+ /* Invalid function call */
+ return FAILURE;
+ }
+
+ return SUCCESS;
+ }
+
+
+ /* restore previous (or text) video mode */
+
+ int RestoreScreen( void )
+ {
+ gcursor_x = 0;
+ gcursor_y = 0;
+ gwindow_height = 0;
+ gwindow_height = 0;
+
+ return Driver_Restore_Mode();
+ }
+
+
+ void Display_Bitmap_On_Screen( char* buffer, int line, int col )
+ {
+ Driver_Display_Bitmap( buffer, line, col );
+ }
+
+
+ void Goto_XY( int x, int y )
+ {
+ gcursor_x = x;
+ gcursor_y = y;
+ }
+
+
+ void Print_Str( char* string )
+ {
+ if ( !string ) return;
+
+ while ( *string )
+ {
+ switch ( *string )
+ {
+ case '\n':
+ gcursor_x = 0;
+ gcursor_y++;
+ if ( gcursor_y > gwindow_height ) gcursor_y = 0;
+ break;
+
+ default:
+ (*Print_8x8_Char)( gcursor_x, gcursor_y, *string );
+
+ gcursor_x++;
+
+ if ( gcursor_x >= gwindow_width )
+ {
+ gcursor_x = 0;
+ gcursor_y++;
+
+ if ( gcursor_y >= gwindow_height ) gcursor_y = 0;
+ }
+ }
+ string++;
+ }
+ }
+
+
+ void Print_XY( int x, int y, char* string )
+ {
+ Goto_XY( x, y );
+ Print_Str( string );
+ }
+
+
+/* End */
diff --git a/xc/extras/FreeType/test/gmain.h b/xc/extras/FreeType/test/gmain.h
new file mode 100644
index 000000000..a79832d72
--- /dev/null
+++ b/xc/extras/FreeType/test/gmain.h
@@ -0,0 +1,72 @@
+/*******************************************************************
+ *
+ * gmain.h graphics utility main interface 1.1
+ *
+ * This file defines a common interface, implemented in the body
+ * file 'gmain.c'. It relies on system dependent driver files,
+ * like 'gfs_os.c', whose interface is described in 'gdriver.h'.
+ *
+ * Copyright 1996-1998 by
+ * David Turner, Robert Wilhelm, and Werner Lemberg.
+ *
+ * This file is part of the FreeType project, and may only be used
+ * modified and distributed under the terms of the FreeType project
+ * license, LICENSE.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 GMAIN_H
+#define GMAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Graphics mode definitions */
+
+#define Graphics_Mode_Mono 1 /* monochrome graphics mode */
+#define Graphics_Mode_Gray 2 /* 8-bit palette graphics mode */
+
+ extern char* Vio; /* Pointer to VRAM or display buffer */
+
+ extern int vio_ScanLineWidth; /* Scan Line width in bytes */
+
+ extern int vio_Width;
+ extern int vio_Height;
+
+ extern unsigned char gray_palette[5]; /* standard gray_palette */
+
+
+ /* set a graphics mode, chosen from the FS_Graphics_xxx list */
+ int SetGraphScreen( int mode );
+
+ /* restore previous (or text) video mode */
+ int RestoreScreen( void );
+
+ /* display a bitmap of 'line' lines, and 'col' columns (each */
+ /* column made of 8 bits) */
+ void Display_Bitmap_On_Screen( char* buffer, int line, int col );
+
+ void Goto_XY( int x, int y );
+
+
+ extern int gcursor_x;
+ extern int gcursor_y;
+
+ extern int gwindow_width;
+ extern int gwindow_height;
+
+
+ void Print_Str( char* string );
+ void Print_XY ( int x, int y, char* string );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GMAIN_H */
+
+
+/* End */
diff --git a/xc/extras/README b/xc/extras/README
new file mode 100644
index 000000000..787fa2e0c
--- /dev/null
+++ b/xc/extras/README
@@ -0,0 +1,17 @@
+This directory (xc/extras) contains packages that are maintained outside
+of XFree86, but which are included with the base XFree86 distribution.
+Each such package should be imported on its own vendor branch (see
+the README.XFree86 file in each subdirectory for specific 'cvs import'
+details). 'XFree86' RCS ident lines should only be added to files that
+have XFree86-specific changes. Binary files should not normally be
+imported.
+
+Packages included here must be redistributable under conditions compatible
+with the XFree86 redistribution conditions (see
+xc/programs/Xserver/hw/xfree86/doc/COPYRIGHT for examples of compatible
+licences).
+
+
+
+$XFree86: xc/extras/README,v 1.2 1998/08/29 08:10:34 dawes Exp $
+
diff --git a/xc/extras/X-TrueType/ARABIC/CP1256toUCS2.c b/xc/extras/X-TrueType/ARABIC/CP1256toUCS2.c
new file mode 100644
index 000000000..9082e88a5
--- /dev/null
+++ b/xc/extras/X-TrueType/ARABIC/CP1256toUCS2.c
@@ -0,0 +1,91 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Microsoft arabic encoding to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblCp1256ToUcs2[] = {
+ ALTCHR, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027,
+ 0x0029, 0x0028, 0x002A, 0x002B, 0x066b, 0x002D, 0x002E, 0x002F,
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667,
+ 0x0668, 0x0669, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005d, 0x005C, 0x005b, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0xfd3f, 0x007C, 0xfd3e, 0x007E, 0x007F,
+ 0x0080, 0xfb56, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfb7a, 0xfb8a, 0x008f,
+ 0xfb92, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178,
+ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00bb, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x061b, 0x00ab, 0x00bc, 0x00bd, 0x00be, 0x061f,
+ 0x00c0, 0xfe80, 0xfe81, 0xfe83, 0xfe85, 0xfe87, 0xfe89, 0xfe8d,
+ 0xfe8f, 0xfe93, 0xfe95, 0xfe99, 0xfe9d, 0xfea1, 0xfea5, 0xfea9,
+ 0xfeab, 0xfead, 0xfeaf, 0xfeb1, 0xfeb5, 0xfeb9, 0xfebd, 0x00d7,
+ 0xfec1, 0xfec5, 0xfec9, 0xfecd, 0x0640, 0xfed1, 0xfed5, 0xfed9,
+ 0x00e0, 0xfedd, 0x00e2, 0xfee1, 0xfee5, 0xfee9, 0xfeed, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0xfeef, 0xfef1, 0x00ee, 0x00ef,
+ 0xfe70, 0xfe72, 0xfe74, 0xfe76, 0x00f4, 0xfe78, 0xfe7a, 0x00f7,
+ 0xfe7c, 0x00f9, 0xfe7e, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x00ff
+};
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_cp1256_to_ucs2, /* function name */
+ tblCp1256ToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ARABIC/Imakefile b/xc/extras/X-TrueType/ARABIC/Imakefile
new file mode 100644
index 000000000..ea7c5a950
--- /dev/null
+++ b/xc/extras/X-TrueType/ARABIC/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ARABIC */
+
+#define ModuleName ARABIC
+SRCS = CP1256toUCS2.c MULEARABICtoUCS2.c XATERMtoUCS2.c main.c
+OBJS = CP1256toUCS2.o MULEARABICtoUCS2.o XATERMtoUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ARABIC/MULEARABICtoUCS2.c b/xc/extras/X-TrueType/ARABIC/MULEARABICtoUCS2.c
new file mode 100644
index 000000000..1c8dd6882
--- /dev/null
+++ b/xc/extras/X-TrueType/ARABIC/MULEARABICtoUCS2.c
@@ -0,0 +1,106 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ mulearabic to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Table build by looking into the unicode chart,
+ an actual X11 font using mulearabic-1 encoding.
+ and help of Juliusz Chorobczek.
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblMulearabic0ToUcs2[] = {
+/* 0x0020 - 0x002A */
+ ALTCHR, 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666,
+ 0x0667, 0x0668, 0x0669
+};
+
+static ucs2_t tblMulearabic1ToUcs2[] = {
+/* 0x0020 - 0x0069 */
+ ALTCHR, 0x0020, 0x0021, 0x0028, 0x0029, 0x060c, 0x06d4, 0x003a,
+ 0x061b, 0x061f, 0x00ab, 0x00bb, 0x000a, 0xfe80, 0xfe81, 0xfe82,
+ 0xfe83, 0xfe84, 0xfe85, 0xfe86, 0xfe87, 0xfe88, 0xfe8b, 0xfe8c,
+ 0xfe8d, 0xfe8e, 0xfe91, 0xfe92, 0xfe93, 0xfe94, 0xfe97, 0xfe98,
+ 0xfe9b, 0xfe9c, 0xfea9, 0xfeaa, 0xfeab, 0xfeac, 0xfead, 0xfeae,
+ 0xfeaf, 0xfeb0, 0xfecb, 0xfecc, 0xfecf, 0xfed0, 0xfed3, 0xfed4,
+ 0xfed7, 0xfed8, 0xfedf, 0xfee0, 0xfee1, 0xfee3, 0xfee4, 0xfee2,
+ 0xfee7, 0xfee8, 0xfee9, 0xfeeb, 0xfeec, 0xfeea, 0xfeed, 0xfeee,
+ 0xfef3, 0xfef4, 0xfef5, 0xfef7, 0xfef9, 0xfefb, 0xfb58, 0xfb59,
+ 0xfb8a, 0xfb8b
+};
+
+static ucs2_t tblMulearabic2ToUcs2[] = {
+/* 0x0020 - 0x006e */
+ ALTCHR, 0xfe89, 0xfe8a, 0xfe8f, 0xfe90, 0xfe95, 0xfe96, 0xfe99,
+ 0xfe9a, 0xfe9d, 0xfe9f, 0xfea0, 0xfe9e, 0xfea1, 0xfea3, 0xfea4,
+ 0xfea2, 0xfea5, 0xfea7, 0xfea8, 0xfea6, 0xfeb1, 0xfeb3, 0xfeb4,
+ 0xfeb2, 0xfeb5, 0xfeb7, 0xfeb8, 0xfeb6, 0xfeb9, 0xfebb, 0xfebc,
+ 0xfeba, 0xfebd, 0xfebf, 0xfec0, 0xfebe, 0xfec1, 0xfec3, 0xfec4,
+ 0xfec2, 0xfec5, 0xfec7, 0xfec8, 0xfec6, 0xfec9, 0xfeca, 0xfecd,
+ 0xfece, 0xfed1, 0xfed2, 0xfed5, 0xfed6, 0xfed9, 0xfedb, 0xfedc,
+ 0xfeda, 0xfedd, 0xfede, 0xfee5, 0xfee6, 0xfeef, 0xfef0, 0xfef1,
+ 0xfef2, 0xfef6, 0xfef8, 0xfefa, 0xfefc, 0xfb56, 0xfb57, 0xfb7a,
+ 0xfb7c, 0xfb7d, 0xfb7b, 0xfb92, 0xfb94, 0xfb95, 0xfb93
+};
+
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_mulearabic0_to_ucs2, /* function name */
+ tblMulearabic0ToUcs2, /* table name */
+ 0x20,0x2a, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_mulearabic1_to_ucs2, /* function name */
+ tblMulearabic1ToUcs2, /* table name */
+ 0x20,0x69, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_mulearabic2_to_ucs2, /* function name */
+ tblMulearabic2ToUcs2, /* table name */
+ 0x20,0x6e, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ARABIC/XATERMtoUCS2.c b/xc/extras/X-TrueType/ARABIC/XATERMtoUCS2.c
new file mode 100644
index 000000000..e684faa00
--- /dev/null
+++ b/xc/extras/X-TrueType/ARABIC/XATERMtoUCS2.c
@@ -0,0 +1,101 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ xaterm special encoding to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This is the encoding used by the xaterm program (an arabic
+ xterm). The font it uses is in fact a 16 bit encoded one,
+ whith 0x0000 -> 0x00ff equal to iso-8859-1,
+ and 0x0100 -> 0x01ff whith the arabic glyphs.
+ As the lower half is an equivalent mapping to unicode there
+ is no need for a table.
+
+ Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblXaterm_TophalfToUcs2[] = {
+ ALTCHR, 0xfefa, 0xfef8, 0xfef9, 0xfef7, 0xfe88, 0xfe84, 0xfe86,
+ 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652,
+ 0x0640, 0x0040, 0x0024, 0x2039, 0x203a, 0x061f, 0x0022, 0x003d,
+ 0x005f, 0x007b, 0x007d, 0x005b, 0x005d, 0x005c, 0x00a6, 0x005e,
+ 0x0020, 0x0021, ALTCHR, ALTCHR, 0x0023, 0x066a, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x060c, 0x002D, 0x06d4, 0x002F,
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667,
+ 0x0668, 0x0669, 0x061b, 0x003A, 0xfe8d, 0xfe8e, 0xfeed, 0xfeee,
+ 0xfe91, 0xfe92, 0xfe8f, 0xfe90, 0xfe97, 0xfe98, 0xfe95, 0xfe96,
+ 0xfe9b, 0xfe9b, 0xfe99, 0xfe9a, 0xfe9f, 0xfea0, 0xfe9d, 0xfe9e,
+ 0xfea3, 0xfea4, 0xfea1, 0xfea2, 0xfea7, 0xfea8, 0xfea5, 0xfea6,
+ 0xfeab, 0xfeac, 0xfea9, 0xfeaa, 0xfeaf, 0xfeb0, 0xfead, 0xfeae,
+ 0xfeb3, 0xfeb4, 0xfeb1, 0xfeb2, 0xfeb7, 0xfeb8, 0xfeb5, 0xfeb6,
+ 0xfebb, 0xfebc, 0xfeb9, 0xfeba, 0xfebf, 0xfec0, 0xfebd, 0xfebe,
+ 0xfec3, 0xfec4, 0xfec1, 0xfec2, 0xfec7, 0xfec8, 0xfec5, 0xfec6,
+ 0xfecb, 0xfecc, 0xfec9, 0xfeca, 0xfecf, 0xfed0, 0xfecd, 0xfece,
+ 0xfed3, 0xfed4, 0xfed1, 0xfed2, 0xfed7, 0xfed8, 0xfed5, 0xfed6,
+ 0xfedb, 0xfedc, 0xfed9, 0xfeda, 0xfedf, 0xfec0, 0xfedd, 0xfede,
+ 0xfee3, 0xfee4, 0xfee1, 0xfee2, 0xfee7, 0xfee8, 0xfee5, 0xfee6,
+ 0xfeeb, 0xfeec, 0xfee9, 0xfeea, 0xfef3, 0xfef4, 0xfef1, 0xfef2,
+ 0xfe80, 0xfe81, ALTCHR, 0xfe94, 0xfe83, 0xfe85, 0xfeef, 0xfef0,
+ 0xfe87, 0xfe93, 0xfe89, 0xfe8a, 0xfe8b, 0xfe8c, 0xfefc, 0xfefb,
+ 0xfe71, 0xfe73, 0xfe75, 0xfe77, 0xfe79, 0xfe7b, 0xfe7d, 0xfe7f,
+ 0xfe82, 0xfef5, 0xfef6, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR
+};
+
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_xaterm_tophalf_to_ucs2, /* function name */
+ tblXaterm_TophalfToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ARABIC/main.c b/xc/extras/X-TrueType/ARABIC/main.c
new file mode 100644
index 000000000..ceaf0dd96
--- /dev/null
+++ b/xc/extras/X-TrueType/ARABIC/main.c
@@ -0,0 +1,120 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ MULEARABIC0,
+ MULEARABIC1,
+ MULEARABIC2,
+ CP1256,
+ XATERM /* "extended" font used by xaterm */
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "mulearabic", NULL, "0",
+ MULEARABIC0, { 0x20, 0x2a, 0, 0, 0x20 } },
+ { "mulearabic", NULL, "1",
+ MULEARABIC1, { 0x20, 0x69, 0, 0, 0x20 } },
+ { "mulearabic", NULL, "2",
+ MULEARABIC2, { 0x20, 0x6e, 0, 0, 0x20 } },
+ { "microsoft", NULL, "cp1256",
+ CP1256, { 0x00, 0xff, 0, 0, 0x20 } },
+ { "xaterm", NULL, "fontspecific",
+ XATERM, { 0x00, 0xff, 0x00, 0x01, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_mulearabic0_to_ucs2);
+CODECONV_TEMPLATE(cc_mulearabic1_to_ucs2);
+CODECONV_TEMPLATE(cc_mulearabic2_to_ucs2);
+CODECONV_TEMPLATE(cc_cp1256_to_ucs2);
+CODECONV_TEMPLATE(cc_xaterm_to_ucs2);
+CODECONV_TEMPLATE(cc_xaterm_tophalf_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { MULEARABIC0, EPlfmISO, EEncISO10646,
+ cc_mulearabic0_to_ucs2, NULL },
+ { MULEARABIC0, EPlfmUnicode, EEncAny,
+ cc_mulearabic0_to_ucs2, NULL },
+ { MULEARABIC0, EPlfmMS, EEncMSUnicode,
+ cc_mulearabic0_to_ucs2, NULL },
+ { MULEARABIC1, EPlfmISO, EEncISO10646,
+ cc_mulearabic1_to_ucs2, NULL },
+ { MULEARABIC1, EPlfmUnicode, EEncAny,
+ cc_mulearabic1_to_ucs2, NULL },
+ { MULEARABIC1, EPlfmMS, EEncMSUnicode,
+ cc_mulearabic1_to_ucs2, NULL },
+ { MULEARABIC2, EPlfmISO, EEncISO10646,
+ cc_mulearabic2_to_ucs2, NULL },
+ { MULEARABIC2, EPlfmUnicode, EEncAny,
+ cc_mulearabic2_to_ucs2, NULL },
+ { MULEARABIC2, EPlfmMS, EEncMSUnicode,
+ cc_mulearabic2_to_ucs2, NULL },
+ { CP1256, EPlfmISO, EEncISO10646,
+ cc_cp1256_to_ucs2, NULL },
+ { CP1256, EPlfmUnicode, EEncAny,
+ cc_cp1256_to_ucs2, NULL },
+ { CP1256, EPlfmMS, EEncMSUnicode,
+ cc_cp1256_to_ucs2, NULL },
+ { XATERM, EPlfmISO, EEncISO10646,
+ cc_xaterm_to_ucs2, NULL },
+ { XATERM, EPlfmUnicode, EEncAny,
+ cc_xaterm_to_ucs2, NULL },
+ { XATERM, EPlfmMS, EEncMSUnicode,
+ cc_xaterm_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ARABIC_entrypoint)
+
+ft_char_code_t /* result charCodeDest */
+cc_xaterm_to_ucs2(ft_char_code_t codeSrc)
+{
+ if (codeSrc <= 0x00ff) return codeSrc;
+ else return cc_xaterm_tophalf_to_ucs2( codeSrc & 0xff );
+}
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ARMSCII8/ARMSCII8toUCS2.c b/xc/extras/X-TrueType/ARMSCII8/ARMSCII8toUCS2.c
new file mode 100644
index 000000000..aece57b99
--- /dev/null
+++ b/xc/extras/X-TrueType/ARMSCII8/ARMSCII8toUCS2.c
@@ -0,0 +1,80 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ ArmSCII-8 (Armenian) to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Source: http://www.freenet.am/ArmSCII/ArmCS-005.html
+ There is a potential problem whith char "armeternity"
+ (0xa1 in ArmSCII-8) as it isn't listed in unicode charts yet.
+ I used 0xf0a1 as that is the value used by a microsoft-symbol
+ encoded font for char at 0xa1; so if the armenian TTF has also
+ a microsoft-symbol encoding it will show up; otherwise the
+ "armeternity" will probably be lost; a standardization is
+ needed here.
+ Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblArmSCII8ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00a0, 0xf0a1, 0x00a7, 0x0589, 0x0029, 0x0028, 0x00bb, 0x00ab,
+ 0x2014, 0x002e, 0x055d, 0x002c, 0x2010, 0x058a, 0x2026, 0x055c,
+ 0x055b, 0x055e, 0x0531, 0x0561, 0x0532, 0x0562, 0x0533, 0x0563,
+ 0x0534, 0x0564, 0x0535, 0x0565, 0x0536, 0x0566, 0x0537, 0x0567,
+ 0x0538, 0x0568, 0x0539, 0x0569, 0x053a, 0x056a, 0x053b, 0x056b,
+ 0x053c, 0x056c, 0x053d, 0x056d, 0x053e, 0x056e, 0x053f, 0x056f,
+ 0x0540, 0x0570, 0x0541, 0x0571, 0x0542, 0x0572, 0x0543, 0x0573,
+ 0x0544, 0x0574, 0x0545, 0x0575, 0x0546, 0x0576, 0x0547, 0x0577,
+ 0x0548, 0x0578, 0x0549, 0x0579, 0x054a, 0x057a, 0x054b, 0x057b,
+ 0x054c, 0x057c, 0x054d, 0x057d, 0x054e, 0x057e, 0x054f, 0x057f,
+ 0x0550, 0x0580, 0x0551, 0x0581, 0x0552, 0x0582, 0x0553, 0x0583,
+ 0x0554, 0x0584, 0x0555, 0x0585, 0x0556, 0x0586, 0x02bc, 0x0587
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_armscii8_to_ucs2, /* function name */
+ tblArmSCII8ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ARMSCII8/Imakefile b/xc/extras/X-TrueType/ARMSCII8/Imakefile
new file mode 100644
index 000000000..45ae295b3
--- /dev/null
+++ b/xc/extras/X-TrueType/ARMSCII8/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ARMSCII8 */
+
+#define ModuleName ARMSCII8
+SRCS = ARMSCII8toUCS2.c main.c
+OBJS = ARMSCII8toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ARMSCII8/main.c b/xc/extras/X-TrueType/ARMSCII8/main.c
new file mode 100644
index 000000000..4f1aecdae
--- /dev/null
+++ b/xc/extras/X-TrueType/ARMSCII8/main.c
@@ -0,0 +1,69 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ARMSCII8
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "armscii", NULL, "8", ARMSCII8, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_armscii8_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ARMSCII8, EPlfmISO, EEncISO10646,
+ cc_armscii8_to_ucs2, NULL },
+ { ARMSCII8, EPlfmUnicode, EEncAny,
+ cc_armscii8_to_ucs2, NULL },
+ { ARMSCII8, EPlfmMS, EEncMSUnicode,
+ cc_armscii8_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ARMSCII8_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/BIG5/BIG5toUCS2.c b/xc/extras/X-TrueType/BIG5/BIG5toUCS2.c
new file mode 100644
index 000000000..939ff44ea
--- /dev/null
+++ b/xc/extras/X-TrueType/BIG5/BIG5toUCS2.c
@@ -0,0 +1,2284 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPING/EASTASIA/OTHER/BIG5.TXT)
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x3000
+
+static ucs2_t tblBig5EtenToUcs2[] = {
+/* 0xA140 - 0xA1FF */
+ 0x3000, 0xFF0C, 0x3001, 0x3002, 0xFF0E, 0x2022, 0xFF1B, 0xFF1A,
+ 0xFF1F, 0xFF01, 0xFE30, 0x2026, 0x2025, 0xFE50, 0xFF64, 0xFE52,
+ 0x00B7, 0xFE54, 0xFE55, 0xFE56, 0xFE57, 0xFF5C, 0x2013, 0xFE31,
+ 0x2014, 0xFE33, 0xFFFD, 0xFE34, 0xFE4F, 0xFF08, 0xFF09, 0xFE35,
+ 0xFE36, 0xFF5B, 0xFF5D, 0xFE37, 0xFE38, 0x3014, 0x3015, 0xFE39,
+ 0xFE3A, 0x3010, 0x3011, 0xFE3B, 0xFE3C, 0x300A, 0x300B, 0xFE3D,
+ 0xFE3E, 0x3008, 0x3009, 0xFE3F, 0xFE40, 0x300C, 0x300D, 0xFE41,
+ 0xFE42, 0x300E, 0x300F, 0xFE43, 0xFE44, 0xFE59, 0xFE5A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0x2018, 0x2019, 0x201C,
+ 0x201D, 0x301D, 0x301E, 0x2035, 0x2032, 0xFF03, 0xFF06, 0xFF0A,
+ 0x203B, 0x00A7, 0x3003, 0x25CB, 0x25CF, 0x25B3, 0x25B2, 0x25CE,
+ 0x2606, 0x2605, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25BD, 0x25BC,
+ 0x32A3, 0x2105, 0x203E, 0xFFFD, 0xFF3F, 0xFFFD, 0xFE49, 0xFE4A,
+ 0xFE4D, 0xFE4E, 0xFE4B, 0xFE4C, 0xFE5F, 0xFE60, 0xFE61, 0xFF0B,
+ 0xFF0D, 0x00D7, 0x00F7, 0x00B1, 0x221A, 0xFF1C, 0xFF1E, 0xFF1D,
+ 0x2266, 0x2267, 0x2260, 0x221E, 0x2252, 0x2261, 0xFE62, 0xFE63,
+ 0xFE64, 0xFE65, 0xFE66, 0x223C, 0x2229, 0x222A, 0x22A5, 0x2220,
+ 0x221F, 0x22BF, 0x33D2, 0x33D1, 0x222B, 0x222E, 0x2235, 0x2234,
+ 0x2640, 0x2642, 0x2641, 0x2609, 0x2191, 0x2193, 0x2190, 0x2192,
+ 0x2196, 0x2197, 0x2199, 0x2198, 0x2225, 0x2223, 0xFFFD, ALTCHR,
+/* 0xA240 - 0xA2FF */
+ 0xFFFD, 0xFF0F, 0xFF3C, 0xFF04, 0x00A5, 0x3012, 0x00A2, 0x00A3,
+ 0xFF05, 0xFF20, 0x2103, 0x2109, 0xFE69, 0xFE6A, 0xFE6B, 0x33D5,
+ 0x339C, 0x339D, 0x339E, 0x33CE, 0x33A1, 0x338E, 0x338F, 0x33C4,
+ 0x00B0, 0x5159, 0x515B, 0x515E, 0x515D, 0x5161, 0x5163, 0x55E7,
+ 0x74E9, 0x7CCE, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,
+ 0x2587, 0x2588, 0x258F, 0x258E, 0x258D, 0x258C, 0x258B, 0x258A,
+ 0x2589, 0x253C, 0x2534, 0x252C, 0x2524, 0x251C, 0x2594, 0x2500,
+ 0x2502, 0x2595, 0x250C, 0x2510, 0x2514, 0x2518, 0x256D, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x256E, 0x2570, 0x256F, 0x2550, 0x255E, 0x256A, 0x2561,
+ 0x25E2, 0x25E3, 0x25E5, 0x25E4, 0x2571, 0x2572, 0x2573, 0xFF10,
+ 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, 0xFF18,
+ 0xFF19, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166,
+ 0x2167, 0x2168, 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025,
+ 0x3026, 0x3027, 0x3028, 0x3029, 0xFFFD, 0x5344, 0xFFFD, 0xFF21,
+ 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27, 0xFF28, 0xFF29,
+ 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F, 0xFF30, 0xFF31,
+ 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37, 0xFF38, 0xFF39,
+ 0xFF3A, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47,
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F,
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, ALTCHR,
+/* 0xA340 - 0xA3FF */
+ 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0x0391, 0x0392, 0x0393, 0x0394,
+ 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C,
+ 0x039D, 0x039E, 0x039F, 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5,
+ 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4,
+ 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC,
+ 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5,
+ 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x3105, 0x3106, 0x3107, 0x3108,
+ 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116,
+ 0x3117, 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E,
+ 0x311F, 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126,
+ 0x3127, 0x3128, 0x3129, 0x02D9, 0x02C9, 0x02CA, 0x02C7, 0x02CB,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xA440 - 0xA4FF */
+ 0x4E00, 0x4E59, 0x4E01, 0x4E03, 0x4E43, 0x4E5D, 0x4E86, 0x4E8C,
+ 0x4EBA, 0x513F, 0x5165, 0x516B, 0x51E0, 0x5200, 0x5201, 0x529B,
+ 0x5315, 0x5341, 0x535C, 0x53C8, 0x4E09, 0x4E0B, 0x4E08, 0x4E0A,
+ 0x4E2B, 0x4E38, 0x51E1, 0x4E45, 0x4E48, 0x4E5F, 0x4E5E, 0x4E8E,
+ 0x4EA1, 0x5140, 0x5203, 0x52FA, 0x5343, 0x53C9, 0x53E3, 0x571F,
+ 0x58EB, 0x5915, 0x5927, 0x5973, 0x5B50, 0x5B51, 0x5B53, 0x5BF8,
+ 0x5C0F, 0x5C22, 0x5C38, 0x5C71, 0x5DDD, 0x5DE5, 0x5DF1, 0x5DF2,
+ 0x5DF3, 0x5DFE, 0x5E72, 0x5EFE, 0x5F0B, 0x5F13, 0x624D, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x4E11, 0x4E10, 0x4E0D, 0x4E2D, 0x4E30, 0x4E39, 0x4E4B,
+ 0x5C39, 0x4E88, 0x4E91, 0x4E95, 0x4E92, 0x4E94, 0x4EA2, 0x4EC1,
+ 0x4EC0, 0x4EC3, 0x4EC6, 0x4EC7, 0x4ECD, 0x4ECA, 0x4ECB, 0x4EC4,
+ 0x5143, 0x5141, 0x5167, 0x516D, 0x516E, 0x516C, 0x5197, 0x51F6,
+ 0x5206, 0x5207, 0x5208, 0x52FB, 0x52FE, 0x52FF, 0x5316, 0x5339,
+ 0x5348, 0x5347, 0x5345, 0x535E, 0x5384, 0x53CB, 0x53CA, 0x53CD,
+ 0x58EC, 0x5929, 0x592B, 0x592A, 0x592D, 0x5B54, 0x5C11, 0x5C24,
+ 0x5C3A, 0x5C6F, 0x5DF4, 0x5E7B, 0x5EFF, 0x5F14, 0x5F15, 0x5FC3,
+ 0x6208, 0x6236, 0x624B, 0x624E, 0x652F, 0x6587, 0x6597, 0x65A4,
+ 0x65B9, 0x65E5, 0x66F0, 0x6708, 0x6728, 0x6B20, 0x6B62, 0x6B79,
+ 0x6BCB, 0x6BD4, 0x6BDB, 0x6C0F, 0x6C34, 0x706B, 0x722A, 0x7236,
+ 0x723B, 0x7247, 0x7259, 0x725B, 0x72AC, 0x738B, 0x4E19, ALTCHR,
+/* 0xA540 - 0xA5FF */
+ 0x4E16, 0x4E15, 0x4E14, 0x4E18, 0x4E3B, 0x4E4D, 0x4E4F, 0x4E4E,
+ 0x4EE5, 0x4ED8, 0x4ED4, 0x4ED5, 0x4ED6, 0x4ED7, 0x4EE3, 0x4EE4,
+ 0x4ED9, 0x4EDE, 0x5145, 0x5144, 0x5189, 0x518A, 0x51AC, 0x51F9,
+ 0x51FA, 0x51F8, 0x520A, 0x52A0, 0x529F, 0x5305, 0x5306, 0x5317,
+ 0x531D, 0x4EDF, 0x534A, 0x5349, 0x5361, 0x5360, 0x536F, 0x536E,
+ 0x53BB, 0x53EF, 0x53E4, 0x53F3, 0x53EC, 0x53EE, 0x53E9, 0x53E8,
+ 0x53FC, 0x53F8, 0x53F5, 0x53EB, 0x53E6, 0x53EA, 0x53F2, 0x53F1,
+ 0x53F0, 0x53E5, 0x53ED, 0x53FB, 0x56DB, 0x56DA, 0x5916, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x592E, 0x5931, 0x5974, 0x5976, 0x5B55, 0x5B83, 0x5C3C,
+ 0x5DE8, 0x5DE7, 0x5DE6, 0x5E02, 0x5E03, 0x5E73, 0x5E7C, 0x5F01,
+ 0x5F18, 0x5F17, 0x5FC5, 0x620A, 0x6253, 0x6254, 0x6252, 0x6251,
+ 0x65A5, 0x65E6, 0x672E, 0x672C, 0x672A, 0x672B, 0x672D, 0x6B63,
+ 0x6BCD, 0x6C11, 0x6C10, 0x6C38, 0x6C41, 0x6C40, 0x6C3E, 0x72AF,
+ 0x7384, 0x7389, 0x74DC, 0x74E6, 0x7518, 0x751F, 0x7528, 0x7529,
+ 0x7530, 0x7531, 0x7532, 0x7533, 0x758B, 0x767D, 0x76AE, 0x76BF,
+ 0x76EE, 0x77DB, 0x77E2, 0x77F3, 0x793A, 0x79BE, 0x7A74, 0x7ACB,
+ 0x4E1E, 0x4E1F, 0x4E52, 0x4E53, 0x4E69, 0x4E99, 0x4EA4, 0x4EA6,
+ 0x4EA5, 0x4EFF, 0x4F09, 0x4F19, 0x4F0A, 0x4F15, 0x4F0D, 0x4F10,
+ 0x4F11, 0x4F0F, 0x4EF2, 0x4EF6, 0x4EFB, 0x4EF0, 0x4EF3, 0x4EFD,
+ 0x4F01, 0x4F0B, 0x5149, 0x5147, 0x5146, 0x5148, 0x5168, ALTCHR,
+/* 0xA640 - 0xA6FF */
+ 0x5171, 0x518D, 0x51B0, 0x5217, 0x5211, 0x5212, 0x520E, 0x5216,
+ 0x52A3, 0x5308, 0x5321, 0x5320, 0x5370, 0x5371, 0x5409, 0x540F,
+ 0x540C, 0x540A, 0x5410, 0x5401, 0x540B, 0x5404, 0x5411, 0x540D,
+ 0x5408, 0x5403, 0x540E, 0x5406, 0x5412, 0x56E0, 0x56DE, 0x56DD,
+ 0x5733, 0x5730, 0x5728, 0x572D, 0x572C, 0x572F, 0x5729, 0x5919,
+ 0x591A, 0x5937, 0x5938, 0x5984, 0x5978, 0x5983, 0x597D, 0x5979,
+ 0x5982, 0x5981, 0x5B57, 0x5B58, 0x5B87, 0x5B88, 0x5B85, 0x5B89,
+ 0x5BFA, 0x5C16, 0x5C79, 0x5DDE, 0x5E06, 0x5E76, 0x5E74, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5F0F, 0x5F1B, 0x5FD9, 0x5FD6, 0x620E, 0x620C, 0x620D,
+ 0x6210, 0x6263, 0x625B, 0x6258, 0x6536, 0x65E9, 0x65E8, 0x65EC,
+ 0x65ED, 0x66F2, 0x66F3, 0x6709, 0x673D, 0x6734, 0x6731, 0x6735,
+ 0x6B21, 0x6B64, 0x6B7B, 0x6C16, 0x6C5D, 0x6C57, 0x6C59, 0x6C5F,
+ 0x6C60, 0x6C50, 0x6C55, 0x6C61, 0x6C5B, 0x6C4D, 0x6C4E, 0x7070,
+ 0x725F, 0x725D, 0x767E, 0x7AF9, 0x7C73, 0x7CF8, 0x7F36, 0x7F8A,
+ 0x7FBD, 0x8001, 0x8003, 0x800C, 0x8012, 0x8033, 0x807F, 0x8089,
+ 0x808B, 0x808C, 0x81E3, 0x81EA, 0x81F3, 0x81FC, 0x820C, 0x821B,
+ 0x821F, 0x826E, 0x8272, 0x827E, 0x866B, 0x8840, 0x884C, 0x8863,
+ 0x897F, 0x9621, 0x4E32, 0x4EA8, 0x4F4D, 0x4F4F, 0x4F47, 0x4F57,
+ 0x4F5E, 0x4F34, 0x4F5B, 0x4F55, 0x4F30, 0x4F50, 0x4F51, 0x4F3D,
+ 0x4F3A, 0x4F38, 0x4F43, 0x4F54, 0x4F3C, 0x4F46, 0x4F63, ALTCHR,
+/* 0xA740 - 0xA7FF */
+ 0x4F5C, 0x4F60, 0x4F2F, 0x4F4E, 0x4F36, 0x4F59, 0x4F5D, 0x4F48,
+ 0x4F5A, 0x514C, 0x514B, 0x514D, 0x5175, 0x51B6, 0x51B7, 0x5225,
+ 0x5224, 0x5229, 0x522A, 0x5228, 0x52AB, 0x52A9, 0x52AA, 0x52AC,
+ 0x5323, 0x5373, 0x5375, 0x541D, 0x542D, 0x541E, 0x543E, 0x5426,
+ 0x544E, 0x5427, 0x5446, 0x5443, 0x5433, 0x5448, 0x5442, 0x541B,
+ 0x5429, 0x544A, 0x5439, 0x543B, 0x5438, 0x542E, 0x5435, 0x5436,
+ 0x5420, 0x543C, 0x5440, 0x5431, 0x542B, 0x541F, 0x542C, 0x56EA,
+ 0x56F0, 0x56E4, 0x56EB, 0x574A, 0x5751, 0x5740, 0x574D, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5747, 0x574E, 0x573E, 0x5750, 0x574F, 0x573B, 0x58EF,
+ 0x593E, 0x599D, 0x5992, 0x59A8, 0x599E, 0x59A3, 0x5999, 0x5996,
+ 0x598D, 0x59A4, 0x5993, 0x598A, 0x59A5, 0x5B5D, 0x5B5C, 0x5B5A,
+ 0x5B5B, 0x5B8C, 0x5B8B, 0x5B8F, 0x5C2C, 0x5C40, 0x5C41, 0x5C3F,
+ 0x5C3E, 0x5C90, 0x5C91, 0x5C94, 0x5C8C, 0x5DEB, 0x5E0C, 0x5E8F,
+ 0x5E87, 0x5E8A, 0x5EF7, 0x5F04, 0x5F1F, 0x5F64, 0x5F62, 0x5F77,
+ 0x5F79, 0x5FD8, 0x5FCC, 0x5FD7, 0x5FCD, 0x5FF1, 0x5FEB, 0x5FF8,
+ 0x5FEA, 0x6212, 0x6211, 0x6284, 0x6297, 0x6296, 0x6280, 0x6276,
+ 0x6289, 0x626D, 0x628A, 0x627C, 0x627E, 0x6279, 0x6273, 0x6292,
+ 0x626F, 0x6298, 0x626E, 0x6295, 0x6293, 0x6291, 0x6286, 0x6539,
+ 0x653B, 0x6538, 0x65F1, 0x66F4, 0x675F, 0x674E, 0x674F, 0x6750,
+ 0x6751, 0x675C, 0x6756, 0x675E, 0x6749, 0x6746, 0x6760, ALTCHR,
+/* 0xA840 - 0xA8FF */
+ 0x6753, 0x6757, 0x6B65, 0x6BCF, 0x6C42, 0x6C5E, 0x6C99, 0x6C81,
+ 0x6C88, 0x6C89, 0x6C85, 0x6C9B, 0x6C6A, 0x6C7A, 0x6C90, 0x6C70,
+ 0x6C8C, 0x6C68, 0x6C96, 0x6C92, 0x6C7D, 0x6C83, 0x6C72, 0x6C7E,
+ 0x6C74, 0x6C86, 0x6C76, 0x6C8D, 0x6C94, 0x6C98, 0x6C82, 0x7076,
+ 0x707C, 0x707D, 0x7078, 0x7262, 0x7261, 0x7260, 0x72C4, 0x72C2,
+ 0x7396, 0x752C, 0x752B, 0x7537, 0x7538, 0x7682, 0x76EF, 0x77E3,
+ 0x79C1, 0x79C0, 0x79BF, 0x7A76, 0x7CFB, 0x7F55, 0x8096, 0x8093,
+ 0x809D, 0x8098, 0x809B, 0x809A, 0x80B2, 0x826F, 0x8292, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x828B, 0x828D, 0x898B, 0x89D2, 0x8A00, 0x8C37, 0x8C46,
+ 0x8C55, 0x8C9D, 0x8D64, 0x8D70, 0x8DB3, 0x8EAB, 0x8ECA, 0x8F9B,
+ 0x8FB0, 0x8FC2, 0x8FC6, 0x8FC5, 0x8FC4, 0x5DE1, 0x9091, 0x90A2,
+ 0x90AA, 0x90A6, 0x90A3, 0x9149, 0x91C6, 0x91CC, 0x9632, 0x962E,
+ 0x9631, 0x962A, 0x962C, 0x4E26, 0x4E56, 0x4E73, 0x4E8B, 0x4E9B,
+ 0x4E9E, 0x4EAB, 0x4EAC, 0x4F6F, 0x4F9D, 0x4F8D, 0x4F73, 0x4F7F,
+ 0x4F6C, 0x4F9B, 0x4F8B, 0x4F86, 0x4F83, 0x4F70, 0x4F75, 0x4F88,
+ 0x4F69, 0x4F7B, 0x4F96, 0x4F7E, 0x4F8F, 0x4F91, 0x4F7A, 0x5154,
+ 0x5152, 0x5155, 0x5169, 0x5177, 0x5176, 0x5178, 0x51BD, 0x51FD,
+ 0x523B, 0x5238, 0x5237, 0x523A, 0x5230, 0x522E, 0x5236, 0x5241,
+ 0x52BE, 0x52BB, 0x5352, 0x5354, 0x5353, 0x5351, 0x5366, 0x5377,
+ 0x5378, 0x5379, 0x53D6, 0x53D4, 0x53D7, 0x5473, 0x5475, ALTCHR,
+/* 0xA940 - 0xA9FF */
+ 0x5496, 0x5478, 0x5495, 0x5480, 0x547B, 0x5477, 0x5484, 0x5492,
+ 0x5486, 0x547C, 0x5490, 0x5471, 0x5476, 0x548C, 0x549A, 0x5462,
+ 0x5468, 0x548B, 0x547D, 0x548E, 0x56FA, 0x5783, 0x5777, 0x576A,
+ 0x5769, 0x5761, 0x5766, 0x5764, 0x577C, 0x591C, 0x5949, 0x5947,
+ 0x5948, 0x5944, 0x5954, 0x59BE, 0x59BB, 0x59D4, 0x59B9, 0x59AE,
+ 0x59D1, 0x59C6, 0x59D0, 0x59CD, 0x59CB, 0x59D3, 0x59CA, 0x59AF,
+ 0x59B3, 0x59D2, 0x59C5, 0x5B5F, 0x5B64, 0x5B63, 0x5B97, 0x5B9A,
+ 0x5B98, 0x5B9C, 0x5B99, 0x5B9B, 0x5C1A, 0x5C48, 0x5C45, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5C46, 0x5CB7, 0x5CA1, 0x5CB8, 0x5CA9, 0x5CAB, 0x5CB1,
+ 0x5CB3, 0x5E18, 0x5E1A, 0x5E16, 0x5E15, 0x5E1B, 0x5E11, 0x5E78,
+ 0x5E9A, 0x5E97, 0x5E9C, 0x5E95, 0x5E96, 0x5EF6, 0x5F26, 0x5F27,
+ 0x5F29, 0x5F80, 0x5F81, 0x5F7F, 0x5F7C, 0x5FDD, 0x5FE0, 0x5FFD,
+ 0x5FF5, 0x5FFF, 0x600F, 0x6014, 0x602F, 0x6035, 0x6016, 0x602A,
+ 0x6015, 0x6021, 0x6027, 0x6029, 0x602B, 0x601B, 0x6216, 0x6215,
+ 0x623F, 0x623E, 0x6240, 0x627F, 0x62C9, 0x62CC, 0x62C4, 0x62BF,
+ 0x62C2, 0x62B9, 0x62D2, 0x62DB, 0x62AB, 0x62D3, 0x62D4, 0x62CB,
+ 0x62C8, 0x62A8, 0x62BD, 0x62BC, 0x62D0, 0x62D9, 0x62C7, 0x62CD,
+ 0x62B5, 0x62DA, 0x62B1, 0x62D8, 0x62D6, 0x62D7, 0x62C6, 0x62AC,
+ 0x62CE, 0x653E, 0x65A7, 0x65BC, 0x65FA, 0x6614, 0x6613, 0x660C,
+ 0x6606, 0x6602, 0x660E, 0x6600, 0x660F, 0x6615, 0x660A, ALTCHR,
+/* 0xAA40 - 0xAAFF */
+ 0x6607, 0x670D, 0x670B, 0x676D, 0x678B, 0x6795, 0x6771, 0x679C,
+ 0x6773, 0x6777, 0x6787, 0x679D, 0x6797, 0x676F, 0x6770, 0x677F,
+ 0x6789, 0x677E, 0x6790, 0x6775, 0x679A, 0x6793, 0x677C, 0x676A,
+ 0x6772, 0x6B23, 0x6B66, 0x6B67, 0x6B7F, 0x6C13, 0x6C1B, 0x6CE3,
+ 0x6CE8, 0x6CF3, 0x6CB1, 0x6CCC, 0x6CE5, 0x6CB3, 0x6CBD, 0x6CBE,
+ 0x6CBC, 0x6CE2, 0x6CAB, 0x6CD5, 0x6CD3, 0x6CB8, 0x6CC4, 0x6CB9,
+ 0x6CC1, 0x6CAE, 0x6CD7, 0x6CC5, 0x6CF1, 0x6CBF, 0x6CBB, 0x6CE1,
+ 0x6CDB, 0x6CCA, 0x6CAC, 0x6CEF, 0x6CDC, 0x6CD6, 0x6CE0, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7095, 0x708E, 0x7092, 0x708A, 0x7099, 0x722C, 0x722D,
+ 0x7238, 0x7248, 0x7267, 0x7269, 0x72C0, 0x72CE, 0x72D9, 0x72D7,
+ 0x72D0, 0x73A9, 0x73A8, 0x739F, 0x73AB, 0x73A5, 0x753D, 0x759D,
+ 0x7599, 0x759A, 0x7684, 0x76C2, 0x76F2, 0x76F4, 0x77E5, 0x77FD,
+ 0x793E, 0x7940, 0x7941, 0x79C9, 0x79C8, 0x7A7A, 0x7A79, 0x7AFA,
+ 0x7CFE, 0x7F54, 0x7F8C, 0x7F8B, 0x8005, 0x80BA, 0x80A5, 0x80A2,
+ 0x80B1, 0x80A1, 0x80AB, 0x80A9, 0x80B4, 0x80AA, 0x80AF, 0x81E5,
+ 0x81FE, 0x820D, 0x82B3, 0x829D, 0x8299, 0x82AD, 0x82BD, 0x829F,
+ 0x82B9, 0x82B1, 0x82AC, 0x82A5, 0x82AF, 0x82B8, 0x82A3, 0x82B0,
+ 0x82BE, 0x82B7, 0x864E, 0x8671, 0x521D, 0x8868, 0x8ECB, 0x8FCE,
+ 0x8FD4, 0x8FD1, 0x90B5, 0x90B8, 0x90B1, 0x90B6, 0x91C7, 0x91D1,
+ 0x9577, 0x9580, 0x961C, 0x9640, 0x963F, 0x963B, 0x9644, ALTCHR,
+/* 0xAB40 - 0xABFF */
+ 0x9642, 0x96B9, 0x96E8, 0x9752, 0x975E, 0x4E9F, 0x4EAD, 0x4EAE,
+ 0x4FE1, 0x4FB5, 0x4FAF, 0x4FBF, 0x4FE0, 0x4FD1, 0x4FCF, 0x4FDD,
+ 0x4FC3, 0x4FB6, 0x4FD8, 0x4FDF, 0x4FCA, 0x4FD7, 0x4FAE, 0x4FD0,
+ 0x4FC4, 0x4FC2, 0x4FDA, 0x4FCE, 0x4FDE, 0x4FB7, 0x5157, 0x5192,
+ 0x5191, 0x51A0, 0x524E, 0x5243, 0x524A, 0x524D, 0x524C, 0x524B,
+ 0x5247, 0x52C7, 0x52C9, 0x52C3, 0x52C1, 0x530D, 0x5357, 0x537B,
+ 0x539A, 0x53DB, 0x54AC, 0x54C0, 0x54A8, 0x54CE, 0x54C9, 0x54B8,
+ 0x54A6, 0x54B3, 0x54C7, 0x54C2, 0x54BD, 0x54AA, 0x54C1, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x54C4, 0x54C8, 0x54AF, 0x54AB, 0x54B1, 0x54BB, 0x54A9,
+ 0x54A7, 0x54BF, 0x56FF, 0x5782, 0x578B, 0x57A0, 0x57A3, 0x57A2,
+ 0x57CE, 0x57AE, 0x5793, 0x5955, 0x5951, 0x594F, 0x594E, 0x5950,
+ 0x59DC, 0x59D8, 0x59FF, 0x59E3, 0x59E8, 0x5A03, 0x59E5, 0x59EA,
+ 0x59DA, 0x59E6, 0x5A01, 0x59FB, 0x5B69, 0x5BA3, 0x5BA6, 0x5BA4,
+ 0x5BA2, 0x5BA5, 0x5C01, 0x5C4E, 0x5C4F, 0x5C4D, 0x5C4B, 0x5CD9,
+ 0x5CD2, 0x5DF7, 0x5E1D, 0x5E25, 0x5E1F, 0x5E7D, 0x5EA0, 0x5EA6,
+ 0x5EFA, 0x5F08, 0x5F2D, 0x5F65, 0x5F88, 0x5F85, 0x5F8A, 0x5F8B,
+ 0x5F87, 0x5F8C, 0x5F89, 0x6012, 0x601D, 0x6020, 0x6025, 0x600E,
+ 0x6028, 0x604D, 0x6070, 0x6068, 0x6062, 0x6046, 0x6043, 0x606C,
+ 0x606B, 0x606A, 0x6064, 0x6241, 0x62DC, 0x6316, 0x6309, 0x62FC,
+ 0x62ED, 0x6301, 0x62EE, 0x62FD, 0x6307, 0x62F1, 0x62F7, ALTCHR,
+/* 0xAC40 - 0xACFF */
+ 0x62EF, 0x62EC, 0x62FE, 0x62F4, 0x6311, 0x6302, 0x653F, 0x6545,
+ 0x65AB, 0x65BD, 0x65E2, 0x6625, 0x662D, 0x6620, 0x6627, 0x662F,
+ 0x661F, 0x6628, 0x6631, 0x6624, 0x66F7, 0x67FF, 0x67D3, 0x67F1,
+ 0x67D4, 0x67D0, 0x67EC, 0x67B6, 0x67AF, 0x67F5, 0x67E9, 0x67EF,
+ 0x67C4, 0x67D1, 0x67B4, 0x67DA, 0x67E5, 0x67B8, 0x67CF, 0x67DE,
+ 0x67F3, 0x67B0, 0x67D9, 0x67E2, 0x67DD, 0x67D2, 0x6B6A, 0x6B83,
+ 0x6B86, 0x6BB5, 0x6BD2, 0x6BD7, 0x6C1F, 0x6CC9, 0x6D0B, 0x6D32,
+ 0x6D2A, 0x6D41, 0x6D25, 0x6D0C, 0x6D31, 0x6D1E, 0x6D17, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6D3B, 0x6D3D, 0x6D3E, 0x6D36, 0x6D1B, 0x6CF5, 0x6D39,
+ 0x6D27, 0x6D38, 0x6D29, 0x6D2E, 0x6D35, 0x6D0E, 0x6D2B, 0x70AB,
+ 0x70BA, 0x70B3, 0x70AC, 0x70AF, 0x70AD, 0x70B8, 0x70AE, 0x70A4,
+ 0x7230, 0x7272, 0x726F, 0x7274, 0x72E9, 0x72E0, 0x72E1, 0x73B7,
+ 0x73CA, 0x73BB, 0x73B2, 0x73CD, 0x73C0, 0x73B3, 0x751A, 0x752D,
+ 0x754F, 0x754C, 0x754E, 0x754B, 0x75AB, 0x75A4, 0x75A5, 0x75A2,
+ 0x75A3, 0x7678, 0x7686, 0x7687, 0x7688, 0x76C8, 0x76C6, 0x76C3,
+ 0x76C5, 0x7701, 0x76F9, 0x76F8, 0x7709, 0x770B, 0x76FE, 0x76FC,
+ 0x7707, 0x77DC, 0x7802, 0x7814, 0x780C, 0x780D, 0x7946, 0x7949,
+ 0x7948, 0x7947, 0x79B9, 0x79BA, 0x79D1, 0x79D2, 0x79CB, 0x7A7F,
+ 0x7A81, 0x7AFF, 0x7AFD, 0x7C7D, 0x7D02, 0x7D05, 0x7D00, 0x7D09,
+ 0x7D07, 0x7D04, 0x7D06, 0x7F38, 0x7F8E, 0x7FBF, 0x8004, ALTCHR,
+/* 0xAD40 - 0xADFF */
+ 0x8010, 0x800D, 0x8011, 0x8036, 0x80D6, 0x80E5, 0x80DA, 0x80C3,
+ 0x80C4, 0x80CC, 0x80E1, 0x80DB, 0x80CE, 0x80DE, 0x80E4, 0x80DD,
+ 0x81F4, 0x8222, 0x82E7, 0x8303, 0x8305, 0x82E3, 0x82DB, 0x82E6,
+ 0x8304, 0x82E5, 0x8302, 0x8309, 0x82D2, 0x82D7, 0x82F1, 0x8301,
+ 0x82DC, 0x82D4, 0x82D1, 0x82DE, 0x82D3, 0x82DF, 0x82EF, 0x8306,
+ 0x8650, 0x8679, 0x867B, 0x867A, 0x884D, 0x886B, 0x8981, 0x89D4,
+ 0x8A08, 0x8A02, 0x8A03, 0x8C9E, 0x8CA0, 0x8D74, 0x8D73, 0x8DB4,
+ 0x8ECD, 0x8ECC, 0x8FF0, 0x8FE6, 0x8FE2, 0x8FEA, 0x8FE5, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8FED, 0x8FEB, 0x8FE4, 0x8FE8, 0x90CA, 0x90CE, 0x90C1,
+ 0x90C3, 0x914B, 0x914A, 0x91CD, 0x9582, 0x9650, 0x964B, 0x964C,
+ 0x964D, 0x9762, 0x9769, 0x97CB, 0x97ED, 0x97F3, 0x9801, 0x98A8,
+ 0x98DB, 0x98DF, 0x9996, 0x9999, 0x4E58, 0x4EB3, 0x500C, 0x500D,
+ 0x5023, 0x4FEF, 0x5026, 0x5025, 0x4FF8, 0x5029, 0x5016, 0x5006,
+ 0x503C, 0x501F, 0x501A, 0x5012, 0x5011, 0x4FFA, 0x5000, 0x5014,
+ 0x5028, 0x4FF1, 0x5021, 0x500B, 0x5019, 0x5018, 0x4FF3, 0x4FEE,
+ 0x502D, 0x502A, 0x4FFE, 0x502B, 0x5009, 0x517C, 0x51A4, 0x51A5,
+ 0x51A2, 0x51CD, 0x51CC, 0x51C6, 0x51CB, 0x5256, 0x525C, 0x5254,
+ 0x525B, 0x525D, 0x532A, 0x537F, 0x539F, 0x539D, 0x53DF, 0x54E8,
+ 0x5510, 0x5501, 0x5537, 0x54FC, 0x54E5, 0x54F2, 0x5506, 0x54FA,
+ 0x5514, 0x54E9, 0x54ED, 0x54E1, 0x5509, 0x54EE, 0x54EA, ALTCHR,
+/* 0xAE40 - 0xAEFF */
+ 0x54E6, 0x5527, 0x5507, 0x54FD, 0x550F, 0x5703, 0x5704, 0x57C2,
+ 0x57D4, 0x57CB, 0x57C3, 0x5809, 0x590F, 0x5957, 0x5958, 0x595A,
+ 0x5A11, 0x5A18, 0x5A1C, 0x5A1F, 0x5A1B, 0x5A13, 0x59EC, 0x5A20,
+ 0x5A23, 0x5A29, 0x5A25, 0x5A0C, 0x5A09, 0x5B6B, 0x5C58, 0x5BB0,
+ 0x5BB3, 0x5BB6, 0x5BB4, 0x5BAE, 0x5BB5, 0x5BB9, 0x5BB8, 0x5C04,
+ 0x5C51, 0x5C55, 0x5C50, 0x5CED, 0x5CFD, 0x5CFB, 0x5CEA, 0x5CE8,
+ 0x5CF0, 0x5CF6, 0x5D01, 0x5CF4, 0x5DEE, 0x5E2D, 0x5E2B, 0x5EAB,
+ 0x5EAD, 0x5EA7, 0x5F31, 0x5F92, 0x5F91, 0x5F90, 0x6059, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6063, 0x6065, 0x6050, 0x6055, 0x606D, 0x6069, 0x606F,
+ 0x6084, 0x609F, 0x609A, 0x608D, 0x6094, 0x608C, 0x6085, 0x6096,
+ 0x6247, 0x62F3, 0x6308, 0x62FF, 0x634E, 0x633E, 0x632F, 0x6355,
+ 0x6342, 0x6346, 0x634F, 0x6349, 0x633A, 0x6350, 0x633D, 0x632A,
+ 0x632B, 0x6328, 0x634D, 0x634C, 0x6548, 0x6549, 0x6599, 0x65C1,
+ 0x65C5, 0x6642, 0x6649, 0x664F, 0x6643, 0x6652, 0x664C, 0x6645,
+ 0x6641, 0x66F8, 0x6714, 0x6715, 0x6717, 0x6821, 0x6838, 0x6848,
+ 0x6846, 0x6853, 0x6839, 0x6842, 0x6854, 0x6829, 0x68B3, 0x6817,
+ 0x684C, 0x6851, 0x683D, 0x67F4, 0x6850, 0x6840, 0x683C, 0x6843,
+ 0x682A, 0x6845, 0x6813, 0x6818, 0x6841, 0x6B8A, 0x6B89, 0x6BB7,
+ 0x6C23, 0x6C27, 0x6C28, 0x6C26, 0x6C24, 0x6CF0, 0x6D6A, 0x6D95,
+ 0x6D88, 0x6D87, 0x6D66, 0x6D78, 0x6D77, 0x6D59, 0x6D93, ALTCHR,
+/* 0xAF40 - 0xAFFF */
+ 0x6D6C, 0x6D89, 0x6D6E, 0x6D5A, 0x6D74, 0x6D69, 0x6D8C, 0x6D8A,
+ 0x6D79, 0x6D85, 0x6D65, 0x6D94, 0x70CA, 0x70D8, 0x70E4, 0x70D9,
+ 0x70C8, 0x70CF, 0x7239, 0x7279, 0x72FC, 0x72F9, 0x72FD, 0x72F8,
+ 0x72F7, 0x7386, 0x73ED, 0x7409, 0x73EE, 0x73E0, 0x73EA, 0x73DE,
+ 0x7554, 0x755D, 0x755C, 0x755A, 0x7559, 0x75BE, 0x75C5, 0x75C7,
+ 0x75B2, 0x75B3, 0x75BD, 0x75BC, 0x75B9, 0x75C2, 0x75B8, 0x768B,
+ 0x76B0, 0x76CA, 0x76CD, 0x76CE, 0x7729, 0x771F, 0x7720, 0x7728,
+ 0x77E9, 0x7830, 0x7827, 0x7838, 0x781D, 0x7834, 0x7837, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7825, 0x782D, 0x7820, 0x781F, 0x7832, 0x7955, 0x7950,
+ 0x7960, 0x795F, 0x7956, 0x795E, 0x795D, 0x7957, 0x795A, 0x79E4,
+ 0x79E3, 0x79E7, 0x79DF, 0x79E6, 0x79E9, 0x79D8, 0x7A84, 0x7A88,
+ 0x7AD9, 0x7B06, 0x7B11, 0x7C89, 0x7D21, 0x7D17, 0x7D0B, 0x7D0A,
+ 0x7D20, 0x7D22, 0x7D14, 0x7D10, 0x7D15, 0x7D1A, 0x7D1C, 0x7D0D,
+ 0x7D19, 0x7D1B, 0x7F3A, 0x7F5F, 0x7F94, 0x7FC5, 0x7FC1, 0x8006,
+ 0x8018, 0x8015, 0x8019, 0x8017, 0x803D, 0x803F, 0x80F1, 0x8102,
+ 0x80F0, 0x8105, 0x80ED, 0x80F4, 0x8106, 0x80F8, 0x80F3, 0x8108,
+ 0x80FD, 0x810A, 0x80FC, 0x80EF, 0x81ED, 0x81EC, 0x8200, 0x8210,
+ 0x822A, 0x822B, 0x8228, 0x822C, 0x82BB, 0x832B, 0x8352, 0x8354,
+ 0x834A, 0x8338, 0x8350, 0x8349, 0x8335, 0x8334, 0x834F, 0x8332,
+ 0x8339, 0x8336, 0x8317, 0x8340, 0x8331, 0x8328, 0x8343, ALTCHR,
+/* 0xB040 - 0xB0FF */
+ 0x8654, 0x868A, 0x86AA, 0x8693, 0x86A4, 0x86A9, 0x868C, 0x86A3,
+ 0x869C, 0x8870, 0x8877, 0x8881, 0x8882, 0x887D, 0x8879, 0x8A18,
+ 0x8A10, 0x8A0E, 0x8A0C, 0x8A15, 0x8A0A, 0x8A17, 0x8A13, 0x8A16,
+ 0x8A0F, 0x8A11, 0x8C48, 0x8C7A, 0x8C79, 0x8CA1, 0x8CA2, 0x8D77,
+ 0x8EAC, 0x8ED2, 0x8ED4, 0x8ECF, 0x8FB1, 0x9001, 0x9006, 0x8FF7,
+ 0x9000, 0x8FFA, 0x8FF4, 0x9003, 0x8FFD, 0x9005, 0x8FF8, 0x9095,
+ 0x90E1, 0x90DD, 0x90E2, 0x9152, 0x914D, 0x914C, 0x91D8, 0x91DD,
+ 0x91D7, 0x91DC, 0x91D9, 0x9583, 0x9662, 0x9663, 0x9661, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x965B, 0x965D, 0x9664, 0x9658, 0x965E, 0x96BB, 0x98E2,
+ 0x99AC, 0x9AA8, 0x9AD8, 0x9B25, 0x9B32, 0x9B3C, 0x4E7E, 0x507A,
+ 0x507D, 0x505C, 0x5047, 0x5043, 0x504C, 0x505A, 0x5049, 0x5065,
+ 0x5076, 0x504E, 0x5055, 0x5075, 0x5074, 0x5077, 0x504F, 0x500F,
+ 0x506F, 0x506D, 0x515C, 0x5195, 0x51F0, 0x526A, 0x526F, 0x52D2,
+ 0x52D9, 0x52D8, 0x52D5, 0x5310, 0x530F, 0x5319, 0x533F, 0x5340,
+ 0x533E, 0x53C3, 0x66FC, 0x5546, 0x556A, 0x5566, 0x5544, 0x555E,
+ 0x5561, 0x5543, 0x554A, 0x5531, 0x5556, 0x554F, 0x5555, 0x552F,
+ 0x5564, 0x5538, 0x552E, 0x555C, 0x552C, 0x5563, 0x5533, 0x5541,
+ 0x5557, 0x5708, 0x570B, 0x5709, 0x57DF, 0x5805, 0x580A, 0x5806,
+ 0x57E0, 0x57E4, 0x57FA, 0x5802, 0x5835, 0x57F7, 0x57F9, 0x5920,
+ 0x5962, 0x5A36, 0x5A41, 0x5A49, 0x5A66, 0x5A6A, 0x5A40, ALTCHR,
+/* 0xB140 - 0xB1FF */
+ 0x5A3C, 0x5A62, 0x5A5A, 0x5A46, 0x5A4A, 0x5B70, 0x5BC7, 0x5BC5,
+ 0x5BC4, 0x5BC2, 0x5BBF, 0x5BC6, 0x5C09, 0x5C08, 0x5C07, 0x5C60,
+ 0x5C5C, 0x5C5D, 0x5D07, 0x5D06, 0x5D0E, 0x5D1B, 0x5D16, 0x5D22,
+ 0x5D11, 0x5D29, 0x5D14, 0x5D19, 0x5D24, 0x5D27, 0x5D17, 0x5DE2,
+ 0x5E38, 0x5E36, 0x5E33, 0x5E37, 0x5EB7, 0x5EB8, 0x5EB6, 0x5EB5,
+ 0x5EBE, 0x5F35, 0x5F37, 0x5F57, 0x5F6C, 0x5F69, 0x5F6B, 0x5F97,
+ 0x5F99, 0x5F9E, 0x5F98, 0x5FA1, 0x5FA0, 0x5F9C, 0x607F, 0x60A3,
+ 0x6089, 0x60A0, 0x60A8, 0x60CB, 0x60B4, 0x60E6, 0x60BD, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x60C5, 0x60BB, 0x60B5, 0x60DC, 0x60BC, 0x60D8, 0x60D5,
+ 0x60C6, 0x60DF, 0x60B8, 0x60DA, 0x60C7, 0x621A, 0x621B, 0x6248,
+ 0x63A0, 0x63A7, 0x6372, 0x6396, 0x63A2, 0x63A5, 0x6377, 0x6367,
+ 0x6398, 0x63AA, 0x6371, 0x63A9, 0x6389, 0x6383, 0x639B, 0x636B,
+ 0x63A8, 0x6384, 0x6388, 0x6399, 0x63A1, 0x63AC, 0x6392, 0x638F,
+ 0x6380, 0x637B, 0x6369, 0x6368, 0x637A, 0x655D, 0x6556, 0x6551,
+ 0x6559, 0x6557, 0x555F, 0x654F, 0x6558, 0x6555, 0x6554, 0x659C,
+ 0x659B, 0x65AC, 0x65CF, 0x65CB, 0x65CC, 0x65CE, 0x665D, 0x665A,
+ 0x6664, 0x6668, 0x6666, 0x665E, 0x66F9, 0x52D7, 0x671B, 0x6881,
+ 0x68AF, 0x68A2, 0x6893, 0x68B5, 0x687F, 0x6876, 0x68B1, 0x68A7,
+ 0x6897, 0x68B0, 0x6883, 0x68C4, 0x68AD, 0x6886, 0x6885, 0x6894,
+ 0x689D, 0x68A8, 0x689F, 0x68A1, 0x6882, 0x6B32, 0x6BBA, ALTCHR,
+/* 0xB240 - 0xB2FF */
+ 0x6BEB, 0x6BEC, 0x6C2B, 0x6D8E, 0x6DBC, 0x6DF3, 0x6DD9, 0x6DB2,
+ 0x6DE1, 0x6DCC, 0x6DE4, 0x6DFB, 0x6DFA, 0x6E05, 0x6DC7, 0x6DCB,
+ 0x6DAF, 0x6DD1, 0x6DAE, 0x6DDE, 0x6DF9, 0x6DB8, 0x6DF7, 0x6DF5,
+ 0x6DC5, 0x6DD2, 0x6E1A, 0x6DB5, 0x6DDA, 0x6DEB, 0x6DD8, 0x6DEA,
+ 0x6DF1, 0x6DEE, 0x6DE8, 0x6DC6, 0x6DC4, 0x6DAA, 0x6DEC, 0x6DBF,
+ 0x6DE6, 0x70F9, 0x7109, 0x710A, 0x70FD, 0x70EF, 0x723D, 0x727D,
+ 0x7281, 0x731C, 0x731B, 0x7316, 0x7313, 0x7319, 0x7387, 0x7405,
+ 0x740A, 0x7403, 0x7406, 0x73FE, 0x740D, 0x74E0, 0x74F6, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x74F7, 0x751C, 0x7522, 0x7565, 0x7566, 0x7562, 0x7570,
+ 0x758F, 0x75D4, 0x75D5, 0x75B5, 0x75CA, 0x75CD, 0x768E, 0x76D4,
+ 0x76D2, 0x76DB, 0x7737, 0x773E, 0x773C, 0x7736, 0x7738, 0x773A,
+ 0x786B, 0x7843, 0x784E, 0x7965, 0x7968, 0x796D, 0x79FB, 0x7A92,
+ 0x7A95, 0x7B20, 0x7B28, 0x7B1B, 0x7B2C, 0x7B26, 0x7B19, 0x7B1E,
+ 0x7B2E, 0x7C92, 0x7C97, 0x7C95, 0x7D46, 0x7D43, 0x7D71, 0x7D2E,
+ 0x7D39, 0x7D3C, 0x7D40, 0x7D30, 0x7D33, 0x7D44, 0x7D2F, 0x7D42,
+ 0x7D32, 0x7D31, 0x7F3D, 0x7F9E, 0x7F9A, 0x7FCC, 0x7FCE, 0x7FD2,
+ 0x801C, 0x804A, 0x8046, 0x812F, 0x8116, 0x8123, 0x812B, 0x8129,
+ 0x8130, 0x8124, 0x8202, 0x8235, 0x8237, 0x8236, 0x8239, 0x838E,
+ 0x839E, 0x8398, 0x8378, 0x83A2, 0x8396, 0x83BD, 0x83AB, 0x8392,
+ 0x838A, 0x8393, 0x8389, 0x83A0, 0x8377, 0x837B, 0x837C, ALTCHR,
+/* 0xB340 - 0xB3FF */
+ 0x8386, 0x83A7, 0x8655, 0x5F6A, 0x86C7, 0x86C0, 0x86B6, 0x86C4,
+ 0x86B5, 0x86C6, 0x86CB, 0x86B1, 0x86AF, 0x86C9, 0x8853, 0x889E,
+ 0x8888, 0x88AB, 0x8892, 0x8896, 0x888D, 0x888B, 0x8993, 0x898F,
+ 0x8A2A, 0x8A1D, 0x8A23, 0x8A25, 0x8A31, 0x8A2D, 0x8A1F, 0x8A1B,
+ 0x8A22, 0x8C49, 0x8C5A, 0x8CA9, 0x8CAC, 0x8CAB, 0x8CA8, 0x8CAA,
+ 0x8CA7, 0x8D67, 0x8D66, 0x8DBE, 0x8DBA, 0x8EDB, 0x8EDF, 0x9019,
+ 0x900D, 0x901A, 0x9017, 0x9023, 0x901F, 0x901D, 0x9010, 0x9015,
+ 0x901E, 0x9020, 0x900F, 0x9022, 0x9016, 0x901B, 0x9014, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x90E8, 0x90ED, 0x90FD, 0x9157, 0x91CE, 0x91F5, 0x91E6,
+ 0x91E3, 0x91E7, 0x91ED, 0x91E9, 0x9589, 0x966A, 0x9675, 0x9673,
+ 0x9678, 0x9670, 0x9674, 0x9676, 0x9677, 0x966C, 0x96C0, 0x96EA,
+ 0x96E9, 0x7AE0, 0x7ADF, 0x9802, 0x9803, 0x9B5A, 0x9CE5, 0x9E75,
+ 0x9E7F, 0x9EA5, 0x9EBB, 0x50A2, 0x508D, 0x5085, 0x5099, 0x5091,
+ 0x5080, 0x5096, 0x5098, 0x509A, 0x6700, 0x51F1, 0x5272, 0x5274,
+ 0x5275, 0x5269, 0x52DE, 0x52DD, 0x52DB, 0x535A, 0x53A5, 0x557B,
+ 0x5580, 0x55A7, 0x557C, 0x558A, 0x559D, 0x5598, 0x5582, 0x559C,
+ 0x55AA, 0x5594, 0x5587, 0x558B, 0x5583, 0x55B3, 0x55AE, 0x559F,
+ 0x553E, 0x55B2, 0x559A, 0x55BB, 0x55AC, 0x55B1, 0x557E, 0x5589,
+ 0x55AB, 0x5599, 0x570D, 0x582F, 0x582A, 0x5834, 0x5824, 0x5830,
+ 0x5831, 0x5821, 0x581D, 0x5820, 0x58F9, 0x58FA, 0x5960, ALTCHR,
+/* 0xB440 - 0xB4FF */
+ 0x5A77, 0x5A9A, 0x5A7F, 0x5A92, 0x5A9B, 0x5AA7, 0x5B73, 0x5B71,
+ 0x5BD2, 0x5BCC, 0x5BD3, 0x5BD0, 0x5C0A, 0x5C0B, 0x5C31, 0x5D4C,
+ 0x5D50, 0x5D34, 0x5D47, 0x5DFD, 0x5E45, 0x5E3D, 0x5E40, 0x5E43,
+ 0x5E7E, 0x5ECA, 0x5EC1, 0x5EC2, 0x5EC4, 0x5F3C, 0x5F6D, 0x5FA9,
+ 0x5FAA, 0x5FA8, 0x60D1, 0x60E1, 0x60B2, 0x60B6, 0x60E0, 0x611C,
+ 0x6123, 0x60FA, 0x6115, 0x60F0, 0x60FB, 0x60F4, 0x6168, 0x60F1,
+ 0x610E, 0x60F6, 0x6109, 0x6100, 0x6112, 0x621F, 0x6249, 0x63A3,
+ 0x638C, 0x63CF, 0x63C0, 0x63E9, 0x63C9, 0x63C6, 0x63CD, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x63D2, 0x63E3, 0x63D0, 0x63E1, 0x63D6, 0x63ED, 0x63EE,
+ 0x6376, 0x63F4, 0x63EA, 0x63DB, 0x6452, 0x63DA, 0x63F9, 0x655E,
+ 0x6566, 0x6562, 0x6563, 0x6591, 0x6590, 0x65AF, 0x666E, 0x6670,
+ 0x6674, 0x6676, 0x666F, 0x6691, 0x667A, 0x667E, 0x6677, 0x66FE,
+ 0x66FF, 0x671F, 0x671D, 0x68FA, 0x68D5, 0x68E0, 0x68D8, 0x68D7,
+ 0x6905, 0x68DF, 0x68F5, 0x68EE, 0x68E7, 0x68F9, 0x68D2, 0x68F2,
+ 0x68E3, 0x68CB, 0x68CD, 0x690D, 0x6912, 0x690E, 0x68C9, 0x68DA,
+ 0x696E, 0x68FB, 0x6B3E, 0x6B3A, 0x6B3D, 0x6B98, 0x6B96, 0x6BBC,
+ 0x6BEF, 0x6C2E, 0x6C2F, 0x6C2C, 0x6E2F, 0x6E38, 0x6E54, 0x6E21,
+ 0x6E32, 0x6E67, 0x6E4A, 0x6E20, 0x6E25, 0x6E23, 0x6E1B, 0x6E5B,
+ 0x6E58, 0x6E24, 0x6E56, 0x6E6E, 0x6E2D, 0x6E26, 0x6E6F, 0x6E34,
+ 0x6E4D, 0x6E3A, 0x6E2C, 0x6E43, 0x6E1D, 0x6E3E, 0x6ECB, ALTCHR,
+/* 0xB540 - 0xB5FF */
+ 0x6E89, 0x6E19, 0x6E4E, 0x6E63, 0x6E44, 0x6E72, 0x6E69, 0x6E5F,
+ 0x7119, 0x711A, 0x7126, 0x7130, 0x7121, 0x7136, 0x716E, 0x711C,
+ 0x724C, 0x7284, 0x7280, 0x7336, 0x7325, 0x7334, 0x7329, 0x743A,
+ 0x742A, 0x7433, 0x7422, 0x7425, 0x7435, 0x7436, 0x7434, 0x742F,
+ 0x741B, 0x7426, 0x7428, 0x7525, 0x7526, 0x756B, 0x756A, 0x75E2,
+ 0x75DB, 0x75E3, 0x75D9, 0x75D8, 0x75DE, 0x75E0, 0x767B, 0x767C,
+ 0x7696, 0x7693, 0x76B4, 0x76DC, 0x774F, 0x77ED, 0x785D, 0x786C,
+ 0x786F, 0x7A0D, 0x7A08, 0x7A0B, 0x7A05, 0x7A00, 0x7A98, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7A97, 0x7A96, 0x7AE5, 0x7AE3, 0x7B49, 0x7B56, 0x7B46,
+ 0x7B50, 0x7B52, 0x7B54, 0x7B4D, 0x7B4B, 0x7B4F, 0x7B51, 0x7C9F,
+ 0x7CA5, 0x7D5E, 0x7D50, 0x7D68, 0x7D55, 0x7D2B, 0x7D6E, 0x7D72,
+ 0x7D61, 0x7D66, 0x7D62, 0x7D70, 0x7D73, 0x5584, 0x7FD4, 0x7FD5,
+ 0x800B, 0x8052, 0x8085, 0x8155, 0x8154, 0x814B, 0x8151, 0x814E,
+ 0x8139, 0x8146, 0x813E, 0x814C, 0x8153, 0x8174, 0x8212, 0x821C,
+ 0x83E9, 0x8403, 0x83F8, 0x840D, 0x83E0, 0x83C5, 0x840B, 0x83C1,
+ 0x83EF, 0x83F1, 0x83F4, 0x8457, 0x840A, 0x83F0, 0x840C, 0x83CC,
+ 0x83FD, 0x83F2, 0x83CA, 0x8438, 0x840E, 0x8404, 0x83DC, 0x8407,
+ 0x83D4, 0x83DF, 0x865B, 0x86DF, 0x86D9, 0x86ED, 0x86D4, 0x86DB,
+ 0x86E4, 0x86D0, 0x86DE, 0x8857, 0x88C1, 0x88C2, 0x88B1, 0x8983,
+ 0x8996, 0x8A3B, 0x8A60, 0x8A55, 0x8A5E, 0x8A3C, 0x8A41, ALTCHR,
+/* 0xB640 - 0xB6FF */
+ 0x8A54, 0x8A5B, 0x8A50, 0x8A46, 0x8A34, 0x8A3A, 0x8A36, 0x8A56,
+ 0x8C61, 0x8C82, 0x8CAF, 0x8CBC, 0x8CB3, 0x8CBD, 0x8CC1, 0x8CBB,
+ 0x8CC0, 0x8CB4, 0x8CB7, 0x8CB6, 0x8CBF, 0x8CB8, 0x8D8A, 0x8D85,
+ 0x8D81, 0x8DCE, 0x8DDD, 0x8DCB, 0x8DDA, 0x8DD1, 0x8DCC, 0x8DDB,
+ 0x8DC6, 0x8EFB, 0x8EF8, 0x8EFC, 0x8F9C, 0x902E, 0x9035, 0x9031,
+ 0x9038, 0x9032, 0x9036, 0x9102, 0x90F5, 0x9109, 0x90FE, 0x9163,
+ 0x9165, 0x91CF, 0x9214, 0x9215, 0x9223, 0x9209, 0x921E, 0x920D,
+ 0x9210, 0x9207, 0x9211, 0x9594, 0x958F, 0x958B, 0x9591, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9593, 0x9592, 0x958E, 0x968A, 0x968E, 0x968B, 0x967D,
+ 0x9685, 0x9686, 0x968D, 0x9672, 0x9684, 0x96C1, 0x96C5, 0x96C4,
+ 0x96C6, 0x96C7, 0x96EF, 0x96F2, 0x97CC, 0x9805, 0x9806, 0x9808,
+ 0x98E7, 0x98EA, 0x98EF, 0x98E9, 0x98F2, 0x98ED, 0x99AE, 0x99AD,
+ 0x9EC3, 0x9ECD, 0x9ED1, 0x4E82, 0x50AD, 0x50B5, 0x50B2, 0x50B3,
+ 0x50C5, 0x50BE, 0x50AC, 0x50B7, 0x50BB, 0x50AF, 0x50C7, 0x527F,
+ 0x5277, 0x527D, 0x52DF, 0x52E6, 0x52E4, 0x52E2, 0x52E3, 0x532F,
+ 0x55DF, 0x55E8, 0x55D3, 0x55E6, 0x55CE, 0x55DC, 0x55C7, 0x55D1,
+ 0x55E3, 0x55E4, 0x55EF, 0x55DA, 0x55E1, 0x55C5, 0x55C6, 0x55E5,
+ 0x55C9, 0x5712, 0x5713, 0x585E, 0x5851, 0x5858, 0x5857, 0x585A,
+ 0x5854, 0x586B, 0x584C, 0x586D, 0x584A, 0x5862, 0x5852, 0x584B,
+ 0x5967, 0x5AC1, 0x5AC9, 0x5ACC, 0x5ABE, 0x5ABD, 0x5ABC, ALTCHR,
+/* 0xB740 - 0xB7FF */
+ 0x5AB3, 0x5AC2, 0x5AB2, 0x5D69, 0x5D6F, 0x5E4C, 0x5E79, 0x5EC9,
+ 0x5EC8, 0x5F12, 0x5F59, 0x5FAC, 0x5FAE, 0x611A, 0x610F, 0x6148,
+ 0x611F, 0x60F3, 0x611B, 0x60F9, 0x6101, 0x6108, 0x614E, 0x614C,
+ 0x6144, 0x614D, 0x613E, 0x6134, 0x6127, 0x610D, 0x6106, 0x6137,
+ 0x6221, 0x6222, 0x6413, 0x643E, 0x641E, 0x642A, 0x642D, 0x643D,
+ 0x642C, 0x640F, 0x641C, 0x6414, 0x640D, 0x6436, 0x6416, 0x6417,
+ 0x6406, 0x656C, 0x659F, 0x65B0, 0x6697, 0x6689, 0x6687, 0x6688,
+ 0x6696, 0x6684, 0x6698, 0x668D, 0x6703, 0x6994, 0x696D, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x695A, 0x6977, 0x6960, 0x6954, 0x6975, 0x6930, 0x6982,
+ 0x694A, 0x6968, 0x696B, 0x695E, 0x6953, 0x6979, 0x6986, 0x695D,
+ 0x6963, 0x695B, 0x6B47, 0x6B72, 0x6BC0, 0x6BBF, 0x6BD3, 0x6BFD,
+ 0x6EA2, 0x6EAF, 0x6ED3, 0x6EB6, 0x6EC2, 0x6E90, 0x6E9D, 0x6EC7,
+ 0x6EC5, 0x6EA5, 0x6E98, 0x6EBC, 0x6EBA, 0x6EAB, 0x6ED1, 0x6E96,
+ 0x6E9C, 0x6EC4, 0x6ED4, 0x6EAA, 0x6EA7, 0x6EB4, 0x714E, 0x7159,
+ 0x7169, 0x7164, 0x7149, 0x7167, 0x715C, 0x716C, 0x7166, 0x714C,
+ 0x7165, 0x715E, 0x7146, 0x7168, 0x7156, 0x723A, 0x7252, 0x7337,
+ 0x7345, 0x733F, 0x733E, 0x746F, 0x745A, 0x7455, 0x745F, 0x745E,
+ 0x7441, 0x743F, 0x7459, 0x745B, 0x745C, 0x7576, 0x7578, 0x7600,
+ 0x75F0, 0x7601, 0x75F2, 0x75F1, 0x75FA, 0x75FF, 0x75F4, 0x75F3,
+ 0x76DE, 0x76DF, 0x775B, 0x776B, 0x7766, 0x775E, 0x7763, ALTCHR,
+/* 0xB840 - 0xB8FF */
+ 0x7779, 0x776A, 0x776C, 0x775C, 0x7765, 0x7768, 0x7762, 0x77EE,
+ 0x788E, 0x78B0, 0x7897, 0x7898, 0x788C, 0x7889, 0x787C, 0x7891,
+ 0x7893, 0x787F, 0x797A, 0x797F, 0x7981, 0x842C, 0x79BD, 0x7A1C,
+ 0x7A1A, 0x7A20, 0x7A14, 0x7A1F, 0x7A1E, 0x7A9F, 0x7AA0, 0x7B77,
+ 0x7BC0, 0x7B60, 0x7B6E, 0x7B67, 0x7CB1, 0x7CB3, 0x7CB5, 0x7D93,
+ 0x7D79, 0x7D91, 0x7D81, 0x7D8F, 0x7D5B, 0x7F6E, 0x7F69, 0x7F6A,
+ 0x7F72, 0x7FA9, 0x7FA8, 0x7FA4, 0x8056, 0x8058, 0x8086, 0x8084,
+ 0x8171, 0x8170, 0x8178, 0x8165, 0x816E, 0x8173, 0x816B, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8179, 0x817A, 0x8166, 0x8205, 0x8247, 0x8482, 0x8477,
+ 0x843D, 0x8431, 0x8475, 0x8466, 0x846B, 0x8449, 0x846C, 0x845B,
+ 0x843C, 0x8435, 0x8461, 0x8463, 0x8469, 0x846D, 0x8446, 0x865E,
+ 0x865C, 0x865F, 0x86F9, 0x8713, 0x8708, 0x8707, 0x8700, 0x86FE,
+ 0x86FB, 0x8702, 0x8703, 0x8706, 0x870A, 0x8859, 0x88DF, 0x88D4,
+ 0x88D9, 0x88DC, 0x88D8, 0x88DD, 0x88E1, 0x88CA, 0x88D5, 0x88D2,
+ 0x899C, 0x89E3, 0x8A6B, 0x8A72, 0x8A73, 0x8A66, 0x8A69, 0x8A70,
+ 0x8A87, 0x8A7C, 0x8A63, 0x8AA0, 0x8A71, 0x8A85, 0x8A6D, 0x8A62,
+ 0x8A6E, 0x8A6C, 0x8A79, 0x8A7B, 0x8A3E, 0x8A68, 0x8C62, 0x8C8A,
+ 0x8C89, 0x8CCA, 0x8CC7, 0x8CC8, 0x8CC4, 0x8CB2, 0x8CC3, 0x8CC2,
+ 0x8CC5, 0x8DE1, 0x8DDF, 0x8DE8, 0x8DEF, 0x8DF3, 0x8DFA, 0x8DEA,
+ 0x8DE4, 0x8DE6, 0x8EB2, 0x8F03, 0x8F09, 0x8EFE, 0x8F0A, ALTCHR,
+/* 0xB940 - 0xB9FF */
+ 0x8F9F, 0x8FB2, 0x904B, 0x904A, 0x9053, 0x9042, 0x9054, 0x903C,
+ 0x9055, 0x9050, 0x9047, 0x904F, 0x904E, 0x904D, 0x9051, 0x903E,
+ 0x9041, 0x9112, 0x9117, 0x916C, 0x916A, 0x9169, 0x91C9, 0x9237,
+ 0x9257, 0x9238, 0x923D, 0x9240, 0x923E, 0x925B, 0x924B, 0x9264,
+ 0x9251, 0x9234, 0x9249, 0x924D, 0x9245, 0x9239, 0x923F, 0x925A,
+ 0x9598, 0x9698, 0x9694, 0x9695, 0x96CD, 0x96CB, 0x96C9, 0x96CA,
+ 0x96F7, 0x96FB, 0x96F9, 0x96F6, 0x9756, 0x9774, 0x9776, 0x9810,
+ 0x9811, 0x9813, 0x980A, 0x9812, 0x980C, 0x98FC, 0x98F4, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x98FD, 0x98FE, 0x99B3, 0x99B1, 0x99B4, 0x9AE1, 0x9CE9,
+ 0x9E82, 0x9F0E, 0x9F13, 0x9F20, 0x50E7, 0x50EE, 0x50E5, 0x50D6,
+ 0x50ED, 0x50DA, 0x50D5, 0x50CF, 0x50D1, 0x50F1, 0x50CE, 0x50E9,
+ 0x5162, 0x51F3, 0x5283, 0x5282, 0x5331, 0x53AD, 0x55FE, 0x5600,
+ 0x561B, 0x5617, 0x55FD, 0x5614, 0x5606, 0x5609, 0x560D, 0x560E,
+ 0x55F7, 0x5616, 0x561F, 0x5608, 0x5610, 0x55F6, 0x5718, 0x5716,
+ 0x5875, 0x587E, 0x5883, 0x5893, 0x588A, 0x5879, 0x5885, 0x587D,
+ 0x58FD, 0x5925, 0x5922, 0x5924, 0x596A, 0x5969, 0x5AE1, 0x5AE6,
+ 0x5AE9, 0x5AD7, 0x5AD6, 0x5AD8, 0x5AE3, 0x5B75, 0x5BDE, 0x5BE7,
+ 0x5BE1, 0x5BE5, 0x5BE6, 0x5BE8, 0x5BE2, 0x5BE4, 0x5BDF, 0x5C0D,
+ 0x5C62, 0x5D84, 0x5D87, 0x5E5B, 0x5E63, 0x5E55, 0x5E57, 0x5E54,
+ 0x5ED3, 0x5ED6, 0x5F0A, 0x5F46, 0x5F70, 0x5FB9, 0x6147, ALTCHR,
+/* 0xBA40 - 0xBAFF */
+ 0x613F, 0x614B, 0x6177, 0x6162, 0x6163, 0x615F, 0x615A, 0x6158,
+ 0x6175, 0x622A, 0x6487, 0x6458, 0x6454, 0x64A4, 0x6478, 0x645F,
+ 0x647A, 0x6451, 0x6467, 0x6434, 0x646D, 0x647B, 0x6572, 0x65A1,
+ 0x65D7, 0x65D6, 0x66A2, 0x66A8, 0x669D, 0x699C, 0x69A8, 0x6995,
+ 0x69C1, 0x69AE, 0x69D3, 0x69CB, 0x699B, 0x69B7, 0x69BB, 0x69AB,
+ 0x69B4, 0x69D0, 0x69CD, 0x69AD, 0x69CC, 0x69A6, 0x69C3, 0x69A3,
+ 0x6B49, 0x6B4C, 0x6C33, 0x6F33, 0x6F14, 0x6EFE, 0x6F13, 0x6EF4,
+ 0x6F29, 0x6F3E, 0x6F20, 0x6F2C, 0x6F0F, 0x6F02, 0x6F22, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6EFF, 0x6EEF, 0x6F06, 0x6F31, 0x6F38, 0x6F32, 0x6F23,
+ 0x6F15, 0x6F2B, 0x6F2F, 0x6F88, 0x6F2A, 0x6EEC, 0x6F01, 0x6EF2,
+ 0x6ECC, 0x6EF7, 0x7194, 0x7199, 0x717D, 0x718A, 0x7184, 0x7192,
+ 0x723E, 0x7292, 0x7296, 0x7344, 0x7350, 0x7464, 0x7463, 0x746A,
+ 0x7470, 0x746D, 0x7504, 0x7591, 0x7627, 0x760D, 0x760B, 0x7609,
+ 0x7613, 0x76E1, 0x76E3, 0x7784, 0x777D, 0x777F, 0x7761, 0x78C1,
+ 0x789F, 0x78A7, 0x78B3, 0x78A9, 0x78A3, 0x798E, 0x798F, 0x798D,
+ 0x7A2E, 0x7A31, 0x7AAA, 0x7AA9, 0x7AED, 0x7AEF, 0x7BA1, 0x7B95,
+ 0x7B8B, 0x7B75, 0x7B97, 0x7B9D, 0x7B94, 0x7B8F, 0x7BB8, 0x7B87,
+ 0x7B84, 0x7CB9, 0x7CBD, 0x7CBE, 0x7DBB, 0x7DB0, 0x7D9C, 0x7DBD,
+ 0x7DBE, 0x7DA0, 0x7DCA, 0x7DB4, 0x7DB2, 0x7DB1, 0x7DBA, 0x7DA2,
+ 0x7DBF, 0x7DB5, 0x7DB8, 0x7DAD, 0x7DD2, 0x7DC7, 0x7DAC, ALTCHR,
+/* 0xBB40 - 0xBBFF */
+ 0x7F70, 0x7FE0, 0x7FE1, 0x7FDF, 0x805E, 0x805A, 0x8087, 0x8150,
+ 0x8180, 0x818F, 0x8188, 0x818A, 0x817F, 0x8182, 0x81E7, 0x81FA,
+ 0x8207, 0x8214, 0x821E, 0x824B, 0x84C9, 0x84BF, 0x84C6, 0x84C4,
+ 0x8499, 0x849E, 0x84B2, 0x849C, 0x84CB, 0x84B8, 0x84C0, 0x84D3,
+ 0x8490, 0x84BC, 0x84D1, 0x84CA, 0x873F, 0x871C, 0x873B, 0x8722,
+ 0x8725, 0x8734, 0x8718, 0x8755, 0x8737, 0x8729, 0x88F3, 0x8902,
+ 0x88F4, 0x88F9, 0x88F8, 0x88FD, 0x88E8, 0x891A, 0x88EF, 0x8AA6,
+ 0x8A8C, 0x8A9E, 0x8AA3, 0x8A8D, 0x8AA1, 0x8A93, 0x8AA4, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8AAA, 0x8AA5, 0x8AA8, 0x8A98, 0x8A91, 0x8A9A, 0x8AA7,
+ 0x8C6A, 0x8C8D, 0x8C8C, 0x8CD3, 0x8CD1, 0x8CD2, 0x8D6B, 0x8D99,
+ 0x8D95, 0x8DFC, 0x8F14, 0x8F12, 0x8F15, 0x8F13, 0x8FA3, 0x9060,
+ 0x9058, 0x905C, 0x9063, 0x9059, 0x905E, 0x9062, 0x905D, 0x905B,
+ 0x9119, 0x9118, 0x911E, 0x9175, 0x9178, 0x9177, 0x9174, 0x9278,
+ 0x9280, 0x9285, 0x9298, 0x9296, 0x927B, 0x9293, 0x929C, 0x92A8,
+ 0x927C, 0x9291, 0x95A1, 0x95A8, 0x95A9, 0x95A3, 0x95A5, 0x95A4,
+ 0x9699, 0x969C, 0x969B, 0x96CC, 0x96D2, 0x9700, 0x977C, 0x9785,
+ 0x97F6, 0x9817, 0x9818, 0x98AF, 0x98B1, 0x9903, 0x9905, 0x990C,
+ 0x9909, 0x99C1, 0x9AAF, 0x9AB0, 0x9AE6, 0x9B41, 0x9B42, 0x9CF4,
+ 0x9CF6, 0x9CF3, 0x9EBC, 0x9F3B, 0x9F4A, 0x5104, 0x5100, 0x50FB,
+ 0x50F5, 0x50F9, 0x5102, 0x5108, 0x5109, 0x5105, 0x51DC, ALTCHR,
+/* 0xBC40 - 0xBCFF */
+ 0x5287, 0x5288, 0x5289, 0x528D, 0x528A, 0x52F0, 0x53B2, 0x562E,
+ 0x563B, 0x5639, 0x5632, 0x563F, 0x5634, 0x5629, 0x5653, 0x564E,
+ 0x5657, 0x5674, 0x5636, 0x562F, 0x5630, 0x5880, 0x589F, 0x589E,
+ 0x58B3, 0x589C, 0x58AE, 0x58A9, 0x58A6, 0x596D, 0x5B09, 0x5AFB,
+ 0x5B0B, 0x5AF5, 0x5B0C, 0x5B08, 0x5BEE, 0x5BEC, 0x5BE9, 0x5BEB,
+ 0x5C64, 0x5C65, 0x5D9D, 0x5D94, 0x5E62, 0x5E5F, 0x5E61, 0x5EE2,
+ 0x5EDA, 0x5EDF, 0x5EDD, 0x5EE3, 0x5EE0, 0x5F48, 0x5F71, 0x5FB7,
+ 0x5FB5, 0x6176, 0x6167, 0x616E, 0x615D, 0x6155, 0x6182, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x617C, 0x6170, 0x616B, 0x617E, 0x61A7, 0x6190, 0x61AB,
+ 0x618E, 0x61AC, 0x619A, 0x61A4, 0x6194, 0x61AE, 0x622E, 0x6469,
+ 0x646F, 0x6479, 0x649E, 0x64B2, 0x6488, 0x6490, 0x64B0, 0x64A5,
+ 0x6493, 0x6495, 0x64A9, 0x6492, 0x64AE, 0x64AD, 0x64AB, 0x649A,
+ 0x64AC, 0x6499, 0x64A2, 0x64B3, 0x6575, 0x6577, 0x6578, 0x66AE,
+ 0x66AB, 0x66B4, 0x66B1, 0x6A23, 0x6A1F, 0x69E8, 0x6A01, 0x6A1E,
+ 0x6A19, 0x69FD, 0x6A21, 0x6A13, 0x6A0A, 0x69F3, 0x6A02, 0x6A05,
+ 0x69ED, 0x6A11, 0x6B50, 0x6B4E, 0x6BA4, 0x6BC5, 0x6BC6, 0x6F3F,
+ 0x6F7C, 0x6F84, 0x6F51, 0x6F66, 0x6F54, 0x6F86, 0x6F6D, 0x6F5B,
+ 0x6F78, 0x6F6E, 0x6F8E, 0x6F7A, 0x6F70, 0x6F64, 0x6F97, 0x6F58,
+ 0x6ED5, 0x6F6F, 0x6F60, 0x6F5F, 0x719F, 0x71AC, 0x71B1, 0x71A8,
+ 0x7256, 0x729B, 0x734E, 0x7357, 0x7469, 0x748B, 0x7483, ALTCHR,
+/* 0xBD40 - 0xBDFF */
+ 0x747E, 0x7480, 0x757F, 0x7620, 0x7629, 0x761F, 0x7624, 0x7626,
+ 0x7621, 0x7622, 0x769A, 0x76BA, 0x76E4, 0x778E, 0x7787, 0x778C,
+ 0x7791, 0x778B, 0x78CB, 0x78C5, 0x78BA, 0x78CA, 0x78BE, 0x78D5,
+ 0x78BC, 0x78D0, 0x7A3F, 0x7A3C, 0x7A40, 0x7A3D, 0x7A37, 0x7A3B,
+ 0x7AAF, 0x7AAE, 0x7BAD, 0x7BB1, 0x7BC4, 0x7BB4, 0x7BC6, 0x7BC7,
+ 0x7BC1, 0x7BA0, 0x7BCC, 0x7CCA, 0x7DE0, 0x7DF4, 0x7DEF, 0x7DFB,
+ 0x7DD8, 0x7DEC, 0x7DDD, 0x7DE8, 0x7DE3, 0x7DDA, 0x7DDE, 0x7DE9,
+ 0x7D9E, 0x7DD9, 0x7DF2, 0x7DF9, 0x7F75, 0x7F77, 0x7FAF, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7FE9, 0x8026, 0x819B, 0x819C, 0x819D, 0x81A0, 0x819A,
+ 0x8198, 0x8517, 0x853D, 0x851A, 0x84EE, 0x852C, 0x852D, 0x8513,
+ 0x8511, 0x8523, 0x8521, 0x8514, 0x84EC, 0x8525, 0x84FF, 0x8506,
+ 0x8782, 0x8774, 0x8776, 0x8760, 0x8766, 0x8778, 0x8768, 0x8759,
+ 0x8757, 0x874C, 0x8753, 0x885B, 0x885D, 0x8910, 0x8907, 0x8912,
+ 0x8913, 0x8915, 0x890A, 0x8ABC, 0x8AD2, 0x8AC7, 0x8AC4, 0x8A95,
+ 0x8ACB, 0x8AF8, 0x8AB2, 0x8AC9, 0x8AC2, 0x8ABF, 0x8AB0, 0x8AD6,
+ 0x8ACD, 0x8AB6, 0x8AB9, 0x8ADB, 0x8C4C, 0x8C4E, 0x8C6C, 0x8CE0,
+ 0x8CDE, 0x8CE6, 0x8CE4, 0x8CEC, 0x8CED, 0x8CE2, 0x8CE3, 0x8CDC,
+ 0x8CEA, 0x8CE1, 0x8D6D, 0x8D9F, 0x8DA3, 0x8E2B, 0x8E10, 0x8E1D,
+ 0x8E22, 0x8E0F, 0x8E29, 0x8E1F, 0x8E21, 0x8E1E, 0x8EBA, 0x8F1D,
+ 0x8F1B, 0x8F1F, 0x8F29, 0x8F26, 0x8F2A, 0x8F1C, 0x8F1E, ALTCHR,
+/* 0xBE40 - 0xBEFF */
+ 0x8F25, 0x9069, 0x906E, 0x9068, 0x906D, 0x9077, 0x9130, 0x912D,
+ 0x9127, 0x9131, 0x9187, 0x9189, 0x918B, 0x9183, 0x92C5, 0x92BB,
+ 0x92B7, 0x92EA, 0x92AC, 0x92E4, 0x92C1, 0x92B3, 0x92BC, 0x92D2,
+ 0x92C7, 0x92F0, 0x92B2, 0x95AD, 0x95B1, 0x9704, 0x9706, 0x9707,
+ 0x9709, 0x9760, 0x978D, 0x978B, 0x978F, 0x9821, 0x982B, 0x981C,
+ 0x98B3, 0x990A, 0x9913, 0x9912, 0x9918, 0x99DD, 0x99D0, 0x99DF,
+ 0x99DB, 0x99D1, 0x99D5, 0x99D2, 0x99D9, 0x9AB7, 0x9AEE, 0x9AEF,
+ 0x9B27, 0x9B45, 0x9B44, 0x9B77, 0x9B6F, 0x9D06, 0x9D09, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9D03, 0x9EA9, 0x9EBE, 0x9ECE, 0x58A8, 0x9F52, 0x5112,
+ 0x5118, 0x5114, 0x5110, 0x5115, 0x5180, 0x51AA, 0x51DD, 0x5291,
+ 0x5293, 0x52F3, 0x5659, 0x566B, 0x5679, 0x5669, 0x5664, 0x5678,
+ 0x566A, 0x5668, 0x5665, 0x5671, 0x566F, 0x566C, 0x5662, 0x5676,
+ 0x58C1, 0x58BE, 0x58C7, 0x58C5, 0x596E, 0x5B1D, 0x5B34, 0x5B78,
+ 0x5BF0, 0x5C0E, 0x5F4A, 0x61B2, 0x6191, 0x61A9, 0x618A, 0x61CD,
+ 0x61B6, 0x61BE, 0x61CA, 0x61C8, 0x6230, 0x64C5, 0x64C1, 0x64CB,
+ 0x64BB, 0x64BC, 0x64DA, 0x64C4, 0x64C7, 0x64C2, 0x64CD, 0x64BF,
+ 0x64D2, 0x64D4, 0x64BE, 0x6574, 0x66C6, 0x66C9, 0x66B9, 0x66C4,
+ 0x66C7, 0x66B8, 0x6A3D, 0x6A38, 0x6A3A, 0x6A59, 0x6A6B, 0x6A58,
+ 0x6A39, 0x6A44, 0x6A62, 0x6A61, 0x6A4B, 0x6A47, 0x6A35, 0x6A5F,
+ 0x6A48, 0x6B59, 0x6B77, 0x6C05, 0x6FC2, 0x6FB1, 0x6FA1, ALTCHR,
+/* 0xBF40 - 0xBFFF */
+ 0x6FC3, 0x6FA4, 0x6FC1, 0x6FA7, 0x6FB3, 0x6FC0, 0x6FB9, 0x6FB6,
+ 0x6FA6, 0x6FA0, 0x6FB4, 0x71BE, 0x71C9, 0x71D0, 0x71D2, 0x71C8,
+ 0x71D5, 0x71B9, 0x71CE, 0x71D9, 0x71DC, 0x71C3, 0x71C4, 0x7368,
+ 0x749C, 0x74A3, 0x7498, 0x749F, 0x749E, 0x74E2, 0x750C, 0x750D,
+ 0x7634, 0x7638, 0x763A, 0x76E7, 0x76E5, 0x77A0, 0x779E, 0x779F,
+ 0x77A5, 0x78E8, 0x78DA, 0x78EC, 0x78E7, 0x79A6, 0x7A4D, 0x7A4E,
+ 0x7A46, 0x7A4C, 0x7A4B, 0x7ABA, 0x7BD9, 0x7C11, 0x7BC9, 0x7BE4,
+ 0x7BDB, 0x7BE1, 0x7BE9, 0x7BE6, 0x7CD5, 0x7CD6, 0x7E0A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7E11, 0x7E08, 0x7E1B, 0x7E23, 0x7E1E, 0x7E1D, 0x7E09,
+ 0x7E10, 0x7F79, 0x7FB2, 0x7FF0, 0x7FF1, 0x7FEE, 0x8028, 0x81B3,
+ 0x81A9, 0x81A8, 0x81FB, 0x8208, 0x8258, 0x8259, 0x854A, 0x8559,
+ 0x8548, 0x8568, 0x8569, 0x8543, 0x8549, 0x856D, 0x856A, 0x855E,
+ 0x8783, 0x879F, 0x879E, 0x87A2, 0x878D, 0x8861, 0x892A, 0x8932,
+ 0x8925, 0x892B, 0x8921, 0x89AA, 0x89A6, 0x8AE6, 0x8AFA, 0x8AEB,
+ 0x8AF1, 0x8B00, 0x8ADC, 0x8AE7, 0x8AEE, 0x8AFE, 0x8B01, 0x8B02,
+ 0x8AF7, 0x8AED, 0x8AF3, 0x8AF6, 0x8AFC, 0x8C6B, 0x8C6D, 0x8C93,
+ 0x8CF4, 0x8E44, 0x8E31, 0x8E34, 0x8E42, 0x8E39, 0x8E35, 0x8F3B,
+ 0x8F2F, 0x8F38, 0x8F33, 0x8FA8, 0x8FA6, 0x9075, 0x9074, 0x9078,
+ 0x9072, 0x907C, 0x907A, 0x9134, 0x9192, 0x9320, 0x9336, 0x92F8,
+ 0x9333, 0x932F, 0x9322, 0x92FC, 0x932B, 0x9304, 0x931A, ALTCHR,
+/* 0xC040 - 0xC0FF */
+ 0x9310, 0x9326, 0x9321, 0x9315, 0x932E, 0x9319, 0x95BB, 0x96A7,
+ 0x96A8, 0x96AA, 0x96D5, 0x970E, 0x9711, 0x9716, 0x970D, 0x9713,
+ 0x970F, 0x975B, 0x975C, 0x9766, 0x9798, 0x9830, 0x9838, 0x983B,
+ 0x9837, 0x982D, 0x9839, 0x9824, 0x9910, 0x9928, 0x991E, 0x991B,
+ 0x9921, 0x991A, 0x99ED, 0x99E2, 0x99F1, 0x9AB8, 0x9ABC, 0x9AFB,
+ 0x9AED, 0x9B28, 0x9B91, 0x9D15, 0x9D23, 0x9D26, 0x9D28, 0x9D12,
+ 0x9D1B, 0x9ED8, 0x9ED4, 0x9F8D, 0x9F9C, 0x512A, 0x511F, 0x5121,
+ 0x5132, 0x52F5, 0x568E, 0x5680, 0x5690, 0x5685, 0x5687, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x568F, 0x58D5, 0x58D3, 0x58D1, 0x58CE, 0x5B30, 0x5B2A,
+ 0x5B24, 0x5B7A, 0x5C37, 0x5C68, 0x5DBC, 0x5DBA, 0x5DBD, 0x5DB8,
+ 0x5E6B, 0x5F4C, 0x5FBD, 0x61C9, 0x61C2, 0x61C7, 0x61E6, 0x61CB,
+ 0x6232, 0x6234, 0x64CE, 0x64CA, 0x64D8, 0x64E0, 0x64F0, 0x64E6,
+ 0x64EC, 0x64F1, 0x64E2, 0x64ED, 0x6582, 0x6583, 0x66D9, 0x66D6,
+ 0x6A80, 0x6A94, 0x6A84, 0x6AA2, 0x6A9C, 0x6ADB, 0x6AA3, 0x6A7E,
+ 0x6A97, 0x6A90, 0x6AA0, 0x6B5C, 0x6BAE, 0x6BDA, 0x6C08, 0x6FD8,
+ 0x6FF1, 0x6FDF, 0x6FE0, 0x6FDB, 0x6FE4, 0x6FEB, 0x6FEF, 0x6F80,
+ 0x6FEC, 0x6FE1, 0x6FE9, 0x6FD5, 0x6FEE, 0x6FF0, 0x71E7, 0x71DF,
+ 0x71EE, 0x71E6, 0x71E5, 0x71ED, 0x71EC, 0x71F4, 0x71E0, 0x7235,
+ 0x7246, 0x7370, 0x7372, 0x74A9, 0x74B0, 0x74A6, 0x74A8, 0x7646,
+ 0x7642, 0x764C, 0x76EA, 0x77B3, 0x77AA, 0x77B0, 0x77AC, ALTCHR,
+/* 0xC140 - 0xC1FF */
+ 0x77A7, 0x77AD, 0x77EF, 0x78F7, 0x78FA, 0x78F4, 0x78EF, 0x7901,
+ 0x79A7, 0x79AA, 0x7A57, 0x7ABF, 0x7C07, 0x7C0D, 0x7BFE, 0x7BF7,
+ 0x7C0C, 0x7BE0, 0x7CE0, 0x7CDC, 0x7CDE, 0x7CE2, 0x7CDF, 0x7CD9,
+ 0x7CDD, 0x7E2E, 0x7E3E, 0x7E46, 0x7E37, 0x7E32, 0x7E43, 0x7E2B,
+ 0x7E3D, 0x7E31, 0x7E45, 0x7E41, 0x7E34, 0x7E39, 0x7E48, 0x7E35,
+ 0x7E3F, 0x7E2F, 0x7F44, 0x7FF3, 0x7FFC, 0x8071, 0x8072, 0x8070,
+ 0x806F, 0x8073, 0x81C6, 0x81C3, 0x81BA, 0x81C2, 0x81C0, 0x81BF,
+ 0x81BD, 0x81C9, 0x81BE, 0x81E8, 0x8209, 0x8271, 0x85AA, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8584, 0x857E, 0x859C, 0x8591, 0x8594, 0x85AF, 0x859B,
+ 0x8587, 0x85A8, 0x858A, 0x8667, 0x87C0, 0x87D1, 0x87B3, 0x87D2,
+ 0x87C6, 0x87AB, 0x87BB, 0x87BA, 0x87C8, 0x87CB, 0x893B, 0x8936,
+ 0x8944, 0x8938, 0x893D, 0x89AC, 0x8B0E, 0x8B17, 0x8B19, 0x8B1B,
+ 0x8B0A, 0x8B20, 0x8B1D, 0x8B04, 0x8B10, 0x8C41, 0x8C3F, 0x8C73,
+ 0x8CFA, 0x8CFD, 0x8CFC, 0x8CF8, 0x8CFB, 0x8DA8, 0x8E49, 0x8E4B,
+ 0x8E48, 0x8E4A, 0x8F44, 0x8F3E, 0x8F42, 0x8F45, 0x8F3F, 0x907F,
+ 0x907D, 0x9084, 0x9081, 0x9082, 0x9080, 0x9139, 0x91A3, 0x919E,
+ 0x919C, 0x934D, 0x9382, 0x9328, 0x9375, 0x934A, 0x9365, 0x934B,
+ 0x9318, 0x937E, 0x936C, 0x935B, 0x9370, 0x935A, 0x9354, 0x95CA,
+ 0x95CB, 0x95CC, 0x95C8, 0x95C6, 0x96B1, 0x96B8, 0x96D6, 0x971C,
+ 0x971E, 0x97A0, 0x97D3, 0x9846, 0x98B6, 0x9935, 0x9A01, ALTCHR,
+/* 0xC240 - 0xC2FF */
+ 0x99FF, 0x9BAE, 0x9BAB, 0x9BAA, 0x9BAD, 0x9D3B, 0x9D3F, 0x9E8B,
+ 0x9ECF, 0x9EDE, 0x9EDC, 0x9EDD, 0x9EDB, 0x9F3E, 0x9F4B, 0x53E2,
+ 0x5695, 0x56AE, 0x58D9, 0x58D8, 0x5B38, 0x5F5D, 0x61E3, 0x6233,
+ 0x64F4, 0x64F2, 0x64FE, 0x6506, 0x64FA, 0x64FB, 0x64F7, 0x65B7,
+ 0x66DC, 0x6726, 0x6AB3, 0x6AAC, 0x6AC3, 0x6ABB, 0x6AB8, 0x6AC2,
+ 0x6AAE, 0x6AAF, 0x6B5F, 0x6B78, 0x6BAF, 0x7009, 0x700B, 0x6FFE,
+ 0x7006, 0x6FFA, 0x7011, 0x700F, 0x71FB, 0x71FC, 0x71FE, 0x71F8,
+ 0x7377, 0x7375, 0x74A7, 0x74BF, 0x7515, 0x7656, 0x7658, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7652, 0x77BD, 0x77BF, 0x77BB, 0x77BC, 0x790E, 0x79AE,
+ 0x7A61, 0x7A62, 0x7A60, 0x7AC4, 0x7AC5, 0x7C2B, 0x7C27, 0x7C2A,
+ 0x7C1E, 0x7C23, 0x7C21, 0x7CE7, 0x7E54, 0x7E55, 0x7E5E, 0x7E5A,
+ 0x7E61, 0x7E52, 0x7E59, 0x7F48, 0x7FF9, 0x7FFB, 0x8077, 0x8076,
+ 0x81CD, 0x81CF, 0x820A, 0x85CF, 0x85A9, 0x85CD, 0x85D0, 0x85C9,
+ 0x85B0, 0x85BA, 0x85B9, 0x85A6, 0x87EF, 0x87EC, 0x87F2, 0x87E0,
+ 0x8986, 0x89B2, 0x89F4, 0x8B28, 0x8B39, 0x8B2C, 0x8B2B, 0x8C50,
+ 0x8D05, 0x8E59, 0x8E63, 0x8E66, 0x8E64, 0x8E5F, 0x8E55, 0x8EC0,
+ 0x8F49, 0x8F4D, 0x9087, 0x9083, 0x9088, 0x91AB, 0x91AC, 0x91D0,
+ 0x9394, 0x938A, 0x9396, 0x93A2, 0x93B3, 0x93AE, 0x93AC, 0x93B0,
+ 0x9398, 0x939A, 0x9397, 0x95D4, 0x95D6, 0x95D0, 0x95D5, 0x96E2,
+ 0x96DC, 0x96D9, 0x96DB, 0x96DE, 0x9724, 0x97A3, 0x97A6, ALTCHR,
+/* 0xC340 - 0xC3FF */
+ 0x97AD, 0x97F9, 0x984D, 0x984F, 0x984C, 0x984E, 0x9853, 0x98BA,
+ 0x993E, 0x993F, 0x993D, 0x992E, 0x99A5, 0x9A0E, 0x9AC1, 0x9B03,
+ 0x9B06, 0x9B4F, 0x9B4E, 0x9B4D, 0x9BCA, 0x9BC9, 0x9BFD, 0x9BC8,
+ 0x9BC0, 0x9D51, 0x9D5D, 0x9D60, 0x9EE0, 0x9F15, 0x9F2C, 0x5133,
+ 0x56A5, 0x58DE, 0x58DF, 0x58E2, 0x5BF5, 0x9F90, 0x5EEC, 0x61F2,
+ 0x61F7, 0x61F6, 0x61F5, 0x6500, 0x650F, 0x66E0, 0x66DD, 0x6AE5,
+ 0x6ADD, 0x6ADA, 0x6AD3, 0x701B, 0x701F, 0x7028, 0x701A, 0x701D,
+ 0x7015, 0x7018, 0x7206, 0x720D, 0x7258, 0x72A2, 0x7378, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x737A, 0x74BD, 0x74CA, 0x74E3, 0x7587, 0x7586, 0x765F,
+ 0x7661, 0x77C7, 0x7919, 0x79B1, 0x7A6B, 0x7A69, 0x7C3E, 0x7C3F,
+ 0x7C38, 0x7C3D, 0x7C37, 0x7C40, 0x7E6B, 0x7E6D, 0x7E79, 0x7E69,
+ 0x7E6A, 0x7F85, 0x7E73, 0x7FB6, 0x7FB9, 0x7FB8, 0x81D8, 0x85E9,
+ 0x85DD, 0x85EA, 0x85D5, 0x85E4, 0x85E5, 0x85F7, 0x87FB, 0x8805,
+ 0x880D, 0x87F9, 0x87FE, 0x8960, 0x895F, 0x8956, 0x895E, 0x8B41,
+ 0x8B5C, 0x8B58, 0x8B49, 0x8B5A, 0x8B4E, 0x8B4F, 0x8B46, 0x8B59,
+ 0x8D08, 0x8D0A, 0x8E7C, 0x8E72, 0x8E87, 0x8E76, 0x8E6C, 0x8E7A,
+ 0x8E74, 0x8F54, 0x8F4E, 0x8FAD, 0x908A, 0x908B, 0x91B1, 0x91AE,
+ 0x93E1, 0x93D1, 0x93DF, 0x93C3, 0x93C8, 0x93DC, 0x93DD, 0x93D6,
+ 0x93E2, 0x93CD, 0x93D8, 0x93E4, 0x93D7, 0x93E8, 0x95DC, 0x96B4,
+ 0x96E3, 0x972A, 0x9727, 0x9761, 0x97DC, 0x97FB, 0x985E, ALTCHR,
+/* 0xC440 - 0xC4FF */
+ 0x9858, 0x985B, 0x98BC, 0x9945, 0x9949, 0x9A16, 0x9A19, 0x9B0D,
+ 0x9BE8, 0x9BE7, 0x9BD6, 0x9BDB, 0x9D89, 0x9D61, 0x9D72, 0x9D6A,
+ 0x9D6C, 0x9E92, 0x9E97, 0x9E93, 0x9EB4, 0x52F8, 0x56A8, 0x56B7,
+ 0x56B6, 0x56B4, 0x56BC, 0x58E4, 0x5B40, 0x5B43, 0x5B7D, 0x5BF6,
+ 0x5DC9, 0x61F8, 0x61FA, 0x6518, 0x6514, 0x6519, 0x66E6, 0x6727,
+ 0x6AEC, 0x703E, 0x7030, 0x7032, 0x7210, 0x737B, 0x74CF, 0x7662,
+ 0x7665, 0x7926, 0x792A, 0x792C, 0x792B, 0x7AC7, 0x7AF6, 0x7C4C,
+ 0x7C43, 0x7C4D, 0x7CEF, 0x7CF0, 0x8FAE, 0x7E7D, 0x7E7C, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7E82, 0x7F4C, 0x8000, 0x81DA, 0x8266, 0x85FB, 0x85F9,
+ 0x8611, 0x85FA, 0x8606, 0x860B, 0x8607, 0x860A, 0x8814, 0x8815,
+ 0x8964, 0x89BA, 0x89F8, 0x8B70, 0x8B6C, 0x8B66, 0x8B6F, 0x8B5F,
+ 0x8B6B, 0x8D0F, 0x8D0D, 0x8E89, 0x8E81, 0x8E85, 0x8E82, 0x91B4,
+ 0x91CB, 0x9418, 0x9403, 0x93FD, 0x95E1, 0x9730, 0x98C4, 0x9952,
+ 0x9951, 0x99A8, 0x9A2B, 0x9A30, 0x9A37, 0x9A35, 0x9C13, 0x9C0D,
+ 0x9E79, 0x9EB5, 0x9EE8, 0x9F2F, 0x9F5F, 0x9F63, 0x9F61, 0x5137,
+ 0x5138, 0x56C1, 0x56C0, 0x56C2, 0x5914, 0x5C6C, 0x5DCD, 0x61FC,
+ 0x61FE, 0x651D, 0x651C, 0x6595, 0x66E9, 0x6AFB, 0x6B04, 0x6AFA,
+ 0x6BB2, 0x704C, 0x721B, 0x72A7, 0x74D6, 0x74D4, 0x7669, 0x77D3,
+ 0x7C50, 0x7E8F, 0x7E8C, 0x7FBC, 0x8617, 0x862D, 0x861A, 0x8823,
+ 0x8822, 0x8821, 0x881F, 0x896A, 0x896C, 0x89BD, 0x8B74, ALTCHR,
+/* 0xC540 - 0xC5FF */
+ 0x8B77, 0x8B7D, 0x8D13, 0x8E8A, 0x8E8D, 0x8E8B, 0x8F5F, 0x8FAF,
+ 0x91BA, 0x942E, 0x9433, 0x9435, 0x943A, 0x9438, 0x9432, 0x942B,
+ 0x95E2, 0x9738, 0x9739, 0x9732, 0x97FF, 0x9867, 0x9865, 0x9957,
+ 0x9A45, 0x9A43, 0x9A40, 0x9A3E, 0x9ACF, 0x9B54, 0x9B51, 0x9C2D,
+ 0x9C25, 0x9DAF, 0x9DB4, 0x9DC2, 0x9DB8, 0x9E9D, 0x9EEF, 0x9F19,
+ 0x9F5C, 0x9F66, 0x9F67, 0x513C, 0x513B, 0x56C8, 0x56CA, 0x56C9,
+ 0x5B7F, 0x5DD4, 0x5DD2, 0x5F4E, 0x61FF, 0x6524, 0x6B0A, 0x6B61,
+ 0x7051, 0x7058, 0x7380, 0x74E4, 0x758A, 0x766E, 0x766C, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x79B3, 0x7C60, 0x7C5F, 0x807E, 0x807D, 0x81DF, 0x8972,
+ 0x896F, 0x89FC, 0x8B80, 0x8D16, 0x8D17, 0x8E91, 0x8E93, 0x8F61,
+ 0x9148, 0x9444, 0x9451, 0x9452, 0x973D, 0x973E, 0x97C3, 0x97C1,
+ 0x986B, 0x9955, 0x9A55, 0x9A4D, 0x9AD2, 0x9B1A, 0x9C49, 0x9C31,
+ 0x9C3E, 0x9C3B, 0x9DD3, 0x9DD7, 0x9F34, 0x9F6C, 0x9F6A, 0x9F94,
+ 0x56CC, 0x5DD6, 0x6200, 0x6523, 0x652B, 0x652A, 0x66EC, 0x6B10,
+ 0x74DA, 0x7ACA, 0x7C64, 0x7C63, 0x7C65, 0x7E93, 0x7E96, 0x7E94,
+ 0x81E2, 0x8638, 0x863F, 0x8831, 0x8B8A, 0x9090, 0x908F, 0x9463,
+ 0x9460, 0x9464, 0x9768, 0x986F, 0x995C, 0x9A5A, 0x9A5B, 0x9A57,
+ 0x9AD3, 0x9AD4, 0x9AD1, 0x9C54, 0x9C57, 0x9C56, 0x9DE5, 0x9E9F,
+ 0x9EF4, 0x56D1, 0x58E9, 0x652C, 0x705E, 0x7671, 0x7672, 0x77D7,
+ 0x7F50, 0x7F88, 0x8836, 0x8839, 0x8862, 0x8B93, 0x8B92, ALTCHR,
+/* 0xC640 - 0xC6FF */
+ 0x8B96, 0x8277, 0x8D1B, 0x91C0, 0x946A, 0x9742, 0x9748, 0x9744,
+ 0x97C6, 0x9870, 0x9A5F, 0x9B22, 0x9B58, 0x9C5F, 0x9DF9, 0x9DFA,
+ 0x9E7C, 0x9E7D, 0x9F07, 0x9F77, 0x9F72, 0x5EF3, 0x6B16, 0x7063,
+ 0x7C6C, 0x7C6E, 0x883B, 0x89C0, 0x8EA1, 0x91C1, 0x9472, 0x9470,
+ 0x9871, 0x995E, 0x9AD6, 0x9B23, 0x9ECC, 0x7064, 0x77DA, 0x8B9A,
+ 0x9477, 0x97C9, 0x9A62, 0x9A65, 0x7E9C, 0x8B9C, 0x8EAA, 0x91C5,
+ 0x947D, 0x947E, 0x947C, 0x9C77, 0x9C78, 0x9EF7, 0x8C54, 0x947F,
+ 0x9E1A, 0x7228, 0x9A6A, 0x9B31, 0x9E1B, 0x9E1E, 0x7C72, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x30FE, 0x309D, 0x309E, 0x3005, 0x3041, 0x3042, 0x3043,
+ 0x3044, 0x3045, 0x3046, 0x3047, 0x3048, 0x3049, 0x304A, 0x304B,
+ 0x304C, 0x304D, 0x304E, 0x304F, 0x3050, 0x3051, 0x3052, 0x3053,
+ 0x3054, 0x3055, 0x3056, 0x3057, 0x3058, 0x3059, 0x305A, 0x305B,
+ 0x305C, 0x305D, 0x305E, 0x305F, 0x3060, 0x3061, 0x3062, 0x3063,
+ 0x3064, 0x3065, 0x3066, 0x3067, 0x3068, 0x3069, 0x306A, 0x306B,
+ 0x306C, 0x306D, 0x306E, 0x306F, 0x3070, 0x3071, 0x3072, 0x3073,
+ 0x3074, 0x3075, 0x3076, 0x3077, 0x3078, 0x3079, 0x307A, 0x307B,
+ 0x307C, 0x307D, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3083,
+ 0x3084, 0x3085, 0x3086, 0x3087, 0x3088, 0x3089, 0x308A, 0x308B,
+ 0x308C, 0x308D, 0x308E, 0x308F, 0x3090, 0x3091, 0x3092, 0x3093,
+ 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7, ALTCHR,
+/* 0xC740 - 0xC7FF */
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF,
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7,
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF,
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7,
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7,
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x30E7, 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED,
+ 0x30EE, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5,
+ 0x30F6, 0x0414, 0x0415, 0x0401, 0x0416, 0x0417, 0x0418, 0x0419,
+ 0x041A, 0x041B, 0x041C, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451, 0x0436,
+ 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446,
+ 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E,
+ 0x044F, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466,
+ 0x2467, 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478,
+ 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, ALTCHR, ALTCHR, ALTCHR,
+/* 0xC840 - 0xC8FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xC940 - 0xC9FF */
+ 0x4E42, 0x4E5C, 0x51F5, 0x531A, 0x5382, 0x4E07, 0x4E0C, 0x4E47,
+ 0x4E8D, 0x56D7, 0xFA0C, 0x5C6E, 0x5F73, 0x4E0F, 0x5187, 0x4E0E,
+ 0x4E2E, 0x4E93, 0x4EC2, 0x4EC9, 0x4EC8, 0x5198, 0x52FC, 0x536C,
+ 0x53B9, 0x5720, 0x5903, 0x592C, 0x5C10, 0x5DFF, 0x65E1, 0x6BB3,
+ 0x6BCC, 0x6C14, 0x723F, 0x4E31, 0x4E3C, 0x4EE8, 0x4EDC, 0x4EE9,
+ 0x4EE1, 0x4EDD, 0x4EDA, 0x520C, 0x531C, 0x534C, 0x5722, 0x5723,
+ 0x5917, 0x592F, 0x5B81, 0x5B84, 0x5C12, 0x5C3B, 0x5C74, 0x5C73,
+ 0x5E04, 0x5E80, 0x5E82, 0x5FC9, 0x6209, 0x6250, 0x6C15, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6C36, 0x6C43, 0x6C3F, 0x6C3B, 0x72AE, 0x72B0, 0x738A,
+ 0x79B8, 0x808A, 0x961E, 0x4F0E, 0x4F18, 0x4F2C, 0x4EF5, 0x4F14,
+ 0x4EF1, 0x4F00, 0x4EF7, 0x4F08, 0x4F1D, 0x4F02, 0x4F05, 0x4F22,
+ 0x4F13, 0x4F04, 0x4EF4, 0x4F12, 0x51B1, 0x5213, 0x5209, 0x5210,
+ 0x52A6, 0x5322, 0x531F, 0x534D, 0x538A, 0x5407, 0x56E1, 0x56DF,
+ 0x572E, 0x572A, 0x5734, 0x593C, 0x5980, 0x597C, 0x5985, 0x597B,
+ 0x597E, 0x5977, 0x597F, 0x5B56, 0x5C15, 0x5C25, 0x5C7C, 0x5C7A,
+ 0x5C7B, 0x5C7E, 0x5DDF, 0x5E75, 0x5E84, 0x5F02, 0x5F1A, 0x5F74,
+ 0x5FD5, 0x5FD4, 0x5FCF, 0x625C, 0x625E, 0x6264, 0x6261, 0x6266,
+ 0x6262, 0x6259, 0x6260, 0x625A, 0x6265, 0x65EF, 0x65EE, 0x673E,
+ 0x6739, 0x6738, 0x673B, 0x673A, 0x673F, 0x673C, 0x6733, 0x6C18,
+ 0x6C46, 0x6C52, 0x6C5C, 0x6C4F, 0x6C4A, 0x6C54, 0x6C4B, ALTCHR,
+/* 0xCA40 - 0xCAFF */
+ 0x6C4C, 0x7071, 0x725E, 0x72B4, 0x72B5, 0x738E, 0x752A, 0x767F,
+ 0x7A75, 0x7F51, 0x8278, 0x827C, 0x8280, 0x827D, 0x827F, 0x864D,
+ 0x897E, 0x9099, 0x9097, 0x9098, 0x909B, 0x9094, 0x9622, 0x9624,
+ 0x9620, 0x9623, 0x4F56, 0x4F3B, 0x4F62, 0x4F49, 0x4F53, 0x4F64,
+ 0x4F3E, 0x4F67, 0x4F52, 0x4F5F, 0x4F41, 0x4F58, 0x4F2D, 0x4F33,
+ 0x4F3F, 0x4F61, 0x518F, 0x51B9, 0x521C, 0x521E, 0x5221, 0x52AD,
+ 0x52AE, 0x5309, 0x5363, 0x5372, 0x538E, 0x538F, 0x5430, 0x5437,
+ 0x542A, 0x5454, 0x5445, 0x5419, 0x541C, 0x5425, 0x5418, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x543D, 0x544F, 0x5441, 0x5428, 0x5424, 0x5447, 0x56EE,
+ 0x56E7, 0x56E5, 0x5741, 0x5745, 0x574C, 0x5749, 0x574B, 0x5752,
+ 0x5906, 0x5940, 0x59A6, 0x5998, 0x59A0, 0x5997, 0x598E, 0x59A2,
+ 0x5990, 0x598F, 0x59A7, 0x59A1, 0x5B8E, 0x5B92, 0x5C28, 0x5C2A,
+ 0x5C8D, 0x5C8F, 0x5C88, 0x5C8B, 0x5C89, 0x5C92, 0x5C8A, 0x5C86,
+ 0x5C93, 0x5C95, 0x5DE0, 0x5E0A, 0x5E0E, 0x5E8B, 0x5E89, 0x5E8C,
+ 0x5E88, 0x5E8D, 0x5F05, 0x5F1D, 0x5F78, 0x5F76, 0x5FD2, 0x5FD1,
+ 0x5FD0, 0x5FED, 0x5FE8, 0x5FEE, 0x5FF3, 0x5FE1, 0x5FE4, 0x5FE3,
+ 0x5FFA, 0x5FEF, 0x5FF7, 0x5FFB, 0x6000, 0x5FF4, 0x623A, 0x6283,
+ 0x628C, 0x628E, 0x628F, 0x6294, 0x6287, 0x6271, 0x627B, 0x627A,
+ 0x6270, 0x6281, 0x6288, 0x6277, 0x627D, 0x6272, 0x6274, 0x6537,
+ 0x65F0, 0x65F4, 0x65F3, 0x65F2, 0x65F5, 0x6745, 0x6747, ALTCHR,
+/* 0xCB40 - 0xCBFF */
+ 0x6759, 0x6755, 0x674C, 0x6748, 0x675D, 0x674D, 0x675A, 0x674B,
+ 0x6BD0, 0x6C19, 0x6C1A, 0x6C78, 0x6C67, 0x6C6B, 0x6C84, 0x6C8B,
+ 0x6C8F, 0x6C71, 0x6C6F, 0x6C69, 0x6C9A, 0x6C6D, 0x6C87, 0x6C95,
+ 0x6C9C, 0x6C66, 0x6C73, 0x6C65, 0x6C7B, 0x6C8E, 0x7074, 0x707A,
+ 0x7263, 0x72BF, 0x72BD, 0x72C3, 0x72C6, 0x72C1, 0x72BA, 0x72C5,
+ 0x7395, 0x7397, 0x7393, 0x7394, 0x7392, 0x753A, 0x7539, 0x7594,
+ 0x7595, 0x7681, 0x793D, 0x8034, 0x8095, 0x8099, 0x8090, 0x8092,
+ 0x809C, 0x8290, 0x828F, 0x8285, 0x828E, 0x8291, 0x8293, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x828A, 0x8283, 0x8284, 0x8C78, 0x8FC9, 0x8FBF, 0x909F,
+ 0x90A1, 0x90A5, 0x909E, 0x90A7, 0x90A0, 0x9630, 0x9628, 0x962F,
+ 0x962D, 0x4E33, 0x4F98, 0x4F7C, 0x4F85, 0x4F7D, 0x4F80, 0x4F87,
+ 0x4F76, 0x4F74, 0x4F89, 0x4F84, 0x4F77, 0x4F4C, 0x4F97, 0x4F6A,
+ 0x4F9A, 0x4F79, 0x4F81, 0x4F78, 0x4F90, 0x4F9C, 0x4F94, 0x4F9E,
+ 0x4F92, 0x4F82, 0x4F95, 0x4F6B, 0x4F6E, 0x519E, 0x51BC, 0x51BE,
+ 0x5235, 0x5232, 0x5233, 0x5246, 0x5231, 0x52BC, 0x530A, 0x530B,
+ 0x533C, 0x5392, 0x5394, 0x5487, 0x547F, 0x5481, 0x5491, 0x5482,
+ 0x5488, 0x546B, 0x547A, 0x547E, 0x5465, 0x546C, 0x5474, 0x5466,
+ 0x548D, 0x546F, 0x5461, 0x5460, 0x5498, 0x5463, 0x5467, 0x5464,
+ 0x56F7, 0x56F9, 0x576F, 0x5772, 0x576D, 0x576B, 0x5771, 0x5770,
+ 0x5776, 0x5780, 0x5775, 0x577B, 0x5773, 0x5774, 0x5762, ALTCHR,
+/* 0xCC40 - 0xCCFF */
+ 0x5768, 0x577D, 0x590C, 0x5945, 0x59B5, 0x59BA, 0x59CF, 0x59CE,
+ 0x59B2, 0x59CC, 0x59C1, 0x59B6, 0x59BC, 0x59C3, 0x59D6, 0x59B1,
+ 0x59BD, 0x59C0, 0x59C8, 0x59B4, 0x59C7, 0x5B62, 0x5B65, 0x5B93,
+ 0x5B95, 0x5C44, 0x5C47, 0x5CAE, 0x5CA4, 0x5CA0, 0x5CB5, 0x5CAF,
+ 0x5CA8, 0x5CAC, 0x5C9F, 0x5CA3, 0x5CAD, 0x5CA2, 0x5CAA, 0x5CA7,
+ 0x5C9D, 0x5CA5, 0x5CB6, 0x5CB0, 0x5CA6, 0x5E17, 0x5E14, 0x5E19,
+ 0x5F28, 0x5F22, 0x5F23, 0x5F24, 0x5F54, 0x5F82, 0x5F7E, 0x5F7D,
+ 0x5FDE, 0x5FE5, 0x602D, 0x6026, 0x6019, 0x6032, 0x600B, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6034, 0x600A, 0x6017, 0x6033, 0x601A, 0x601E, 0x602C,
+ 0x6022, 0x600D, 0x6010, 0x602E, 0x6013, 0x6011, 0x600C, 0x6009,
+ 0x601C, 0x6214, 0x623D, 0x62AD, 0x62B4, 0x62D1, 0x62BE, 0x62AA,
+ 0x62B6, 0x62CA, 0x62AE, 0x62B3, 0x62AF, 0x62BB, 0x62A9, 0x62B0,
+ 0x62B8, 0x653D, 0x65A8, 0x65BB, 0x6609, 0x65FC, 0x6604, 0x6612,
+ 0x6608, 0x65FB, 0x6603, 0x660B, 0x660D, 0x6605, 0x65FD, 0x6611,
+ 0x6610, 0x66F6, 0x670A, 0x6785, 0x676C, 0x678E, 0x6792, 0x6776,
+ 0x677B, 0x6798, 0x6786, 0x6784, 0x6774, 0x678D, 0x678C, 0x677A,
+ 0x679F, 0x6791, 0x6799, 0x6783, 0x677D, 0x6781, 0x6778, 0x6779,
+ 0x6794, 0x6B25, 0x6B80, 0x6B7E, 0x6BDE, 0x6C1D, 0x6C93, 0x6CEC,
+ 0x6CEB, 0x6CEE, 0x6CD9, 0x6CB6, 0x6CD4, 0x6CAD, 0x6CE7, 0x6CB7,
+ 0x6CD0, 0x6CC2, 0x6CBA, 0x6CC3, 0x6CC6, 0x6CED, 0x6CF2, ALTCHR,
+/* 0xCD40 - 0xCDFF */
+ 0x6CD2, 0x6CDD, 0x6CB4, 0x6C8A, 0x6C9D, 0x6C80, 0x6CDE, 0x6CC0,
+ 0x6D30, 0x6CCD, 0x6CC7, 0x6CB0, 0x6CF9, 0x6CCF, 0x6CE9, 0x6CD1,
+ 0x7094, 0x7098, 0x7085, 0x7093, 0x7086, 0x7084, 0x7091, 0x7096,
+ 0x7082, 0x709A, 0x7083, 0x726A, 0x72D6, 0x72CB, 0x72D8, 0x72C9,
+ 0x72DC, 0x72D2, 0x72D4, 0x72DA, 0x72CC, 0x72D1, 0x73A4, 0x73A1,
+ 0x73AD, 0x73A6, 0x73A2, 0x73A0, 0x73AC, 0x739D, 0x74DD, 0x74E8,
+ 0x753F, 0x7540, 0x753E, 0x758C, 0x7598, 0x76AF, 0x76F3, 0x76F1,
+ 0x76F0, 0x76F5, 0x77F8, 0x77FC, 0x77F9, 0x77FB, 0x77FA, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x77F7, 0x7942, 0x793F, 0x79C5, 0x7A78, 0x7A7B, 0x7AFB,
+ 0x7C75, 0x7CFD, 0x8035, 0x808F, 0x80AE, 0x80A3, 0x80B8, 0x80B5,
+ 0x80AD, 0x8220, 0x82A0, 0x82C0, 0x82AB, 0x829A, 0x8298, 0x829B,
+ 0x82B5, 0x82A7, 0x82AE, 0x82BC, 0x829E, 0x82BA, 0x82B4, 0x82A8,
+ 0x82A1, 0x82A9, 0x82C2, 0x82A4, 0x82C3, 0x82B6, 0x82A2, 0x8670,
+ 0x866F, 0x866D, 0x866E, 0x8C56, 0x8FD2, 0x8FCB, 0x8FD3, 0x8FCD,
+ 0x8FD6, 0x8FD5, 0x8FD7, 0x90B2, 0x90B4, 0x90AF, 0x90B3, 0x90B0,
+ 0x9639, 0x963D, 0x963C, 0x963A, 0x9643, 0x4FCD, 0x4FC5, 0x4FD3,
+ 0x4FB2, 0x4FC9, 0x4FCB, 0x4FC1, 0x4FD4, 0x4FDC, 0x4FD9, 0x4FBB,
+ 0x4FB3, 0x4FDB, 0x4FC7, 0x4FD6, 0x4FBA, 0x4FC0, 0x4FB9, 0x4FEC,
+ 0x5244, 0x5249, 0x52C0, 0x52C2, 0x533D, 0x537C, 0x5397, 0x5396,
+ 0x5399, 0x5398, 0x54BA, 0x54A1, 0x54AD, 0x54A5, 0x54CF, ALTCHR,
+/* 0xCE40 - 0xCEFF */
+ 0x54C3, 0x830D, 0x54B7, 0x54AE, 0x54D6, 0x54B6, 0x54C5, 0x54C6,
+ 0x54A0, 0x5470, 0x54BC, 0x54A2, 0x54BE, 0x5472, 0x54DE, 0x54B0,
+ 0x57B5, 0x579E, 0x579F, 0x57A4, 0x578C, 0x5797, 0x579D, 0x579B,
+ 0x5794, 0x5798, 0x578F, 0x5799, 0x57A5, 0x579A, 0x5795, 0x58F4,
+ 0x590D, 0x5953, 0x59E1, 0x59DE, 0x59EE, 0x5A00, 0x59F1, 0x59DD,
+ 0x59FA, 0x59FD, 0x59FC, 0x59F6, 0x59E4, 0x59F2, 0x59F7, 0x59DB,
+ 0x59E9, 0x59F3, 0x59F5, 0x59E0, 0x59FE, 0x59F4, 0x59ED, 0x5BA8,
+ 0x5C4C, 0x5CD0, 0x5CD8, 0x5CCC, 0x5CD7, 0x5CCB, 0x5CDB, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5CDE, 0x5CDA, 0x5CC9, 0x5CC7, 0x5CCA, 0x5CD6, 0x5CD3,
+ 0x5CD4, 0x5CCF, 0x5CC8, 0x5CC6, 0x5CCE, 0x5CDF, 0x5CF8, 0x5DF9,
+ 0x5E21, 0x5E22, 0x5E23, 0x5E20, 0x5E24, 0x5EB0, 0x5EA4, 0x5EA2,
+ 0x5E9B, 0x5EA3, 0x5EA5, 0x5F07, 0x5F2E, 0x5F56, 0x5F86, 0x6037,
+ 0x6039, 0x6054, 0x6072, 0x605E, 0x6045, 0x6053, 0x6047, 0x6049,
+ 0x605B, 0x604C, 0x6040, 0x6042, 0x605F, 0x6024, 0x6044, 0x6058,
+ 0x6066, 0x606E, 0x6242, 0x6243, 0x62CF, 0x630D, 0x630B, 0x62F5,
+ 0x630E, 0x6303, 0x62EB, 0x62F9, 0x630F, 0x630C, 0x62F8, 0x62F6,
+ 0x6300, 0x6313, 0x6314, 0x62FA, 0x6315, 0x62FB, 0x62F0, 0x6541,
+ 0x6543, 0x65AA, 0x65BF, 0x6636, 0x6621, 0x6632, 0x6635, 0x661C,
+ 0x6626, 0x6622, 0x6633, 0x662B, 0x663A, 0x661D, 0x6634, 0x6639,
+ 0x662E, 0x670F, 0x6710, 0x67C1, 0x67F2, 0x67C8, 0x67BA, ALTCHR,
+/* 0xCF40 - 0xCFFF */
+ 0x67DC, 0x67BB, 0x67F8, 0x67D8, 0x67C0, 0x67B7, 0x67C5, 0x67EB,
+ 0x67E4, 0x67DF, 0x67B5, 0x67CD, 0x67B3, 0x67F7, 0x67F6, 0x67EE,
+ 0x67E3, 0x67C2, 0x67B9, 0x67CE, 0x67E7, 0x67F0, 0x67B2, 0x67FC,
+ 0x67C6, 0x67ED, 0x67CC, 0x67AE, 0x67E6, 0x67DB, 0x67FA, 0x67C9,
+ 0x67CA, 0x67C3, 0x67EA, 0x67CB, 0x6B28, 0x6B82, 0x6B84, 0x6BB6,
+ 0x6BD6, 0x6BD8, 0x6BE0, 0x6C20, 0x6C21, 0x6D28, 0x6D34, 0x6D2D,
+ 0x6D1F, 0x6D3C, 0x6D3F, 0x6D12, 0x6D0A, 0x6CDA, 0x6D33, 0x6D04,
+ 0x6D19, 0x6D3A, 0x6D1A, 0x6D11, 0x6D00, 0x6D1D, 0x6D42, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6D01, 0x6D18, 0x6D37, 0x6D03, 0x6D0F, 0x6D40, 0x6D07,
+ 0x6D20, 0x6D2C, 0x6D08, 0x6D22, 0x6D09, 0x6D10, 0x70B7, 0x709F,
+ 0x70BE, 0x70B1, 0x70B0, 0x70A1, 0x70B4, 0x70B5, 0x70A9, 0x7241,
+ 0x7249, 0x724A, 0x726C, 0x7270, 0x7273, 0x726E, 0x72CA, 0x72E4,
+ 0x72E8, 0x72EB, 0x72DF, 0x72EA, 0x72E6, 0x72E3, 0x7385, 0x73CC,
+ 0x73C2, 0x73C8, 0x73C5, 0x73B9, 0x73B6, 0x73B5, 0x73B4, 0x73EB,
+ 0x73BF, 0x73C7, 0x73BE, 0x73C3, 0x73C6, 0x73B8, 0x73CB, 0x74EC,
+ 0x74EE, 0x752E, 0x7547, 0x7548, 0x75A7, 0x75AA, 0x7679, 0x76C4,
+ 0x7708, 0x7703, 0x7704, 0x7705, 0x770A, 0x76F7, 0x76FB, 0x76FA,
+ 0x77E7, 0x77E8, 0x7806, 0x7811, 0x7812, 0x7805, 0x7810, 0x780F,
+ 0x780E, 0x7809, 0x7803, 0x7813, 0x794A, 0x794C, 0x794B, 0x7945,
+ 0x7944, 0x79D5, 0x79CD, 0x79CF, 0x79D6, 0x79CE, 0x7A80, ALTCHR,
+/* 0xD040 - 0xD0FF */
+ 0x7A7E, 0x7AD1, 0x7B00, 0x7B01, 0x7C7A, 0x7C78, 0x7C79, 0x7C7F,
+ 0x7C80, 0x7C81, 0x7D03, 0x7D08, 0x7D01, 0x7F58, 0x7F91, 0x7F8D,
+ 0x7FBE, 0x8007, 0x800E, 0x800F, 0x8014, 0x8037, 0x80D8, 0x80C7,
+ 0x80E0, 0x80D1, 0x80C8, 0x80C2, 0x80D0, 0x80C5, 0x80E3, 0x80D9,
+ 0x80DC, 0x80CA, 0x80D5, 0x80C9, 0x80CF, 0x80D7, 0x80E6, 0x80CD,
+ 0x81FF, 0x8221, 0x8294, 0x82D9, 0x82FE, 0x82F9, 0x8307, 0x82E8,
+ 0x8300, 0x82D5, 0x833A, 0x82EB, 0x82D6, 0x82F4, 0x82EC, 0x82E1,
+ 0x82F2, 0x82F5, 0x830C, 0x82FB, 0x82F6, 0x82F0, 0x82EA, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x82E4, 0x82E0, 0x82FA, 0x82F3, 0x82ED, 0x8677, 0x8674,
+ 0x867C, 0x8673, 0x8841, 0x884E, 0x8867, 0x886A, 0x8869, 0x89D3,
+ 0x8A04, 0x8A07, 0x8D72, 0x8FE3, 0x8FE1, 0x8FEE, 0x8FE0, 0x90F1,
+ 0x90BD, 0x90BF, 0x90D5, 0x90C5, 0x90BE, 0x90C7, 0x90CB, 0x90C8,
+ 0x91D4, 0x91D3, 0x9654, 0x964F, 0x9651, 0x9653, 0x964A, 0x964E,
+ 0x501E, 0x5005, 0x5007, 0x5013, 0x5022, 0x5030, 0x501B, 0x4FF5,
+ 0x4FF4, 0x5033, 0x5037, 0x502C, 0x4FF6, 0x4FF7, 0x5017, 0x501C,
+ 0x5020, 0x5027, 0x5035, 0x502F, 0x5031, 0x500E, 0x515A, 0x5194,
+ 0x5193, 0x51CA, 0x51C4, 0x51C5, 0x51C8, 0x51CE, 0x5261, 0x525A,
+ 0x5252, 0x525E, 0x525F, 0x5255, 0x5262, 0x52CD, 0x530E, 0x539E,
+ 0x5526, 0x54E2, 0x5517, 0x5512, 0x54E7, 0x54F3, 0x54E4, 0x551A,
+ 0x54FF, 0x5504, 0x5508, 0x54EB, 0x5511, 0x5505, 0x54F1, ALTCHR,
+/* 0xD140 - 0xD1FF */
+ 0x550A, 0x54FB, 0x54F7, 0x54F8, 0x54E0, 0x550E, 0x5503, 0x550B,
+ 0x5701, 0x5702, 0x57CC, 0x5832, 0x57D5, 0x57D2, 0x57BA, 0x57C6,
+ 0x57BD, 0x57BC, 0x57B8, 0x57B6, 0x57BF, 0x57C7, 0x57D0, 0x57B9,
+ 0x57C1, 0x590E, 0x594A, 0x5A19, 0x5A16, 0x5A2D, 0x5A2E, 0x5A15,
+ 0x5A0F, 0x5A17, 0x5A0A, 0x5A1E, 0x5A33, 0x5B6C, 0x5BA7, 0x5BAD,
+ 0x5BAC, 0x5C03, 0x5C56, 0x5C54, 0x5CEC, 0x5CFF, 0x5CEE, 0x5CF1,
+ 0x5CF7, 0x5D00, 0x5CF9, 0x5E29, 0x5E28, 0x5EA8, 0x5EAE, 0x5EAA,
+ 0x5EAC, 0x5F33, 0x5F30, 0x5F67, 0x605D, 0x605A, 0x6067, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6041, 0x60A2, 0x6088, 0x6080, 0x6092, 0x6081, 0x609D,
+ 0x6083, 0x6095, 0x609B, 0x6097, 0x6087, 0x609C, 0x608E, 0x6219,
+ 0x6246, 0x62F2, 0x6310, 0x6356, 0x632C, 0x6344, 0x6345, 0x6336,
+ 0x6343, 0x63E4, 0x6339, 0x634B, 0x634A, 0x633C, 0x6329, 0x6341,
+ 0x6334, 0x6358, 0x6354, 0x6359, 0x632D, 0x6347, 0x6333, 0x635A,
+ 0x6351, 0x6338, 0x6357, 0x6340, 0x6348, 0x654A, 0x6546, 0x65C6,
+ 0x65C3, 0x65C4, 0x65C2, 0x664A, 0x665F, 0x6647, 0x6651, 0x6712,
+ 0x6713, 0x681F, 0x681A, 0x6849, 0x6832, 0x6833, 0x683B, 0x684B,
+ 0x684F, 0x6816, 0x6831, 0x681C, 0x6835, 0x682B, 0x682D, 0x682F,
+ 0x684E, 0x6844, 0x6834, 0x681D, 0x6812, 0x6814, 0x6826, 0x6828,
+ 0x682E, 0x684D, 0x683A, 0x6825, 0x6820, 0x6B2C, 0x6B2F, 0x6B2D,
+ 0x6B31, 0x6B34, 0x6B6D, 0x8082, 0x6B88, 0x6BE6, 0x6BE4, ALTCHR,
+/* 0xD240 - 0xD2FF */
+ 0x6BE8, 0x6BE3, 0x6BE2, 0x6BE7, 0x6C25, 0x6D7A, 0x6D63, 0x6D64,
+ 0x6D76, 0x6D0D, 0x6D61, 0x6D92, 0x6D58, 0x6D62, 0x6D6D, 0x6D6F,
+ 0x6D91, 0x6D8D, 0x6DEF, 0x6D7F, 0x6D86, 0x6D5E, 0x6D67, 0x6D60,
+ 0x6D97, 0x6D70, 0x6D7C, 0x6D5F, 0x6D82, 0x6D98, 0x6D2F, 0x6D68,
+ 0x6D8B, 0x6D7E, 0x6D80, 0x6D84, 0x6D16, 0x6D83, 0x6D7B, 0x6D7D,
+ 0x6D75, 0x6D90, 0x70DC, 0x70D3, 0x70D1, 0x70DD, 0x70CB, 0x7F39,
+ 0x70E2, 0x70D7, 0x70D2, 0x70DE, 0x70E0, 0x70D4, 0x70CD, 0x70C5,
+ 0x70C6, 0x70C7, 0x70DA, 0x70CE, 0x70E1, 0x7242, 0x7278, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7277, 0x7276, 0x7300, 0x72FA, 0x72F4, 0x72FE, 0x72F6,
+ 0x72F3, 0x72FB, 0x7301, 0x73D3, 0x73D9, 0x73E5, 0x73D6, 0x73BC,
+ 0x73E7, 0x73E3, 0x73E9, 0x73DC, 0x73D2, 0x73DB, 0x73D4, 0x73DD,
+ 0x73DA, 0x73D7, 0x73D8, 0x73E8, 0x74DE, 0x74DF, 0x74F4, 0x74F5,
+ 0x7521, 0x755B, 0x755F, 0x75B0, 0x75C1, 0x75BB, 0x75C4, 0x75C0,
+ 0x75BF, 0x75B6, 0x75BA, 0x768A, 0x76C9, 0x771D, 0x771B, 0x7710,
+ 0x7713, 0x7712, 0x7723, 0x7711, 0x7715, 0x7719, 0x771A, 0x7722,
+ 0x7727, 0x7823, 0x782C, 0x7822, 0x7835, 0x782F, 0x7828, 0x782E,
+ 0x782B, 0x7821, 0x7829, 0x7833, 0x782A, 0x7831, 0x7954, 0x795B,
+ 0x794F, 0x795C, 0x7953, 0x7952, 0x7951, 0x79EB, 0x79EC, 0x79E0,
+ 0x79EE, 0x79ED, 0x79EA, 0x79DC, 0x79DE, 0x79DD, 0x7A86, 0x7A89,
+ 0x7A85, 0x7A8B, 0x7A8C, 0x7A8A, 0x7A87, 0x7AD8, 0x7B10, ALTCHR,
+/* 0xD340 - 0xD3FF */
+ 0x7B04, 0x7B13, 0x7B05, 0x7B0F, 0x7B08, 0x7B0A, 0x7B0E, 0x7B09,
+ 0x7B12, 0x7C84, 0x7C91, 0x7C8A, 0x7C8C, 0x7C88, 0x7C8D, 0x7C85,
+ 0x7D1E, 0x7D1D, 0x7D11, 0x7D0E, 0x7D18, 0x7D16, 0x7D13, 0x7D1F,
+ 0x7D12, 0x7D0F, 0x7D0C, 0x7F5C, 0x7F61, 0x7F5E, 0x7F60, 0x7F5D,
+ 0x7F5B, 0x7F96, 0x7F92, 0x7FC3, 0x7FC2, 0x7FC0, 0x8016, 0x803E,
+ 0x8039, 0x80FA, 0x80F2, 0x80F9, 0x80F5, 0x8101, 0x80FB, 0x8100,
+ 0x8201, 0x822F, 0x8225, 0x8333, 0x832D, 0x8344, 0x8319, 0x8351,
+ 0x8325, 0x8356, 0x833F, 0x8341, 0x8326, 0x831C, 0x8322, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8342, 0x834E, 0x831B, 0x832A, 0x8308, 0x833C, 0x834D,
+ 0x8316, 0x8324, 0x8320, 0x8337, 0x832F, 0x8329, 0x8347, 0x8345,
+ 0x834C, 0x8353, 0x831E, 0x832C, 0x834B, 0x8327, 0x8348, 0x8653,
+ 0x8652, 0x86A2, 0x86A8, 0x8696, 0x868D, 0x8691, 0x869E, 0x8687,
+ 0x8697, 0x8686, 0x868B, 0x869A, 0x8685, 0x86A5, 0x8699, 0x86A1,
+ 0x86A7, 0x8695, 0x8698, 0x868E, 0x869D, 0x8690, 0x8694, 0x8843,
+ 0x8844, 0x886D, 0x8875, 0x8876, 0x8872, 0x8880, 0x8871, 0x887F,
+ 0x886F, 0x8883, 0x887E, 0x8874, 0x887C, 0x8A12, 0x8C47, 0x8C57,
+ 0x8C7B, 0x8CA4, 0x8CA3, 0x8D76, 0x8D78, 0x8DB5, 0x8DB7, 0x8DB6,
+ 0x8ED1, 0x8ED3, 0x8FFE, 0x8FF5, 0x9002, 0x8FFF, 0x8FFB, 0x9004,
+ 0x8FFC, 0x8FF6, 0x90D6, 0x90E0, 0x90D9, 0x90DA, 0x90E3, 0x90DF,
+ 0x90E5, 0x90D8, 0x90DB, 0x90D7, 0x90DC, 0x90E4, 0x9150, ALTCHR,
+/* 0xD440 - 0xD4FF */
+ 0x914E, 0x914F, 0x91D5, 0x91E2, 0x91DA, 0x965C, 0x965F, 0x96BC,
+ 0x98E3, 0x9ADF, 0x9B2F, 0x4E7F, 0x5070, 0x506A, 0x5061, 0x505E,
+ 0x5060, 0x5053, 0x504B, 0x505D, 0x5072, 0x5048, 0x504D, 0x5041,
+ 0x505B, 0x504A, 0x5062, 0x5015, 0x5045, 0x505F, 0x5069, 0x506B,
+ 0x5063, 0x5064, 0x5046, 0x5040, 0x506E, 0x5073, 0x5057, 0x5051,
+ 0x51D0, 0x526B, 0x526D, 0x526C, 0x526E, 0x52D6, 0x52D3, 0x532D,
+ 0x539C, 0x5575, 0x5576, 0x553C, 0x554D, 0x5550, 0x5534, 0x552A,
+ 0x5551, 0x5562, 0x5536, 0x5535, 0x5530, 0x5552, 0x5545, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x550C, 0x5532, 0x5565, 0x554E, 0x5539, 0x5548, 0x552D,
+ 0x553B, 0x5540, 0x554B, 0x570A, 0x5707, 0x57FB, 0x5814, 0x57E2,
+ 0x57F6, 0x57DC, 0x57F4, 0x5800, 0x57ED, 0x57FD, 0x5808, 0x57F8,
+ 0x580B, 0x57F3, 0x57CF, 0x5807, 0x57EE, 0x57E3, 0x57F2, 0x57E5,
+ 0x57EC, 0x57E1, 0x580E, 0x57FC, 0x5810, 0x57E7, 0x5801, 0x580C,
+ 0x57F1, 0x57E9, 0x57F0, 0x580D, 0x5804, 0x595C, 0x5A60, 0x5A58,
+ 0x5A55, 0x5A67, 0x5A5E, 0x5A38, 0x5A35, 0x5A6D, 0x5A50, 0x5A5F,
+ 0x5A65, 0x5A6C, 0x5A53, 0x5A64, 0x5A57, 0x5A43, 0x5A5D, 0x5A52,
+ 0x5A44, 0x5A5B, 0x5A48, 0x5A8E, 0x5A3E, 0x5A4D, 0x5A39, 0x5A4C,
+ 0x5A70, 0x5A69, 0x5A47, 0x5A51, 0x5A56, 0x5A42, 0x5A5C, 0x5B72,
+ 0x5B6E, 0x5BC1, 0x5BC0, 0x5C59, 0x5D1E, 0x5D0B, 0x5D1D, 0x5D1A,
+ 0x5D20, 0x5D0C, 0x5D28, 0x5D0D, 0x5D26, 0x5D25, 0x5D0F, ALTCHR,
+/* 0xD540 - 0xD5FF */
+ 0x5D30, 0x5D12, 0x5D23, 0x5D1F, 0x5D2E, 0x5E3E, 0x5E34, 0x5EB1,
+ 0x5EB4, 0x5EB9, 0x5EB2, 0x5EB3, 0x5F36, 0x5F38, 0x5F9B, 0x5F96,
+ 0x5F9F, 0x608A, 0x6090, 0x6086, 0x60BE, 0x60B0, 0x60BA, 0x60D3,
+ 0x60D4, 0x60CF, 0x60E4, 0x60D9, 0x60DD, 0x60C8, 0x60B1, 0x60DB,
+ 0x60B7, 0x60CA, 0x60BF, 0x60C3, 0x60CD, 0x60C0, 0x6332, 0x6365,
+ 0x638A, 0x6382, 0x637D, 0x63BD, 0x639E, 0x63AD, 0x639D, 0x6397,
+ 0x63AB, 0x638E, 0x636F, 0x6387, 0x6390, 0x636E, 0x63AF, 0x6375,
+ 0x639C, 0x636D, 0x63AE, 0x637C, 0x63A4, 0x633B, 0x639F, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6378, 0x6385, 0x6381, 0x6391, 0x638D, 0x6370, 0x6553,
+ 0x65CD, 0x6665, 0x6661, 0x665B, 0x6659, 0x665C, 0x6662, 0x6718,
+ 0x6879, 0x6887, 0x6890, 0x689C, 0x686D, 0x686E, 0x68AE, 0x68AB,
+ 0x6956, 0x686F, 0x68A3, 0x68AC, 0x68A9, 0x6875, 0x6874, 0x68B2,
+ 0x688F, 0x6877, 0x6892, 0x687C, 0x686B, 0x6872, 0x68AA, 0x6880,
+ 0x6871, 0x687E, 0x689B, 0x6896, 0x688B, 0x68A0, 0x6889, 0x68A4,
+ 0x6878, 0x687B, 0x6891, 0x688C, 0x688A, 0x687D, 0x6B36, 0x6B33,
+ 0x6B37, 0x6B38, 0x6B91, 0x6B8F, 0x6B8D, 0x6B8E, 0x6B8C, 0x6C2A,
+ 0x6DC0, 0x6DAB, 0x6DB4, 0x6DB3, 0x6E74, 0x6DAC, 0x6DE9, 0x6DE2,
+ 0x6DB7, 0x6DF6, 0x6DD4, 0x6E00, 0x6DC8, 0x6DE0, 0x6DDF, 0x6DD6,
+ 0x6DBE, 0x6DE5, 0x6DDC, 0x6DDD, 0x6DDB, 0x6DF4, 0x6DCA, 0x6DBD,
+ 0x6DED, 0x6DF0, 0x6DBA, 0x6DD5, 0x6DC2, 0x6DCF, 0x6DC9, ALTCHR,
+/* 0xD640 - 0xD6FF */
+ 0x6DD0, 0x6DF2, 0x6DD3, 0x6DFD, 0x6DD7, 0x6DCD, 0x6DE3, 0x6DBB,
+ 0x70FA, 0x710D, 0x70F7, 0x7117, 0x70F4, 0x710C, 0x70F0, 0x7104,
+ 0x70F3, 0x7110, 0x70FC, 0x70FF, 0x7106, 0x7113, 0x7100, 0x70F8,
+ 0x70F6, 0x710B, 0x7102, 0x710E, 0x727E, 0x727B, 0x727C, 0x727F,
+ 0x731D, 0x7317, 0x7307, 0x7311, 0x7318, 0x730A, 0x7308, 0x72FF,
+ 0x730F, 0x731E, 0x7388, 0x73F6, 0x73F8, 0x73F5, 0x7404, 0x7401,
+ 0x73FD, 0x7407, 0x7400, 0x73FA, 0x73FC, 0x73FF, 0x740C, 0x740B,
+ 0x73F4, 0x7408, 0x7564, 0x7563, 0x75CE, 0x75D2, 0x75CF, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x75CB, 0x75CC, 0x75D1, 0x75D0, 0x768F, 0x7689, 0x76D3,
+ 0x7739, 0x772F, 0x772D, 0x7731, 0x7732, 0x7734, 0x7733, 0x773D,
+ 0x7725, 0x773B, 0x7735, 0x7848, 0x7852, 0x7849, 0x784D, 0x784A,
+ 0x784C, 0x7826, 0x7845, 0x7850, 0x7964, 0x7967, 0x7969, 0x796A,
+ 0x7963, 0x796B, 0x7961, 0x79BB, 0x79FA, 0x79F8, 0x79F6, 0x79F7,
+ 0x7A8F, 0x7A94, 0x7A90, 0x7B35, 0x7B47, 0x7B34, 0x7B25, 0x7B30,
+ 0x7B22, 0x7B24, 0x7B33, 0x7B18, 0x7B2A, 0x7B1D, 0x7B31, 0x7B2B,
+ 0x7B2D, 0x7B2F, 0x7B32, 0x7B38, 0x7B1A, 0x7B23, 0x7C94, 0x7C98,
+ 0x7C96, 0x7CA3, 0x7D35, 0x7D3D, 0x7D38, 0x7D36, 0x7D3A, 0x7D45,
+ 0x7D2C, 0x7D29, 0x7D41, 0x7D47, 0x7D3E, 0x7D3F, 0x7D4A, 0x7D3B,
+ 0x7D28, 0x7F63, 0x7F95, 0x7F9C, 0x7F9D, 0x7F9B, 0x7FCA, 0x7FCB,
+ 0x7FCD, 0x7FD0, 0x7FD1, 0x7FC7, 0x7FCF, 0x7FC9, 0x801F, ALTCHR,
+/* 0xD740 - 0xD7FF */
+ 0x801E, 0x801B, 0x8047, 0x8043, 0x8048, 0x8118, 0x8125, 0x8119,
+ 0x811B, 0x812D, 0x811F, 0x812C, 0x811E, 0x8121, 0x8115, 0x8127,
+ 0x811D, 0x8122, 0x8211, 0x8238, 0x8233, 0x823A, 0x8234, 0x8232,
+ 0x8274, 0x8390, 0x83A3, 0x83A8, 0x838D, 0x837A, 0x8373, 0x83A4,
+ 0x8374, 0x838F, 0x8381, 0x8395, 0x8399, 0x8375, 0x8394, 0x83A9,
+ 0x837D, 0x8383, 0x838C, 0x839D, 0x839B, 0x83AA, 0x838B, 0x837E,
+ 0x83A5, 0x83AF, 0x8388, 0x8397, 0x83B0, 0x837F, 0x83A6, 0x8387,
+ 0x83AE, 0x8376, 0x839A, 0x8659, 0x8656, 0x86BF, 0x86B7, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x86C2, 0x86C1, 0x86C5, 0x86BA, 0x86B0, 0x86C8, 0x86B9,
+ 0x86B3, 0x86B8, 0x86CC, 0x86B4, 0x86BB, 0x86BC, 0x86C3, 0x86BD,
+ 0x86BE, 0x8852, 0x8889, 0x8895, 0x88A8, 0x88A2, 0x88AA, 0x889A,
+ 0x8891, 0x88A1, 0x889F, 0x8898, 0x88A7, 0x8899, 0x889B, 0x8897,
+ 0x88A4, 0x88AC, 0x888C, 0x8893, 0x888E, 0x8982, 0x89D6, 0x89D9,
+ 0x89D5, 0x8A30, 0x8A27, 0x8A2C, 0x8A1E, 0x8C39, 0x8C3B, 0x8C5C,
+ 0x8C5D, 0x8C7D, 0x8CA5, 0x8D7D, 0x8D7B, 0x8D79, 0x8DBC, 0x8DC2,
+ 0x8DB9, 0x8DBF, 0x8DC1, 0x8ED8, 0x8EDE, 0x8EDD, 0x8EDC, 0x8ED7,
+ 0x8EE0, 0x8EE1, 0x9024, 0x900B, 0x9011, 0x901C, 0x900C, 0x9021,
+ 0x90EF, 0x90EA, 0x90F0, 0x90F4, 0x90F2, 0x90F3, 0x90D4, 0x90EB,
+ 0x90EC, 0x90E9, 0x9156, 0x9158, 0x915A, 0x9153, 0x9155, 0x91EC,
+ 0x91F4, 0x91F1, 0x91F3, 0x91F8, 0x91E4, 0x91F9, 0x91EA, ALTCHR,
+/* 0xD840 - 0xD8FF */
+ 0x91EB, 0x91F7, 0x91E8, 0x91EE, 0x957A, 0x9586, 0x9588, 0x967C,
+ 0x966D, 0x966B, 0x9671, 0x966F, 0x96BF, 0x976A, 0x9804, 0x98E5,
+ 0x9997, 0x509B, 0x5095, 0x5094, 0x509E, 0x508B, 0x50A3, 0x5083,
+ 0x508C, 0x508E, 0x509D, 0x5068, 0x509C, 0x5092, 0x5082, 0x5087,
+ 0x515F, 0x51D4, 0x5312, 0x5311, 0x53A4, 0x53A7, 0x5591, 0x55A8,
+ 0x55A5, 0x55AD, 0x5577, 0x5645, 0x55A2, 0x5593, 0x5588, 0x558F,
+ 0x55B5, 0x5581, 0x55A3, 0x5592, 0x55A4, 0x557D, 0x558C, 0x55A6,
+ 0x557F, 0x5595, 0x55A1, 0x558E, 0x570C, 0x5829, 0x5837, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5819, 0x581E, 0x5827, 0x5823, 0x5828, 0x57F5, 0x5848,
+ 0x5825, 0x581C, 0x581B, 0x5833, 0x583F, 0x5836, 0x582E, 0x5839,
+ 0x5838, 0x582D, 0x582C, 0x583B, 0x5961, 0x5AAF, 0x5A94, 0x5A9F,
+ 0x5A7A, 0x5AA2, 0x5A9E, 0x5A78, 0x5AA6, 0x5A7C, 0x5AA5, 0x5AAC,
+ 0x5A95, 0x5AAE, 0x5A37, 0x5A84, 0x5A8A, 0x5A97, 0x5A83, 0x5A8B,
+ 0x5AA9, 0x5A7B, 0x5A7D, 0x5A8C, 0x5A9C, 0x5A8F, 0x5A93, 0x5A9D,
+ 0x5BEA, 0x5BCD, 0x5BCB, 0x5BD4, 0x5BD1, 0x5BCA, 0x5BCE, 0x5C0C,
+ 0x5C30, 0x5D37, 0x5D43, 0x5D6B, 0x5D41, 0x5D4B, 0x5D3F, 0x5D35,
+ 0x5D51, 0x5D4E, 0x5D55, 0x5D33, 0x5D3A, 0x5D52, 0x5D3D, 0x5D31,
+ 0x5D59, 0x5D42, 0x5D39, 0x5D49, 0x5D38, 0x5D3C, 0x5D32, 0x5D36,
+ 0x5D40, 0x5D45, 0x5E44, 0x5E41, 0x5F58, 0x5FA6, 0x5FA5, 0x5FAB,
+ 0x60C9, 0x60B9, 0x60CC, 0x60E2, 0x60CE, 0x60C4, 0x6114, ALTCHR,
+/* 0xD940 - 0xD9FF */
+ 0x60F2, 0x610A, 0x6116, 0x6105, 0x60F5, 0x6113, 0x60F8, 0x60FC,
+ 0x60FE, 0x60C1, 0x6103, 0x6118, 0x611D, 0x6110, 0x60FF, 0x6104,
+ 0x610B, 0x624A, 0x6394, 0x63B1, 0x63B0, 0x63CE, 0x63E5, 0x63E8,
+ 0x63EF, 0x63C3, 0x649D, 0x63F3, 0x63CA, 0x63E0, 0x63F6, 0x63D5,
+ 0x63F2, 0x63F5, 0x6461, 0x63DF, 0x63BE, 0x63DD, 0x63DC, 0x63C4,
+ 0x63D8, 0x63D3, 0x63C2, 0x63C7, 0x63CC, 0x63CB, 0x63C8, 0x63F0,
+ 0x63D7, 0x63D9, 0x6532, 0x6567, 0x656A, 0x6564, 0x655C, 0x6568,
+ 0x6565, 0x658C, 0x659D, 0x659E, 0x65AE, 0x65D0, 0x65D2, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x667C, 0x666C, 0x667B, 0x6680, 0x6671, 0x6679, 0x666A,
+ 0x6672, 0x6701, 0x690C, 0x68D3, 0x6904, 0x68DC, 0x692A, 0x68EC,
+ 0x68EA, 0x68F1, 0x690F, 0x68D6, 0x68F7, 0x68EB, 0x68E4, 0x68F6,
+ 0x6913, 0x6910, 0x68F3, 0x68E1, 0x6907, 0x68CC, 0x6908, 0x6970,
+ 0x68B4, 0x6911, 0x68EF, 0x68C6, 0x6914, 0x68F8, 0x68D0, 0x68FD,
+ 0x68FC, 0x68E8, 0x690B, 0x690A, 0x6917, 0x68CE, 0x68C8, 0x68DD,
+ 0x68DE, 0x68E6, 0x68F4, 0x68D1, 0x6906, 0x68D4, 0x68E9, 0x6915,
+ 0x6925, 0x68C7, 0x6B39, 0x6B3B, 0x6B3F, 0x6B3C, 0x6B94, 0x6B97,
+ 0x6B99, 0x6B95, 0x6BBD, 0x6BF0, 0x6BF2, 0x6BF3, 0x6C30, 0x6DFC,
+ 0x6E46, 0x6E47, 0x6E1F, 0x6E49, 0x6E88, 0x6E3C, 0x6E3D, 0x6E45,
+ 0x6E62, 0x6E2B, 0x6E3F, 0x6E41, 0x6E5D, 0x6E73, 0x6E1C, 0x6E33,
+ 0x6E4B, 0x6E40, 0x6E51, 0x6E3B, 0x6E03, 0x6E2E, 0x6E5E, ALTCHR,
+/* 0xDA40 - 0xDAFF */
+ 0x6E68, 0x6E5C, 0x6E61, 0x6E31, 0x6E28, 0x6E60, 0x6E71, 0x6E6B,
+ 0x6E39, 0x6E22, 0x6E30, 0x6E53, 0x6E65, 0x6E27, 0x6E78, 0x6E64,
+ 0x6E77, 0x6E55, 0x6E79, 0x6E52, 0x6E66, 0x6E35, 0x6E36, 0x6E5A,
+ 0x7120, 0x711E, 0x712F, 0x70FB, 0x712E, 0x7131, 0x7123, 0x7125,
+ 0x7122, 0x7132, 0x711F, 0x7128, 0x713A, 0x711B, 0x724B, 0x725A,
+ 0x7288, 0x7289, 0x7286, 0x7285, 0x728B, 0x7312, 0x730B, 0x7330,
+ 0x7322, 0x7331, 0x7333, 0x7327, 0x7332, 0x732D, 0x7326, 0x7323,
+ 0x7335, 0x730C, 0x742E, 0x742C, 0x7430, 0x742B, 0x7416, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x741A, 0x7421, 0x742D, 0x7431, 0x7424, 0x7423, 0x741D,
+ 0x7429, 0x7420, 0x7432, 0x74FB, 0x752F, 0x756F, 0x756C, 0x75E7,
+ 0x75DA, 0x75E1, 0x75E6, 0x75DD, 0x75DF, 0x75E4, 0x75D7, 0x7695,
+ 0x7692, 0x76DA, 0x7746, 0x7747, 0x7744, 0x774D, 0x7745, 0x774A,
+ 0x774E, 0x774B, 0x774C, 0x77DE, 0x77EC, 0x7860, 0x7864, 0x7865,
+ 0x785C, 0x786D, 0x7871, 0x786A, 0x786E, 0x7870, 0x7869, 0x7868,
+ 0x785E, 0x7862, 0x7974, 0x7973, 0x7972, 0x7970, 0x7A02, 0x7A0A,
+ 0x7A03, 0x7A0C, 0x7A04, 0x7A99, 0x7AE6, 0x7AE4, 0x7B4A, 0x7B3B,
+ 0x7B44, 0x7B48, 0x7B4C, 0x7B4E, 0x7B40, 0x7B58, 0x7B45, 0x7CA2,
+ 0x7C9E, 0x7CA8, 0x7CA1, 0x7D58, 0x7D6F, 0x7D63, 0x7D53, 0x7D56,
+ 0x7D67, 0x7D6A, 0x7D4F, 0x7D6D, 0x7D5C, 0x7D6B, 0x7D52, 0x7D54,
+ 0x7D69, 0x7D51, 0x7D5F, 0x7D4E, 0x7F3E, 0x7F3F, 0x7F65, ALTCHR,
+/* 0xDB40 - 0xDBFF */
+ 0x7F66, 0x7FA2, 0x7FA0, 0x7FA1, 0x7FD7, 0x8051, 0x804F, 0x8050,
+ 0x80FE, 0x80D4, 0x8143, 0x814A, 0x8152, 0x814F, 0x8147, 0x813D,
+ 0x814D, 0x813A, 0x81E6, 0x81EE, 0x81F7, 0x81F8, 0x81F9, 0x8204,
+ 0x823C, 0x823D, 0x823F, 0x8275, 0x833B, 0x83CF, 0x83F9, 0x8423,
+ 0x83C0, 0x83E8, 0x8412, 0x83E7, 0x83E4, 0x83FC, 0x83F6, 0x8410,
+ 0x83C6, 0x83C8, 0x83EB, 0x83E3, 0x83BF, 0x8401, 0x83DD, 0x83E5,
+ 0x83D8, 0x83FF, 0x83E1, 0x83CB, 0x83CE, 0x83D6, 0x83F5, 0x83C9,
+ 0x8409, 0x840F, 0x83DE, 0x8411, 0x8406, 0x83C2, 0x83F3, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x83D5, 0x83FA, 0x83C7, 0x83D1, 0x83EA, 0x8413, 0x83C3,
+ 0x83EC, 0x83EE, 0x83C4, 0x83FB, 0x83D7, 0x83E2, 0x841B, 0x83DB,
+ 0x83FE, 0x86D8, 0x86E2, 0x86E6, 0x86D3, 0x86E3, 0x86DA, 0x86EA,
+ 0x86DD, 0x86EB, 0x86DC, 0x86EC, 0x86E9, 0x86D7, 0x86E8, 0x86D1,
+ 0x8848, 0x8856, 0x8855, 0x88BA, 0x88D7, 0x88B9, 0x88B8, 0x88C0,
+ 0x88BE, 0x88B6, 0x88BC, 0x88B7, 0x88BD, 0x88B2, 0x8901, 0x88C9,
+ 0x8995, 0x8998, 0x8997, 0x89DD, 0x89DA, 0x89DB, 0x8A4E, 0x8A4D,
+ 0x8A39, 0x8A59, 0x8A40, 0x8A57, 0x8A58, 0x8A44, 0x8A45, 0x8A52,
+ 0x8A48, 0x8A51, 0x8A4A, 0x8A4C, 0x8A4F, 0x8C5F, 0x8C81, 0x8C80,
+ 0x8CBA, 0x8CBE, 0x8CB0, 0x8CB9, 0x8CB5, 0x8D84, 0x8D80, 0x8D89,
+ 0x8DD8, 0x8DD3, 0x8DCD, 0x8DC7, 0x8DD6, 0x8DDC, 0x8DCF, 0x8DD5,
+ 0x8DD9, 0x8DC8, 0x8DD7, 0x8DC5, 0x8EEF, 0x8EF7, 0x8EFA, ALTCHR,
+/* 0xDC40 - 0xDCFF */
+ 0x8EF9, 0x8EE6, 0x8EEE, 0x8EE5, 0x8EF5, 0x8EE7, 0x8EE8, 0x8EF6,
+ 0x8EEB, 0x8EF1, 0x8EEC, 0x8EF4, 0x8EE9, 0x902D, 0x9034, 0x902F,
+ 0x9106, 0x912C, 0x9104, 0x90FF, 0x90FC, 0x9108, 0x90F9, 0x90FB,
+ 0x9101, 0x9100, 0x9107, 0x9105, 0x9103, 0x9161, 0x9164, 0x915F,
+ 0x9162, 0x9160, 0x9201, 0x920A, 0x9225, 0x9203, 0x921A, 0x9226,
+ 0x920F, 0x920C, 0x9200, 0x9212, 0x91FF, 0x91FD, 0x9206, 0x9204,
+ 0x9227, 0x9202, 0x921C, 0x9224, 0x9219, 0x9217, 0x9205, 0x9216,
+ 0x957B, 0x958D, 0x958C, 0x9590, 0x9687, 0x967E, 0x9688, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9689, 0x9683, 0x9680, 0x96C2, 0x96C8, 0x96C3, 0x96F1,
+ 0x96F0, 0x976C, 0x9770, 0x976E, 0x9807, 0x98A9, 0x98EB, 0x9CE6,
+ 0x9EF9, 0x4E83, 0x4E84, 0x4EB6, 0x50BD, 0x50BF, 0x50C6, 0x50AE,
+ 0x50C4, 0x50CA, 0x50B4, 0x50C8, 0x50C2, 0x50B0, 0x50C1, 0x50BA,
+ 0x50B1, 0x50CB, 0x50C9, 0x50B6, 0x50B8, 0x51D7, 0x527A, 0x5278,
+ 0x527B, 0x527C, 0x55C3, 0x55DB, 0x55CC, 0x55D0, 0x55CB, 0x55CA,
+ 0x55DD, 0x55C0, 0x55D4, 0x55C4, 0x55E9, 0x55BF, 0x55D2, 0x558D,
+ 0x55CF, 0x55D5, 0x55E2, 0x55D6, 0x55C8, 0x55F2, 0x55CD, 0x55D9,
+ 0x55C2, 0x5714, 0x5853, 0x5868, 0x5864, 0x584F, 0x584D, 0x5849,
+ 0x586F, 0x5855, 0x584E, 0x585D, 0x5859, 0x5865, 0x585B, 0x583D,
+ 0x5863, 0x5871, 0x58FC, 0x5AC7, 0x5AC4, 0x5ACB, 0x5ABA, 0x5AB8,
+ 0x5AB1, 0x5AB5, 0x5AB0, 0x5ABF, 0x5AC8, 0x5ABB, 0x5AC6, ALTCHR,
+/* 0xDD40 - 0xDDFF */
+ 0x5AB7, 0x5AC0, 0x5ACA, 0x5AB4, 0x5AB6, 0x5ACD, 0x5AB9, 0x5A90,
+ 0x5BD6, 0x5BD8, 0x5BD9, 0x5C1F, 0x5C33, 0x5D71, 0x5D63, 0x5D4A,
+ 0x5D65, 0x5D72, 0x5D6C, 0x5D5E, 0x5D68, 0x5D67, 0x5D62, 0x5DF0,
+ 0x5E4F, 0x5E4E, 0x5E4A, 0x5E4D, 0x5E4B, 0x5EC5, 0x5ECC, 0x5EC6,
+ 0x5ECB, 0x5EC7, 0x5F40, 0x5FAF, 0x5FAD, 0x60F7, 0x6149, 0x614A,
+ 0x612B, 0x6145, 0x6136, 0x6132, 0x612E, 0x6146, 0x612F, 0x614F,
+ 0x6129, 0x6140, 0x6220, 0x9168, 0x6223, 0x6225, 0x6224, 0x63C5,
+ 0x63F1, 0x63EB, 0x6410, 0x6412, 0x6409, 0x6420, 0x6424, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6433, 0x6443, 0x641F, 0x6415, 0x6418, 0x6439, 0x6437,
+ 0x6422, 0x6423, 0x640C, 0x6426, 0x6430, 0x6428, 0x6441, 0x6435,
+ 0x642F, 0x640A, 0x641A, 0x6440, 0x6425, 0x6427, 0x640B, 0x63E7,
+ 0x641B, 0x642E, 0x6421, 0x640E, 0x656F, 0x6592, 0x65D3, 0x6686,
+ 0x668C, 0x6695, 0x6690, 0x668B, 0x668A, 0x6699, 0x6694, 0x6678,
+ 0x6720, 0x6966, 0x695F, 0x6938, 0x694E, 0x6962, 0x6971, 0x693F,
+ 0x6945, 0x696A, 0x6939, 0x6942, 0x6957, 0x6959, 0x697A, 0x6948,
+ 0x6949, 0x6935, 0x696C, 0x6933, 0x693D, 0x6965, 0x68F0, 0x6978,
+ 0x6934, 0x6969, 0x6940, 0x696F, 0x6944, 0x6976, 0x6958, 0x6941,
+ 0x6974, 0x694C, 0x693B, 0x694B, 0x6937, 0x695C, 0x694F, 0x6951,
+ 0x6932, 0x6952, 0x692F, 0x697B, 0x693C, 0x6B46, 0x6B45, 0x6B43,
+ 0x6B42, 0x6B48, 0x6B41, 0x6B9B, 0xFA0D, 0x6BFB, 0x6BFC, ALTCHR,
+/* 0xDE40 - 0xDEFF */
+ 0x6BF9, 0x6BF7, 0x6BF8, 0x6E9B, 0x6ED6, 0x6EC8, 0x6E8F, 0x6EC0,
+ 0x6E9F, 0x6E93, 0x6E94, 0x6EA0, 0x6EB1, 0x6EB9, 0x6EC6, 0x6ED2,
+ 0x6EBD, 0x6EC1, 0x6E9E, 0x6EC9, 0x6EB7, 0x6EB0, 0x6ECD, 0x6EA6,
+ 0x6ECF, 0x6EB2, 0x6EBE, 0x6EC3, 0x6EDC, 0x6ED8, 0x6E99, 0x6E92,
+ 0x6E8E, 0x6E8D, 0x6EA4, 0x6EA1, 0x6EBF, 0x6EB3, 0x6ED0, 0x6ECA,
+ 0x6E97, 0x6EAE, 0x6EA3, 0x7147, 0x7154, 0x7152, 0x7163, 0x7160,
+ 0x7141, 0x715D, 0x7162, 0x7172, 0x7178, 0x716A, 0x7161, 0x7142,
+ 0x7158, 0x7143, 0x714B, 0x7170, 0x715F, 0x7150, 0x7153, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7144, 0x714D, 0x715A, 0x724F, 0x728D, 0x728C, 0x7291,
+ 0x7290, 0x728E, 0x733C, 0x7342, 0x733B, 0x733A, 0x7340, 0x734A,
+ 0x7349, 0x7444, 0x744A, 0x744B, 0x7452, 0x7451, 0x7457, 0x7440,
+ 0x744F, 0x7450, 0x744E, 0x7442, 0x7446, 0x744D, 0x7454, 0x74E1,
+ 0x74FF, 0x74FE, 0x74FD, 0x751D, 0x7579, 0x7577, 0x6983, 0x75EF,
+ 0x760F, 0x7603, 0x75F7, 0x75FE, 0x75FC, 0x75F9, 0x75F8, 0x7610,
+ 0x75FB, 0x75F6, 0x75ED, 0x75F5, 0x75FD, 0x7699, 0x76B5, 0x76DD,
+ 0x7755, 0x775F, 0x7760, 0x7752, 0x7756, 0x775A, 0x7769, 0x7767,
+ 0x7754, 0x7759, 0x776D, 0x77E0, 0x7887, 0x789A, 0x7894, 0x788F,
+ 0x7884, 0x7895, 0x7885, 0x7886, 0x78A1, 0x7883, 0x7879, 0x7899,
+ 0x7880, 0x7896, 0x787B, 0x797C, 0x7982, 0x797D, 0x7979, 0x7A11,
+ 0x7A18, 0x7A19, 0x7A12, 0x7A17, 0x7A15, 0x7A22, 0x7A13, ALTCHR,
+/* 0xDF40 - 0xDFFF */
+ 0x7A1B, 0x7A10, 0x7AA3, 0x7AA2, 0x7A9E, 0x7AEB, 0x7B66, 0x7B64,
+ 0x7B6D, 0x7B74, 0x7B69, 0x7B72, 0x7B65, 0x7B73, 0x7B71, 0x7B70,
+ 0x7B61, 0x7B78, 0x7B76, 0x7B63, 0x7CB2, 0x7CB4, 0x7CAF, 0x7D88,
+ 0x7D86, 0x7D80, 0x7D8D, 0x7D7F, 0x7D85, 0x7D7A, 0x7D8E, 0x7D7B,
+ 0x7D83, 0x7D7C, 0x7D8C, 0x7D94, 0x7D84, 0x7D7D, 0x7D92, 0x7F6D,
+ 0x7F6B, 0x7F67, 0x7F68, 0x7F6C, 0x7FA6, 0x7FA5, 0x7FA7, 0x7FDB,
+ 0x7FDC, 0x8021, 0x8164, 0x8160, 0x8177, 0x815C, 0x8169, 0x815B,
+ 0x8162, 0x8172, 0x6721, 0x815E, 0x8176, 0x8167, 0x816F, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8144, 0x8161, 0x821D, 0x8249, 0x8244, 0x8240, 0x8242,
+ 0x8245, 0x84F1, 0x843F, 0x8456, 0x8476, 0x8479, 0x848F, 0x848D,
+ 0x8465, 0x8451, 0x8440, 0x8486, 0x8467, 0x8430, 0x844D, 0x847D,
+ 0x845A, 0x8459, 0x8474, 0x8473, 0x845D, 0x8507, 0x845E, 0x8437,
+ 0x843A, 0x8434, 0x847A, 0x8443, 0x8478, 0x8432, 0x8445, 0x8429,
+ 0x83D9, 0x844B, 0x842F, 0x8442, 0x842D, 0x845F, 0x8470, 0x8439,
+ 0x844E, 0x844C, 0x8452, 0x846F, 0x84C5, 0x848E, 0x843B, 0x8447,
+ 0x8436, 0x8433, 0x8468, 0x847E, 0x8444, 0x842B, 0x8460, 0x8454,
+ 0x846E, 0x8450, 0x870B, 0x8704, 0x86F7, 0x870C, 0x86FA, 0x86D6,
+ 0x86F5, 0x874D, 0x86F8, 0x870E, 0x8709, 0x8701, 0x86F6, 0x870D,
+ 0x8705, 0x88D6, 0x88CB, 0x88CD, 0x88CE, 0x88DE, 0x88DB, 0x88DA,
+ 0x88CC, 0x88D0, 0x8985, 0x899B, 0x89DF, 0x89E5, 0x89E4, ALTCHR,
+/* 0xE040 - 0xE0FF */
+ 0x89E1, 0x89E0, 0x89E2, 0x89DC, 0x89E6, 0x8A76, 0x8A86, 0x8A7F,
+ 0x8A61, 0x8A3F, 0x8A77, 0x8A82, 0x8A84, 0x8A75, 0x8A83, 0x8A81,
+ 0x8A74, 0x8A7A, 0x8C3C, 0x8C4B, 0x8C4A, 0x8C65, 0x8C64, 0x8C66,
+ 0x8C86, 0x8C84, 0x8C85, 0x8CCC, 0x8D68, 0x8D69, 0x8D91, 0x8D8C,
+ 0x8D8E, 0x8D8F, 0x8D8D, 0x8D93, 0x8D94, 0x8D90, 0x8D92, 0x8DF0,
+ 0x8DE0, 0x8DEC, 0x8DF1, 0x8DEE, 0x8DD0, 0x8DE9, 0x8DE3, 0x8DE2,
+ 0x8DE7, 0x8DF2, 0x8DEB, 0x8DF4, 0x8F06, 0x8EFF, 0x8F01, 0x8F00,
+ 0x8F05, 0x8F07, 0x8F08, 0x8F02, 0x8F0B, 0x9052, 0x903F, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9044, 0x9049, 0x903D, 0x9110, 0x910D, 0x910F, 0x9111,
+ 0x9116, 0x9114, 0x910B, 0x910E, 0x916E, 0x916F, 0x9248, 0x9252,
+ 0x9230, 0x923A, 0x9266, 0x9233, 0x9265, 0x925E, 0x9283, 0x922E,
+ 0x924A, 0x9246, 0x926D, 0x926C, 0x924F, 0x9260, 0x9267, 0x926F,
+ 0x9236, 0x9261, 0x9270, 0x9231, 0x9254, 0x9263, 0x9250, 0x9272,
+ 0x924E, 0x9253, 0x924C, 0x9256, 0x9232, 0x959F, 0x959C, 0x959E,
+ 0x959B, 0x9692, 0x9693, 0x9691, 0x9697, 0x96CE, 0x96FA, 0x96FD,
+ 0x96F8, 0x96F5, 0x9773, 0x9777, 0x9778, 0x9772, 0x980F, 0x980D,
+ 0x980E, 0x98AC, 0x98F6, 0x98F9, 0x99AF, 0x99B2, 0x99B0, 0x99B5,
+ 0x9AAD, 0x9AAB, 0x9B5B, 0x9CEA, 0x9CED, 0x9CE7, 0x9E80, 0x9EFD,
+ 0x50E6, 0x50D4, 0x50D7, 0x50E8, 0x50F3, 0x50DB, 0x50EA, 0x50DD,
+ 0x50E4, 0x50D3, 0x50EC, 0x50F0, 0x50EF, 0x50E3, 0x50E0, ALTCHR,
+/* 0xE140 - 0xE1FF */
+ 0x51D8, 0x5280, 0x5281, 0x52E9, 0x52EB, 0x5330, 0x53AC, 0x5627,
+ 0x5615, 0x560C, 0x5612, 0x55FC, 0x560F, 0x561C, 0x5601, 0x5613,
+ 0x5602, 0x55FA, 0x561D, 0x5604, 0x55FF, 0x55F9, 0x5889, 0x587C,
+ 0x5890, 0x5898, 0x5886, 0x5881, 0x587F, 0x5874, 0x588B, 0x587A,
+ 0x5887, 0x5891, 0x588E, 0x5876, 0x5882, 0x5888, 0x587B, 0x5894,
+ 0x588F, 0x58FE, 0x596B, 0x5ADC, 0x5AEE, 0x5AE5, 0x5AD5, 0x5AEA,
+ 0x5ADA, 0x5AED, 0x5AEB, 0x5AF3, 0x5AE2, 0x5AE0, 0x5ADB, 0x5AEC,
+ 0x5ADE, 0x5ADD, 0x5AD9, 0x5AE8, 0x5ADF, 0x5B77, 0x5BE0, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5BE3, 0x5C63, 0x5D82, 0x5D80, 0x5D7D, 0x5D86, 0x5D7A,
+ 0x5D81, 0x5D77, 0x5D8A, 0x5D89, 0x5D88, 0x5D7E, 0x5D7C, 0x5D8D,
+ 0x5D79, 0x5D7F, 0x5E58, 0x5E59, 0x5E53, 0x5ED8, 0x5ED1, 0x5ED7,
+ 0x5ECE, 0x5EDC, 0x5ED5, 0x5ED9, 0x5ED2, 0x5ED4, 0x5F44, 0x5F43,
+ 0x5F6F, 0x5FB6, 0x612C, 0x6128, 0x6141, 0x615E, 0x6171, 0x6173,
+ 0x6152, 0x6153, 0x6172, 0x616C, 0x6180, 0x6174, 0x6154, 0x617A,
+ 0x615B, 0x6165, 0x613B, 0x616A, 0x6161, 0x6156, 0x6229, 0x6227,
+ 0x622B, 0x642B, 0x644D, 0x645B, 0x645D, 0x6474, 0x6476, 0x6472,
+ 0x6473, 0x647D, 0x6475, 0x6466, 0x64A6, 0x644E, 0x6482, 0x645E,
+ 0x645C, 0x644B, 0x6453, 0x6460, 0x6450, 0x647F, 0x643F, 0x646C,
+ 0x646B, 0x6459, 0x6465, 0x6477, 0x6573, 0x65A0, 0x66A1, 0x66A0,
+ 0x669F, 0x6705, 0x6704, 0x6722, 0x69B1, 0x69B6, 0x69C9, ALTCHR,
+/* 0xE240 - 0xE2FF */
+ 0x69A0, 0x69CE, 0x6996, 0x69B0, 0x69AC, 0x69BC, 0x6991, 0x6999,
+ 0x698E, 0x69A7, 0x698D, 0x69A9, 0x69BE, 0x69AF, 0x69BF, 0x69C4,
+ 0x69BD, 0x69A4, 0x69D4, 0x69B9, 0x69CA, 0x699A, 0x69CF, 0x69B3,
+ 0x6993, 0x69AA, 0x69A1, 0x699E, 0x69D9, 0x6997, 0x6990, 0x69C2,
+ 0x69B5, 0x69A5, 0x69C6, 0x6B4A, 0x6B4D, 0x6B4B, 0x6B9E, 0x6B9F,
+ 0x6BA0, 0x6BC3, 0x6BC4, 0x6BFE, 0x6ECE, 0x6EF5, 0x6EF1, 0x6F03,
+ 0x6F25, 0x6EF8, 0x6F37, 0x6EFB, 0x6F2E, 0x6F09, 0x6F4E, 0x6F19,
+ 0x6F1A, 0x6F27, 0x6F18, 0x6F3B, 0x6F12, 0x6EED, 0x6F0A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6F36, 0x6F73, 0x6EF9, 0x6EEE, 0x6F2D, 0x6F40, 0x6F30,
+ 0x6F3C, 0x6F35, 0x6EEB, 0x6F07, 0x6F0E, 0x6F43, 0x6F05, 0x6EFD,
+ 0x6EF6, 0x6F39, 0x6F1C, 0x6EFC, 0x6F3A, 0x6F1F, 0x6F0D, 0x6F1E,
+ 0x6F08, 0x6F21, 0x7187, 0x7190, 0x7189, 0x7180, 0x7185, 0x7182,
+ 0x718F, 0x717B, 0x7186, 0x7181, 0x7197, 0x7244, 0x7253, 0x7297,
+ 0x7295, 0x7293, 0x7343, 0x734D, 0x7351, 0x734C, 0x7462, 0x7473,
+ 0x7471, 0x7475, 0x7472, 0x7467, 0x746E, 0x7500, 0x7502, 0x7503,
+ 0x757D, 0x7590, 0x7616, 0x7608, 0x760C, 0x7615, 0x7611, 0x760A,
+ 0x7614, 0x76B8, 0x7781, 0x777C, 0x7785, 0x7782, 0x776E, 0x7780,
+ 0x776F, 0x777E, 0x7783, 0x78B2, 0x78AA, 0x78B4, 0x78AD, 0x78A8,
+ 0x787E, 0x78AB, 0x789E, 0x78A5, 0x78A0, 0x78AC, 0x78A2, 0x78A4,
+ 0x7998, 0x798A, 0x798B, 0x7996, 0x7995, 0x7994, 0x7993, ALTCHR,
+/* 0xE340 - 0xE3FF */
+ 0x7997, 0x7988, 0x7992, 0x7990, 0x7A2B, 0x7A4A, 0x7A30, 0x7A2F,
+ 0x7A28, 0x7A26, 0x7AA8, 0x7AAB, 0x7AAC, 0x7AEE, 0x7B88, 0x7B9C,
+ 0x7B8A, 0x7B91, 0x7B90, 0x7B96, 0x7B8D, 0x7B8C, 0x7B9B, 0x7B8E,
+ 0x7B85, 0x7B98, 0x5284, 0x7B99, 0x7BA4, 0x7B82, 0x7CBB, 0x7CBF,
+ 0x7CBC, 0x7CBA, 0x7DA7, 0x7DB7, 0x7DC2, 0x7DA3, 0x7DAA, 0x7DC1,
+ 0x7DC0, 0x7DC5, 0x7D9D, 0x7DCE, 0x7DC4, 0x7DC6, 0x7DCB, 0x7DCC,
+ 0x7DAF, 0x7DB9, 0x7D96, 0x7DBC, 0x7D9F, 0x7DA6, 0x7DAE, 0x7DA9,
+ 0x7DA1, 0x7DC9, 0x7F73, 0x7FE2, 0x7FE3, 0x7FE5, 0x7FDE, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8024, 0x805D, 0x805C, 0x8189, 0x8186, 0x8183, 0x8187,
+ 0x818D, 0x818C, 0x818B, 0x8215, 0x8497, 0x84A4, 0x84A1, 0x849F,
+ 0x84BA, 0x84CE, 0x84C2, 0x84AC, 0x84AE, 0x84AB, 0x84B9, 0x84B4,
+ 0x84C1, 0x84CD, 0x84AA, 0x849A, 0x84B1, 0x84D0, 0x849D, 0x84A7,
+ 0x84BB, 0x84A2, 0x8494, 0x84C7, 0x84CC, 0x849B, 0x84A9, 0x84AF,
+ 0x84A8, 0x84D6, 0x8498, 0x84B6, 0x84CF, 0x84A0, 0x84D7, 0x84D4,
+ 0x84D2, 0x84DB, 0x84B0, 0x8491, 0x8661, 0x8733, 0x8723, 0x8728,
+ 0x876B, 0x8740, 0x872E, 0x871E, 0x8721, 0x8719, 0x871B, 0x8743,
+ 0x872C, 0x8741, 0x873E, 0x8746, 0x8720, 0x8732, 0x872A, 0x872D,
+ 0x873C, 0x8712, 0x873A, 0x8731, 0x8735, 0x8742, 0x8726, 0x8727,
+ 0x8738, 0x8724, 0x871A, 0x8730, 0x8711, 0x88F7, 0x88E7, 0x88F1,
+ 0x88F2, 0x88FA, 0x88FE, 0x88EE, 0x88FC, 0x88F6, 0x88FB, ALTCHR,
+/* 0xE440 - 0xE4FF */
+ 0x88F0, 0x88EC, 0x88EB, 0x899D, 0x89A1, 0x899F, 0x899E, 0x89E9,
+ 0x89EB, 0x89E8, 0x8AAB, 0x8A99, 0x8A8B, 0x8A92, 0x8A8F, 0x8A96,
+ 0x8C3D, 0x8C68, 0x8C69, 0x8CD5, 0x8CCF, 0x8CD7, 0x8D96, 0x8E09,
+ 0x8E02, 0x8DFF, 0x8E0D, 0x8DFD, 0x8E0A, 0x8E03, 0x8E07, 0x8E06,
+ 0x8E05, 0x8DFE, 0x8E00, 0x8E04, 0x8F10, 0x8F11, 0x8F0E, 0x8F0D,
+ 0x9123, 0x911C, 0x9120, 0x9122, 0x911F, 0x911D, 0x911A, 0x9124,
+ 0x9121, 0x911B, 0x917A, 0x9172, 0x9179, 0x9173, 0x92A5, 0x92A4,
+ 0x9276, 0x929B, 0x927A, 0x92A0, 0x9294, 0x92AA, 0x928D, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x92A6, 0x929A, 0x92AB, 0x9279, 0x9297, 0x927F, 0x92A3,
+ 0x92EE, 0x928E, 0x9282, 0x9295, 0x92A2, 0x927D, 0x9288, 0x92A1,
+ 0x928A, 0x9286, 0x928C, 0x9299, 0x92A7, 0x927E, 0x9287, 0x92A9,
+ 0x929D, 0x928B, 0x922D, 0x969E, 0x96A1, 0x96FF, 0x9758, 0x977D,
+ 0x977A, 0x977E, 0x9783, 0x9780, 0x9782, 0x977B, 0x9784, 0x9781,
+ 0x977F, 0x97CE, 0x97CD, 0x9816, 0x98AD, 0x98AE, 0x9902, 0x9900,
+ 0x9907, 0x999D, 0x999C, 0x99C3, 0x99B9, 0x99BB, 0x99BA, 0x99C2,
+ 0x99BD, 0x99C7, 0x9AB1, 0x9AE3, 0x9AE7, 0x9B3E, 0x9B3F, 0x9B60,
+ 0x9B61, 0x9B5F, 0x9CF1, 0x9CF2, 0x9CF5, 0x9EA7, 0x50FF, 0x5103,
+ 0x5130, 0x50F8, 0x5106, 0x5107, 0x50F6, 0x50FE, 0x510B, 0x510C,
+ 0x50FD, 0x510A, 0x528B, 0x528C, 0x52F1, 0x52EF, 0x5648, 0x5642,
+ 0x564C, 0x5635, 0x5641, 0x564A, 0x5649, 0x5646, 0x5658, ALTCHR,
+/* 0xE540 - 0xE5FF */
+ 0x565A, 0x5640, 0x5633, 0x563D, 0x562C, 0x563E, 0x5638, 0x562A,
+ 0x563A, 0x571A, 0x58AB, 0x589D, 0x58B1, 0x58A0, 0x58A3, 0x58AF,
+ 0x58AC, 0x58A5, 0x58A1, 0x58FF, 0x5AFF, 0x5AF4, 0x5AFD, 0x5AF7,
+ 0x5AF6, 0x5B03, 0x5AF8, 0x5B02, 0x5AF9, 0x5B01, 0x5B07, 0x5B05,
+ 0x5B0F, 0x5C67, 0x5D99, 0x5D97, 0x5D9F, 0x5D92, 0x5DA2, 0x5D93,
+ 0x5D95, 0x5DA0, 0x5D9C, 0x5DA1, 0x5D9A, 0x5D9E, 0x5E69, 0x5E5D,
+ 0x5E60, 0x5E5C, 0x7DF3, 0x5EDB, 0x5EDE, 0x5EE1, 0x5F49, 0x5FB2,
+ 0x618B, 0x6183, 0x6179, 0x61B1, 0x61B0, 0x61A2, 0x6189, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x619B, 0x6193, 0x61AF, 0x61AD, 0x619F, 0x6192, 0x61AA,
+ 0x61A1, 0x618D, 0x6166, 0x61B3, 0x622D, 0x646E, 0x6470, 0x6496,
+ 0x64A0, 0x6485, 0x6497, 0x649C, 0x648F, 0x648B, 0x648A, 0x648C,
+ 0x64A3, 0x649F, 0x6468, 0x64B1, 0x6498, 0x6576, 0x657A, 0x6579,
+ 0x657B, 0x65B2, 0x65B3, 0x66B5, 0x66B0, 0x66A9, 0x66B2, 0x66B7,
+ 0x66AA, 0x66AF, 0x6A00, 0x6A06, 0x6A17, 0x69E5, 0x69F8, 0x6A15,
+ 0x69F1, 0x69E4, 0x6A20, 0x69FF, 0x69EC, 0x69E2, 0x6A1B, 0x6A1D,
+ 0x69FE, 0x6A27, 0x69F2, 0x69EE, 0x6A14, 0x69F7, 0x69E7, 0x6A40,
+ 0x6A08, 0x69E6, 0x69FB, 0x6A0D, 0x69FC, 0x69EB, 0x6A09, 0x6A04,
+ 0x6A18, 0x6A25, 0x6A0F, 0x69F6, 0x6A26, 0x6A07, 0x69F4, 0x6A16,
+ 0x6B51, 0x6BA5, 0x6BA3, 0x6BA2, 0x6BA6, 0x6C01, 0x6C00, 0x6BFF,
+ 0x6C02, 0x6F41, 0x6F26, 0x6F7E, 0x6F87, 0x6FC6, 0x6F92, ALTCHR,
+/* 0xE640 - 0xE6FF */
+ 0x6F8D, 0x6F89, 0x6F8C, 0x6F62, 0x6F4F, 0x6F85, 0x6F5A, 0x6F96,
+ 0x6F76, 0x6F6C, 0x6F82, 0x6F55, 0x6F72, 0x6F52, 0x6F50, 0x6F57,
+ 0x6F94, 0x6F93, 0x6F5D, 0x6F00, 0x6F61, 0x6F6B, 0x6F7D, 0x6F67,
+ 0x6F90, 0x6F53, 0x6F8B, 0x6F69, 0x6F7F, 0x6F95, 0x6F63, 0x6F77,
+ 0x6F6A, 0x6F7B, 0x71B2, 0x71AF, 0x719B, 0x71B0, 0x71A0, 0x719A,
+ 0x71A9, 0x71B5, 0x719D, 0x71A5, 0x719E, 0x71A4, 0x71A1, 0x71AA,
+ 0x719C, 0x71A7, 0x71B3, 0x7298, 0x729A, 0x7358, 0x7352, 0x735E,
+ 0x735F, 0x7360, 0x735D, 0x735B, 0x7361, 0x735A, 0x7359, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7362, 0x7487, 0x7489, 0x748A, 0x7486, 0x7481, 0x747D,
+ 0x7485, 0x7488, 0x747C, 0x7479, 0x7508, 0x7507, 0x757E, 0x7625,
+ 0x761E, 0x7619, 0x761D, 0x761C, 0x7623, 0x761A, 0x7628, 0x761B,
+ 0x769C, 0x769D, 0x769E, 0x769B, 0x778D, 0x778F, 0x7789, 0x7788,
+ 0x78CD, 0x78BB, 0x78CF, 0x78CC, 0x78D1, 0x78CE, 0x78D4, 0x78C8,
+ 0x78C3, 0x78C4, 0x78C9, 0x799A, 0x79A1, 0x79A0, 0x799C, 0x79A2,
+ 0x799B, 0x6B76, 0x7A39, 0x7AB2, 0x7AB4, 0x7AB3, 0x7BB7, 0x7BCB,
+ 0x7BBE, 0x7BAC, 0x7BCE, 0x7BAF, 0x7BB9, 0x7BCA, 0x7BB5, 0x7CC5,
+ 0x7CC8, 0x7CCC, 0x7CCB, 0x7DF7, 0x7DDB, 0x7DEA, 0x7DE7, 0x7DD7,
+ 0x7DE1, 0x7E03, 0x7DFA, 0x7DE6, 0x7DF6, 0x7DF1, 0x7DF0, 0x7DEE,
+ 0x7DDF, 0x7F76, 0x7FAC, 0x7FB0, 0x7FAD, 0x7FED, 0x7FEB, 0x7FEA,
+ 0x7FEC, 0x7FE6, 0x7FE8, 0x8064, 0x8067, 0x81A3, 0x819F, ALTCHR,
+/* 0xE740 - 0xE7FF */
+ 0x819E, 0x8195, 0x81A2, 0x8199, 0x8197, 0x8216, 0x824F, 0x8253,
+ 0x8252, 0x8250, 0x824E, 0x8251, 0x8524, 0x853B, 0x850F, 0x8500,
+ 0x8529, 0x850E, 0x8509, 0x850D, 0x851F, 0x850A, 0x8527, 0x851C,
+ 0x84FB, 0x852B, 0x84FA, 0x8508, 0x850C, 0x84F4, 0x852A, 0x84F2,
+ 0x8515, 0x84F7, 0x84EB, 0x84F3, 0x84FC, 0x8512, 0x84EA, 0x84E9,
+ 0x8516, 0x84FE, 0x8528, 0x851D, 0x852E, 0x8502, 0x84FD, 0x851E,
+ 0x84F6, 0x8531, 0x8526, 0x84E7, 0x84E8, 0x84F0, 0x84EF, 0x84F9,
+ 0x8518, 0x8520, 0x8530, 0x850B, 0x8519, 0x852F, 0x8662, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8756, 0x8763, 0x8764, 0x8777, 0x87E1, 0x8773, 0x8758,
+ 0x8754, 0x875B, 0x8752, 0x8761, 0x875A, 0x8751, 0x875E, 0x876D,
+ 0x876A, 0x8750, 0x874E, 0x875F, 0x875D, 0x876F, 0x876C, 0x877A,
+ 0x876E, 0x875C, 0x8765, 0x874F, 0x877B, 0x8775, 0x8762, 0x8767,
+ 0x8769, 0x885A, 0x8905, 0x890C, 0x8914, 0x890B, 0x8917, 0x8918,
+ 0x8919, 0x8906, 0x8916, 0x8911, 0x890E, 0x8909, 0x89A2, 0x89A4,
+ 0x89A3, 0x89ED, 0x89F0, 0x89EC, 0x8ACF, 0x8AC6, 0x8AB8, 0x8AD3,
+ 0x8AD1, 0x8AD4, 0x8AD5, 0x8ABB, 0x8AD7, 0x8ABE, 0x8AC0, 0x8AC5,
+ 0x8AD8, 0x8AC3, 0x8ABA, 0x8ABD, 0x8AD9, 0x8C3E, 0x8C4D, 0x8C8F,
+ 0x8CE5, 0x8CDF, 0x8CD9, 0x8CE8, 0x8CDA, 0x8CDD, 0x8CE7, 0x8DA0,
+ 0x8D9C, 0x8DA1, 0x8D9B, 0x8E20, 0x8E23, 0x8E25, 0x8E24, 0x8E2E,
+ 0x8E15, 0x8E1B, 0x8E16, 0x8E11, 0x8E19, 0x8E26, 0x8E27, ALTCHR,
+/* 0xE840 - 0xE8FF */
+ 0x8E14, 0x8E12, 0x8E18, 0x8E13, 0x8E1C, 0x8E17, 0x8E1A, 0x8F2C,
+ 0x8F24, 0x8F18, 0x8F1A, 0x8F20, 0x8F23, 0x8F16, 0x8F17, 0x9073,
+ 0x9070, 0x906F, 0x9067, 0x906B, 0x912F, 0x912B, 0x9129, 0x912A,
+ 0x9132, 0x9126, 0x912E, 0x9185, 0x9186, 0x918A, 0x9181, 0x9182,
+ 0x9184, 0x9180, 0x92D0, 0x92C3, 0x92C4, 0x92C0, 0x92D9, 0x92B6,
+ 0x92CF, 0x92F1, 0x92DF, 0x92D8, 0x92E9, 0x92D7, 0x92DD, 0x92CC,
+ 0x92EF, 0x92C2, 0x92E8, 0x92CA, 0x92C8, 0x92CE, 0x92E6, 0x92CD,
+ 0x92D5, 0x92C9, 0x92E0, 0x92DE, 0x92E7, 0x92D1, 0x92D3, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x92B5, 0x92E1, 0x92C6, 0x92B4, 0x957C, 0x95AC, 0x95AB,
+ 0x95AE, 0x95B0, 0x96A4, 0x96A2, 0x96D3, 0x9705, 0x9708, 0x9702,
+ 0x975A, 0x978A, 0x978E, 0x9788, 0x97D0, 0x97CF, 0x981E, 0x981D,
+ 0x9826, 0x9829, 0x9828, 0x9820, 0x981B, 0x9827, 0x98B2, 0x9908,
+ 0x98FA, 0x9911, 0x9914, 0x9916, 0x9917, 0x9915, 0x99DC, 0x99CD,
+ 0x99CF, 0x99D3, 0x99D4, 0x99CE, 0x99C9, 0x99D6, 0x99D8, 0x99CB,
+ 0x99D7, 0x99CC, 0x9AB3, 0x9AEC, 0x9AEB, 0x9AF3, 0x9AF2, 0x9AF1,
+ 0x9B46, 0x9B43, 0x9B67, 0x9B74, 0x9B71, 0x9B66, 0x9B76, 0x9B75,
+ 0x9B70, 0x9B68, 0x9B64, 0x9B6C, 0x9CFC, 0x9CFA, 0x9CFD, 0x9CFF,
+ 0x9CF7, 0x9D07, 0x9D00, 0x9CF9, 0x9CFB, 0x9D08, 0x9D05, 0x9D04,
+ 0x9E83, 0x9ED3, 0x9F0F, 0x9F10, 0x511C, 0x5113, 0x5117, 0x511A,
+ 0x5111, 0x51DE, 0x5334, 0x53E1, 0x5670, 0x5660, 0x566E, ALTCHR,
+/* 0xE940 - 0xE9FF */
+ 0x5673, 0x5666, 0x5663, 0x566D, 0x5672, 0x565E, 0x5677, 0x571C,
+ 0x571B, 0x58C8, 0x58BD, 0x58C9, 0x58BF, 0x58BA, 0x58C2, 0x58BC,
+ 0x58C6, 0x5B17, 0x5B19, 0x5B1B, 0x5B21, 0x5B14, 0x5B13, 0x5B10,
+ 0x5B16, 0x5B28, 0x5B1A, 0x5B20, 0x5B1E, 0x5BEF, 0x5DAC, 0x5DB1,
+ 0x5DA9, 0x5DA7, 0x5DB5, 0x5DB0, 0x5DAE, 0x5DAA, 0x5DA8, 0x5DB2,
+ 0x5DAD, 0x5DAF, 0x5DB4, 0x5E67, 0x5E68, 0x5E66, 0x5E6F, 0x5EE9,
+ 0x5EE7, 0x5EE6, 0x5EE8, 0x5EE5, 0x5F4B, 0x5FBC, 0x619D, 0x61A8,
+ 0x6196, 0x61C5, 0x61B4, 0x61C6, 0x61C1, 0x61CC, 0x61BA, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x61BF, 0x61B8, 0x618C, 0x64D7, 0x64D6, 0x64D0, 0x64CF,
+ 0x64C9, 0x64BD, 0x6489, 0x64C3, 0x64DB, 0x64F3, 0x64D9, 0x6533,
+ 0x657F, 0x657C, 0x65A2, 0x66C8, 0x66BE, 0x66C0, 0x66CA, 0x66CB,
+ 0x66CF, 0x66BD, 0x66BB, 0x66BA, 0x66CC, 0x6723, 0x6A34, 0x6A66,
+ 0x6A49, 0x6A67, 0x6A32, 0x6A68, 0x6A3E, 0x6A5D, 0x6A6D, 0x6A76,
+ 0x6A5B, 0x6A51, 0x6A28, 0x6A5A, 0x6A3B, 0x6A3F, 0x6A41, 0x6A6A,
+ 0x6A64, 0x6A50, 0x6A4F, 0x6A54, 0x6A6F, 0x6A69, 0x6A60, 0x6A3C,
+ 0x6A5E, 0x6A56, 0x6A55, 0x6A4D, 0x6A4E, 0x6A46, 0x6B55, 0x6B54,
+ 0x6B56, 0x6BA7, 0x6BAA, 0x6BAB, 0x6BC8, 0x6BC7, 0x6C04, 0x6C03,
+ 0x6C06, 0x6FAD, 0x6FCB, 0x6FA3, 0x6FC7, 0x6FBC, 0x6FCE, 0x6FC8,
+ 0x6F5E, 0x6FC4, 0x6FBD, 0x6F9E, 0x6FCA, 0x6FA8, 0x7004, 0x6FA5,
+ 0x6FAE, 0x6FBA, 0x6FAC, 0x6FAA, 0x6FCF, 0x6FBF, 0x6FB8, ALTCHR,
+/* 0xEA40 - 0xEAFF */
+ 0x6FA2, 0x6FC9, 0x6FAB, 0x6FCD, 0x6FAF, 0x6FB2, 0x6FB0, 0x71C5,
+ 0x71C2, 0x71BF, 0x71B8, 0x71D6, 0x71C0, 0x71C1, 0x71CB, 0x71D4,
+ 0x71CA, 0x71C7, 0x71CF, 0x71BD, 0x71D8, 0x71BC, 0x71C6, 0x71DA,
+ 0x71DB, 0x729D, 0x729E, 0x7369, 0x7366, 0x7367, 0x736C, 0x7365,
+ 0x736B, 0x736A, 0x747F, 0x749A, 0x74A0, 0x7494, 0x7492, 0x7495,
+ 0x74A1, 0x750B, 0x7580, 0x762F, 0x762D, 0x7631, 0x763D, 0x7633,
+ 0x763C, 0x7635, 0x7632, 0x7630, 0x76BB, 0x76E6, 0x779A, 0x779D,
+ 0x77A1, 0x779C, 0x779B, 0x77A2, 0x77A3, 0x7795, 0x7799, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7797, 0x78DD, 0x78E9, 0x78E5, 0x78EA, 0x78DE, 0x78E3,
+ 0x78DB, 0x78E1, 0x78E2, 0x78ED, 0x78DF, 0x78E0, 0x79A4, 0x7A44,
+ 0x7A48, 0x7A47, 0x7AB6, 0x7AB8, 0x7AB5, 0x7AB1, 0x7AB7, 0x7BDE,
+ 0x7BE3, 0x7BE7, 0x7BDD, 0x7BD5, 0x7BE5, 0x7BDA, 0x7BE8, 0x7BF9,
+ 0x7BD4, 0x7BEA, 0x7BE2, 0x7BDC, 0x7BEB, 0x7BD8, 0x7BDF, 0x7CD2,
+ 0x7CD4, 0x7CD7, 0x7CD0, 0x7CD1, 0x7E12, 0x7E21, 0x7E17, 0x7E0C,
+ 0x7E1F, 0x7E20, 0x7E13, 0x7E0E, 0x7E1C, 0x7E15, 0x7E1A, 0x7E22,
+ 0x7E0B, 0x7E0F, 0x7E16, 0x7E0D, 0x7E14, 0x7E25, 0x7E24, 0x7F43,
+ 0x7F7B, 0x7F7C, 0x7F7A, 0x7FB1, 0x7FEF, 0x802A, 0x8029, 0x806C,
+ 0x81B1, 0x81A6, 0x81AE, 0x81B9, 0x81B5, 0x81AB, 0x81B0, 0x81AC,
+ 0x81B4, 0x81B2, 0x81B7, 0x81A7, 0x81F2, 0x8255, 0x8256, 0x8257,
+ 0x8556, 0x8545, 0x856B, 0x854D, 0x8553, 0x8561, 0x8558, ALTCHR,
+/* 0xEB40 - 0xEBFF */
+ 0x8540, 0x8546, 0x8564, 0x8541, 0x8562, 0x8544, 0x8551, 0x8547,
+ 0x8563, 0x853E, 0x855B, 0x8571, 0x854E, 0x856E, 0x8575, 0x8555,
+ 0x8567, 0x8560, 0x858C, 0x8566, 0x855D, 0x8554, 0x8565, 0x856C,
+ 0x8663, 0x8665, 0x8664, 0x879B, 0x878F, 0x8797, 0x8793, 0x8792,
+ 0x8788, 0x8781, 0x8796, 0x8798, 0x8779, 0x8787, 0x87A3, 0x8785,
+ 0x8790, 0x8791, 0x879D, 0x8784, 0x8794, 0x879C, 0x879A, 0x8789,
+ 0x891E, 0x8926, 0x8930, 0x892D, 0x892E, 0x8927, 0x8931, 0x8922,
+ 0x8929, 0x8923, 0x892F, 0x892C, 0x891F, 0x89F1, 0x8AE0, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8AE2, 0x8AF2, 0x8AF4, 0x8AF5, 0x8ADD, 0x8B14, 0x8AE4,
+ 0x8ADF, 0x8AF0, 0x8AC8, 0x8ADE, 0x8AE1, 0x8AE8, 0x8AFF, 0x8AEF,
+ 0x8AFB, 0x8C91, 0x8C92, 0x8C90, 0x8CF5, 0x8CEE, 0x8CF1, 0x8CF0,
+ 0x8CF3, 0x8D6C, 0x8D6E, 0x8DA5, 0x8DA7, 0x8E33, 0x8E3E, 0x8E38,
+ 0x8E40, 0x8E45, 0x8E36, 0x8E3C, 0x8E3D, 0x8E41, 0x8E30, 0x8E3F,
+ 0x8EBD, 0x8F36, 0x8F2E, 0x8F35, 0x8F32, 0x8F39, 0x8F37, 0x8F34,
+ 0x9076, 0x9079, 0x907B, 0x9086, 0x90FA, 0x9133, 0x9135, 0x9136,
+ 0x9193, 0x9190, 0x9191, 0x918D, 0x918F, 0x9327, 0x931E, 0x9308,
+ 0x931F, 0x9306, 0x930F, 0x937A, 0x9338, 0x933C, 0x931B, 0x9323,
+ 0x9312, 0x9301, 0x9346, 0x932D, 0x930E, 0x930D, 0x92CB, 0x931D,
+ 0x92FA, 0x9325, 0x9313, 0x92F9, 0x92F7, 0x9334, 0x9302, 0x9324,
+ 0x92FF, 0x9329, 0x9339, 0x9335, 0x932A, 0x9314, 0x930C, ALTCHR,
+/* 0xEC40 - 0xECFF */
+ 0x930B, 0x92FE, 0x9309, 0x9300, 0x92FB, 0x9316, 0x95BC, 0x95CD,
+ 0x95BE, 0x95B9, 0x95BA, 0x95B6, 0x95BF, 0x95B5, 0x95BD, 0x96A9,
+ 0x96D4, 0x970B, 0x9712, 0x9710, 0x9799, 0x9797, 0x9794, 0x97F0,
+ 0x97F8, 0x9835, 0x982F, 0x9832, 0x9924, 0x991F, 0x9927, 0x9929,
+ 0x999E, 0x99EE, 0x99EC, 0x99E5, 0x99E4, 0x99F0, 0x99E3, 0x99EA,
+ 0x99E9, 0x99E7, 0x9AB9, 0x9ABF, 0x9AB4, 0x9ABB, 0x9AF6, 0x9AFA,
+ 0x9AF9, 0x9AF7, 0x9B33, 0x9B80, 0x9B85, 0x9B87, 0x9B7C, 0x9B7E,
+ 0x9B7B, 0x9B82, 0x9B93, 0x9B92, 0x9B90, 0x9B7A, 0x9B95, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9B7D, 0x9B88, 0x9D25, 0x9D17, 0x9D20, 0x9D1E, 0x9D14,
+ 0x9D29, 0x9D1D, 0x9D18, 0x9D22, 0x9D10, 0x9D19, 0x9D1F, 0x9E88,
+ 0x9E86, 0x9E87, 0x9EAE, 0x9EAD, 0x9ED5, 0x9ED6, 0x9EFA, 0x9F12,
+ 0x9F3D, 0x5126, 0x5125, 0x5122, 0x5124, 0x5120, 0x5129, 0x52F4,
+ 0x5693, 0x568C, 0x568D, 0x5686, 0x5684, 0x5683, 0x567E, 0x5682,
+ 0x567F, 0x5681, 0x58D6, 0x58D4, 0x58CF, 0x58D2, 0x5B2D, 0x5B25,
+ 0x5B32, 0x5B23, 0x5B2C, 0x5B27, 0x5B26, 0x5B2F, 0x5B2E, 0x5B7B,
+ 0x5BF1, 0x5BF2, 0x5DB7, 0x5E6C, 0x5E6A, 0x5FBE, 0x5FBB, 0x61C3,
+ 0x61B5, 0x61BC, 0x61E7, 0x61E0, 0x61E5, 0x61E4, 0x61E8, 0x61DE,
+ 0x64EF, 0x64E9, 0x64E3, 0x64EB, 0x64E4, 0x64E8, 0x6581, 0x6580,
+ 0x65B6, 0x65DA, 0x66D2, 0x6A8D, 0x6A96, 0x6A81, 0x6AA5, 0x6A89,
+ 0x6A9F, 0x6A9B, 0x6AA1, 0x6A9E, 0x6A87, 0x6A93, 0x6A8E, ALTCHR,
+/* 0xED40 - 0xEDFF */
+ 0x6A95, 0x6A83, 0x6AA8, 0x6AA4, 0x6A91, 0x6A7F, 0x6AA6, 0x6A9A,
+ 0x6A85, 0x6A8C, 0x6A92, 0x6B5B, 0x6BAD, 0x6C09, 0x6FCC, 0x6FA9,
+ 0x6FF4, 0x6FD4, 0x6FE3, 0x6FDC, 0x6FED, 0x6FE7, 0x6FE6, 0x6FDE,
+ 0x6FF2, 0x6FDD, 0x6FE2, 0x6FE8, 0x71E1, 0x71F1, 0x71E8, 0x71F2,
+ 0x71E4, 0x71F0, 0x71E2, 0x7373, 0x736E, 0x736F, 0x7497, 0x74B2,
+ 0x74AB, 0x7490, 0x74AA, 0x74AD, 0x74B1, 0x74A5, 0x74AF, 0x7510,
+ 0x7511, 0x7512, 0x750F, 0x7584, 0x7643, 0x7648, 0x7649, 0x7647,
+ 0x76A4, 0x76E9, 0x77B5, 0x77AB, 0x77B2, 0x77B7, 0x77B6, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x77B4, 0x77B1, 0x77A8, 0x77F0, 0x78F3, 0x78FD, 0x7902,
+ 0x78FB, 0x78FC, 0x78F2, 0x7905, 0x78F9, 0x78FE, 0x7904, 0x79AB,
+ 0x79A8, 0x7A5C, 0x7A5B, 0x7A56, 0x7A58, 0x7A54, 0x7A5A, 0x7ABE,
+ 0x7AC0, 0x7AC1, 0x7C05, 0x7C0F, 0x7BF2, 0x7C00, 0x7BFF, 0x7BFB,
+ 0x7C0E, 0x7BF4, 0x7C0B, 0x7BF3, 0x7C02, 0x7C09, 0x7C03, 0x7C01,
+ 0x7BF8, 0x7BFD, 0x7C06, 0x7BF0, 0x7BF1, 0x7C10, 0x7C0A, 0x7CE8,
+ 0x7E2D, 0x7E3C, 0x7E42, 0x7E33, 0x9848, 0x7E38, 0x7E2A, 0x7E49,
+ 0x7E40, 0x7E47, 0x7E29, 0x7E4C, 0x7E30, 0x7E3B, 0x7E36, 0x7E44,
+ 0x7E3A, 0x7F45, 0x7F7F, 0x7F7E, 0x7F7D, 0x7FF4, 0x7FF2, 0x802C,
+ 0x81BB, 0x81C4, 0x81CC, 0x81CA, 0x81C5, 0x81C7, 0x81BC, 0x81E9,
+ 0x825B, 0x825A, 0x825C, 0x8583, 0x8580, 0x858F, 0x85A7, 0x8595,
+ 0x85A0, 0x858B, 0x85A3, 0x857B, 0x85A4, 0x859A, 0x859E, ALTCHR,
+/* 0xEE40 - 0xEEFF */
+ 0x8577, 0x857C, 0x8589, 0x85A1, 0x857A, 0x8578, 0x8557, 0x858E,
+ 0x8596, 0x8586, 0x858D, 0x8599, 0x859D, 0x8581, 0x85A2, 0x8582,
+ 0x8588, 0x8585, 0x8579, 0x8576, 0x8598, 0x8590, 0x859F, 0x8668,
+ 0x87BE, 0x87AA, 0x87AD, 0x87C5, 0x87B0, 0x87AC, 0x87B9, 0x87B5,
+ 0x87BC, 0x87AE, 0x87C9, 0x87C3, 0x87C2, 0x87CC, 0x87B7, 0x87AF,
+ 0x87C4, 0x87CA, 0x87B4, 0x87B6, 0x87BF, 0x87B8, 0x87BD, 0x87DE,
+ 0x87B2, 0x8935, 0x8933, 0x893C, 0x893E, 0x8941, 0x8952, 0x8937,
+ 0x8942, 0x89AD, 0x89AF, 0x89AE, 0x89F2, 0x89F3, 0x8B1E, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8B18, 0x8B16, 0x8B11, 0x8B05, 0x8B0B, 0x8B22, 0x8B0F,
+ 0x8B12, 0x8B15, 0x8B07, 0x8B0D, 0x8B08, 0x8B06, 0x8B1C, 0x8B13,
+ 0x8B1A, 0x8C4F, 0x8C70, 0x8C72, 0x8C71, 0x8C6F, 0x8C95, 0x8C94,
+ 0x8CF9, 0x8D6F, 0x8E4E, 0x8E4D, 0x8E53, 0x8E50, 0x8E4C, 0x8E47,
+ 0x8F43, 0x8F40, 0x9085, 0x907E, 0x9138, 0x919A, 0x91A2, 0x919B,
+ 0x9199, 0x919F, 0x91A1, 0x919D, 0x91A0, 0x93A1, 0x9383, 0x93AF,
+ 0x9364, 0x9356, 0x9347, 0x937C, 0x9358, 0x935C, 0x9376, 0x9349,
+ 0x9350, 0x9351, 0x9360, 0x936D, 0x938F, 0x934C, 0x936A, 0x9379,
+ 0x9357, 0x9355, 0x9352, 0x934F, 0x9371, 0x9377, 0x937B, 0x9361,
+ 0x935E, 0x9363, 0x9367, 0x9380, 0x934E, 0x9359, 0x95C7, 0x95C0,
+ 0x95C9, 0x95C3, 0x95C5, 0x95B7, 0x96AE, 0x96B0, 0x96AC, 0x9720,
+ 0x971F, 0x9718, 0x971D, 0x9719, 0x979A, 0x97A1, 0x979C, ALTCHR,
+/* 0xEF40 - 0xEFFF */
+ 0x979E, 0x979D, 0x97D5, 0x97D4, 0x97F1, 0x9841, 0x9844, 0x984A,
+ 0x9849, 0x9845, 0x9843, 0x9925, 0x992B, 0x992C, 0x992A, 0x9933,
+ 0x9932, 0x992F, 0x992D, 0x9931, 0x9930, 0x9998, 0x99A3, 0x99A1,
+ 0x9A02, 0x99FA, 0x99F4, 0x99F7, 0x99F9, 0x99F8, 0x99F6, 0x99FB,
+ 0x99FD, 0x99FE, 0x99FC, 0x9A03, 0x9ABE, 0x9AFE, 0x9AFD, 0x9B01,
+ 0x9AFC, 0x9B48, 0x9B9A, 0x9BA8, 0x9B9E, 0x9B9B, 0x9BA6, 0x9BA1,
+ 0x9BA5, 0x9BA4, 0x9B86, 0x9BA2, 0x9BA0, 0x9BAF, 0x9D33, 0x9D41,
+ 0x9D67, 0x9D36, 0x9D2E, 0x9D2F, 0x9D31, 0x9D38, 0x9D30, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9D45, 0x9D42, 0x9D43, 0x9D3E, 0x9D37, 0x9D40, 0x9D3D,
+ 0x7FF5, 0x9D2D, 0x9E8A, 0x9E89, 0x9E8D, 0x9EB0, 0x9EC8, 0x9EDA,
+ 0x9EFB, 0x9EFF, 0x9F24, 0x9F23, 0x9F22, 0x9F54, 0x9FA0, 0x5131,
+ 0x512D, 0x512E, 0x5698, 0x569C, 0x5697, 0x569A, 0x569D, 0x5699,
+ 0x5970, 0x5B3C, 0x5C69, 0x5C6A, 0x5DC0, 0x5E6D, 0x5E6E, 0x61D8,
+ 0x61DF, 0x61ED, 0x61EE, 0x61F1, 0x61EA, 0x61F0, 0x61EB, 0x61D6,
+ 0x61E9, 0x64FF, 0x6504, 0x64FD, 0x64F8, 0x6501, 0x6503, 0x64FC,
+ 0x6594, 0x65DB, 0x66DA, 0x66DB, 0x66D8, 0x6AC5, 0x6AB9, 0x6ABD,
+ 0x6AE1, 0x6AC6, 0x6ABA, 0x6AB6, 0x6AB7, 0x6AC7, 0x6AB4, 0x6AAD,
+ 0x6B5E, 0x6BC9, 0x6C0B, 0x7007, 0x700C, 0x700D, 0x7001, 0x7005,
+ 0x7014, 0x700E, 0x6FFF, 0x7000, 0x6FFB, 0x7026, 0x6FFC, 0x6FF7,
+ 0x700A, 0x7201, 0x71FF, 0x71F9, 0x7203, 0x71FD, 0x7376, ALTCHR,
+/* 0xF040 - 0xF0FF */
+ 0x74B8, 0x74C0, 0x74B5, 0x74C1, 0x74BE, 0x74B6, 0x74BB, 0x74C2,
+ 0x7514, 0x7513, 0x765C, 0x7664, 0x7659, 0x7650, 0x7653, 0x7657,
+ 0x765A, 0x76A6, 0x76BD, 0x76EC, 0x77C2, 0x77BA, 0x78FF, 0x790C,
+ 0x7913, 0x7914, 0x7909, 0x7910, 0x7912, 0x7911, 0x79AD, 0x79AC,
+ 0x7A5F, 0x7C1C, 0x7C29, 0x7C19, 0x7C20, 0x7C1F, 0x7C2D, 0x7C1D,
+ 0x7C26, 0x7C28, 0x7C22, 0x7C25, 0x7C30, 0x7E5C, 0x7E50, 0x7E56,
+ 0x7E63, 0x7E58, 0x7E62, 0x7E5F, 0x7E51, 0x7E60, 0x7E57, 0x7E53,
+ 0x7FB5, 0x7FB3, 0x7FF7, 0x7FF8, 0x8075, 0x81D1, 0x81D2, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x81D0, 0x825F, 0x825E, 0x85B4, 0x85C6, 0x85C0, 0x85C3,
+ 0x85C2, 0x85B3, 0x85B5, 0x85BD, 0x85C7, 0x85C4, 0x85BF, 0x85CB,
+ 0x85CE, 0x85C8, 0x85C5, 0x85B1, 0x85B6, 0x85D2, 0x8624, 0x85B8,
+ 0x85B7, 0x85BE, 0x8669, 0x87E7, 0x87E6, 0x87E2, 0x87DB, 0x87EB,
+ 0x87EA, 0x87E5, 0x87DF, 0x87F3, 0x87E4, 0x87D4, 0x87DC, 0x87D3,
+ 0x87ED, 0x87D8, 0x87E3, 0x87A4, 0x87D7, 0x87D9, 0x8801, 0x87F4,
+ 0x87E8, 0x87DD, 0x8953, 0x894B, 0x894F, 0x894C, 0x8946, 0x8950,
+ 0x8951, 0x8949, 0x8B2A, 0x8B27, 0x8B23, 0x8B33, 0x8B30, 0x8B35,
+ 0x8B47, 0x8B2F, 0x8B3C, 0x8B3E, 0x8B31, 0x8B25, 0x8B37, 0x8B26,
+ 0x8B36, 0x8B2E, 0x8B24, 0x8B3B, 0x8B3D, 0x8B3A, 0x8C42, 0x8C75,
+ 0x8C99, 0x8C98, 0x8C97, 0x8CFE, 0x8D04, 0x8D02, 0x8D00, 0x8E5C,
+ 0x8E62, 0x8E60, 0x8E57, 0x8E56, 0x8E5E, 0x8E65, 0x8E67, ALTCHR,
+/* 0xF140 - 0xF1FF */
+ 0x8E5B, 0x8E5A, 0x8E61, 0x8E5D, 0x8E69, 0x8E54, 0x8F46, 0x8F47,
+ 0x8F48, 0x8F4B, 0x9128, 0x913A, 0x913B, 0x913E, 0x91A8, 0x91A5,
+ 0x91A7, 0x91AF, 0x91AA, 0x93B5, 0x938C, 0x9392, 0x93B7, 0x939B,
+ 0x939D, 0x9389, 0x93A7, 0x938E, 0x93AA, 0x939E, 0x93A6, 0x9395,
+ 0x9388, 0x9399, 0x939F, 0x938D, 0x93B1, 0x9391, 0x93B2, 0x93A4,
+ 0x93A8, 0x93B4, 0x93A3, 0x93A5, 0x95D2, 0x95D3, 0x95D1, 0x96B3,
+ 0x96D7, 0x96DA, 0x5DC2, 0x96DF, 0x96D8, 0x96DD, 0x9723, 0x9722,
+ 0x9725, 0x97AC, 0x97AE, 0x97A8, 0x97AB, 0x97A4, 0x97AA, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x97A2, 0x97A5, 0x97D7, 0x97D9, 0x97D6, 0x97D8, 0x97FA,
+ 0x9850, 0x9851, 0x9852, 0x98B8, 0x9941, 0x993C, 0x993A, 0x9A0F,
+ 0x9A0B, 0x9A09, 0x9A0D, 0x9A04, 0x9A11, 0x9A0A, 0x9A05, 0x9A07,
+ 0x9A06, 0x9AC0, 0x9ADC, 0x9B08, 0x9B04, 0x9B05, 0x9B29, 0x9B35,
+ 0x9B4A, 0x9B4C, 0x9B4B, 0x9BC7, 0x9BC6, 0x9BC3, 0x9BBF, 0x9BC1,
+ 0x9BB5, 0x9BB8, 0x9BD3, 0x9BB6, 0x9BC4, 0x9BB9, 0x9BBD, 0x9D5C,
+ 0x9D53, 0x9D4F, 0x9D4A, 0x9D5B, 0x9D4B, 0x9D59, 0x9D56, 0x9D4C,
+ 0x9D57, 0x9D52, 0x9D54, 0x9D5F, 0x9D58, 0x9D5A, 0x9E8E, 0x9E8C,
+ 0x9EDF, 0x9F01, 0x9F00, 0x9F16, 0x9F25, 0x9F2B, 0x9F2A, 0x9F29,
+ 0x9F28, 0x9F4C, 0x9F55, 0x5134, 0x5135, 0x5296, 0x52F7, 0x53B4,
+ 0x56AB, 0x56AD, 0x56A6, 0x56A7, 0x56AA, 0x56AC, 0x58DA, 0x58DD,
+ 0x58DB, 0x5912, 0x5B3D, 0x5B3E, 0x5B3F, 0x5DC3, 0x5E70, ALTCHR,
+/* 0xF240 - 0xF2FF */
+ 0x5FBF, 0x61FB, 0x6507, 0x6510, 0x650D, 0x6509, 0x650C, 0x650E,
+ 0x6584, 0x65DE, 0x65DD, 0x66DE, 0x6AE7, 0x6AE0, 0x6ACC, 0x6AD1,
+ 0x6AD9, 0x6ACB, 0x6ADF, 0x6ADC, 0x6AD0, 0x6AEB, 0x6ACF, 0x6ACD,
+ 0x6ADE, 0x6B60, 0x6BB0, 0x6C0C, 0x7019, 0x7027, 0x7020, 0x7016,
+ 0x702B, 0x7021, 0x7022, 0x7023, 0x7029, 0x7017, 0x7024, 0x701C,
+ 0x702A, 0x720C, 0x720A, 0x7207, 0x7202, 0x7205, 0x72A5, 0x72A6,
+ 0x72A4, 0x72A3, 0x72A1, 0x74CB, 0x74C5, 0x74B7, 0x74C3, 0x7516,
+ 0x7660, 0x77C9, 0x77CA, 0x77C4, 0x77F1, 0x791D, 0x791B, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7921, 0x791C, 0x7917, 0x791E, 0x79B0, 0x7A67, 0x7A68,
+ 0x7C33, 0x7C3C, 0x7C39, 0x7C2C, 0x7C3B, 0x7CEC, 0x7CEA, 0x7E76,
+ 0x7E75, 0x7E78, 0x7E70, 0x7E77, 0x7E6F, 0x7E7A, 0x7E72, 0x7E74,
+ 0x7E68, 0x7F4B, 0x7F4A, 0x7F83, 0x7F86, 0x7FB7, 0x7FFD, 0x7FFE,
+ 0x8078, 0x81D7, 0x81D5, 0x8264, 0x8261, 0x8263, 0x85EB, 0x85F1,
+ 0x85ED, 0x85D9, 0x85E1, 0x85E8, 0x85DA, 0x85D7, 0x85EC, 0x85F2,
+ 0x85F8, 0x85D8, 0x85DF, 0x85E3, 0x85DC, 0x85D1, 0x85F0, 0x85E6,
+ 0x85EF, 0x85DE, 0x85E2, 0x8800, 0x87FA, 0x8803, 0x87F6, 0x87F7,
+ 0x8809, 0x880C, 0x880B, 0x8806, 0x87FC, 0x8808, 0x87FF, 0x880A,
+ 0x8802, 0x8962, 0x895A, 0x895B, 0x8957, 0x8961, 0x895C, 0x8958,
+ 0x895D, 0x8959, 0x8988, 0x89B7, 0x89B6, 0x89F6, 0x8B50, 0x8B48,
+ 0x8B4A, 0x8B40, 0x8B53, 0x8B56, 0x8B54, 0x8B4B, 0x8B55, ALTCHR,
+/* 0xF340 - 0xF3FF */
+ 0x8B51, 0x8B42, 0x8B52, 0x8B57, 0x8C43, 0x8C77, 0x8C76, 0x8C9A,
+ 0x8D06, 0x8D07, 0x8D09, 0x8DAC, 0x8DAA, 0x8DAD, 0x8DAB, 0x8E6D,
+ 0x8E78, 0x8E73, 0x8E6A, 0x8E6F, 0x8E7B, 0x8EC2, 0x8F52, 0x8F51,
+ 0x8F4F, 0x8F50, 0x8F53, 0x8FB4, 0x9140, 0x913F, 0x91B0, 0x91AD,
+ 0x93DE, 0x93C7, 0x93CF, 0x93C2, 0x93DA, 0x93D0, 0x93F9, 0x93EC,
+ 0x93CC, 0x93D9, 0x93A9, 0x93E6, 0x93CA, 0x93D4, 0x93EE, 0x93E3,
+ 0x93D5, 0x93C4, 0x93CE, 0x93C0, 0x93D2, 0x93E7, 0x957D, 0x95DA,
+ 0x95DB, 0x96E1, 0x9729, 0x972B, 0x972C, 0x9728, 0x9726, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x97B3, 0x97B7, 0x97B6, 0x97DD, 0x97DE, 0x97DF, 0x985C,
+ 0x9859, 0x985D, 0x9857, 0x98BF, 0x98BD, 0x98BB, 0x98BE, 0x9948,
+ 0x9947, 0x9943, 0x99A6, 0x99A7, 0x9A1A, 0x9A15, 0x9A25, 0x9A1D,
+ 0x9A24, 0x9A1B, 0x9A22, 0x9A20, 0x9A27, 0x9A23, 0x9A1E, 0x9A1C,
+ 0x9A14, 0x9AC2, 0x9B0B, 0x9B0A, 0x9B0E, 0x9B0C, 0x9B37, 0x9BEA,
+ 0x9BEB, 0x9BE0, 0x9BDE, 0x9BE4, 0x9BE6, 0x9BE2, 0x9BF0, 0x9BD4,
+ 0x9BD7, 0x9BEC, 0x9BDC, 0x9BD9, 0x9BE5, 0x9BD5, 0x9BE1, 0x9BDA,
+ 0x9D77, 0x9D81, 0x9D8A, 0x9D84, 0x9D88, 0x9D71, 0x9D80, 0x9D78,
+ 0x9D86, 0x9D8B, 0x9D8C, 0x9D7D, 0x9D6B, 0x9D74, 0x9D75, 0x9D70,
+ 0x9D69, 0x9D85, 0x9D73, 0x9D7B, 0x9D82, 0x9D6F, 0x9D79, 0x9D7F,
+ 0x9D87, 0x9D68, 0x9E94, 0x9E91, 0x9EC0, 0x9EFC, 0x9F2D, 0x9F40,
+ 0x9F41, 0x9F4D, 0x9F56, 0x9F57, 0x9F58, 0x5337, 0x56B2, ALTCHR,
+/* 0xF440 - 0xF4FF */
+ 0x56B5, 0x56B3, 0x58E3, 0x5B45, 0x5DC6, 0x5DC7, 0x5EEE, 0x5EEF,
+ 0x5FC0, 0x5FC1, 0x61F9, 0x6517, 0x6516, 0x6515, 0x6513, 0x65DF,
+ 0x66E8, 0x66E3, 0x66E4, 0x6AF3, 0x6AF0, 0x6AEA, 0x6AE8, 0x6AF9,
+ 0x6AF1, 0x6AEE, 0x6AEF, 0x703C, 0x7035, 0x702F, 0x7037, 0x7034,
+ 0x7031, 0x7042, 0x7038, 0x703F, 0x703A, 0x7039, 0x7040, 0x703B,
+ 0x7033, 0x7041, 0x7213, 0x7214, 0x72A8, 0x737D, 0x737C, 0x74BA,
+ 0x76AB, 0x76AA, 0x76BE, 0x76ED, 0x77CC, 0x77CE, 0x77CF, 0x77CD,
+ 0x77F2, 0x7925, 0x7923, 0x7927, 0x7928, 0x7924, 0x7929, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x79B2, 0x7A6E, 0x7A6C, 0x7A6D, 0x7AF7, 0x7C49, 0x7C48,
+ 0x7C4A, 0x7C47, 0x7C45, 0x7CEE, 0x7E7B, 0x7E7E, 0x7E81, 0x7E80,
+ 0x7FBA, 0x7FFF, 0x8079, 0x81DB, 0x81D9, 0x820B, 0x8268, 0x8269,
+ 0x8622, 0x85FF, 0x8601, 0x85FE, 0x861B, 0x8600, 0x85F6, 0x8604,
+ 0x8609, 0x8605, 0x860C, 0x85FD, 0x8819, 0x8810, 0x8811, 0x8817,
+ 0x8813, 0x8816, 0x8963, 0x8966, 0x89B9, 0x89F7, 0x8B60, 0x8B6A,
+ 0x8B5D, 0x8B68, 0x8B63, 0x8B65, 0x8B67, 0x8B6D, 0x8DAE, 0x8E86,
+ 0x8E88, 0x8E84, 0x8F59, 0x8F56, 0x8F57, 0x8F55, 0x8F58, 0x8F5A,
+ 0x908D, 0x9143, 0x9141, 0x91B7, 0x91B5, 0x91B2, 0x91B3, 0x940B,
+ 0x9413, 0x93FB, 0x9420, 0x940F, 0x9414, 0x93FE, 0x9415, 0x9410,
+ 0x9428, 0x9419, 0x940D, 0x93F5, 0x9400, 0x93F7, 0x9407, 0x940E,
+ 0x9416, 0x9412, 0x93FA, 0x9409, 0x93F8, 0x940A, 0x93FF, ALTCHR,
+/* 0xF540 - 0xF5FF */
+ 0x93FC, 0x940C, 0x93F6, 0x9411, 0x9406, 0x95DE, 0x95E0, 0x95DF,
+ 0x972E, 0x972F, 0x97B9, 0x97BB, 0x97FD, 0x97FE, 0x9860, 0x9862,
+ 0x9863, 0x985F, 0x98C1, 0x98C2, 0x9950, 0x994E, 0x9959, 0x994C,
+ 0x994B, 0x9953, 0x9A32, 0x9A34, 0x9A31, 0x9A2C, 0x9A2A, 0x9A36,
+ 0x9A29, 0x9A2E, 0x9A38, 0x9A2D, 0x9AC7, 0x9ACA, 0x9AC6, 0x9B10,
+ 0x9B12, 0x9B11, 0x9C0B, 0x9C08, 0x9BF7, 0x9C05, 0x9C12, 0x9BF8,
+ 0x9C40, 0x9C07, 0x9C0E, 0x9C06, 0x9C17, 0x9C14, 0x9C09, 0x9D9F,
+ 0x9D99, 0x9DA4, 0x9D9D, 0x9D92, 0x9D98, 0x9D90, 0x9D9B, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9DA0, 0x9D94, 0x9D9C, 0x9DAA, 0x9D97, 0x9DA1, 0x9D9A,
+ 0x9DA2, 0x9DA8, 0x9D9E, 0x9DA3, 0x9DBF, 0x9DA9, 0x9D96, 0x9DA6,
+ 0x9DA7, 0x9E99, 0x9E9B, 0x9E9A, 0x9EE5, 0x9EE4, 0x9EE7, 0x9EE6,
+ 0x9F30, 0x9F2E, 0x9F5B, 0x9F60, 0x9F5E, 0x9F5D, 0x9F59, 0x9F91,
+ 0x513A, 0x5139, 0x5298, 0x5297, 0x56C3, 0x56BD, 0x56BE, 0x5B48,
+ 0x5B47, 0x5DCB, 0x5DCF, 0x5EF1, 0x61FD, 0x651B, 0x6B02, 0x6AFC,
+ 0x6B03, 0x6AF8, 0x6B00, 0x7043, 0x7044, 0x704A, 0x7048, 0x7049,
+ 0x7045, 0x7046, 0x721D, 0x721A, 0x7219, 0x737E, 0x7517, 0x766A,
+ 0x77D0, 0x792D, 0x7931, 0x792F, 0x7C54, 0x7C53, 0x7CF2, 0x7E8A,
+ 0x7E87, 0x7E88, 0x7E8B, 0x7E86, 0x7E8D, 0x7F4D, 0x7FBB, 0x8030,
+ 0x81DD, 0x8618, 0x862A, 0x8626, 0x861F, 0x8623, 0x861C, 0x8619,
+ 0x8627, 0x862E, 0x8621, 0x8620, 0x8629, 0x861E, 0x8625, ALTCHR,
+/* 0xF640 - 0xF6FF */
+ 0x8829, 0x881D, 0x881B, 0x8820, 0x8824, 0x881C, 0x882B, 0x884A,
+ 0x896D, 0x8969, 0x896E, 0x896B, 0x89FA, 0x8B79, 0x8B78, 0x8B45,
+ 0x8B7A, 0x8B7B, 0x8D10, 0x8D14, 0x8DAF, 0x8E8E, 0x8E8C, 0x8F5E,
+ 0x8F5B, 0x8F5D, 0x9146, 0x9144, 0x9145, 0x91B9, 0x943F, 0x943B,
+ 0x9436, 0x9429, 0x943D, 0x943C, 0x9430, 0x9439, 0x942A, 0x9437,
+ 0x942C, 0x9440, 0x9431, 0x95E5, 0x95E4, 0x95E3, 0x9735, 0x973A,
+ 0x97BF, 0x97E1, 0x9864, 0x98C9, 0x98C6, 0x98C0, 0x9958, 0x9956,
+ 0x9A39, 0x9A3D, 0x9A46, 0x9A44, 0x9A42, 0x9A41, 0x9A3A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9A3F, 0x9ACD, 0x9B15, 0x9B17, 0x9B18, 0x9B16, 0x9B3A,
+ 0x9B52, 0x9C2B, 0x9C1D, 0x9C1C, 0x9C2C, 0x9C23, 0x9C28, 0x9C29,
+ 0x9C24, 0x9C21, 0x9DB7, 0x9DB6, 0x9DBC, 0x9DC1, 0x9DC7, 0x9DCA,
+ 0x9DCF, 0x9DBE, 0x9DC5, 0x9DC3, 0x9DBB, 0x9DB5, 0x9DCE, 0x9DB9,
+ 0x9DBA, 0x9DAC, 0x9DC8, 0x9DB1, 0x9DAD, 0x9DCC, 0x9DB3, 0x9DCD,
+ 0x9DB2, 0x9E7A, 0x9E9C, 0x9EEB, 0x9EEE, 0x9EED, 0x9F1B, 0x9F18,
+ 0x9F1A, 0x9F31, 0x9F4E, 0x9F65, 0x9F64, 0x9F92, 0x4EB9, 0x56C6,
+ 0x56C5, 0x56CB, 0x5971, 0x5B4B, 0x5B4C, 0x5DD5, 0x5DD1, 0x5EF2,
+ 0x6521, 0x6520, 0x6526, 0x6522, 0x6B0B, 0x6B08, 0x6B09, 0x6C0D,
+ 0x7055, 0x7056, 0x7057, 0x7052, 0x721E, 0x721F, 0x72A9, 0x737F,
+ 0x74D8, 0x74D5, 0x74D9, 0x74D7, 0x766D, 0x76AD, 0x7935, 0x79B4,
+ 0x7A70, 0x7A71, 0x7C57, 0x7C5C, 0x7C59, 0x7C5B, 0x7C5A, ALTCHR,
+/* 0xF740 - 0xF7FF */
+ 0x7CF4, 0x7CF1, 0x7E91, 0x7F4F, 0x7F87, 0x81DE, 0x826B, 0x8634,
+ 0x8635, 0x8633, 0x862C, 0x8632, 0x8636, 0x882C, 0x8828, 0x8826,
+ 0x882A, 0x8825, 0x8971, 0x89BF, 0x89BE, 0x89FB, 0x8B7E, 0x8B84,
+ 0x8B82, 0x8B86, 0x8B85, 0x8B7F, 0x8D15, 0x8E95, 0x8E94, 0x8E9A,
+ 0x8E92, 0x8E90, 0x8E96, 0x8E97, 0x8F60, 0x8F62, 0x9147, 0x944C,
+ 0x9450, 0x944A, 0x944B, 0x944F, 0x9447, 0x9445, 0x9448, 0x9449,
+ 0x9446, 0x973F, 0x97E3, 0x986A, 0x9869, 0x98CB, 0x9954, 0x995B,
+ 0x9A4E, 0x9A53, 0x9A54, 0x9A4C, 0x9A4F, 0x9A48, 0x9A4A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9A49, 0x9A52, 0x9A50, 0x9AD0, 0x9B19, 0x9B2B, 0x9B3B,
+ 0x9B56, 0x9B55, 0x9C46, 0x9C48, 0x9C3F, 0x9C44, 0x9C39, 0x9C33,
+ 0x9C41, 0x9C3C, 0x9C37, 0x9C34, 0x9C32, 0x9C3D, 0x9C36, 0x9DDB,
+ 0x9DD2, 0x9DDE, 0x9DDA, 0x9DCB, 0x9DD0, 0x9DDC, 0x9DD1, 0x9DDF,
+ 0x9DE9, 0x9DD9, 0x9DD8, 0x9DD6, 0x9DF5, 0x9DD5, 0x9DDD, 0x9EB6,
+ 0x9EF0, 0x9F35, 0x9F33, 0x9F32, 0x9F42, 0x9F6B, 0x9F95, 0x9FA2,
+ 0x513D, 0x5299, 0x58E8, 0x58E7, 0x5972, 0x5B4D, 0x5DD8, 0x882F,
+ 0x5F4F, 0x6201, 0x6203, 0x6204, 0x6529, 0x6525, 0x6596, 0x66EB,
+ 0x6B11, 0x6B12, 0x6B0F, 0x6BCA, 0x705B, 0x705A, 0x7222, 0x7382,
+ 0x7381, 0x7383, 0x7670, 0x77D4, 0x7C67, 0x7C66, 0x7E95, 0x826C,
+ 0x863A, 0x8640, 0x8639, 0x863C, 0x8631, 0x863B, 0x863E, 0x8830,
+ 0x8832, 0x882E, 0x8833, 0x8976, 0x8974, 0x8973, 0x89FE, ALTCHR,
+/* 0xF840 - 0xF8FF */
+ 0x8B8C, 0x8B8E, 0x8B8B, 0x8B88, 0x8C45, 0x8D19, 0x8E98, 0x8F64,
+ 0x8F63, 0x91BC, 0x9462, 0x9455, 0x945D, 0x9457, 0x945E, 0x97C4,
+ 0x97C5, 0x9800, 0x9A56, 0x9A59, 0x9B1E, 0x9B1F, 0x9B20, 0x9C52,
+ 0x9C58, 0x9C50, 0x9C4A, 0x9C4D, 0x9C4B, 0x9C55, 0x9C59, 0x9C4C,
+ 0x9C4E, 0x9DFB, 0x9DF7, 0x9DEF, 0x9DE3, 0x9DEB, 0x9DF8, 0x9DE4,
+ 0x9DF6, 0x9DE1, 0x9DEE, 0x9DE6, 0x9DF2, 0x9DF0, 0x9DE2, 0x9DEC,
+ 0x9DF4, 0x9DF3, 0x9DE8, 0x9DED, 0x9EC2, 0x9ED0, 0x9EF2, 0x9EF3,
+ 0x9F06, 0x9F1C, 0x9F38, 0x9F37, 0x9F36, 0x9F43, 0x9F4F, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9F71, 0x9F70, 0x9F6E, 0x9F6F, 0x56D3, 0x56CD, 0x5B4E,
+ 0x5C6D, 0x652D, 0x66ED, 0x66EE, 0x6B13, 0x705F, 0x7061, 0x705D,
+ 0x7060, 0x7223, 0x74DB, 0x74E5, 0x77D5, 0x7938, 0x79B7, 0x79B6,
+ 0x7C6A, 0x7E97, 0x7F89, 0x826D, 0x8643, 0x8838, 0x8837, 0x8835,
+ 0x884B, 0x8B94, 0x8B95, 0x8E9E, 0x8E9F, 0x8EA0, 0x8E9D, 0x91BE,
+ 0x91BD, 0x91C2, 0x946B, 0x9468, 0x9469, 0x96E5, 0x9746, 0x9743,
+ 0x9747, 0x97C7, 0x97E5, 0x9A5E, 0x9AD5, 0x9B59, 0x9C63, 0x9C67,
+ 0x9C66, 0x9C62, 0x9C5E, 0x9C60, 0x9E02, 0x9DFE, 0x9E07, 0x9E03,
+ 0x9E06, 0x9E05, 0x9E00, 0x9E01, 0x9E09, 0x9DFF, 0x9DFD, 0x9E04,
+ 0x9EA0, 0x9F1E, 0x9F46, 0x9F74, 0x9F75, 0x9F76, 0x56D4, 0x652E,
+ 0x65B8, 0x6B18, 0x6B19, 0x6B17, 0x6B1A, 0x7062, 0x7226, 0x72AA,
+ 0x77D8, 0x77D9, 0x7939, 0x7C69, 0x7C6B, 0x7CF6, 0x7E9A, ALTCHR,
+/* 0xF940 - 0xF9FF */
+ 0x7E98, 0x7E9B, 0x7E99, 0x81E0, 0x81E1, 0x8646, 0x8647, 0x8648,
+ 0x8979, 0x897A, 0x897C, 0x897B, 0x89FF, 0x8B98, 0x8B99, 0x8EA5,
+ 0x8EA4, 0x8EA3, 0x946E, 0x946D, 0x946F, 0x9471, 0x9473, 0x9749,
+ 0x9872, 0x995F, 0x9C68, 0x9C6E, 0x9C6D, 0x9E0B, 0x9E0D, 0x9E10,
+ 0x9E0F, 0x9E12, 0x9E11, 0x9EA1, 0x9EF5, 0x9F09, 0x9F47, 0x9F78,
+ 0x9F7B, 0x9F7A, 0x9F79, 0x571E, 0x7066, 0x7C6F, 0x883C, 0x8DB2,
+ 0x8EA6, 0x91C3, 0x9474, 0x9478, 0x9476, 0x9475, 0x9A60, 0x9C74,
+ 0x9C73, 0x9C71, 0x9C75, 0x9E14, 0x9E13, 0x9EF6, 0x9F0A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9FA4, 0x7068, 0x7065, 0x7CF7, 0x866A, 0x883E, 0x883D,
+ 0x883F, 0x8B9E, 0x8C9C, 0x8EA9, 0x8EC9, 0x974B, 0x9873, 0x9874,
+ 0x98CC, 0x9961, 0x99AB, 0x9A64, 0x9A66, 0x9A67, 0x9B24, 0x9E15,
+ 0x9E17, 0x9F48, 0x6207, 0x6B1E, 0x7227, 0x864C, 0x8EA8, 0x9482,
+ 0x9480, 0x9481, 0x9A69, 0x9A68, 0x9B2E, 0x9E19, 0x7229, 0x864B,
+ 0x8B9F, 0x9483, 0x9C79, 0x9EB7, 0x7675, 0x9A6B, 0x9C7A, 0x9E1D,
+ 0x7069, 0x706A, 0x9EA4, 0x9F7E, 0x9F49, 0x9F98, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+};
+
+CODE_CONV_TWO_OCTET_TO_UCS2(cc_big5eten_to_ucs2, /* function name */
+ tblBig5EtenToUcs2, /* table name */
+ 0x00A1, 0x00F9, /* code range (high byte) */
+ 0x0040, 0x00FF, /* code range (low byte) */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/BIG5/Imakefile b/xc/extras/X-TrueType/BIG5/Imakefile
new file mode 100644
index 000000000..aad55684f
--- /dev/null
+++ b/xc/extras/X-TrueType/BIG5/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: BIG5 */
+
+#define ModuleName BIG5
+SRCS = BIG5toUCS2.c main.c
+OBJS = BIG5toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/BIG5/main.c b/xc/extras/X-TrueType/BIG5/main.c
new file mode 100644
index 000000000..1eba9d160
--- /dev/null
+++ b/xc/extras/X-TrueType/BIG5/main.c
@@ -0,0 +1,69 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ BIG5ETEN
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "big5", "eten", NULL, BIG5ETEN, { 0x40, 0xff, 0xa1, 0xf9, 0xa140 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_big5eten_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { BIG5ETEN, EPlfmISO, EEncISO10646,
+ cc_big5eten_to_ucs2, NULL },
+ { BIG5ETEN, EPlfmUnicode, EEncAny,
+ cc_big5eten_to_ucs2, NULL },
+ { BIG5ETEN, EPlfmMS, EEncMSUnicode,
+ cc_big5eten_to_ucs2, NULL },
+ { BIG5ETEN, EPlfmMS, EEncMSBig5WGL4, NULL, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(BIG5_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/CHANGES.eng b/xc/extras/X-TrueType/CHANGES.eng
new file mode 100644
index 000000000..6ddfbb62d
--- /dev/null
+++ b/xc/extras/X-TrueType/CHANGES.eng
@@ -0,0 +1,41 @@
+* Changes between 1.1pl05 and 1.2
+ - fix several bugs in code converter, and
+ - change directory hierarchie (for XFree86 New Design).
+
+* Changes between 1.1pl04 and 1.1pl05
+ - fix when HasSharedLibraries is defined as No,
+ - add new converters (contributed by Pablo Saratxaga), and
+ - fix for Very Lazy using particular fonts.
+
+* Changes between 1.1pl03 and 1.1pl04
+ - add "cr" (Code Range) TTCap to restrict code range.
+
+* Changes between 1.1pl02 and 1.1pl03
+ - fix for FreeBSD ELF Platforms.
+
+* Changes between 1.1pl01 and 1.1pl02
+ - fix for MS Unicode font to use unicode charset, and
+ - add the XLFD range specifies.
+
+* Changes between 1.1pl00 and 1.1pl01
+ - added the very lazy font metrics calculation method,
+ - fix for the ISO 8859-11, and
+ - fix for ftcconv.c if the code converter module is linked
+ statically.
+
+* Changes between 1.1 and 1.1pl00
+ - added the true font property of the font metrics.
+
+* Changes between 1.0pl00 and 1.1.
+ - switched the base XFree86 source codes to version 3.3.3,
+ - added TCVN encoding (contributed by Pablo Saratxaga),
+ - bug fix for the font rotation, and
+ - added the code to calculation the raw width and to store the
+ `attributes' field in the `XCharStruct'.
+
+* Changes between 1.0 and 1.0pl00.
+ - added 'Turn on/off Hinting' to TTCap,
+ - added some encodings, and
+ - some bug fix.
+
+# end of file
diff --git a/xc/extras/X-TrueType/DOSENCODING/DOSENCODINGtoUCS2.c b/xc/extras/X-TrueType/DOSENCODING/DOSENCODINGtoUCS2.c
new file mode 100644
index 000000000..d52ef5fdb
--- /dev/null
+++ b/xc/extras/X-TrueType/DOSENCODING/DOSENCODINGtoUCS2.c
@@ -0,0 +1,227 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ DOS encodings (IBM codepages) to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Table build by looking into the unicode chart, and various DOS
+ and Windows fonts, DOS manuals and GNU libc internationalization
+ charset tables.
+
+ support for those encodings may seem useless for X11, but doesmu users
+ can appreciate it, as well as users of any kind of DOS emulator.
+ Also several True Type fonts made primarly for Windows are completly
+ broken, that is the unicode codes they told are wrong, they claim to
+ be cp1252 while they are not. So the alias -misc-fontspecific can
+ be helpfull to use TTF fonts wrongly encoded (that is the case of
+ all the vietnamese fonts I've seen so far, they have to be called
+ whith -misc-fontspecific instead of -viscii1.1-1 *sigh*)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblCp437ToUcs2[] = {
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,
+ 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA,
+ 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556,
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F,
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,
+ 0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B,
+ 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,
+ 0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4,
+ 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,
+ 0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248,
+ 0x00B0, 0x00B7, 0x2022, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0
+};
+
+static ucs2_t tblCp850ToUcs2[] = {
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7,
+ 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,
+ 0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9,
+ 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20D7, 0x0192,
+ 0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA,
+ 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,
+ 0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C0, 0x00A9,
+ 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510,
+ 0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3,
+ 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,
+ 0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE,
+ 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,
+ 0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE,
+ 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,
+ 0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8,
+ 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0
+};
+
+static ucs2_t tblCp1252ToUcs2[] = {
+ ALTCHR, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F,
+ 0x0080, 0x0081, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0x008d, 0x008e, 0x008f,
+ 0x0090, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178,
+ 0x00a0, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7,
+ 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
+ 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7,
+ 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
+ 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7,
+ 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
+};
+
+static ucs2_t tblCp1256ToUcs2[] = {
+ ALTCHR, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007,
+ 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f,
+ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017,
+ 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066a, 0x0026, 0x0027,
+ 0x0029, 0x0028, 0x002A, 0x002B, 0x066b, 0x002D, 0x002E, 0x002F,
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667,
+ 0x0668, 0x0669, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005d, 0x005C, 0x005b, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0xfd3f, 0x007C, 0xfd3e, 0x007E, 0x007F,
+ 0x0080, 0xfb56, 0x201a, 0x0192, 0x201e, 0x2026, 0x2020, 0x2021,
+ 0x02c6, 0x2030, 0x0160, 0x2039, 0x0152, 0xfb7a, 0xfb8a, 0x008f,
+ 0xfb92, 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+ 0x02dc, 0x2122, 0x0161, 0x203a, 0x0153, 0x009d, 0x009e, 0x0178,
+ 0x00a0, 0x060c, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7,
+ 0x00a8, 0x00a9, 0x00aa, 0x00bb, 0x00ac, 0x00ad, 0x00ae, 0x00af,
+ 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+ 0x00b8, 0x00b9, 0x061b, 0x00ab, 0x00bc, 0x00bd, 0x00be, 0x061f,
+ 0x00c0, 0xfe80, 0xfe81, 0xfe83, 0xfe85, 0xfe87, 0xfe89, 0xfe8d,
+ 0xfe8f, 0xfe93, 0xfe95, 0xfe99, 0xfe9d, 0xfea1, 0xfea5, 0xfea9,
+ 0xfeab, 0xfead, 0xfeaf, 0xfeb1, 0xfeb5, 0xfeb9, 0xfebd, 0x00d7,
+ 0xfec1, 0xfec5, 0xfec9, 0xfecd, 0x0640, 0xfed1, 0xfed5, 0xfed9,
+ 0x00e0, 0xfedd, 0x00e2, 0xfee1, 0xfee5, 0xfee9, 0xfeed, 0x00e7,
+ 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0xfeef, 0xfef1, 0x00ee, 0x00ef,
+ 0xfe70, 0xfe72, 0xfe74, 0xfe76, 0x00f4, 0xfe78, 0xfe7a, 0x00f7,
+ 0xfe7c, 0x00f9, 0xfe7e, 0x00fb, 0x00fc, 0x200e, 0x200f, 0x00ff
+};
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_cp437_to_ucs2, /* function name */
+ tblCp437ToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_cp850_to_ucs2, /* function name */
+ tblCp850ToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_cp1252_to_ucs2, /* function name */
+ tblCp1252ToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_cp1256_to_ucs2, /* function name */
+ tblCp1256ToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/DOSENCODING/Imakefile b/xc/extras/X-TrueType/DOSENCODING/Imakefile
new file mode 100644
index 000000000..34bb6284d
--- /dev/null
+++ b/xc/extras/X-TrueType/DOSENCODING/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: DOSENCODING */
+
+#define ModuleName DOSENCODING
+SRCS = DOSENCODINGtoUCS2.c main.c
+OBJS = DOSENCODINGtoUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/DOSENCODING/main.c b/xc/extras/X-TrueType/DOSENCODING/main.c
new file mode 100644
index 000000000..d5b93cad1
--- /dev/null
+++ b/xc/extras/X-TrueType/DOSENCODING/main.c
@@ -0,0 +1,96 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1998,1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Table build by looking into the unicode chart, and various DOS
+ and Windows fonts, DOS manuals and GNU libc internationalization
+ charset tables.
+
+ support for those encodings may seem useless for X11, but doesmu users
+ can appreciate it, as well as users of any kind of DOS emulator.
+ Also several True Type fonts made primarly for Windows are completly
+ broken, that is the unicode codes they told are wrong, they claim to
+ be cp1252 while they are not. So the alias -misc-fontspecific can
+ be helpfull to use TTF fonts wrongly encoded (that is the case of
+ all the vietnamese fonts I've seen so far, they have to be called
+ whith -misc-fontspecific instead of -viscii1.1-1 *sigh*)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ CP437,
+ CP850,
+ CP1252,
+ /* CP1256 moved to ARABIC directory */
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "ibm", NULL, "cp437", CP437, { 0x00, 0xff, 0, 0, 0x20 } },
+ { "ibm", NULL, "cp850", CP850, { 0x00, 0xff, 0, 0, 0x20 } },
+ { "microsoft", NULL, "cp1252", CP1252, { 0x00, 0xff, 0, 0, 0x20 } },
+ { "ansi", NULL, "0", CP1252, { 0x00, 0xff, 0, 0, 0x20 } },
+ { "microsoft", NULL, "fontspecific", CP1252, { 0x00, 0xff, 0, 0, 0x20 } },
+ { "misc", NULL, "fontspecific", CP1252, { 0x00, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_cp437_to_ucs2);
+CODECONV_TEMPLATE(cc_cp850_to_ucs2);
+CODECONV_TEMPLATE(cc_cp1252_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { CP437, EPlfmISO, EEncISO10646, cc_cp437_to_ucs2, NULL },
+ { CP437, EPlfmUnicode, EEncAny, cc_cp437_to_ucs2, NULL },
+ { CP437, EPlfmMS, EEncMSUnicode, cc_cp437_to_ucs2, NULL },
+ { CP850, EPlfmISO, EEncISO10646, cc_cp850_to_ucs2, NULL },
+ { CP850, EPlfmUnicode, EEncAny, cc_cp850_to_ucs2, NULL },
+ { CP850, EPlfmMS, EEncMSUnicode, cc_cp850_to_ucs2, NULL },
+ { CP1252, EPlfmISO, EEncISO10646, cc_cp1252_to_ucs2, NULL },
+ { CP1252, EPlfmUnicode, EEncAny, cc_cp1252_to_ucs2, NULL },
+ { CP1252, EPlfmMS, EEncMSUnicode, cc_cp1252_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(DOSENCODING_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/GB2312/GB2312toUCS2.c b/xc/extras/X-TrueType/GB2312/GB2312toUCS2.c
new file mode 100644
index 000000000..29666ccb8
--- /dev/null
+++ b/xc/extras/X-TrueType/GB2312/GB2312toUCS2.c
@@ -0,0 +1,1189 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPING/EASTASIA/GB/GB2312.TXT)
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x3000
+
+static ucs2_t tblGb2312ToUcs2[] = {
+/* 0x2120 - 0x217F */
+ ALTCHR, 0x3000, 0x3001, 0x3002, 0x30FB, 0x02C9, 0x02C7, 0x00A8,
+ 0x3003, 0x3005, 0x2015, 0xFF5E, 0x2225, 0x2026, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B,
+ 0x300C, 0x300D, 0x300E, 0x300F, 0x3016, 0x3017, 0x3010, 0x3011,
+ 0x00B1, 0x00D7, 0x00F7, 0x2236, 0x2227, 0x2228, 0x2211, 0x220F,
+ 0x222A, 0x2229, 0x2208, 0x2237, 0x221A, 0x22A5, 0x2225, 0x2220,
+ 0x2312, 0x2299, 0x222B, 0x222E, 0x2261, 0x224C, 0x2248, 0x223D,
+ 0x221D, 0x2260, 0x226E, 0x226F, 0x2264, 0x2265, 0x221E, 0x2235,
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFF04,
+ 0x00A4, 0xFFE0, 0xFFE1, 0x2030, 0x00A7, 0x2116, 0x2606, 0x2605,
+ 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6, 0x25A1, 0x25A0, 0x25B3,
+ 0x25B2, 0x203B, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, ALTCHR,
+/* 0x2220 - 0x227F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x2488, 0x2489, 0x248A, 0x248B, 0x248C, 0x248D, 0x248E,
+ 0x248F, 0x2490, 0x2491, 0x2492, 0x2493, 0x2494, 0x2495, 0x2496,
+ 0x2497, 0x2498, 0x2499, 0x249A, 0x249B, 0x2474, 0x2475, 0x2476,
+ 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E,
+ 0x247F, 0x2480, 0x2481, 0x2482, 0x2483, 0x2484, 0x2485, 0x2486,
+ 0x2487, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466,
+ 0x2467, 0x2468, 0x2469, ALTCHR, ALTCHR, 0x3220, 0x3221, 0x3222,
+ 0x3223, 0x3224, 0x3225, 0x3226, 0x3227, 0x3228, 0x3229, ALTCHR,
+ ALTCHR, 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166,
+ 0x2167, 0x2168, 0x2169, 0x216A, 0x216B, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2320 - 0x237F */
+ ALTCHR, 0xFF01, 0xFF02, 0xFF03, 0xFFE5, 0xFF05, 0xFF06, 0xFF07,
+ 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F,
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17,
+ 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F,
+ 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27,
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F,
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37,
+ 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F,
+ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47,
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F,
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57,
+ 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, ALTCHR,
+/* 0x2420 - 0x247F */
+ ALTCHR, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2520 - 0x257F */
+ ALTCHR, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF,
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7,
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF,
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7,
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7,
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7,
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF,
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2620 - 0x267F */
+ ALTCHR, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,
+ 0x03A9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+ 0x03C9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2720 - 0x277F */
+ ALTCHR, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401,
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D,
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D,
+ 0x042E, 0x042F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451,
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D,
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D,
+ 0x044E, 0x044F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2820 - 0x287F */
+ ALTCHR, 0x0101, 0x00E1, 0x01CE, 0x00E0, 0x0113, 0x00E9, 0x011B,
+ 0x00E8, 0x012B, 0x00ED, 0x01D0, 0x00EC, 0x014D, 0x00F3, 0x01D2,
+ 0x00F2, 0x016B, 0x00FA, 0x01D4, 0x00F9, 0x01D6, 0x01D8, 0x01DA,
+ 0x01DC, 0x00FC, 0x00EA, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x3105, 0x3106, 0x3107,
+ 0x3108, 0x3109, 0x310A, 0x310B, 0x310C, 0x310D, 0x310E, 0x310F,
+ 0x3110, 0x3111, 0x3112, 0x3113, 0x3114, 0x3115, 0x3116, 0x3117,
+ 0x3118, 0x3119, 0x311A, 0x311B, 0x311C, 0x311D, 0x311E, 0x311F,
+ 0x3120, 0x3121, 0x3122, 0x3123, 0x3124, 0x3125, 0x3126, 0x3127,
+ 0x3128, 0x3129, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2920 - 0x297F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x2500, 0x2501, 0x2502, 0x2503,
+ 0x2504, 0x2505, 0x2506, 0x2507, 0x2508, 0x2509, 0x250A, 0x250B,
+ 0x250C, 0x250D, 0x250E, 0x250F, 0x2510, 0x2511, 0x2512, 0x2513,
+ 0x2514, 0x2515, 0x2516, 0x2517, 0x2518, 0x2519, 0x251A, 0x251B,
+ 0x251C, 0x251D, 0x251E, 0x251F, 0x2520, 0x2521, 0x2522, 0x2523,
+ 0x2524, 0x2525, 0x2526, 0x2527, 0x2528, 0x2529, 0x252A, 0x252B,
+ 0x252C, 0x252D, 0x252E, 0x252F, 0x2530, 0x2531, 0x2532, 0x2533,
+ 0x2534, 0x2535, 0x2536, 0x2537, 0x2538, 0x2539, 0x253A, 0x253B,
+ 0x253C, 0x253D, 0x253E, 0x253F, 0x2540, 0x2541, 0x2542, 0x2543,
+ 0x2544, 0x2545, 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, 0x254B,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2A20 - 0x2A7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2B20 - 0x2B7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2C20 - 0x2C7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2D20 - 0x2D7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2E20 - 0x2E7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2F20 - 0x2F7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x3020 - 0x307F */
+ ALTCHR, 0x554A, 0x963F, 0x57C3, 0x6328, 0x54CE, 0x5509, 0x54C0,
+ 0x7691, 0x764C, 0x853C, 0x77EE, 0x827E, 0x788D, 0x7231, 0x9698,
+ 0x978D, 0x6C28, 0x5B89, 0x4FFA, 0x6309, 0x6697, 0x5CB8, 0x80FA,
+ 0x6848, 0x80AE, 0x6602, 0x76CE, 0x51F9, 0x6556, 0x71AC, 0x7FF1,
+ 0x8884, 0x50B2, 0x5965, 0x61CA, 0x6FB3, 0x82AD, 0x634C, 0x6252,
+ 0x53ED, 0x5427, 0x7B06, 0x516B, 0x75A4, 0x5DF4, 0x62D4, 0x8DCB,
+ 0x9776, 0x628A, 0x8019, 0x575D, 0x9738, 0x7F62, 0x7238, 0x767D,
+ 0x67CF, 0x767E, 0x6446, 0x4F70, 0x8D25, 0x62DC, 0x7A17, 0x6591,
+ 0x73ED, 0x642C, 0x6273, 0x822C, 0x9881, 0x677F, 0x7248, 0x626E,
+ 0x62CC, 0x4F34, 0x74E3, 0x534A, 0x529E, 0x7ECA, 0x90A6, 0x5E2E,
+ 0x6886, 0x699C, 0x8180, 0x7ED1, 0x68D2, 0x78C5, 0x868C, 0x9551,
+ 0x508D, 0x8C24, 0x82DE, 0x80DE, 0x5305, 0x8912, 0x5265, ALTCHR,
+/* 0x3120 - 0x317F */
+ ALTCHR, 0x8584, 0x96F9, 0x4FDD, 0x5821, 0x9971, 0x5B9D, 0x62B1,
+ 0x62A5, 0x66B4, 0x8C79, 0x9C8D, 0x7206, 0x676F, 0x7891, 0x60B2,
+ 0x5351, 0x5317, 0x8F88, 0x80CC, 0x8D1D, 0x94A1, 0x500D, 0x72C8,
+ 0x5907, 0x60EB, 0x7119, 0x88AB, 0x5954, 0x82EF, 0x672C, 0x7B28,
+ 0x5D29, 0x7EF7, 0x752D, 0x6CF5, 0x8E66, 0x8FF8, 0x903C, 0x9F3B,
+ 0x6BD4, 0x9119, 0x7B14, 0x5F7C, 0x78A7, 0x84D6, 0x853D, 0x6BD5,
+ 0x6BD9, 0x6BD6, 0x5E01, 0x5E87, 0x75F9, 0x95ED, 0x655D, 0x5F0A,
+ 0x5FC5, 0x8F9F, 0x58C1, 0x81C2, 0x907F, 0x965B, 0x97AD, 0x8FB9,
+ 0x7F16, 0x8D2C, 0x6241, 0x4FBF, 0x53D8, 0x535E, 0x8FA8, 0x8FA9,
+ 0x8FAB, 0x904D, 0x6807, 0x5F6A, 0x8198, 0x8868, 0x9CD6, 0x618B,
+ 0x522B, 0x762A, 0x5F6C, 0x658C, 0x6FD2, 0x6EE8, 0x5BBE, 0x6448,
+ 0x5175, 0x51B0, 0x67C4, 0x4E19, 0x79C9, 0x997C, 0x70B3, ALTCHR,
+/* 0x3220 - 0x327F */
+ ALTCHR, 0x75C5, 0x5E76, 0x73BB, 0x83E0, 0x64AD, 0x62E8, 0x94B5,
+ 0x6CE2, 0x535A, 0x52C3, 0x640F, 0x94C2, 0x7B94, 0x4F2F, 0x5E1B,
+ 0x8236, 0x8116, 0x818A, 0x6E24, 0x6CCA, 0x9A73, 0x6355, 0x535C,
+ 0x54FA, 0x8865, 0x57E0, 0x4E0D, 0x5E03, 0x6B65, 0x7C3F, 0x90E8,
+ 0x6016, 0x64E6, 0x731C, 0x88C1, 0x6750, 0x624D, 0x8D22, 0x776C,
+ 0x8E29, 0x91C7, 0x5F69, 0x83DC, 0x8521, 0x9910, 0x53C2, 0x8695,
+ 0x6B8B, 0x60ED, 0x60E8, 0x707F, 0x82CD, 0x8231, 0x4ED3, 0x6CA7,
+ 0x85CF, 0x64CD, 0x7CD9, 0x69FD, 0x66F9, 0x8349, 0x5395, 0x7B56,
+ 0x4FA7, 0x518C, 0x6D4B, 0x5C42, 0x8E6D, 0x63D2, 0x53C9, 0x832C,
+ 0x8336, 0x67E5, 0x78B4, 0x643D, 0x5BDF, 0x5C94, 0x5DEE, 0x8BE7,
+ 0x62C6, 0x67F4, 0x8C7A, 0x6400, 0x63BA, 0x8749, 0x998B, 0x8C17,
+ 0x7F20, 0x94F2, 0x4EA7, 0x9610, 0x98A4, 0x660C, 0x7316, ALTCHR,
+/* 0x3320 - 0x337F */
+ ALTCHR, 0x573A, 0x5C1D, 0x5E38, 0x957F, 0x507F, 0x80A0, 0x5382,
+ 0x655E, 0x7545, 0x5531, 0x5021, 0x8D85, 0x6284, 0x949E, 0x671D,
+ 0x5632, 0x6F6E, 0x5DE2, 0x5435, 0x7092, 0x8F66, 0x626F, 0x64A4,
+ 0x63A3, 0x5F7B, 0x6F88, 0x90F4, 0x81E3, 0x8FB0, 0x5C18, 0x6668,
+ 0x5FF1, 0x6C89, 0x9648, 0x8D81, 0x886C, 0x6491, 0x79F0, 0x57CE,
+ 0x6A59, 0x6210, 0x5448, 0x4E58, 0x7A0B, 0x60E9, 0x6F84, 0x8BDA,
+ 0x627F, 0x901E, 0x9A8B, 0x79E4, 0x5403, 0x75F4, 0x6301, 0x5319,
+ 0x6C60, 0x8FDF, 0x5F1B, 0x9A70, 0x803B, 0x9F7F, 0x4F88, 0x5C3A,
+ 0x8D64, 0x7FC5, 0x65A5, 0x70BD, 0x5145, 0x51B2, 0x866B, 0x5D07,
+ 0x5BA0, 0x62BD, 0x916C, 0x7574, 0x8E0C, 0x7A20, 0x6101, 0x7B79,
+ 0x4EC7, 0x7EF8, 0x7785, 0x4E11, 0x81ED, 0x521D, 0x51FA, 0x6A71,
+ 0x53A8, 0x8E87, 0x9504, 0x96CF, 0x6EC1, 0x9664, 0x695A, ALTCHR,
+/* 0x3420 - 0x347F */
+ ALTCHR, 0x7840, 0x50A8, 0x77D7, 0x6410, 0x89E6, 0x5904, 0x63E3,
+ 0x5DDD, 0x7A7F, 0x693D, 0x4F20, 0x8239, 0x5598, 0x4E32, 0x75AE,
+ 0x7A97, 0x5E62, 0x5E8A, 0x95EF, 0x521B, 0x5439, 0x708A, 0x6376,
+ 0x9524, 0x5782, 0x6625, 0x693F, 0x9187, 0x5507, 0x6DF3, 0x7EAF,
+ 0x8822, 0x6233, 0x7EF0, 0x75B5, 0x8328, 0x78C1, 0x96CC, 0x8F9E,
+ 0x6148, 0x74F7, 0x8BCD, 0x6B64, 0x523A, 0x8D50, 0x6B21, 0x806A,
+ 0x8471, 0x56F1, 0x5306, 0x4ECE, 0x4E1B, 0x51D1, 0x7C97, 0x918B,
+ 0x7C07, 0x4FC3, 0x8E7F, 0x7BE1, 0x7A9C, 0x6467, 0x5D14, 0x50AC,
+ 0x8106, 0x7601, 0x7CB9, 0x6DEC, 0x7FE0, 0x6751, 0x5B58, 0x5BF8,
+ 0x78CB, 0x64AE, 0x6413, 0x63AA, 0x632B, 0x9519, 0x642D, 0x8FBE,
+ 0x7B54, 0x7629, 0x6253, 0x5927, 0x5446, 0x6B79, 0x50A3, 0x6234,
+ 0x5E26, 0x6B86, 0x4EE3, 0x8D37, 0x888B, 0x5F85, 0x902E, ALTCHR,
+/* 0x3520 - 0x357F */
+ ALTCHR, 0x6020, 0x803D, 0x62C5, 0x4E39, 0x5355, 0x90F8, 0x63B8,
+ 0x80C6, 0x65E6, 0x6C2E, 0x4F46, 0x60EE, 0x6DE1, 0x8BDE, 0x5F39,
+ 0x86CB, 0x5F53, 0x6321, 0x515A, 0x8361, 0x6863, 0x5200, 0x6363,
+ 0x8E48, 0x5012, 0x5C9B, 0x7977, 0x5BFC, 0x5230, 0x7A3B, 0x60BC,
+ 0x9053, 0x76D7, 0x5FB7, 0x5F97, 0x7684, 0x8E6C, 0x706F, 0x767B,
+ 0x7B49, 0x77AA, 0x51F3, 0x9093, 0x5824, 0x4F4E, 0x6EF4, 0x8FEA,
+ 0x654C, 0x7B1B, 0x72C4, 0x6DA4, 0x7FDF, 0x5AE1, 0x62B5, 0x5E95,
+ 0x5730, 0x8482, 0x7B2C, 0x5E1D, 0x5F1F, 0x9012, 0x7F14, 0x98A0,
+ 0x6382, 0x6EC7, 0x7898, 0x70B9, 0x5178, 0x975B, 0x57AB, 0x7535,
+ 0x4F43, 0x7538, 0x5E97, 0x60E6, 0x5960, 0x6DC0, 0x6BBF, 0x7889,
+ 0x53FC, 0x96D5, 0x51CB, 0x5201, 0x6389, 0x540A, 0x9493, 0x8C03,
+ 0x8DCC, 0x7239, 0x789F, 0x8776, 0x8FED, 0x8C0D, 0x53E0, ALTCHR,
+/* 0x3620 - 0x367F */
+ ALTCHR, 0x4E01, 0x76EF, 0x53EE, 0x9489, 0x9876, 0x9F0E, 0x952D,
+ 0x5B9A, 0x8BA2, 0x4E22, 0x4E1C, 0x51AC, 0x8463, 0x61C2, 0x52A8,
+ 0x680B, 0x4F97, 0x606B, 0x51BB, 0x6D1E, 0x515C, 0x6296, 0x6597,
+ 0x9661, 0x8C46, 0x9017, 0x75D8, 0x90FD, 0x7763, 0x6BD2, 0x728A,
+ 0x72EC, 0x8BFB, 0x5835, 0x7779, 0x8D4C, 0x675C, 0x9540, 0x809A,
+ 0x5EA6, 0x6E21, 0x5992, 0x7AEF, 0x77ED, 0x953B, 0x6BB5, 0x65AD,
+ 0x7F0E, 0x5806, 0x5151, 0x961F, 0x5BF9, 0x58A9, 0x5428, 0x8E72,
+ 0x6566, 0x987F, 0x56E4, 0x949D, 0x76FE, 0x9041, 0x6387, 0x54C6,
+ 0x591A, 0x593A, 0x579B, 0x8EB2, 0x6735, 0x8DFA, 0x8235, 0x5241,
+ 0x60F0, 0x5815, 0x86FE, 0x5CE8, 0x9E45, 0x4FC4, 0x989D, 0x8BB9,
+ 0x5A25, 0x6076, 0x5384, 0x627C, 0x904F, 0x9102, 0x997F, 0x6069,
+ 0x800C, 0x513F, 0x8033, 0x5C14, 0x9975, 0x6D31, 0x4E8C, ALTCHR,
+/* 0x3720 - 0x377F */
+ ALTCHR, 0x8D30, 0x53D1, 0x7F5A, 0x7B4F, 0x4F10, 0x4E4F, 0x9600,
+ 0x6CD5, 0x73D0, 0x85E9, 0x5E06, 0x756A, 0x7FFB, 0x6A0A, 0x77FE,
+ 0x9492, 0x7E41, 0x51E1, 0x70E6, 0x53CD, 0x8FD4, 0x8303, 0x8D29,
+ 0x72AF, 0x996D, 0x6CDB, 0x574A, 0x82B3, 0x65B9, 0x80AA, 0x623F,
+ 0x9632, 0x59A8, 0x4EFF, 0x8BBF, 0x7EBA, 0x653E, 0x83F2, 0x975E,
+ 0x5561, 0x98DE, 0x80A5, 0x532A, 0x8BFD, 0x5420, 0x80BA, 0x5E9F,
+ 0x6CB8, 0x8D39, 0x82AC, 0x915A, 0x5429, 0x6C1B, 0x5206, 0x7EB7,
+ 0x575F, 0x711A, 0x6C7E, 0x7C89, 0x594B, 0x4EFD, 0x5FFF, 0x6124,
+ 0x7CAA, 0x4E30, 0x5C01, 0x67AB, 0x8702, 0x5CF0, 0x950B, 0x98CE,
+ 0x75AF, 0x70FD, 0x9022, 0x51AF, 0x7F1D, 0x8BBD, 0x5949, 0x51E4,
+ 0x4F5B, 0x5426, 0x592B, 0x6577, 0x80A4, 0x5B75, 0x6276, 0x62C2,
+ 0x8F90, 0x5E45, 0x6C1F, 0x7B26, 0x4F0F, 0x4FD8, 0x670D, ALTCHR,
+/* 0x3820 - 0x387F */
+ ALTCHR, 0x6D6E, 0x6DAA, 0x798F, 0x88B1, 0x5F17, 0x752B, 0x629A,
+ 0x8F85, 0x4FEF, 0x91DC, 0x65A7, 0x812F, 0x8151, 0x5E9C, 0x8150,
+ 0x8D74, 0x526F, 0x8986, 0x8D4B, 0x590D, 0x5085, 0x4ED8, 0x961C,
+ 0x7236, 0x8179, 0x8D1F, 0x5BCC, 0x8BA3, 0x9644, 0x5987, 0x7F1A,
+ 0x5490, 0x5676, 0x560E, 0x8BE5, 0x6539, 0x6982, 0x9499, 0x76D6,
+ 0x6E89, 0x5E72, 0x7518, 0x6746, 0x67D1, 0x7AFF, 0x809D, 0x8D76,
+ 0x611F, 0x79C6, 0x6562, 0x8D63, 0x5188, 0x521A, 0x94A2, 0x7F38,
+ 0x809B, 0x7EB2, 0x5C97, 0x6E2F, 0x6760, 0x7BD9, 0x768B, 0x9AD8,
+ 0x818F, 0x7F94, 0x7CD5, 0x641E, 0x9550, 0x7A3F, 0x544A, 0x54E5,
+ 0x6B4C, 0x6401, 0x6208, 0x9E3D, 0x80F3, 0x7599, 0x5272, 0x9769,
+ 0x845B, 0x683C, 0x86E4, 0x9601, 0x9694, 0x94EC, 0x4E2A, 0x5404,
+ 0x7ED9, 0x6839, 0x8DDF, 0x8015, 0x66F4, 0x5E9A, 0x7FB9, ALTCHR,
+/* 0x3920 - 0x397F */
+ ALTCHR, 0x57C2, 0x803F, 0x6897, 0x5DE5, 0x653B, 0x529F, 0x606D,
+ 0x9F9A, 0x4F9B, 0x8EAC, 0x516C, 0x5BAB, 0x5F13, 0x5DE9, 0x6C5E,
+ 0x62F1, 0x8D21, 0x5171, 0x94A9, 0x52FE, 0x6C9F, 0x82DF, 0x72D7,
+ 0x57A2, 0x6784, 0x8D2D, 0x591F, 0x8F9C, 0x83C7, 0x5495, 0x7B8D,
+ 0x4F30, 0x6CBD, 0x5B64, 0x59D1, 0x9F13, 0x53E4, 0x86CA, 0x9AA8,
+ 0x8C37, 0x80A1, 0x6545, 0x987E, 0x56FA, 0x96C7, 0x522E, 0x74DC,
+ 0x5250, 0x5BE1, 0x6302, 0x8902, 0x4E56, 0x62D0, 0x602A, 0x68FA,
+ 0x5173, 0x5B98, 0x51A0, 0x89C2, 0x7BA1, 0x9986, 0x7F50, 0x60EF,
+ 0x704C, 0x8D2F, 0x5149, 0x5E7F, 0x901B, 0x7470, 0x89C4, 0x572D,
+ 0x7845, 0x5F52, 0x9F9F, 0x95FA, 0x8F68, 0x9B3C, 0x8BE1, 0x7678,
+ 0x6842, 0x67DC, 0x8DEA, 0x8D35, 0x523D, 0x8F8A, 0x6EDA, 0x68CD,
+ 0x9505, 0x90ED, 0x56FD, 0x679C, 0x88F9, 0x8FC7, 0x54C8, ALTCHR,
+/* 0x3A20 - 0x3A7F */
+ ALTCHR, 0x9AB8, 0x5B69, 0x6D77, 0x6C26, 0x4EA5, 0x5BB3, 0x9A87,
+ 0x9163, 0x61A8, 0x90AF, 0x97E9, 0x542B, 0x6DB5, 0x5BD2, 0x51FD,
+ 0x558A, 0x7F55, 0x7FF0, 0x64BC, 0x634D, 0x65F1, 0x61BE, 0x608D,
+ 0x710A, 0x6C57, 0x6C49, 0x592F, 0x676D, 0x822A, 0x58D5, 0x568E,
+ 0x8C6A, 0x6BEB, 0x90DD, 0x597D, 0x8017, 0x53F7, 0x6D69, 0x5475,
+ 0x559D, 0x8377, 0x83CF, 0x6838, 0x79BE, 0x548C, 0x4F55, 0x5408,
+ 0x76D2, 0x8C89, 0x9602, 0x6CB3, 0x6DB8, 0x8D6B, 0x8910, 0x9E64,
+ 0x8D3A, 0x563F, 0x9ED1, 0x75D5, 0x5F88, 0x72E0, 0x6068, 0x54FC,
+ 0x4EA8, 0x6A2A, 0x8861, 0x6052, 0x8F70, 0x54C4, 0x70D8, 0x8679,
+ 0x9E3F, 0x6D2A, 0x5B8F, 0x5F18, 0x7EA2, 0x5589, 0x4FAF, 0x7334,
+ 0x543C, 0x539A, 0x5019, 0x540E, 0x547C, 0x4E4E, 0x5FFD, 0x745A,
+ 0x58F6, 0x846B, 0x80E1, 0x8774, 0x72D0, 0x7CCA, 0x6E56, ALTCHR,
+/* 0x3B20 - 0x3B7F */
+ ALTCHR, 0x5F27, 0x864E, 0x552C, 0x62A4, 0x4E92, 0x6CAA, 0x6237,
+ 0x82B1, 0x54D7, 0x534E, 0x733E, 0x6ED1, 0x753B, 0x5212, 0x5316,
+ 0x8BDD, 0x69D0, 0x5F8A, 0x6000, 0x6DEE, 0x574F, 0x6B22, 0x73AF,
+ 0x6853, 0x8FD8, 0x7F13, 0x6362, 0x60A3, 0x5524, 0x75EA, 0x8C62,
+ 0x7115, 0x6DA3, 0x5BA6, 0x5E7B, 0x8352, 0x614C, 0x9EC4, 0x78FA,
+ 0x8757, 0x7C27, 0x7687, 0x51F0, 0x60F6, 0x714C, 0x6643, 0x5E4C,
+ 0x604D, 0x8C0E, 0x7070, 0x6325, 0x8F89, 0x5FBD, 0x6062, 0x86D4,
+ 0x56DE, 0x6BC1, 0x6094, 0x6167, 0x5349, 0x60E0, 0x6666, 0x8D3F,
+ 0x79FD, 0x4F1A, 0x70E9, 0x6C47, 0x8BB3, 0x8BF2, 0x7ED8, 0x8364,
+ 0x660F, 0x5A5A, 0x9B42, 0x6D51, 0x6DF7, 0x8C41, 0x6D3B, 0x4F19,
+ 0x706B, 0x83B7, 0x6216, 0x60D1, 0x970D, 0x8D27, 0x7978, 0x51FB,
+ 0x573E, 0x57FA, 0x673A, 0x7578, 0x7A3D, 0x79EF, 0x7B95, ALTCHR,
+/* 0x3C20 - 0x3C7F */
+ ALTCHR, 0x808C, 0x9965, 0x8FF9, 0x6FC0, 0x8BA5, 0x9E21, 0x59EC,
+ 0x7EE9, 0x7F09, 0x5409, 0x6781, 0x68D8, 0x8F91, 0x7C4D, 0x96C6,
+ 0x53CA, 0x6025, 0x75BE, 0x6C72, 0x5373, 0x5AC9, 0x7EA7, 0x6324,
+ 0x51E0, 0x810A, 0x5DF1, 0x84DF, 0x6280, 0x5180, 0x5B63, 0x4F0E,
+ 0x796D, 0x5242, 0x60B8, 0x6D4E, 0x5BC4, 0x5BC2, 0x8BA1, 0x8BB0,
+ 0x65E2, 0x5FCC, 0x9645, 0x5993, 0x7EE7, 0x7EAA, 0x5609, 0x67B7,
+ 0x5939, 0x4F73, 0x5BB6, 0x52A0, 0x835A, 0x988A, 0x8D3E, 0x7532,
+ 0x94BE, 0x5047, 0x7A3C, 0x4EF7, 0x67B6, 0x9A7E, 0x5AC1, 0x6B7C,
+ 0x76D1, 0x575A, 0x5C16, 0x7B3A, 0x95F4, 0x714E, 0x517C, 0x80A9,
+ 0x8270, 0x5978, 0x7F04, 0x8327, 0x68C0, 0x67EC, 0x78B1, 0x7877,
+ 0x62E3, 0x6361, 0x7B80, 0x4FED, 0x526A, 0x51CF, 0x8350, 0x69DB,
+ 0x9274, 0x8DF5, 0x8D31, 0x89C1, 0x952E, 0x7BAD, 0x4EF6, ALTCHR,
+/* 0x3D20 - 0x3D7F */
+ ALTCHR, 0x5065, 0x8230, 0x5251, 0x996F, 0x6E10, 0x6E85, 0x6DA7,
+ 0x5EFA, 0x50F5, 0x59DC, 0x5C06, 0x6D46, 0x6C5F, 0x7586, 0x848B,
+ 0x6868, 0x5956, 0x8BB2, 0x5320, 0x9171, 0x964D, 0x8549, 0x6912,
+ 0x7901, 0x7126, 0x80F6, 0x4EA4, 0x90CA, 0x6D47, 0x9A84, 0x5A07,
+ 0x56BC, 0x6405, 0x94F0, 0x77EB, 0x4FA5, 0x811A, 0x72E1, 0x89D2,
+ 0x997A, 0x7F34, 0x7EDE, 0x527F, 0x6559, 0x9175, 0x8F7F, 0x8F83,
+ 0x53EB, 0x7A96, 0x63ED, 0x63A5, 0x7686, 0x79F8, 0x8857, 0x9636,
+ 0x622A, 0x52AB, 0x8282, 0x6854, 0x6770, 0x6377, 0x776B, 0x7AED,
+ 0x6D01, 0x7ED3, 0x89E3, 0x59D0, 0x6212, 0x85C9, 0x82A5, 0x754C,
+ 0x501F, 0x4ECB, 0x75A5, 0x8BEB, 0x5C4A, 0x5DFE, 0x7B4B, 0x65A4,
+ 0x91D1, 0x4ECA, 0x6D25, 0x895F, 0x7D27, 0x9526, 0x4EC5, 0x8C28,
+ 0x8FDB, 0x9773, 0x664B, 0x7981, 0x8FD1, 0x70EC, 0x6D78, ALTCHR,
+/* 0x3E20 - 0x3E7F */
+ ALTCHR, 0x5C3D, 0x52B2, 0x8346, 0x5162, 0x830E, 0x775B, 0x6676,
+ 0x9CB8, 0x4EAC, 0x60CA, 0x7CBE, 0x7CB3, 0x7ECF, 0x4E95, 0x8B66,
+ 0x666F, 0x9888, 0x9759, 0x5883, 0x656C, 0x955C, 0x5F84, 0x75C9,
+ 0x9756, 0x7ADF, 0x7ADE, 0x51C0, 0x70AF, 0x7A98, 0x63EA, 0x7A76,
+ 0x7EA0, 0x7396, 0x97ED, 0x4E45, 0x7078, 0x4E5D, 0x9152, 0x53A9,
+ 0x6551, 0x65E7, 0x81FC, 0x8205, 0x548E, 0x5C31, 0x759A, 0x97A0,
+ 0x62D8, 0x72D9, 0x75BD, 0x5C45, 0x9A79, 0x83CA, 0x5C40, 0x5480,
+ 0x77E9, 0x4E3E, 0x6CAE, 0x805A, 0x62D2, 0x636E, 0x5DE8, 0x5177,
+ 0x8DDD, 0x8E1E, 0x952F, 0x4FF1, 0x53E5, 0x60E7, 0x70AC, 0x5267,
+ 0x6350, 0x9E43, 0x5A1F, 0x5026, 0x7737, 0x5377, 0x7EE2, 0x6485,
+ 0x652B, 0x6289, 0x6398, 0x5014, 0x7235, 0x89C9, 0x51B3, 0x8BC0,
+ 0x7EDD, 0x5747, 0x83CC, 0x94A7, 0x519B, 0x541B, 0x5CFB, ALTCHR,
+/* 0x3F20 - 0x3F7F */
+ ALTCHR, 0x4FCA, 0x7AE3, 0x6D5A, 0x90E1, 0x9A8F, 0x5580, 0x5496,
+ 0x5361, 0x54AF, 0x5F00, 0x63E9, 0x6977, 0x51EF, 0x6168, 0x520A,
+ 0x582A, 0x52D8, 0x574E, 0x780D, 0x770B, 0x5EB7, 0x6177, 0x7CE0,
+ 0x625B, 0x6297, 0x4EA2, 0x7095, 0x8003, 0x62F7, 0x70E4, 0x9760,
+ 0x5777, 0x82DB, 0x67EF, 0x68F5, 0x78D5, 0x9897, 0x79D1, 0x58F3,
+ 0x54B3, 0x53EF, 0x6E34, 0x514B, 0x523B, 0x5BA2, 0x8BFE, 0x80AF,
+ 0x5543, 0x57A6, 0x6073, 0x5751, 0x542D, 0x7A7A, 0x6050, 0x5B54,
+ 0x63A7, 0x62A0, 0x53E3, 0x6263, 0x5BC7, 0x67AF, 0x54ED, 0x7A9F,
+ 0x82E6, 0x9177, 0x5E93, 0x88E4, 0x5938, 0x57AE, 0x630E, 0x8DE8,
+ 0x80EF, 0x5757, 0x7B77, 0x4FA9, 0x5FEB, 0x5BBD, 0x6B3E, 0x5321,
+ 0x7B50, 0x72C2, 0x6846, 0x77FF, 0x7736, 0x65F7, 0x51B5, 0x4E8F,
+ 0x76D4, 0x5CBF, 0x7AA5, 0x8475, 0x594E, 0x9B41, 0x5080, ALTCHR,
+/* 0x4020 - 0x407F */
+ ALTCHR, 0x9988, 0x6127, 0x6E83, 0x5764, 0x6606, 0x6346, 0x56F0,
+ 0x62EC, 0x6269, 0x5ED3, 0x9614, 0x5783, 0x62C9, 0x5587, 0x8721,
+ 0x814A, 0x8FA3, 0x5566, 0x83B1, 0x6765, 0x8D56, 0x84DD, 0x5A6A,
+ 0x680F, 0x62E6, 0x7BEE, 0x9611, 0x5170, 0x6F9C, 0x8C30, 0x63FD,
+ 0x89C8, 0x61D2, 0x7F06, 0x70C2, 0x6EE5, 0x7405, 0x6994, 0x72FC,
+ 0x5ECA, 0x90CE, 0x6717, 0x6D6A, 0x635E, 0x52B3, 0x7262, 0x8001,
+ 0x4F6C, 0x59E5, 0x916A, 0x70D9, 0x6D9D, 0x52D2, 0x4E50, 0x96F7,
+ 0x956D, 0x857E, 0x78CA, 0x7D2F, 0x5121, 0x5792, 0x64C2, 0x808B,
+ 0x7C7B, 0x6CEA, 0x68F1, 0x695E, 0x51B7, 0x5398, 0x68A8, 0x7281,
+ 0x9ECE, 0x7BF1, 0x72F8, 0x79BB, 0x6F13, 0x7406, 0x674E, 0x91CC,
+ 0x9CA4, 0x793C, 0x8389, 0x8354, 0x540F, 0x6817, 0x4E3D, 0x5389,
+ 0x52B1, 0x783E, 0x5386, 0x5229, 0x5088, 0x4F8B, 0x4FD0, ALTCHR,
+/* 0x4120 - 0x417F */
+ ALTCHR, 0x75E2, 0x7ACB, 0x7C92, 0x6CA5, 0x96B6, 0x529B, 0x7483,
+ 0x54E9, 0x4FE9, 0x8054, 0x83B2, 0x8FDE, 0x9570, 0x5EC9, 0x601C,
+ 0x6D9F, 0x5E18, 0x655B, 0x8138, 0x94FE, 0x604B, 0x70BC, 0x7EC3,
+ 0x7CAE, 0x51C9, 0x6881, 0x7CB1, 0x826F, 0x4E24, 0x8F86, 0x91CF,
+ 0x667E, 0x4EAE, 0x8C05, 0x64A9, 0x804A, 0x50DA, 0x7597, 0x71CE,
+ 0x5BE5, 0x8FBD, 0x6F66, 0x4E86, 0x6482, 0x9563, 0x5ED6, 0x6599,
+ 0x5217, 0x88C2, 0x70C8, 0x52A3, 0x730E, 0x7433, 0x6797, 0x78F7,
+ 0x9716, 0x4E34, 0x90BB, 0x9CDE, 0x6DCB, 0x51DB, 0x8D41, 0x541D,
+ 0x62CE, 0x73B2, 0x83F1, 0x96F6, 0x9F84, 0x94C3, 0x4F36, 0x7F9A,
+ 0x51CC, 0x7075, 0x9675, 0x5CAD, 0x9886, 0x53E6, 0x4EE4, 0x6E9C,
+ 0x7409, 0x69B4, 0x786B, 0x998F, 0x7559, 0x5218, 0x7624, 0x6D41,
+ 0x67F3, 0x516D, 0x9F99, 0x804B, 0x5499, 0x7B3C, 0x7ABF, ALTCHR,
+/* 0x4220 - 0x427F */
+ ALTCHR, 0x9686, 0x5784, 0x62E2, 0x9647, 0x697C, 0x5A04, 0x6402,
+ 0x7BD3, 0x6F0F, 0x964B, 0x82A6, 0x5362, 0x9885, 0x5E90, 0x7089,
+ 0x63B3, 0x5364, 0x864F, 0x9C81, 0x9E93, 0x788C, 0x9732, 0x8DEF,
+ 0x8D42, 0x9E7F, 0x6F5E, 0x7984, 0x5F55, 0x9646, 0x622E, 0x9A74,
+ 0x5415, 0x94DD, 0x4FA3, 0x65C5, 0x5C65, 0x5C61, 0x7F15, 0x8651,
+ 0x6C2F, 0x5F8B, 0x7387, 0x6EE4, 0x7EFF, 0x5CE6, 0x631B, 0x5B6A,
+ 0x6EE6, 0x5375, 0x4E71, 0x63A0, 0x7565, 0x62A1, 0x8F6E, 0x4F26,
+ 0x4ED1, 0x6CA6, 0x7EB6, 0x8BBA, 0x841D, 0x87BA, 0x7F57, 0x903B,
+ 0x9523, 0x7BA9, 0x9AA1, 0x88F8, 0x843D, 0x6D1B, 0x9A86, 0x7EDC,
+ 0x5988, 0x9EBB, 0x739B, 0x7801, 0x8682, 0x9A6C, 0x9A82, 0x561B,
+ 0x5417, 0x57CB, 0x4E70, 0x9EA6, 0x5356, 0x8FC8, 0x8109, 0x7792,
+ 0x9992, 0x86EE, 0x6EE1, 0x8513, 0x66FC, 0x6162, 0x6F2B, ALTCHR,
+/* 0x4320 - 0x437F */
+ ALTCHR, 0x8C29, 0x8292, 0x832B, 0x76F2, 0x6C13, 0x5FD9, 0x83BD,
+ 0x732B, 0x8305, 0x951A, 0x6BDB, 0x77DB, 0x94C6, 0x536F, 0x8302,
+ 0x5192, 0x5E3D, 0x8C8C, 0x8D38, 0x4E48, 0x73AB, 0x679A, 0x6885,
+ 0x9176, 0x9709, 0x7164, 0x6CA1, 0x7709, 0x5A92, 0x9541, 0x6BCF,
+ 0x7F8E, 0x6627, 0x5BD0, 0x59B9, 0x5A9A, 0x95E8, 0x95F7, 0x4EEC,
+ 0x840C, 0x8499, 0x6AAC, 0x76DF, 0x9530, 0x731B, 0x68A6, 0x5B5F,
+ 0x772F, 0x919A, 0x9761, 0x7CDC, 0x8FF7, 0x8C1C, 0x5F25, 0x7C73,
+ 0x79D8, 0x89C5, 0x6CCC, 0x871C, 0x5BC6, 0x5E42, 0x68C9, 0x7720,
+ 0x7EF5, 0x5195, 0x514D, 0x52C9, 0x5A29, 0x7F05, 0x9762, 0x82D7,
+ 0x63CF, 0x7784, 0x85D0, 0x79D2, 0x6E3A, 0x5E99, 0x5999, 0x8511,
+ 0x706D, 0x6C11, 0x62BF, 0x76BF, 0x654F, 0x60AF, 0x95FD, 0x660E,
+ 0x879F, 0x9E23, 0x94ED, 0x540D, 0x547D, 0x8C2C, 0x6478, ALTCHR,
+/* 0x4420 - 0x447F */
+ ALTCHR, 0x6479, 0x8611, 0x6A21, 0x819C, 0x78E8, 0x6469, 0x9B54,
+ 0x62B9, 0x672B, 0x83AB, 0x58A8, 0x9ED8, 0x6CAB, 0x6F20, 0x5BDE,
+ 0x964C, 0x8C0B, 0x725F, 0x67D0, 0x62C7, 0x7261, 0x4EA9, 0x59C6,
+ 0x6BCD, 0x5893, 0x66AE, 0x5E55, 0x52DF, 0x6155, 0x6728, 0x76EE,
+ 0x7766, 0x7267, 0x7A46, 0x62FF, 0x54EA, 0x5450, 0x94A0, 0x90A3,
+ 0x5A1C, 0x7EB3, 0x6C16, 0x4E43, 0x5976, 0x8010, 0x5948, 0x5357,
+ 0x7537, 0x96BE, 0x56CA, 0x6320, 0x8111, 0x607C, 0x95F9, 0x6DD6,
+ 0x5462, 0x9981, 0x5185, 0x5AE9, 0x80FD, 0x59AE, 0x9713, 0x502A,
+ 0x6CE5, 0x5C3C, 0x62DF, 0x4F60, 0x533F, 0x817B, 0x9006, 0x6EBA,
+ 0x852B, 0x62C8, 0x5E74, 0x78BE, 0x64B5, 0x637B, 0x5FF5, 0x5A18,
+ 0x917F, 0x9E1F, 0x5C3F, 0x634F, 0x8042, 0x5B7D, 0x556E, 0x954A,
+ 0x954D, 0x6D85, 0x60A8, 0x67E0, 0x72DE, 0x51DD, 0x5B81, ALTCHR,
+/* 0x4520 - 0x457F */
+ ALTCHR, 0x62E7, 0x6CDE, 0x725B, 0x626D, 0x94AE, 0x7EBD, 0x8113,
+ 0x6D53, 0x519C, 0x5F04, 0x5974, 0x52AA, 0x6012, 0x5973, 0x6696,
+ 0x8650, 0x759F, 0x632A, 0x61E6, 0x7CEF, 0x8BFA, 0x54E6, 0x6B27,
+ 0x9E25, 0x6BB4, 0x85D5, 0x5455, 0x5076, 0x6CA4, 0x556A, 0x8DB4,
+ 0x722C, 0x5E15, 0x6015, 0x7436, 0x62CD, 0x6392, 0x724C, 0x5F98,
+ 0x6E43, 0x6D3E, 0x6500, 0x6F58, 0x76D8, 0x78D0, 0x76FC, 0x7554,
+ 0x5224, 0x53DB, 0x4E53, 0x5E9E, 0x65C1, 0x802A, 0x80D6, 0x629B,
+ 0x5486, 0x5228, 0x70AE, 0x888D, 0x8DD1, 0x6CE1, 0x5478, 0x80DA,
+ 0x57F9, 0x88F4, 0x8D54, 0x966A, 0x914D, 0x4F69, 0x6C9B, 0x55B7,
+ 0x76C6, 0x7830, 0x62A8, 0x70F9, 0x6F8E, 0x5F6D, 0x84EC, 0x68DA,
+ 0x787C, 0x7BF7, 0x81A8, 0x670B, 0x9E4F, 0x6367, 0x78B0, 0x576F,
+ 0x7812, 0x9739, 0x6279, 0x62AB, 0x5288, 0x7435, 0x6BD7, ALTCHR,
+/* 0x4620 - 0x467F */
+ ALTCHR, 0x5564, 0x813E, 0x75B2, 0x76AE, 0x5339, 0x75DE, 0x50FB,
+ 0x5C41, 0x8B6C, 0x7BC7, 0x504F, 0x7247, 0x9A97, 0x98D8, 0x6F02,
+ 0x74E2, 0x7968, 0x6487, 0x77A5, 0x62FC, 0x9891, 0x8D2B, 0x54C1,
+ 0x8058, 0x4E52, 0x576A, 0x82F9, 0x840D, 0x5E73, 0x51ED, 0x74F6,
+ 0x8BC4, 0x5C4F, 0x5761, 0x6CFC, 0x9887, 0x5A46, 0x7834, 0x9B44,
+ 0x8FEB, 0x7C95, 0x5256, 0x6251, 0x94FA, 0x4EC6, 0x8386, 0x8461,
+ 0x83E9, 0x84B2, 0x57D4, 0x6734, 0x5703, 0x666E, 0x6D66, 0x8C31,
+ 0x66DD, 0x7011, 0x671F, 0x6B3A, 0x6816, 0x621A, 0x59BB, 0x4E03,
+ 0x51C4, 0x6F06, 0x67D2, 0x6C8F, 0x5176, 0x68CB, 0x5947, 0x6B67,
+ 0x7566, 0x5D0E, 0x8110, 0x9F50, 0x65D7, 0x7948, 0x7941, 0x9A91,
+ 0x8D77, 0x5C82, 0x4E5E, 0x4F01, 0x542F, 0x5951, 0x780C, 0x5668,
+ 0x6C14, 0x8FC4, 0x5F03, 0x6C7D, 0x6CE3, 0x8BAB, 0x6390, ALTCHR,
+/* 0x4720 - 0x477F */
+ ALTCHR, 0x6070, 0x6D3D, 0x7275, 0x6266, 0x948E, 0x94C5, 0x5343,
+ 0x8FC1, 0x7B7E, 0x4EDF, 0x8C26, 0x4E7E, 0x9ED4, 0x94B1, 0x94B3,
+ 0x524D, 0x6F5C, 0x9063, 0x6D45, 0x8C34, 0x5811, 0x5D4C, 0x6B20,
+ 0x6B49, 0x67AA, 0x545B, 0x8154, 0x7F8C, 0x5899, 0x8537, 0x5F3A,
+ 0x62A2, 0x6A47, 0x9539, 0x6572, 0x6084, 0x6865, 0x77A7, 0x4E54,
+ 0x4FA8, 0x5DE7, 0x9798, 0x64AC, 0x7FD8, 0x5CED, 0x4FCF, 0x7A8D,
+ 0x5207, 0x8304, 0x4E14, 0x602F, 0x7A83, 0x94A6, 0x4FB5, 0x4EB2,
+ 0x79E6, 0x7434, 0x52E4, 0x82B9, 0x64D2, 0x79BD, 0x5BDD, 0x6C81,
+ 0x9752, 0x8F7B, 0x6C22, 0x503E, 0x537F, 0x6E05, 0x64CE, 0x6674,
+ 0x6C30, 0x60C5, 0x9877, 0x8BF7, 0x5E86, 0x743C, 0x7A77, 0x79CB,
+ 0x4E18, 0x90B1, 0x7403, 0x6C42, 0x56DA, 0x914B, 0x6CC5, 0x8D8B,
+ 0x533A, 0x86C6, 0x66F2, 0x8EAF, 0x5C48, 0x9A71, 0x6E20, ALTCHR,
+/* 0x4820 - 0x487F */
+ ALTCHR, 0x53D6, 0x5A36, 0x9F8B, 0x8DA3, 0x53BB, 0x5708, 0x98A7,
+ 0x6743, 0x919B, 0x6CC9, 0x5168, 0x75CA, 0x62F3, 0x72AC, 0x5238,
+ 0x529D, 0x7F3A, 0x7094, 0x7638, 0x5374, 0x9E4A, 0x69B7, 0x786E,
+ 0x96C0, 0x88D9, 0x7FA4, 0x7136, 0x71C3, 0x5189, 0x67D3, 0x74E4,
+ 0x58E4, 0x6518, 0x56B7, 0x8BA9, 0x9976, 0x6270, 0x7ED5, 0x60F9,
+ 0x70ED, 0x58EC, 0x4EC1, 0x4EBA, 0x5FCD, 0x97E7, 0x4EFB, 0x8BA4,
+ 0x5203, 0x598A, 0x7EAB, 0x6254, 0x4ECD, 0x65E5, 0x620E, 0x8338,
+ 0x84C9, 0x8363, 0x878D, 0x7194, 0x6EB6, 0x5BB9, 0x7ED2, 0x5197,
+ 0x63C9, 0x67D4, 0x8089, 0x8339, 0x8815, 0x5112, 0x5B7A, 0x5982,
+ 0x8FB1, 0x4E73, 0x6C5D, 0x5165, 0x8925, 0x8F6F, 0x962E, 0x854A,
+ 0x745E, 0x9510, 0x95F0, 0x6DA6, 0x82E5, 0x5F31, 0x6492, 0x6D12,
+ 0x8428, 0x816E, 0x9CC3, 0x585E, 0x8D5B, 0x4E09, 0x53C1, ALTCHR,
+/* 0x4920 - 0x497F */
+ ALTCHR, 0x4F1E, 0x6563, 0x6851, 0x55D3, 0x4E27, 0x6414, 0x9A9A,
+ 0x626B, 0x5AC2, 0x745F, 0x8272, 0x6DA9, 0x68EE, 0x50E7, 0x838E,
+ 0x7802, 0x6740, 0x5239, 0x6C99, 0x7EB1, 0x50BB, 0x5565, 0x715E,
+ 0x7B5B, 0x6652, 0x73CA, 0x82EB, 0x6749, 0x5C71, 0x5220, 0x717D,
+ 0x886B, 0x95EA, 0x9655, 0x64C5, 0x8D61, 0x81B3, 0x5584, 0x6C55,
+ 0x6247, 0x7F2E, 0x5892, 0x4F24, 0x5546, 0x8D4F, 0x664C, 0x4E0A,
+ 0x5C1A, 0x88F3, 0x68A2, 0x634E, 0x7A0D, 0x70E7, 0x828D, 0x52FA,
+ 0x97F6, 0x5C11, 0x54E8, 0x90B5, 0x7ECD, 0x5962, 0x8D4A, 0x86C7,
+ 0x820C, 0x820D, 0x8D66, 0x6444, 0x5C04, 0x6151, 0x6D89, 0x793E,
+ 0x8BBE, 0x7837, 0x7533, 0x547B, 0x4F38, 0x8EAB, 0x6DF1, 0x5A20,
+ 0x7EC5, 0x795E, 0x6C88, 0x5BA1, 0x5A76, 0x751A, 0x80BE, 0x614E,
+ 0x6E17, 0x58F0, 0x751F, 0x7525, 0x7272, 0x5347, 0x7EF3, ALTCHR,
+/* 0x4A20 - 0x4A7F */
+ ALTCHR, 0x7701, 0x76DB, 0x5269, 0x80DC, 0x5723, 0x5E08, 0x5931,
+ 0x72EE, 0x65BD, 0x6E7F, 0x8BD7, 0x5C38, 0x8671, 0x5341, 0x77F3,
+ 0x62FE, 0x65F6, 0x4EC0, 0x98DF, 0x8680, 0x5B9E, 0x8BC6, 0x53F2,
+ 0x77E2, 0x4F7F, 0x5C4E, 0x9A76, 0x59CB, 0x5F0F, 0x793A, 0x58EB,
+ 0x4E16, 0x67FF, 0x4E8B, 0x62ED, 0x8A93, 0x901D, 0x52BF, 0x662F,
+ 0x55DC, 0x566C, 0x9002, 0x4ED5, 0x4F8D, 0x91CA, 0x9970, 0x6C0F,
+ 0x5E02, 0x6043, 0x5BA4, 0x89C6, 0x8BD5, 0x6536, 0x624B, 0x9996,
+ 0x5B88, 0x5BFF, 0x6388, 0x552E, 0x53D7, 0x7626, 0x517D, 0x852C,
+ 0x67A2, 0x68B3, 0x6B8A, 0x6292, 0x8F93, 0x53D4, 0x8212, 0x6DD1,
+ 0x758F, 0x4E66, 0x8D4E, 0x5B70, 0x719F, 0x85AF, 0x6691, 0x66D9,
+ 0x7F72, 0x8700, 0x9ECD, 0x9F20, 0x5C5E, 0x672F, 0x8FF0, 0x6811,
+ 0x675F, 0x620D, 0x7AD6, 0x5885, 0x5EB6, 0x6570, 0x6F31, ALTCHR,
+/* 0x4B20 - 0x4B7F */
+ ALTCHR, 0x6055, 0x5237, 0x800D, 0x6454, 0x8870, 0x7529, 0x5E05,
+ 0x6813, 0x62F4, 0x971C, 0x53CC, 0x723D, 0x8C01, 0x6C34, 0x7761,
+ 0x7A0E, 0x542E, 0x77AC, 0x987A, 0x821C, 0x8BF4, 0x7855, 0x6714,
+ 0x70C1, 0x65AF, 0x6495, 0x5636, 0x601D, 0x79C1, 0x53F8, 0x4E1D,
+ 0x6B7B, 0x8086, 0x5BFA, 0x55E3, 0x56DB, 0x4F3A, 0x4F3C, 0x9972,
+ 0x5DF3, 0x677E, 0x8038, 0x6002, 0x9882, 0x9001, 0x5B8B, 0x8BBC,
+ 0x8BF5, 0x641C, 0x8258, 0x64DE, 0x55FD, 0x82CF, 0x9165, 0x4FD7,
+ 0x7D20, 0x901F, 0x7C9F, 0x50F3, 0x5851, 0x6EAF, 0x5BBF, 0x8BC9,
+ 0x8083, 0x9178, 0x849C, 0x7B97, 0x867D, 0x968B, 0x968F, 0x7EE5,
+ 0x9AD3, 0x788E, 0x5C81, 0x7A57, 0x9042, 0x96A7, 0x795F, 0x5B59,
+ 0x635F, 0x7B0B, 0x84D1, 0x68AD, 0x5506, 0x7F29, 0x7410, 0x7D22,
+ 0x9501, 0x6240, 0x584C, 0x4ED6, 0x5B83, 0x5979, 0x5854, ALTCHR,
+/* 0x4C20 - 0x4C7F */
+ ALTCHR, 0x736D, 0x631E, 0x8E4B, 0x8E0F, 0x80CE, 0x82D4, 0x62AC,
+ 0x53F0, 0x6CF0, 0x915E, 0x592A, 0x6001, 0x6C70, 0x574D, 0x644A,
+ 0x8D2A, 0x762B, 0x6EE9, 0x575B, 0x6A80, 0x75F0, 0x6F6D, 0x8C2D,
+ 0x8C08, 0x5766, 0x6BEF, 0x8892, 0x78B3, 0x63A2, 0x53F9, 0x70AD,
+ 0x6C64, 0x5858, 0x642A, 0x5802, 0x68E0, 0x819B, 0x5510, 0x7CD6,
+ 0x5018, 0x8EBA, 0x6DCC, 0x8D9F, 0x70EB, 0x638F, 0x6D9B, 0x6ED4,
+ 0x7EE6, 0x8404, 0x6843, 0x9003, 0x6DD8, 0x9676, 0x8BA8, 0x5957,
+ 0x7279, 0x85E4, 0x817E, 0x75BC, 0x8A8A, 0x68AF, 0x5254, 0x8E22,
+ 0x9511, 0x63D0, 0x9898, 0x8E44, 0x557C, 0x4F53, 0x66FF, 0x568F,
+ 0x60D5, 0x6D95, 0x5243, 0x5C49, 0x5929, 0x6DFB, 0x586B, 0x7530,
+ 0x751C, 0x606C, 0x8214, 0x8146, 0x6311, 0x6761, 0x8FE2, 0x773A,
+ 0x8DF3, 0x8D34, 0x94C1, 0x5E16, 0x5385, 0x542C, 0x70C3, ALTCHR,
+/* 0x4D20 - 0x4D7F */
+ ALTCHR, 0x6C40, 0x5EF7, 0x505C, 0x4EAD, 0x5EAD, 0x633A, 0x8247,
+ 0x901A, 0x6850, 0x916E, 0x77B3, 0x540C, 0x94DC, 0x5F64, 0x7AE5,
+ 0x6876, 0x6345, 0x7B52, 0x7EDF, 0x75DB, 0x5077, 0x6295, 0x5934,
+ 0x900F, 0x51F8, 0x79C3, 0x7A81, 0x56FE, 0x5F92, 0x9014, 0x6D82,
+ 0x5C60, 0x571F, 0x5410, 0x5154, 0x6E4D, 0x56E2, 0x63A8, 0x9893,
+ 0x817F, 0x8715, 0x892A, 0x9000, 0x541E, 0x5C6F, 0x81C0, 0x62D6,
+ 0x6258, 0x8131, 0x9E35, 0x9640, 0x9A6E, 0x9A7C, 0x692D, 0x59A5,
+ 0x62D3, 0x553E, 0x6316, 0x54C7, 0x86D9, 0x6D3C, 0x5A03, 0x74E6,
+ 0x889C, 0x6B6A, 0x5916, 0x8C4C, 0x5F2F, 0x6E7E, 0x73A9, 0x987D,
+ 0x4E38, 0x70F7, 0x5B8C, 0x7897, 0x633D, 0x665A, 0x7696, 0x60CB,
+ 0x5B9B, 0x5A49, 0x4E07, 0x8155, 0x6C6A, 0x738B, 0x4EA1, 0x6789,
+ 0x7F51, 0x5F80, 0x65FA, 0x671B, 0x5FD8, 0x5984, 0x5A01, ALTCHR,
+/* 0x4E20 - 0x4E7F */
+ ALTCHR, 0x5DCD, 0x5FAE, 0x5371, 0x97E6, 0x8FDD, 0x6845, 0x56F4,
+ 0x552F, 0x60DF, 0x4E3A, 0x6F4D, 0x7EF4, 0x82C7, 0x840E, 0x59D4,
+ 0x4F1F, 0x4F2A, 0x5C3E, 0x7EAC, 0x672A, 0x851A, 0x5473, 0x754F,
+ 0x80C3, 0x5582, 0x9B4F, 0x4F4D, 0x6E2D, 0x8C13, 0x5C09, 0x6170,
+ 0x536B, 0x761F, 0x6E29, 0x868A, 0x6587, 0x95FB, 0x7EB9, 0x543B,
+ 0x7A33, 0x7D0A, 0x95EE, 0x55E1, 0x7FC1, 0x74EE, 0x631D, 0x8717,
+ 0x6DA1, 0x7A9D, 0x6211, 0x65A1, 0x5367, 0x63E1, 0x6C83, 0x5DEB,
+ 0x545C, 0x94A8, 0x4E4C, 0x6C61, 0x8BEC, 0x5C4B, 0x65E0, 0x829C,
+ 0x68A7, 0x543E, 0x5434, 0x6BCB, 0x6B66, 0x4E94, 0x6342, 0x5348,
+ 0x821E, 0x4F0D, 0x4FAE, 0x575E, 0x620A, 0x96FE, 0x6664, 0x7269,
+ 0x52FF, 0x52A1, 0x609F, 0x8BEF, 0x6614, 0x7199, 0x6790, 0x897F,
+ 0x7852, 0x77FD, 0x6670, 0x563B, 0x5438, 0x9521, 0x727A, ALTCHR,
+/* 0x4F20 - 0x4F7F */
+ ALTCHR, 0x7A00, 0x606F, 0x5E0C, 0x6089, 0x819D, 0x5915, 0x60DC,
+ 0x7184, 0x70EF, 0x6EAA, 0x6C50, 0x7280, 0x6A84, 0x88AD, 0x5E2D,
+ 0x4E60, 0x5AB3, 0x559C, 0x94E3, 0x6D17, 0x7CFB, 0x9699, 0x620F,
+ 0x7EC6, 0x778E, 0x867E, 0x5323, 0x971E, 0x8F96, 0x6687, 0x5CE1,
+ 0x4FA0, 0x72ED, 0x4E0B, 0x53A6, 0x590F, 0x5413, 0x6380, 0x9528,
+ 0x5148, 0x4ED9, 0x9C9C, 0x7EA4, 0x54B8, 0x8D24, 0x8854, 0x8237,
+ 0x95F2, 0x6D8E, 0x5F26, 0x5ACC, 0x663E, 0x9669, 0x73B0, 0x732E,
+ 0x53BF, 0x817A, 0x9985, 0x7FA1, 0x5BAA, 0x9677, 0x9650, 0x7EBF,
+ 0x76F8, 0x53A2, 0x9576, 0x9999, 0x7BB1, 0x8944, 0x6E58, 0x4E61,
+ 0x7FD4, 0x7965, 0x8BE6, 0x60F3, 0x54CD, 0x4EAB, 0x9879, 0x5DF7,
+ 0x6A61, 0x50CF, 0x5411, 0x8C61, 0x8427, 0x785D, 0x9704, 0x524A,
+ 0x54EE, 0x56A3, 0x9500, 0x6D88, 0x5BB5, 0x6DC6, 0x6653, ALTCHR,
+/* 0x5020 - 0x507F */
+ ALTCHR, 0x5C0F, 0x5B5D, 0x6821, 0x8096, 0x5578, 0x7B11, 0x6548,
+ 0x6954, 0x4E9B, 0x6B47, 0x874E, 0x978B, 0x534F, 0x631F, 0x643A,
+ 0x90AA, 0x659C, 0x80C1, 0x8C10, 0x5199, 0x68B0, 0x5378, 0x87F9,
+ 0x61C8, 0x6CC4, 0x6CFB, 0x8C22, 0x5C51, 0x85AA, 0x82AF, 0x950C,
+ 0x6B23, 0x8F9B, 0x65B0, 0x5FFB, 0x5FC3, 0x4FE1, 0x8845, 0x661F,
+ 0x8165, 0x7329, 0x60FA, 0x5174, 0x5211, 0x578B, 0x5F62, 0x90A2,
+ 0x884C, 0x9192, 0x5E78, 0x674F, 0x6027, 0x59D3, 0x5144, 0x51F6,
+ 0x80F8, 0x5308, 0x6C79, 0x96C4, 0x718A, 0x4F11, 0x4FEE, 0x7F9E,
+ 0x673D, 0x55C5, 0x9508, 0x79C0, 0x8896, 0x7EE3, 0x589F, 0x620C,
+ 0x9700, 0x865A, 0x5618, 0x987B, 0x5F90, 0x8BB8, 0x84C4, 0x9157,
+ 0x53D9, 0x65ED, 0x5E8F, 0x755C, 0x6064, 0x7D6E, 0x5A7F, 0x7EEA,
+ 0x7EED, 0x8F69, 0x55A7, 0x5BA3, 0x60AC, 0x65CB, 0x7384, ALTCHR,
+/* 0x5120 - 0x517F */
+ ALTCHR, 0x9009, 0x7663, 0x7729, 0x7EDA, 0x9774, 0x859B, 0x5B66,
+ 0x7A74, 0x96EA, 0x8840, 0x52CB, 0x718F, 0x5FAA, 0x65EC, 0x8BE2,
+ 0x5BFB, 0x9A6F, 0x5DE1, 0x6B89, 0x6C5B, 0x8BAD, 0x8BAF, 0x900A,
+ 0x8FC5, 0x538B, 0x62BC, 0x9E26, 0x9E2D, 0x5440, 0x4E2B, 0x82BD,
+ 0x7259, 0x869C, 0x5D16, 0x8859, 0x6DAF, 0x96C5, 0x54D1, 0x4E9A,
+ 0x8BB6, 0x7109, 0x54BD, 0x9609, 0x70DF, 0x6DF9, 0x76D0, 0x4E25,
+ 0x7814, 0x8712, 0x5CA9, 0x5EF6, 0x8A00, 0x989C, 0x960E, 0x708E,
+ 0x6CBF, 0x5944, 0x63A9, 0x773C, 0x884D, 0x6F14, 0x8273, 0x5830,
+ 0x71D5, 0x538C, 0x781A, 0x96C1, 0x5501, 0x5F66, 0x7130, 0x5BB4,
+ 0x8C1A, 0x9A8C, 0x6B83, 0x592E, 0x9E2F, 0x79E7, 0x6768, 0x626C,
+ 0x4F6F, 0x75A1, 0x7F8A, 0x6D0B, 0x9633, 0x6C27, 0x4EF0, 0x75D2,
+ 0x517B, 0x6837, 0x6F3E, 0x9080, 0x8170, 0x5996, 0x7476, ALTCHR,
+/* 0x5220 - 0x527F */
+ ALTCHR, 0x6447, 0x5C27, 0x9065, 0x7A91, 0x8C23, 0x59DA, 0x54AC,
+ 0x8200, 0x836F, 0x8981, 0x8000, 0x6930, 0x564E, 0x8036, 0x7237,
+ 0x91CE, 0x51B6, 0x4E5F, 0x9875, 0x6396, 0x4E1A, 0x53F6, 0x66F3,
+ 0x814B, 0x591C, 0x6DB2, 0x4E00, 0x58F9, 0x533B, 0x63D6, 0x94F1,
+ 0x4F9D, 0x4F0A, 0x8863, 0x9890, 0x5937, 0x9057, 0x79FB, 0x4EEA,
+ 0x80F0, 0x7591, 0x6C82, 0x5B9C, 0x59E8, 0x5F5D, 0x6905, 0x8681,
+ 0x501A, 0x5DF2, 0x4E59, 0x77E3, 0x4EE5, 0x827A, 0x6291, 0x6613,
+ 0x9091, 0x5C79, 0x4EBF, 0x5F79, 0x81C6, 0x9038, 0x8084, 0x75AB,
+ 0x4EA6, 0x88D4, 0x610F, 0x6BC5, 0x5FC6, 0x4E49, 0x76CA, 0x6EA2,
+ 0x8BE3, 0x8BAE, 0x8C0A, 0x8BD1, 0x5F02, 0x7FFC, 0x7FCC, 0x7ECE,
+ 0x8335, 0x836B, 0x56E0, 0x6BB7, 0x97F3, 0x9634, 0x59FB, 0x541F,
+ 0x94F6, 0x6DEB, 0x5BC5, 0x996E, 0x5C39, 0x5F15, 0x9690, ALTCHR,
+/* 0x5320 - 0x537F */
+ ALTCHR, 0x5370, 0x82F1, 0x6A31, 0x5A74, 0x9E70, 0x5E94, 0x7F28,
+ 0x83B9, 0x8424, 0x8425, 0x8367, 0x8747, 0x8FCE, 0x8D62, 0x76C8,
+ 0x5F71, 0x9896, 0x786C, 0x6620, 0x54DF, 0x62E5, 0x4F63, 0x81C3,
+ 0x75C8, 0x5EB8, 0x96CD, 0x8E0A, 0x86F9, 0x548F, 0x6CF3, 0x6D8C,
+ 0x6C38, 0x607F, 0x52C7, 0x7528, 0x5E7D, 0x4F18, 0x60A0, 0x5FE7,
+ 0x5C24, 0x7531, 0x90AE, 0x94C0, 0x72B9, 0x6CB9, 0x6E38, 0x9149,
+ 0x6709, 0x53CB, 0x53F3, 0x4F51, 0x91C9, 0x8BF1, 0x53C8, 0x5E7C,
+ 0x8FC2, 0x6DE4, 0x4E8E, 0x76C2, 0x6986, 0x865E, 0x611A, 0x8206,
+ 0x4F59, 0x4FDE, 0x903E, 0x9C7C, 0x6109, 0x6E1D, 0x6E14, 0x9685,
+ 0x4E88, 0x5A31, 0x96E8, 0x4E0E, 0x5C7F, 0x79B9, 0x5B87, 0x8BED,
+ 0x7FBD, 0x7389, 0x57DF, 0x828B, 0x90C1, 0x5401, 0x9047, 0x55BB,
+ 0x5CEA, 0x5FA1, 0x6108, 0x6B32, 0x72F1, 0x80B2, 0x8A89, ALTCHR,
+/* 0x5420 - 0x547F */
+ ALTCHR, 0x6D74, 0x5BD3, 0x88D5, 0x9884, 0x8C6B, 0x9A6D, 0x9E33,
+ 0x6E0A, 0x51A4, 0x5143, 0x57A3, 0x8881, 0x539F, 0x63F4, 0x8F95,
+ 0x56ED, 0x5458, 0x5706, 0x733F, 0x6E90, 0x7F18, 0x8FDC, 0x82D1,
+ 0x613F, 0x6028, 0x9662, 0x66F0, 0x7EA6, 0x8D8A, 0x8DC3, 0x94A5,
+ 0x5CB3, 0x7CA4, 0x6708, 0x60A6, 0x9605, 0x8018, 0x4E91, 0x90E7,
+ 0x5300, 0x9668, 0x5141, 0x8FD0, 0x8574, 0x915D, 0x6655, 0x97F5,
+ 0x5B55, 0x531D, 0x7838, 0x6742, 0x683D, 0x54C9, 0x707E, 0x5BB0,
+ 0x8F7D, 0x518D, 0x5728, 0x54B1, 0x6512, 0x6682, 0x8D5E, 0x8D43,
+ 0x810F, 0x846C, 0x906D, 0x7CDF, 0x51FF, 0x85FB, 0x67A3, 0x65E9,
+ 0x6FA1, 0x86A4, 0x8E81, 0x566A, 0x9020, 0x7682, 0x7076, 0x71E5,
+ 0x8D23, 0x62E9, 0x5219, 0x6CFD, 0x8D3C, 0x600E, 0x589E, 0x618E,
+ 0x66FE, 0x8D60, 0x624E, 0x55B3, 0x6E23, 0x672D, 0x8F67, ALTCHR,
+/* 0x5520 - 0x557F */
+ ALTCHR, 0x94E1, 0x95F8, 0x7728, 0x6805, 0x69A8, 0x548B, 0x4E4D,
+ 0x70B8, 0x8BC8, 0x6458, 0x658B, 0x5B85, 0x7A84, 0x503A, 0x5BE8,
+ 0x77BB, 0x6BE1, 0x8A79, 0x7C98, 0x6CBE, 0x76CF, 0x65A9, 0x8F97,
+ 0x5D2D, 0x5C55, 0x8638, 0x6808, 0x5360, 0x6218, 0x7AD9, 0x6E5B,
+ 0x7EFD, 0x6A1F, 0x7AE0, 0x5F70, 0x6F33, 0x5F20, 0x638C, 0x6DA8,
+ 0x6756, 0x4E08, 0x5E10, 0x8D26, 0x4ED7, 0x80C0, 0x7634, 0x969C,
+ 0x62DB, 0x662D, 0x627E, 0x6CBC, 0x8D75, 0x7167, 0x7F69, 0x5146,
+ 0x8087, 0x53EC, 0x906E, 0x6298, 0x54F2, 0x86F0, 0x8F99, 0x8005,
+ 0x9517, 0x8517, 0x8FD9, 0x6D59, 0x73CD, 0x659F, 0x771F, 0x7504,
+ 0x7827, 0x81FB, 0x8D1E, 0x9488, 0x4FA6, 0x6795, 0x75B9, 0x8BCA,
+ 0x9707, 0x632F, 0x9547, 0x9635, 0x84B8, 0x6323, 0x7741, 0x5F81,
+ 0x72F0, 0x4E89, 0x6014, 0x6574, 0x62EF, 0x6B63, 0x653F, ALTCHR,
+/* 0x5620 - 0x567F */
+ ALTCHR, 0x5E27, 0x75C7, 0x90D1, 0x8BC1, 0x829D, 0x679D, 0x652F,
+ 0x5431, 0x8718, 0x77E5, 0x80A2, 0x8102, 0x6C41, 0x4E4B, 0x7EC7,
+ 0x804C, 0x76F4, 0x690D, 0x6B96, 0x6267, 0x503C, 0x4F84, 0x5740,
+ 0x6307, 0x6B62, 0x8DBE, 0x53EA, 0x65E8, 0x7EB8, 0x5FD7, 0x631A,
+ 0x63B7, 0x81F3, 0x81F4, 0x7F6E, 0x5E1C, 0x5CD9, 0x5236, 0x667A,
+ 0x79E9, 0x7A1A, 0x8D28, 0x7099, 0x75D4, 0x6EDE, 0x6CBB, 0x7A92,
+ 0x4E2D, 0x76C5, 0x5FE0, 0x949F, 0x8877, 0x7EC8, 0x79CD, 0x80BF,
+ 0x91CD, 0x4EF2, 0x4F17, 0x821F, 0x5468, 0x5DDE, 0x6D32, 0x8BCC,
+ 0x7CA5, 0x8F74, 0x8098, 0x5E1A, 0x5492, 0x76B1, 0x5B99, 0x663C,
+ 0x9AA4, 0x73E0, 0x682A, 0x86DB, 0x6731, 0x732A, 0x8BF8, 0x8BDB,
+ 0x9010, 0x7AF9, 0x70DB, 0x716E, 0x62C4, 0x77A9, 0x5631, 0x4E3B,
+ 0x8457, 0x67F1, 0x52A9, 0x86C0, 0x8D2E, 0x94F8, 0x7B51, ALTCHR,
+/* 0x5720 - 0x577F */
+ ALTCHR, 0x4F4F, 0x6CE8, 0x795D, 0x9A7B, 0x6293, 0x722A, 0x62FD,
+ 0x4E13, 0x7816, 0x8F6C, 0x64B0, 0x8D5A, 0x7BC6, 0x6869, 0x5E84,
+ 0x88C5, 0x5986, 0x649E, 0x58EE, 0x72B6, 0x690E, 0x9525, 0x8FFD,
+ 0x8D58, 0x5760, 0x7F00, 0x8C06, 0x51C6, 0x6349, 0x62D9, 0x5353,
+ 0x684C, 0x7422, 0x8301, 0x914C, 0x5544, 0x7740, 0x707C, 0x6D4A,
+ 0x5179, 0x54A8, 0x8D44, 0x59FF, 0x6ECB, 0x6DC4, 0x5B5C, 0x7D2B,
+ 0x4ED4, 0x7C7D, 0x6ED3, 0x5B50, 0x81EA, 0x6E0D, 0x5B57, 0x9B03,
+ 0x68D5, 0x8E2A, 0x5B97, 0x7EFC, 0x603B, 0x7EB5, 0x90B9, 0x8D70,
+ 0x594F, 0x63CD, 0x79DF, 0x8DB3, 0x5352, 0x65CF, 0x7956, 0x8BC5,
+ 0x963B, 0x7EC4, 0x94BB, 0x7E82, 0x5634, 0x9189, 0x6700, 0x7F6A,
+ 0x5C0A, 0x9075, 0x6628, 0x5DE6, 0x4F50, 0x67DE, 0x505A, 0x4F5C,
+ 0x5750, 0x5EA7, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x5820 - 0x587F */
+ ALTCHR, 0x4E8D, 0x4E0C, 0x5140, 0x4E10, 0x5EFF, 0x5345, 0x4E15,
+ 0x4E98, 0x4E1E, 0x9B32, 0x5B6C, 0x5669, 0x4E28, 0x79BA, 0x4E3F,
+ 0x5315, 0x4E47, 0x592D, 0x723B, 0x536E, 0x6C10, 0x56DF, 0x80E4,
+ 0x9997, 0x6BD3, 0x777E, 0x9F17, 0x4E36, 0x4E9F, 0x9F10, 0x4E5C,
+ 0x4E69, 0x4E93, 0x8288, 0x5B5B, 0x556C, 0x560F, 0x4EC4, 0x538D,
+ 0x539D, 0x53A3, 0x53A5, 0x53AE, 0x9765, 0x8D5D, 0x531A, 0x53F5,
+ 0x5326, 0x532E, 0x533E, 0x8D5C, 0x5366, 0x5363, 0x5202, 0x5208,
+ 0x520E, 0x522D, 0x5233, 0x523F, 0x5240, 0x524C, 0x525E, 0x5261,
+ 0x525C, 0x84AF, 0x527D, 0x5282, 0x5281, 0x5290, 0x5293, 0x5182,
+ 0x7F54, 0x4EBB, 0x4EC3, 0x4EC9, 0x4EC2, 0x4EE8, 0x4EE1, 0x4EEB,
+ 0x4EDE, 0x4F1B, 0x4EF3, 0x4F22, 0x4F64, 0x4EF5, 0x4F25, 0x4F27,
+ 0x4F09, 0x4F2B, 0x4F5E, 0x4F67, 0x6538, 0x4F5A, 0x4F5D, ALTCHR,
+/* 0x5920 - 0x597F */
+ ALTCHR, 0x4F5F, 0x4F57, 0x4F32, 0x4F3D, 0x4F76, 0x4F74, 0x4F91,
+ 0x4F89, 0x4F83, 0x4F8F, 0x4F7E, 0x4F7B, 0x4FAA, 0x4F7C, 0x4FAC,
+ 0x4F94, 0x4FE6, 0x4FE8, 0x4FEA, 0x4FC5, 0x4FDA, 0x4FE3, 0x4FDC,
+ 0x4FD1, 0x4FDF, 0x4FF8, 0x5029, 0x504C, 0x4FF3, 0x502C, 0x500F,
+ 0x502E, 0x502D, 0x4FFE, 0x501C, 0x500C, 0x5025, 0x5028, 0x507E,
+ 0x5043, 0x5055, 0x5048, 0x504E, 0x506C, 0x507B, 0x50A5, 0x50A7,
+ 0x50A9, 0x50BA, 0x50D6, 0x5106, 0x50ED, 0x50EC, 0x50E6, 0x50EE,
+ 0x5107, 0x510B, 0x4EDD, 0x6C3D, 0x4F58, 0x4F65, 0x4FCE, 0x9FA0,
+ 0x6C46, 0x7C74, 0x516E, 0x5DFD, 0x9EC9, 0x9998, 0x5181, 0x5914,
+ 0x52F9, 0x530D, 0x8A07, 0x5310, 0x51EB, 0x5919, 0x5155, 0x4EA0,
+ 0x5156, 0x4EB3, 0x886E, 0x88A4, 0x4EB5, 0x8114, 0x88D2, 0x7980,
+ 0x5B34, 0x8803, 0x7FB8, 0x51AB, 0x51B1, 0x51BD, 0x51BC, ALTCHR,
+/* 0x5A20 - 0x5A7F */
+ ALTCHR, 0x51C7, 0x5196, 0x51A2, 0x51A5, 0x8BA0, 0x8BA6, 0x8BA7,
+ 0x8BAA, 0x8BB4, 0x8BB5, 0x8BB7, 0x8BC2, 0x8BC3, 0x8BCB, 0x8BCF,
+ 0x8BCE, 0x8BD2, 0x8BD3, 0x8BD4, 0x8BD6, 0x8BD8, 0x8BD9, 0x8BDC,
+ 0x8BDF, 0x8BE0, 0x8BE4, 0x8BE8, 0x8BE9, 0x8BEE, 0x8BF0, 0x8BF3,
+ 0x8BF6, 0x8BF9, 0x8BFC, 0x8BFF, 0x8C00, 0x8C02, 0x8C04, 0x8C07,
+ 0x8C0C, 0x8C0F, 0x8C11, 0x8C12, 0x8C14, 0x8C15, 0x8C16, 0x8C19,
+ 0x8C1B, 0x8C18, 0x8C1D, 0x8C1F, 0x8C20, 0x8C21, 0x8C25, 0x8C27,
+ 0x8C2A, 0x8C2B, 0x8C2E, 0x8C2F, 0x8C32, 0x8C33, 0x8C35, 0x8C36,
+ 0x5369, 0x537A, 0x961D, 0x9622, 0x9621, 0x9631, 0x962A, 0x963D,
+ 0x963C, 0x9642, 0x9649, 0x9654, 0x965F, 0x9667, 0x966C, 0x9672,
+ 0x9674, 0x9688, 0x968D, 0x9697, 0x96B0, 0x9097, 0x909B, 0x909D,
+ 0x9099, 0x90AC, 0x90A1, 0x90B4, 0x90B3, 0x90B6, 0x90BA, ALTCHR,
+/* 0x5B20 - 0x5B7F */
+ ALTCHR, 0x90B8, 0x90B0, 0x90CF, 0x90C5, 0x90BE, 0x90D0, 0x90C4,
+ 0x90C7, 0x90D3, 0x90E6, 0x90E2, 0x90DC, 0x90D7, 0x90DB, 0x90EB,
+ 0x90EF, 0x90FE, 0x9104, 0x9122, 0x911E, 0x9123, 0x9131, 0x912F,
+ 0x9139, 0x9143, 0x9146, 0x520D, 0x5942, 0x52A2, 0x52AC, 0x52AD,
+ 0x52BE, 0x54FF, 0x52D0, 0x52D6, 0x52F0, 0x53DF, 0x71EE, 0x77CD,
+ 0x5EF4, 0x51F5, 0x51FC, 0x9B2F, 0x53B6, 0x5F01, 0x755A, 0x5DEF,
+ 0x574C, 0x57A9, 0x57A1, 0x587E, 0x58BC, 0x58C5, 0x58D1, 0x5729,
+ 0x572C, 0x572A, 0x5733, 0x5739, 0x572E, 0x572F, 0x575C, 0x573B,
+ 0x5742, 0x5769, 0x5785, 0x576B, 0x5786, 0x577C, 0x577B, 0x5768,
+ 0x576D, 0x5776, 0x5773, 0x57AD, 0x57A4, 0x578C, 0x57B2, 0x57CF,
+ 0x57A7, 0x57B4, 0x5793, 0x57A0, 0x57D5, 0x57D8, 0x57DA, 0x57D9,
+ 0x57D2, 0x57B8, 0x57F4, 0x57EF, 0x57F8, 0x57E4, 0x57DD, ALTCHR,
+/* 0x5C20 - 0x5C7F */
+ ALTCHR, 0x580B, 0x580D, 0x57FD, 0x57ED, 0x5800, 0x581E, 0x5819,
+ 0x5844, 0x5820, 0x5865, 0x586C, 0x5881, 0x5889, 0x589A, 0x5880,
+ 0x99A8, 0x9F19, 0x61FF, 0x8279, 0x827D, 0x827F, 0x828F, 0x828A,
+ 0x82A8, 0x8284, 0x828E, 0x8291, 0x8297, 0x8299, 0x82AB, 0x82B8,
+ 0x82BE, 0x82B0, 0x82C8, 0x82CA, 0x82E3, 0x8298, 0x82B7, 0x82AE,
+ 0x82CB, 0x82CC, 0x82C1, 0x82A9, 0x82B4, 0x82A1, 0x82AA, 0x829F,
+ 0x82C4, 0x82CE, 0x82A4, 0x82E1, 0x8309, 0x82F7, 0x82E4, 0x830F,
+ 0x8307, 0x82DC, 0x82F4, 0x82D2, 0x82D8, 0x830C, 0x82FB, 0x82D3,
+ 0x8311, 0x831A, 0x8306, 0x8314, 0x8315, 0x82E0, 0x82D5, 0x831C,
+ 0x8351, 0x835B, 0x835C, 0x8308, 0x8392, 0x833C, 0x8334, 0x8331,
+ 0x839B, 0x835E, 0x832F, 0x834F, 0x8347, 0x8343, 0x835F, 0x8340,
+ 0x8317, 0x8360, 0x832D, 0x833A, 0x8333, 0x8366, 0x8365, ALTCHR,
+/* 0x5D20 - 0x5D7F */
+ ALTCHR, 0x8368, 0x831B, 0x8369, 0x836C, 0x836A, 0x836D, 0x836E,
+ 0x83B0, 0x8378, 0x83B3, 0x83B4, 0x83A0, 0x83AA, 0x8393, 0x839C,
+ 0x8385, 0x837C, 0x83B6, 0x83A9, 0x837D, 0x83B8, 0x837B, 0x8398,
+ 0x839E, 0x83A8, 0x83BA, 0x83BC, 0x83C1, 0x8401, 0x83E5, 0x83D8,
+ 0x5807, 0x8418, 0x840B, 0x83DD, 0x83FD, 0x83D6, 0x841C, 0x8438,
+ 0x8411, 0x8406, 0x83D4, 0x83DF, 0x840F, 0x8403, 0x83F8, 0x83F9,
+ 0x83EA, 0x83C5, 0x83C0, 0x8426, 0x83F0, 0x83E1, 0x845C, 0x8451,
+ 0x845A, 0x8459, 0x8473, 0x8487, 0x8488, 0x847A, 0x8489, 0x8478,
+ 0x843C, 0x8446, 0x8469, 0x8476, 0x848C, 0x848E, 0x8431, 0x846D,
+ 0x84C1, 0x84CD, 0x84D0, 0x84E6, 0x84BD, 0x84D3, 0x84CA, 0x84BF,
+ 0x84BA, 0x84E0, 0x84A1, 0x84B9, 0x84B4, 0x8497, 0x84E5, 0x84E3,
+ 0x850C, 0x750D, 0x8538, 0x84F0, 0x8539, 0x851F, 0x853A, ALTCHR,
+/* 0x5E20 - 0x5E7F */
+ ALTCHR, 0x8556, 0x853B, 0x84FF, 0x84FC, 0x8559, 0x8548, 0x8568,
+ 0x8564, 0x855E, 0x857A, 0x77A2, 0x8543, 0x8572, 0x857B, 0x85A4,
+ 0x85A8, 0x8587, 0x858F, 0x8579, 0x85AE, 0x859C, 0x8585, 0x85B9,
+ 0x85B7, 0x85B0, 0x85D3, 0x85C1, 0x85DC, 0x85FF, 0x8627, 0x8605,
+ 0x8629, 0x8616, 0x863C, 0x5EFE, 0x5F08, 0x593C, 0x5941, 0x8037,
+ 0x5955, 0x595A, 0x5958, 0x530F, 0x5C22, 0x5C25, 0x5C2C, 0x5C34,
+ 0x624C, 0x626A, 0x629F, 0x62BB, 0x62CA, 0x62DA, 0x62D7, 0x62EE,
+ 0x6322, 0x62F6, 0x6339, 0x634B, 0x6343, 0x63AD, 0x63F6, 0x6371,
+ 0x637A, 0x638E, 0x63B4, 0x636D, 0x63AC, 0x638A, 0x6369, 0x63AE,
+ 0x63BC, 0x63F2, 0x63F8, 0x63E0, 0x63FF, 0x63C4, 0x63DE, 0x63CE,
+ 0x6452, 0x63C6, 0x63BE, 0x6445, 0x6441, 0x640B, 0x641B, 0x6420,
+ 0x640C, 0x6426, 0x6421, 0x645E, 0x6484, 0x646D, 0x6496, ALTCHR,
+/* 0x5F20 - 0x5F7F */
+ ALTCHR, 0x647A, 0x64B7, 0x64B8, 0x6499, 0x64BA, 0x64C0, 0x64D0,
+ 0x64D7, 0x64E4, 0x64E2, 0x6509, 0x6525, 0x652E, 0x5F0B, 0x5FD2,
+ 0x7519, 0x5F11, 0x535F, 0x53F1, 0x53FD, 0x53E9, 0x53E8, 0x53FB,
+ 0x5412, 0x5416, 0x5406, 0x544B, 0x5452, 0x5453, 0x5454, 0x5456,
+ 0x5443, 0x5421, 0x5457, 0x5459, 0x5423, 0x5432, 0x5482, 0x5494,
+ 0x5477, 0x5471, 0x5464, 0x549A, 0x549B, 0x5484, 0x5476, 0x5466,
+ 0x549D, 0x54D0, 0x54AD, 0x54C2, 0x54B4, 0x54D2, 0x54A7, 0x54A6,
+ 0x54D3, 0x54D4, 0x5472, 0x54A3, 0x54D5, 0x54BB, 0x54BF, 0x54CC,
+ 0x54D9, 0x54DA, 0x54DC, 0x54A9, 0x54AA, 0x54A4, 0x54DD, 0x54CF,
+ 0x54DE, 0x551B, 0x54E7, 0x5520, 0x54FD, 0x5514, 0x54F3, 0x5522,
+ 0x5523, 0x550F, 0x5511, 0x5527, 0x552A, 0x5567, 0x558F, 0x55B5,
+ 0x5549, 0x556D, 0x5541, 0x5555, 0x553F, 0x5550, 0x553C, ALTCHR,
+/* 0x6020 - 0x607F */
+ ALTCHR, 0x5537, 0x5556, 0x5575, 0x5576, 0x5577, 0x5533, 0x5530,
+ 0x555C, 0x558B, 0x55D2, 0x5583, 0x55B1, 0x55B9, 0x5588, 0x5581,
+ 0x559F, 0x557E, 0x55D6, 0x5591, 0x557B, 0x55DF, 0x55BD, 0x55BE,
+ 0x5594, 0x5599, 0x55EA, 0x55F7, 0x55C9, 0x561F, 0x55D1, 0x55EB,
+ 0x55EC, 0x55D4, 0x55E6, 0x55DD, 0x55C4, 0x55EF, 0x55E5, 0x55F2,
+ 0x55F3, 0x55CC, 0x55CD, 0x55E8, 0x55F5, 0x55E4, 0x8F94, 0x561E,
+ 0x5608, 0x560C, 0x5601, 0x5624, 0x5623, 0x55FE, 0x5600, 0x5627,
+ 0x562D, 0x5658, 0x5639, 0x5657, 0x562C, 0x564D, 0x5662, 0x5659,
+ 0x565C, 0x564C, 0x5654, 0x5686, 0x5664, 0x5671, 0x566B, 0x567B,
+ 0x567C, 0x5685, 0x5693, 0x56AF, 0x56D4, 0x56D7, 0x56DD, 0x56E1,
+ 0x56F5, 0x56EB, 0x56F9, 0x56FF, 0x5704, 0x570A, 0x5709, 0x571C,
+ 0x5E0F, 0x5E19, 0x5E14, 0x5E11, 0x5E31, 0x5E3B, 0x5E3C, ALTCHR,
+/* 0x6120 - 0x617F */
+ ALTCHR, 0x5E37, 0x5E44, 0x5E54, 0x5E5B, 0x5E5E, 0x5E61, 0x5C8C,
+ 0x5C7A, 0x5C8D, 0x5C90, 0x5C96, 0x5C88, 0x5C98, 0x5C99, 0x5C91,
+ 0x5C9A, 0x5C9C, 0x5CB5, 0x5CA2, 0x5CBD, 0x5CAC, 0x5CAB, 0x5CB1,
+ 0x5CA3, 0x5CC1, 0x5CB7, 0x5CC4, 0x5CD2, 0x5CE4, 0x5CCB, 0x5CE5,
+ 0x5D02, 0x5D03, 0x5D27, 0x5D26, 0x5D2E, 0x5D24, 0x5D1E, 0x5D06,
+ 0x5D1B, 0x5D58, 0x5D3E, 0x5D34, 0x5D3D, 0x5D6C, 0x5D5B, 0x5D6F,
+ 0x5D5D, 0x5D6B, 0x5D4B, 0x5D4A, 0x5D69, 0x5D74, 0x5D82, 0x5D99,
+ 0x5D9D, 0x8C73, 0x5DB7, 0x5DC5, 0x5F73, 0x5F77, 0x5F82, 0x5F87,
+ 0x5F89, 0x5F8C, 0x5F95, 0x5F99, 0x5F9C, 0x5FA8, 0x5FAD, 0x5FB5,
+ 0x5FBC, 0x8862, 0x5F61, 0x72AD, 0x72B0, 0x72B4, 0x72B7, 0x72B8,
+ 0x72C3, 0x72C1, 0x72CE, 0x72CD, 0x72D2, 0x72E8, 0x72EF, 0x72E9,
+ 0x72F2, 0x72F4, 0x72F7, 0x7301, 0x72F3, 0x7303, 0x72FA, ALTCHR,
+/* 0x6220 - 0x627F */
+ ALTCHR, 0x72FB, 0x7317, 0x7313, 0x7321, 0x730A, 0x731E, 0x731D,
+ 0x7315, 0x7322, 0x7339, 0x7325, 0x732C, 0x7338, 0x7331, 0x7350,
+ 0x734D, 0x7357, 0x7360, 0x736C, 0x736F, 0x737E, 0x821B, 0x5925,
+ 0x98E7, 0x5924, 0x5902, 0x9963, 0x9967, 0x9968, 0x9969, 0x996A,
+ 0x996B, 0x996C, 0x9974, 0x9977, 0x997D, 0x9980, 0x9984, 0x9987,
+ 0x998A, 0x998D, 0x9990, 0x9991, 0x9993, 0x9994, 0x9995, 0x5E80,
+ 0x5E91, 0x5E8B, 0x5E96, 0x5EA5, 0x5EA0, 0x5EB9, 0x5EB5, 0x5EBE,
+ 0x5EB3, 0x8D53, 0x5ED2, 0x5ED1, 0x5EDB, 0x5EE8, 0x5EEA, 0x81BA,
+ 0x5FC4, 0x5FC9, 0x5FD6, 0x5FCF, 0x6003, 0x5FEE, 0x6004, 0x5FE1,
+ 0x5FE4, 0x5FFE, 0x6005, 0x6006, 0x5FEA, 0x5FED, 0x5FF8, 0x6019,
+ 0x6035, 0x6026, 0x601B, 0x600F, 0x600D, 0x6029, 0x602B, 0x600A,
+ 0x603F, 0x6021, 0x6078, 0x6079, 0x607B, 0x607A, 0x6042, ALTCHR,
+/* 0x6320 - 0x637F */
+ ALTCHR, 0x606A, 0x607D, 0x6096, 0x609A, 0x60AD, 0x609D, 0x6083,
+ 0x6092, 0x608C, 0x609B, 0x60EC, 0x60BB, 0x60B1, 0x60DD, 0x60D8,
+ 0x60C6, 0x60DA, 0x60B4, 0x6120, 0x6126, 0x6115, 0x6123, 0x60F4,
+ 0x6100, 0x610E, 0x612B, 0x614A, 0x6175, 0x61AC, 0x6194, 0x61A7,
+ 0x61B7, 0x61D4, 0x61F5, 0x5FDD, 0x96B3, 0x95E9, 0x95EB, 0x95F1,
+ 0x95F3, 0x95F5, 0x95F6, 0x95FC, 0x95FE, 0x9603, 0x9604, 0x9606,
+ 0x9608, 0x960A, 0x960B, 0x960C, 0x960D, 0x960F, 0x9612, 0x9615,
+ 0x9616, 0x9617, 0x9619, 0x961A, 0x4E2C, 0x723F, 0x6215, 0x6C35,
+ 0x6C54, 0x6C5C, 0x6C4A, 0x6CA3, 0x6C85, 0x6C90, 0x6C94, 0x6C8C,
+ 0x6C68, 0x6C69, 0x6C74, 0x6C76, 0x6C86, 0x6CA9, 0x6CD0, 0x6CD4,
+ 0x6CAD, 0x6CF7, 0x6CF8, 0x6CF1, 0x6CD7, 0x6CB2, 0x6CE0, 0x6CD6,
+ 0x6CFA, 0x6CEB, 0x6CEE, 0x6CB1, 0x6CD3, 0x6CEF, 0x6CFE, ALTCHR,
+/* 0x6420 - 0x647F */
+ ALTCHR, 0x6D39, 0x6D27, 0x6D0C, 0x6D43, 0x6D48, 0x6D07, 0x6D04,
+ 0x6D19, 0x6D0E, 0x6D2B, 0x6D4D, 0x6D2E, 0x6D35, 0x6D1A, 0x6D4F,
+ 0x6D52, 0x6D54, 0x6D33, 0x6D91, 0x6D6F, 0x6D9E, 0x6DA0, 0x6D5E,
+ 0x6D93, 0x6D94, 0x6D5C, 0x6D60, 0x6D7C, 0x6D63, 0x6E1A, 0x6DC7,
+ 0x6DC5, 0x6DDE, 0x6E0E, 0x6DBF, 0x6DE0, 0x6E11, 0x6DE6, 0x6DDD,
+ 0x6DD9, 0x6E16, 0x6DAB, 0x6E0C, 0x6DAE, 0x6E2B, 0x6E6E, 0x6E4E,
+ 0x6E6B, 0x6EB2, 0x6E5F, 0x6E86, 0x6E53, 0x6E54, 0x6E32, 0x6E25,
+ 0x6E44, 0x6EDF, 0x6EB1, 0x6E98, 0x6EE0, 0x6F2D, 0x6EE2, 0x6EA5,
+ 0x6EA7, 0x6EBD, 0x6EBB, 0x6EB7, 0x6ED7, 0x6EB4, 0x6ECF, 0x6E8F,
+ 0x6EC2, 0x6E9F, 0x6F62, 0x6F46, 0x6F47, 0x6F24, 0x6F15, 0x6EF9,
+ 0x6F2F, 0x6F36, 0x6F4B, 0x6F74, 0x6F2A, 0x6F09, 0x6F29, 0x6F89,
+ 0x6F8D, 0x6F8C, 0x6F78, 0x6F72, 0x6F7C, 0x6F7A, 0x6FD1, ALTCHR,
+/* 0x6520 - 0x657F */
+ ALTCHR, 0x6FC9, 0x6FA7, 0x6FB9, 0x6FB6, 0x6FC2, 0x6FE1, 0x6FEE,
+ 0x6FDE, 0x6FE0, 0x6FEF, 0x701A, 0x7023, 0x701B, 0x7039, 0x7035,
+ 0x704F, 0x705E, 0x5B80, 0x5B84, 0x5B95, 0x5B93, 0x5BA5, 0x5BB8,
+ 0x752F, 0x9A9E, 0x6434, 0x5BE4, 0x5BEE, 0x8930, 0x5BF0, 0x8E47,
+ 0x8B07, 0x8FB6, 0x8FD3, 0x8FD5, 0x8FE5, 0x8FEE, 0x8FE4, 0x8FE9,
+ 0x8FE6, 0x8FF3, 0x8FE8, 0x9005, 0x9004, 0x900B, 0x9026, 0x9011,
+ 0x900D, 0x9016, 0x9021, 0x9035, 0x9036, 0x902D, 0x902F, 0x9044,
+ 0x9051, 0x9052, 0x9050, 0x9068, 0x9058, 0x9062, 0x905B, 0x66B9,
+ 0x9074, 0x907D, 0x9082, 0x9088, 0x9083, 0x908B, 0x5F50, 0x5F57,
+ 0x5F56, 0x5F58, 0x5C3B, 0x54AB, 0x5C50, 0x5C59, 0x5B71, 0x5C63,
+ 0x5C66, 0x7FBC, 0x5F2A, 0x5F29, 0x5F2D, 0x8274, 0x5F3C, 0x9B3B,
+ 0x5C6E, 0x5981, 0x5983, 0x598D, 0x59A9, 0x59AA, 0x59A3, ALTCHR,
+/* 0x6620 - 0x667F */
+ ALTCHR, 0x5997, 0x59CA, 0x59AB, 0x599E, 0x59A4, 0x59D2, 0x59B2,
+ 0x59AF, 0x59D7, 0x59BE, 0x5A05, 0x5A06, 0x59DD, 0x5A08, 0x59E3,
+ 0x59D8, 0x59F9, 0x5A0C, 0x5A09, 0x5A32, 0x5A34, 0x5A11, 0x5A23,
+ 0x5A13, 0x5A40, 0x5A67, 0x5A4A, 0x5A55, 0x5A3C, 0x5A62, 0x5A75,
+ 0x80EC, 0x5AAA, 0x5A9B, 0x5A77, 0x5A7A, 0x5ABE, 0x5AEB, 0x5AB2,
+ 0x5AD2, 0x5AD4, 0x5AB8, 0x5AE0, 0x5AE3, 0x5AF1, 0x5AD6, 0x5AE6,
+ 0x5AD8, 0x5ADC, 0x5B09, 0x5B17, 0x5B16, 0x5B32, 0x5B37, 0x5B40,
+ 0x5C15, 0x5C1C, 0x5B5A, 0x5B65, 0x5B73, 0x5B51, 0x5B53, 0x5B62,
+ 0x9A75, 0x9A77, 0x9A78, 0x9A7A, 0x9A7F, 0x9A7D, 0x9A80, 0x9A81,
+ 0x9A85, 0x9A88, 0x9A8A, 0x9A90, 0x9A92, 0x9A93, 0x9A96, 0x9A98,
+ 0x9A9B, 0x9A9C, 0x9A9D, 0x9A9F, 0x9AA0, 0x9AA2, 0x9AA3, 0x9AA5,
+ 0x9AA7, 0x7E9F, 0x7EA1, 0x7EA3, 0x7EA5, 0x7EA8, 0x7EA9, ALTCHR,
+/* 0x6720 - 0x677F */
+ ALTCHR, 0x7EAD, 0x7EB0, 0x7EBE, 0x7EC0, 0x7EC1, 0x7EC2, 0x7EC9,
+ 0x7ECB, 0x7ECC, 0x7ED0, 0x7ED4, 0x7ED7, 0x7EDB, 0x7EE0, 0x7EE1,
+ 0x7EE8, 0x7EEB, 0x7EEE, 0x7EEF, 0x7EF1, 0x7EF2, 0x7F0D, 0x7EF6,
+ 0x7EFA, 0x7EFB, 0x7EFE, 0x7F01, 0x7F02, 0x7F03, 0x7F07, 0x7F08,
+ 0x7F0B, 0x7F0C, 0x7F0F, 0x7F11, 0x7F12, 0x7F17, 0x7F19, 0x7F1C,
+ 0x7F1B, 0x7F1F, 0x7F21, 0x7F22, 0x7F23, 0x7F24, 0x7F25, 0x7F26,
+ 0x7F27, 0x7F2A, 0x7F2B, 0x7F2C, 0x7F2D, 0x7F2F, 0x7F30, 0x7F31,
+ 0x7F32, 0x7F33, 0x7F35, 0x5E7A, 0x757F, 0x5DDB, 0x753E, 0x9095,
+ 0x738E, 0x7391, 0x73AE, 0x73A2, 0x739F, 0x73CF, 0x73C2, 0x73D1,
+ 0x73B7, 0x73B3, 0x73C0, 0x73C9, 0x73C8, 0x73E5, 0x73D9, 0x987C,
+ 0x740A, 0x73E9, 0x73E7, 0x73DE, 0x73BA, 0x73F2, 0x740F, 0x742A,
+ 0x745B, 0x7426, 0x7425, 0x7428, 0x7430, 0x742E, 0x742C, ALTCHR,
+/* 0x6820 - 0x687F */
+ ALTCHR, 0x741B, 0x741A, 0x7441, 0x745C, 0x7457, 0x7455, 0x7459,
+ 0x7477, 0x746D, 0x747E, 0x749C, 0x748E, 0x7480, 0x7481, 0x7487,
+ 0x748B, 0x749E, 0x74A8, 0x74A9, 0x7490, 0x74A7, 0x74D2, 0x74BA,
+ 0x97EA, 0x97EB, 0x97EC, 0x674C, 0x6753, 0x675E, 0x6748, 0x6769,
+ 0x67A5, 0x6787, 0x676A, 0x6773, 0x6798, 0x67A7, 0x6775, 0x67A8,
+ 0x679E, 0x67AD, 0x678B, 0x6777, 0x677C, 0x67F0, 0x6809, 0x67D8,
+ 0x680A, 0x67E9, 0x67B0, 0x680C, 0x67D9, 0x67B5, 0x67DA, 0x67B3,
+ 0x67DD, 0x6800, 0x67C3, 0x67B8, 0x67E2, 0x680E, 0x67C1, 0x67FD,
+ 0x6832, 0x6833, 0x6860, 0x6861, 0x684E, 0x6862, 0x6844, 0x6864,
+ 0x6883, 0x681D, 0x6855, 0x6866, 0x6841, 0x6867, 0x6840, 0x683E,
+ 0x684A, 0x6849, 0x6829, 0x68B5, 0x688F, 0x6874, 0x6877, 0x6893,
+ 0x686B, 0x68C2, 0x696E, 0x68FC, 0x691F, 0x6920, 0x68F9, ALTCHR,
+/* 0x6920 - 0x697F */
+ ALTCHR, 0x6924, 0x68F0, 0x690B, 0x6901, 0x6957, 0x68E3, 0x6910,
+ 0x6971, 0x6939, 0x6960, 0x6942, 0x695D, 0x6984, 0x696B, 0x6980,
+ 0x6998, 0x6978, 0x6934, 0x69CC, 0x6987, 0x6988, 0x69CE, 0x6989,
+ 0x6966, 0x6963, 0x6979, 0x699B, 0x69A7, 0x69BB, 0x69AB, 0x69AD,
+ 0x69D4, 0x69B1, 0x69C1, 0x69CA, 0x69DF, 0x6995, 0x69E0, 0x698D,
+ 0x69FF, 0x6A2F, 0x69ED, 0x6A17, 0x6A18, 0x6A65, 0x69F2, 0x6A44,
+ 0x6A3E, 0x6AA0, 0x6A50, 0x6A5B, 0x6A35, 0x6A8E, 0x6A79, 0x6A3D,
+ 0x6A28, 0x6A58, 0x6A7C, 0x6A91, 0x6A90, 0x6AA9, 0x6A97, 0x6AAB,
+ 0x7337, 0x7352, 0x6B81, 0x6B82, 0x6B87, 0x6B84, 0x6B92, 0x6B93,
+ 0x6B8D, 0x6B9A, 0x6B9B, 0x6BA1, 0x6BAA, 0x8F6B, 0x8F6D, 0x8F71,
+ 0x8F72, 0x8F73, 0x8F75, 0x8F76, 0x8F78, 0x8F77, 0x8F79, 0x8F7A,
+ 0x8F7C, 0x8F7E, 0x8F81, 0x8F82, 0x8F84, 0x8F87, 0x8F8B, ALTCHR,
+/* 0x6A20 - 0x6A7F */
+ ALTCHR, 0x8F8D, 0x8F8E, 0x8F8F, 0x8F98, 0x8F9A, 0x8ECE, 0x620B,
+ 0x6217, 0x621B, 0x621F, 0x6222, 0x6221, 0x6225, 0x6224, 0x622C,
+ 0x81E7, 0x74EF, 0x74F4, 0x74FF, 0x750F, 0x7511, 0x7513, 0x6534,
+ 0x65EE, 0x65EF, 0x65F0, 0x660A, 0x6619, 0x6772, 0x6603, 0x6615,
+ 0x6600, 0x7085, 0x66F7, 0x661D, 0x6634, 0x6631, 0x6636, 0x6635,
+ 0x8006, 0x665F, 0x6654, 0x6641, 0x664F, 0x6656, 0x6661, 0x6657,
+ 0x6677, 0x6684, 0x668C, 0x66A7, 0x669D, 0x66BE, 0x66DB, 0x66DC,
+ 0x66E6, 0x66E9, 0x8D32, 0x8D33, 0x8D36, 0x8D3B, 0x8D3D, 0x8D40,
+ 0x8D45, 0x8D46, 0x8D48, 0x8D49, 0x8D47, 0x8D4D, 0x8D55, 0x8D59,
+ 0x89C7, 0x89CA, 0x89CB, 0x89CC, 0x89CE, 0x89CF, 0x89D0, 0x89D1,
+ 0x726E, 0x729F, 0x725D, 0x7266, 0x726F, 0x727E, 0x727F, 0x7284,
+ 0x728B, 0x728D, 0x728F, 0x7292, 0x6308, 0x6332, 0x63B0, ALTCHR,
+/* 0x6B20 - 0x6B7F */
+ ALTCHR, 0x643F, 0x64D8, 0x8004, 0x6BEA, 0x6BF3, 0x6BFD, 0x6BF5,
+ 0x6BF9, 0x6C05, 0x6C07, 0x6C06, 0x6C0D, 0x6C15, 0x6C18, 0x6C19,
+ 0x6C1A, 0x6C21, 0x6C29, 0x6C24, 0x6C2A, 0x6C32, 0x6535, 0x6555,
+ 0x656B, 0x724D, 0x7252, 0x7256, 0x7230, 0x8662, 0x5216, 0x809F,
+ 0x809C, 0x8093, 0x80BC, 0x670A, 0x80BD, 0x80B1, 0x80AB, 0x80AD,
+ 0x80B4, 0x80B7, 0x80E7, 0x80E8, 0x80E9, 0x80EA, 0x80DB, 0x80C2,
+ 0x80C4, 0x80D9, 0x80CD, 0x80D7, 0x6710, 0x80DD, 0x80EB, 0x80F1,
+ 0x80F4, 0x80ED, 0x810D, 0x810E, 0x80F2, 0x80FC, 0x6715, 0x8112,
+ 0x8C5A, 0x8136, 0x811E, 0x812C, 0x8118, 0x8132, 0x8148, 0x814C,
+ 0x8153, 0x8174, 0x8159, 0x815A, 0x8171, 0x8160, 0x8169, 0x817C,
+ 0x817D, 0x816D, 0x8167, 0x584D, 0x5AB5, 0x8188, 0x8182, 0x8191,
+ 0x6ED5, 0x81A3, 0x81AA, 0x81CC, 0x6726, 0x81CA, 0x81BB, ALTCHR,
+/* 0x6C20 - 0x6C7F */
+ ALTCHR, 0x81C1, 0x81A6, 0x6B24, 0x6B37, 0x6B39, 0x6B43, 0x6B46,
+ 0x6B59, 0x98D1, 0x98D2, 0x98D3, 0x98D5, 0x98D9, 0x98DA, 0x6BB3,
+ 0x5F40, 0x6BC2, 0x89F3, 0x6590, 0x9F51, 0x6593, 0x65BC, 0x65C6,
+ 0x65C4, 0x65C3, 0x65CC, 0x65CE, 0x65D2, 0x65D6, 0x7080, 0x709C,
+ 0x7096, 0x709D, 0x70BB, 0x70C0, 0x70B7, 0x70AB, 0x70B1, 0x70E8,
+ 0x70CA, 0x7110, 0x7113, 0x7116, 0x712F, 0x7131, 0x7173, 0x715C,
+ 0x7168, 0x7145, 0x7172, 0x714A, 0x7178, 0x717A, 0x7198, 0x71B3,
+ 0x71B5, 0x71A8, 0x71A0, 0x71E0, 0x71D4, 0x71E7, 0x71F9, 0x721D,
+ 0x7228, 0x706C, 0x7118, 0x7166, 0x71B9, 0x623E, 0x623D, 0x6243,
+ 0x6248, 0x6249, 0x793B, 0x7940, 0x7946, 0x7949, 0x795B, 0x795C,
+ 0x7953, 0x795A, 0x7962, 0x7957, 0x7960, 0x796F, 0x7967, 0x797A,
+ 0x7985, 0x798A, 0x799A, 0x79A7, 0x79B3, 0x5FD1, 0x5FD0, ALTCHR,
+/* 0x6D20 - 0x6D7F */
+ ALTCHR, 0x603C, 0x605D, 0x605A, 0x6067, 0x6041, 0x6059, 0x6063,
+ 0x60AB, 0x6106, 0x610D, 0x615D, 0x61A9, 0x619D, 0x61CB, 0x61D1,
+ 0x6206, 0x8080, 0x807F, 0x6C93, 0x6CF6, 0x6DFC, 0x77F6, 0x77F8,
+ 0x7800, 0x7809, 0x7817, 0x7818, 0x7811, 0x65AB, 0x782D, 0x781C,
+ 0x781D, 0x7839, 0x783A, 0x783B, 0x781F, 0x783C, 0x7825, 0x782C,
+ 0x7823, 0x7829, 0x784E, 0x786D, 0x7856, 0x7857, 0x7826, 0x7850,
+ 0x7847, 0x784C, 0x786A, 0x789B, 0x7893, 0x789A, 0x7887, 0x789C,
+ 0x78A1, 0x78A3, 0x78B2, 0x78B9, 0x78A5, 0x78D4, 0x78D9, 0x78C9,
+ 0x78EC, 0x78F2, 0x7905, 0x78F4, 0x7913, 0x7924, 0x791E, 0x7934,
+ 0x9F9B, 0x9EF9, 0x9EFB, 0x9EFC, 0x76F1, 0x7704, 0x770D, 0x76F9,
+ 0x7707, 0x7708, 0x771A, 0x7722, 0x7719, 0x772D, 0x7726, 0x7735,
+ 0x7738, 0x7750, 0x7751, 0x7747, 0x7743, 0x775A, 0x7768, ALTCHR,
+/* 0x6E20 - 0x6E7F */
+ ALTCHR, 0x7762, 0x7765, 0x777F, 0x778D, 0x777D, 0x7780, 0x778C,
+ 0x7791, 0x779F, 0x77A0, 0x77B0, 0x77B5, 0x77BD, 0x753A, 0x7540,
+ 0x754E, 0x754B, 0x7548, 0x755B, 0x7572, 0x7579, 0x7583, 0x7F58,
+ 0x7F61, 0x7F5F, 0x8A48, 0x7F68, 0x7F74, 0x7F71, 0x7F79, 0x7F81,
+ 0x7F7E, 0x76CD, 0x76E5, 0x8832, 0x9485, 0x9486, 0x9487, 0x948B,
+ 0x948A, 0x948C, 0x948D, 0x948F, 0x9490, 0x9494, 0x9497, 0x9495,
+ 0x949A, 0x949B, 0x949C, 0x94A3, 0x94A4, 0x94AB, 0x94AA, 0x94AD,
+ 0x94AC, 0x94AF, 0x94B0, 0x94B2, 0x94B4, 0x94B6, 0x94B7, 0x94B8,
+ 0x94B9, 0x94BA, 0x94BC, 0x94BD, 0x94BF, 0x94C4, 0x94C8, 0x94C9,
+ 0x94CA, 0x94CB, 0x94CC, 0x94CD, 0x94CE, 0x94D0, 0x94D1, 0x94D2,
+ 0x94D5, 0x94D6, 0x94D7, 0x94D9, 0x94D8, 0x94DB, 0x94DE, 0x94DF,
+ 0x94E0, 0x94E2, 0x94E4, 0x94E5, 0x94E7, 0x94E8, 0x94EA, ALTCHR,
+/* 0x6F20 - 0x6F7F */
+ ALTCHR, 0x94E9, 0x94EB, 0x94EE, 0x94EF, 0x94F3, 0x94F4, 0x94F5,
+ 0x94F7, 0x94F9, 0x94FC, 0x94FD, 0x94FF, 0x9503, 0x9502, 0x9506,
+ 0x9507, 0x9509, 0x950A, 0x950D, 0x950E, 0x950F, 0x9512, 0x9513,
+ 0x9514, 0x9515, 0x9516, 0x9518, 0x951B, 0x951D, 0x951E, 0x951F,
+ 0x9522, 0x952A, 0x952B, 0x9529, 0x952C, 0x9531, 0x9532, 0x9534,
+ 0x9536, 0x9537, 0x9538, 0x953C, 0x953E, 0x953F, 0x9542, 0x9535,
+ 0x9544, 0x9545, 0x9546, 0x9549, 0x954C, 0x954E, 0x954F, 0x9552,
+ 0x9553, 0x9554, 0x9556, 0x9557, 0x9558, 0x9559, 0x955B, 0x955E,
+ 0x955F, 0x955D, 0x9561, 0x9562, 0x9564, 0x9565, 0x9566, 0x9567,
+ 0x9568, 0x9569, 0x956A, 0x956B, 0x956C, 0x956F, 0x9571, 0x9572,
+ 0x9573, 0x953A, 0x77E7, 0x77EC, 0x96C9, 0x79D5, 0x79ED, 0x79E3,
+ 0x79EB, 0x7A06, 0x5D47, 0x7A03, 0x7A02, 0x7A1E, 0x7A14, ALTCHR,
+/* 0x7020 - 0x707F */
+ ALTCHR, 0x7A39, 0x7A37, 0x7A51, 0x9ECF, 0x99A5, 0x7A70, 0x7688,
+ 0x768E, 0x7693, 0x7699, 0x76A4, 0x74DE, 0x74E0, 0x752C, 0x9E20,
+ 0x9E22, 0x9E28, 0x9E29, 0x9E2A, 0x9E2B, 0x9E2C, 0x9E32, 0x9E31,
+ 0x9E36, 0x9E38, 0x9E37, 0x9E39, 0x9E3A, 0x9E3E, 0x9E41, 0x9E42,
+ 0x9E44, 0x9E46, 0x9E47, 0x9E48, 0x9E49, 0x9E4B, 0x9E4C, 0x9E4E,
+ 0x9E51, 0x9E55, 0x9E57, 0x9E5A, 0x9E5B, 0x9E5C, 0x9E5E, 0x9E63,
+ 0x9E66, 0x9E67, 0x9E68, 0x9E69, 0x9E6A, 0x9E6B, 0x9E6C, 0x9E71,
+ 0x9E6D, 0x9E73, 0x7592, 0x7594, 0x7596, 0x75A0, 0x759D, 0x75AC,
+ 0x75A3, 0x75B3, 0x75B4, 0x75B8, 0x75C4, 0x75B1, 0x75B0, 0x75C3,
+ 0x75C2, 0x75D6, 0x75CD, 0x75E3, 0x75E8, 0x75E6, 0x75E4, 0x75EB,
+ 0x75E7, 0x7603, 0x75F1, 0x75FC, 0x75FF, 0x7610, 0x7600, 0x7605,
+ 0x760C, 0x7617, 0x760A, 0x7625, 0x7618, 0x7615, 0x7619, ALTCHR,
+/* 0x7120 - 0x717F */
+ ALTCHR, 0x761B, 0x763C, 0x7622, 0x7620, 0x7640, 0x762D, 0x7630,
+ 0x763F, 0x7635, 0x7643, 0x763E, 0x7633, 0x764D, 0x765E, 0x7654,
+ 0x765C, 0x7656, 0x766B, 0x766F, 0x7FCA, 0x7AE6, 0x7A78, 0x7A79,
+ 0x7A80, 0x7A86, 0x7A88, 0x7A95, 0x7AA6, 0x7AA0, 0x7AAC, 0x7AA8,
+ 0x7AAD, 0x7AB3, 0x8864, 0x8869, 0x8872, 0x887D, 0x887F, 0x8882,
+ 0x88A2, 0x88C6, 0x88B7, 0x88BC, 0x88C9, 0x88E2, 0x88CE, 0x88E3,
+ 0x88E5, 0x88F1, 0x891A, 0x88FC, 0x88E8, 0x88FE, 0x88F0, 0x8921,
+ 0x8919, 0x8913, 0x891B, 0x890A, 0x8934, 0x892B, 0x8936, 0x8941,
+ 0x8966, 0x897B, 0x758B, 0x80E5, 0x76B2, 0x76B4, 0x77DC, 0x8012,
+ 0x8014, 0x8016, 0x801C, 0x8020, 0x8022, 0x8025, 0x8026, 0x8027,
+ 0x8029, 0x8028, 0x8031, 0x800B, 0x8035, 0x8043, 0x8046, 0x804D,
+ 0x8052, 0x8069, 0x8071, 0x8983, 0x9878, 0x9880, 0x9883, ALTCHR,
+/* 0x7220 - 0x727F */
+ ALTCHR, 0x9889, 0x988C, 0x988D, 0x988F, 0x9894, 0x989A, 0x989B,
+ 0x989E, 0x989F, 0x98A1, 0x98A2, 0x98A5, 0x98A6, 0x864D, 0x8654,
+ 0x866C, 0x866E, 0x867F, 0x867A, 0x867C, 0x867B, 0x86A8, 0x868D,
+ 0x868B, 0x86AC, 0x869D, 0x86A7, 0x86A3, 0x86AA, 0x8693, 0x86A9,
+ 0x86B6, 0x86C4, 0x86B5, 0x86CE, 0x86B0, 0x86BA, 0x86B1, 0x86AF,
+ 0x86C9, 0x86CF, 0x86B4, 0x86E9, 0x86F1, 0x86F2, 0x86ED, 0x86F3,
+ 0x86D0, 0x8713, 0x86DE, 0x86F4, 0x86DF, 0x86D8, 0x86D1, 0x8703,
+ 0x8707, 0x86F8, 0x8708, 0x870A, 0x870D, 0x8709, 0x8723, 0x873B,
+ 0x871E, 0x8725, 0x872E, 0x871A, 0x873E, 0x8748, 0x8734, 0x8731,
+ 0x8729, 0x8737, 0x873F, 0x8782, 0x8722, 0x877D, 0x877E, 0x877B,
+ 0x8760, 0x8770, 0x874C, 0x876E, 0x878B, 0x8753, 0x8763, 0x877C,
+ 0x8764, 0x8759, 0x8765, 0x8793, 0x87AF, 0x87A8, 0x87D2, ALTCHR,
+/* 0x7320 - 0x737F */
+ ALTCHR, 0x87C6, 0x8788, 0x8785, 0x87AD, 0x8797, 0x8783, 0x87AB,
+ 0x87E5, 0x87AC, 0x87B5, 0x87B3, 0x87CB, 0x87D3, 0x87BD, 0x87D1,
+ 0x87C0, 0x87CA, 0x87DB, 0x87EA, 0x87E0, 0x87EE, 0x8816, 0x8813,
+ 0x87FE, 0x880A, 0x881B, 0x8821, 0x8839, 0x883C, 0x7F36, 0x7F42,
+ 0x7F44, 0x7F45, 0x8210, 0x7AFA, 0x7AFD, 0x7B08, 0x7B03, 0x7B04,
+ 0x7B15, 0x7B0A, 0x7B2B, 0x7B0F, 0x7B47, 0x7B38, 0x7B2A, 0x7B19,
+ 0x7B2E, 0x7B31, 0x7B20, 0x7B25, 0x7B24, 0x7B33, 0x7B3E, 0x7B1E,
+ 0x7B58, 0x7B5A, 0x7B45, 0x7B75, 0x7B4C, 0x7B5D, 0x7B60, 0x7B6E,
+ 0x7B7B, 0x7B62, 0x7B72, 0x7B71, 0x7B90, 0x7BA6, 0x7BA7, 0x7BB8,
+ 0x7BAC, 0x7B9D, 0x7BA8, 0x7B85, 0x7BAA, 0x7B9C, 0x7BA2, 0x7BAB,
+ 0x7BB4, 0x7BD1, 0x7BC1, 0x7BCC, 0x7BDD, 0x7BDA, 0x7BE5, 0x7BE6,
+ 0x7BEA, 0x7C0C, 0x7BFE, 0x7BFC, 0x7C0F, 0x7C16, 0x7C0B, ALTCHR,
+/* 0x7420 - 0x747F */
+ ALTCHR, 0x7C1F, 0x7C2A, 0x7C26, 0x7C38, 0x7C41, 0x7C40, 0x81FE,
+ 0x8201, 0x8202, 0x8204, 0x81EC, 0x8844, 0x8221, 0x8222, 0x8223,
+ 0x822D, 0x822F, 0x8228, 0x822B, 0x8238, 0x823B, 0x8233, 0x8234,
+ 0x823E, 0x8244, 0x8249, 0x824B, 0x824F, 0x825A, 0x825F, 0x8268,
+ 0x887E, 0x8885, 0x8888, 0x88D8, 0x88DF, 0x895E, 0x7F9D, 0x7F9F,
+ 0x7FA7, 0x7FAF, 0x7FB0, 0x7FB2, 0x7C7C, 0x6549, 0x7C91, 0x7C9D,
+ 0x7C9C, 0x7C9E, 0x7CA2, 0x7CB2, 0x7CBC, 0x7CBD, 0x7CC1, 0x7CC7,
+ 0x7CCC, 0x7CCD, 0x7CC8, 0x7CC5, 0x7CD7, 0x7CE8, 0x826E, 0x66A8,
+ 0x7FBF, 0x7FCE, 0x7FD5, 0x7FE5, 0x7FE1, 0x7FE6, 0x7FE9, 0x7FEE,
+ 0x7FF3, 0x7CF8, 0x7D77, 0x7DA6, 0x7DAE, 0x7E47, 0x7E9B, 0x9EB8,
+ 0x9EB4, 0x8D73, 0x8D84, 0x8D94, 0x8D91, 0x8DB1, 0x8D67, 0x8D6D,
+ 0x8C47, 0x8C49, 0x914A, 0x9150, 0x914E, 0x914F, 0x9164, ALTCHR,
+/* 0x7520 - 0x757F */
+ ALTCHR, 0x9162, 0x9161, 0x9170, 0x9169, 0x916F, 0x917D, 0x917E,
+ 0x9172, 0x9174, 0x9179, 0x918C, 0x9185, 0x9190, 0x918D, 0x9191,
+ 0x91A2, 0x91A3, 0x91AA, 0x91AD, 0x91AE, 0x91AF, 0x91B5, 0x91B4,
+ 0x91BA, 0x8C55, 0x9E7E, 0x8DB8, 0x8DEB, 0x8E05, 0x8E59, 0x8E69,
+ 0x8DB5, 0x8DBF, 0x8DBC, 0x8DBA, 0x8DC4, 0x8DD6, 0x8DD7, 0x8DDA,
+ 0x8DDE, 0x8DCE, 0x8DCF, 0x8DDB, 0x8DC6, 0x8DEC, 0x8DF7, 0x8DF8,
+ 0x8DE3, 0x8DF9, 0x8DFB, 0x8DE4, 0x8E09, 0x8DFD, 0x8E14, 0x8E1D,
+ 0x8E1F, 0x8E2C, 0x8E2E, 0x8E23, 0x8E2F, 0x8E3A, 0x8E40, 0x8E39,
+ 0x8E35, 0x8E3D, 0x8E31, 0x8E49, 0x8E41, 0x8E42, 0x8E51, 0x8E52,
+ 0x8E4A, 0x8E70, 0x8E76, 0x8E7C, 0x8E6F, 0x8E74, 0x8E85, 0x8E8F,
+ 0x8E94, 0x8E90, 0x8E9C, 0x8E9E, 0x8C78, 0x8C82, 0x8C8A, 0x8C85,
+ 0x8C98, 0x8C94, 0x659B, 0x89D6, 0x89DE, 0x89DA, 0x89DC, ALTCHR,
+/* 0x7620 - 0x767F */
+ ALTCHR, 0x89E5, 0x89EB, 0x89EF, 0x8A3E, 0x8B26, 0x9753, 0x96E9,
+ 0x96F3, 0x96EF, 0x9706, 0x9701, 0x9708, 0x970F, 0x970E, 0x972A,
+ 0x972D, 0x9730, 0x973E, 0x9F80, 0x9F83, 0x9F85, 0x9F86, 0x9F87,
+ 0x9F88, 0x9F89, 0x9F8A, 0x9F8C, 0x9EFE, 0x9F0B, 0x9F0D, 0x96B9,
+ 0x96BC, 0x96BD, 0x96CE, 0x96D2, 0x77BF, 0x96E0, 0x928E, 0x92AE,
+ 0x92C8, 0x933E, 0x936A, 0x93CA, 0x938F, 0x943E, 0x946B, 0x9C7F,
+ 0x9C82, 0x9C85, 0x9C86, 0x9C87, 0x9C88, 0x7A23, 0x9C8B, 0x9C8E,
+ 0x9C90, 0x9C91, 0x9C92, 0x9C94, 0x9C95, 0x9C9A, 0x9C9B, 0x9C9E,
+ 0x9C9F, 0x9CA0, 0x9CA1, 0x9CA2, 0x9CA3, 0x9CA5, 0x9CA6, 0x9CA7,
+ 0x9CA8, 0x9CA9, 0x9CAB, 0x9CAD, 0x9CAE, 0x9CB0, 0x9CB1, 0x9CB2,
+ 0x9CB3, 0x9CB4, 0x9CB5, 0x9CB6, 0x9CB7, 0x9CBA, 0x9CBB, 0x9CBC,
+ 0x9CBD, 0x9CC4, 0x9CC5, 0x9CC6, 0x9CC7, 0x9CCA, 0x9CCB, ALTCHR,
+/* 0x7720 - 0x777F */
+ ALTCHR, 0x9CCC, 0x9CCD, 0x9CCE, 0x9CCF, 0x9CD0, 0x9CD3, 0x9CD4,
+ 0x9CD5, 0x9CD7, 0x9CD8, 0x9CD9, 0x9CDC, 0x9CDD, 0x9CDF, 0x9CE2,
+ 0x977C, 0x9785, 0x9791, 0x9792, 0x9794, 0x97AF, 0x97AB, 0x97A3,
+ 0x97B2, 0x97B4, 0x9AB1, 0x9AB0, 0x9AB7, 0x9E58, 0x9AB6, 0x9ABA,
+ 0x9ABC, 0x9AC1, 0x9AC0, 0x9AC5, 0x9AC2, 0x9ACB, 0x9ACC, 0x9AD1,
+ 0x9B45, 0x9B43, 0x9B47, 0x9B49, 0x9B48, 0x9B4D, 0x9B51, 0x98E8,
+ 0x990D, 0x992E, 0x9955, 0x9954, 0x9ADF, 0x9AE1, 0x9AE6, 0x9AEF,
+ 0x9AEB, 0x9AFB, 0x9AED, 0x9AF9, 0x9B08, 0x9B0F, 0x9B13, 0x9B1F,
+ 0x9B23, 0x9EBD, 0x9EBE, 0x7E3B, 0x9E82, 0x9E87, 0x9E88, 0x9E8B,
+ 0x9E92, 0x93D6, 0x9E9D, 0x9E9F, 0x9EDB, 0x9EDC, 0x9EDD, 0x9EE0,
+ 0x9EDF, 0x9EE2, 0x9EE9, 0x9EE7, 0x9EE5, 0x9EEA, 0x9EEF, 0x9F22,
+ 0x9F2C, 0x9F2F, 0x9F39, 0x9F37, 0x9F3D, 0x9F3E, 0x9F44, ALTCHR,
+};
+
+CODE_CONV_TWO_OCTET_TO_UCS2(cc_gb2312_to_ucs2, /* function name */
+ tblGb2312ToUcs2, /* table name */
+ 0x0021, 0x0077, /* code range (high byte) */
+ 0x0020, 0x007F, /* code range (low byte) */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/GB2312/Imakefile b/xc/extras/X-TrueType/GB2312/Imakefile
new file mode 100644
index 000000000..bfa802180
--- /dev/null
+++ b/xc/extras/X-TrueType/GB2312/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: GB2312 */
+
+#define ModuleName GB2312
+SRCS = GB2312toUCS2.c main.c
+OBJS = GB2312toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/GB2312/main.c b/xc/extras/X-TrueType/GB2312/main.c
new file mode 100644
index 000000000..d9ef7962f
--- /dev/null
+++ b/xc/extras/X-TrueType/GB2312/main.c
@@ -0,0 +1,66 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+typedef enum
+{
+ GB2312
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "gb2312", NULL, NULL, GB2312, { 0x20, 0x7f, 0x21, 0x77, 0x2121 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+CODECONV_TEMPLATE(cc_gb2312_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { GB2312, EPlfmISO, EEncISO10646,
+ cc_gb2312_to_ucs2, NULL },
+ { GB2312, EPlfmUnicode, EEncAny,
+ cc_gb2312_to_ucs2, NULL },
+ { GB2312, EPlfmMS, EEncMSUnicode,
+ cc_gb2312_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(GB2312_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.1/ISO8859_1toAROMAN.c b/xc/extras/X-TrueType/ISO8859.1/ISO8859_1toAROMAN.c
new file mode 100644
index 000000000..13e85db8c
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.1/ISO8859_1toAROMAN.c
@@ -0,0 +1,74 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+ This table from xfsft:
+ Copyright (c) 1997 by Mark Leisher
+ Copyright (c) 1998 by Juliusz Chroboczek
+
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPING/EASTASIA/JIS/JIS0201.TXT)
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ft_char_code_t tblIso8859_1ToAppleRoman[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00CA, 0x00C1, 0x00A2, 0x00A3, 0x00DB, 0x00B4, ALTCHR, 0x00A4,
+ 0x00AC, 0x00A9, 0x00BB, 0x00C7, 0x00C2, ALTCHR, 0x00A8, 0x00F8,
+ 0x00A1, 0x00B1, ALTCHR, ALTCHR, 0x00AB, 0x00B5, 0x00A6, 0x00E1,
+ 0x00FC, ALTCHR, 0x00BC, 0x00C8, ALTCHR, ALTCHR, ALTCHR, 0x00C0,
+ 0x00CB, 0x00E7, 0x00E5, 0x00CC, 0x0080, 0x0081, 0x00AE, 0x0082,
+ 0x00E9, 0x0083, 0x00E6, 0x00E8, 0x00ED, 0x00EA, 0x00EB, 0x00EC,
+ ALTCHR, 0x0084, 0x00F1, 0x00EE, 0x00EF, 0x00CD, 0x0085, ALTCHR,
+ 0x00AF, 0x00F4, 0x00F2, 0x00F3, 0x0086, ALTCHR, ALTCHR, 0x00A7,
+ 0x0088, 0x0087, 0x0089, 0x008B, 0x008A, 0x008C, 0x00BE, 0x008D,
+ 0x008F, 0x008E, 0x0090, 0x0091, 0x0093, 0x0092, 0x0094, 0x0095,
+ ALTCHR, 0x0096, 0x0098, 0x0097, 0x0099, 0x009B, 0x009A, 0x00D6,
+ 0x00BF, 0x009D, 0x009C, 0x009E, 0x009F, ALTCHR, ALTCHR, 0x00D8
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_1_to_apple_roman, /* function name */
+ tblIso8859_1ToAppleRoman, /* table name */
+ ALTCHR /* alt char code (on ARoman) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.1/Imakefile b/xc/extras/X-TrueType/ISO8859.1/Imakefile
new file mode 100644
index 000000000..c09325a5d
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.1/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.1 */
+
+#define ModuleName ISO8859_1
+SRCS = ISO8859_1toAROMAN.c main.c
+OBJS = ISO8859_1toAROMAN.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.1/main.c b/xc/extras/X-TrueType/ISO8859.1/main.c
new file mode 100644
index 000000000..bafeea0f1
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.1/main.c
@@ -0,0 +1,137 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+/****************************************
+ tables
+ */
+typedef enum
+{
+ ISO8859_1,
+ ASCII,
+ APPLE_ROMAN,
+ APPLE_CENTEURO,
+ APPLE_CYRILLIC,
+ MS_SYMBOL,
+ UNICODE
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+#ifndef I_HATE_UNICODE
+ { "unicode", NULL, NULL, UNICODE, { 0x00, 0xff, 0x00, 0xff, 0x20 } },
+ { "iso10646", NULL, "1", UNICODE, { 0x00, 0xff, 0x00, 0xff, 0x20 } },
+#endif
+ { "iso8859", NULL, "1", ISO8859_1, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "ascii", NULL, NULL, ASCII, { 0x20, 0x7e, 0, 0, 0x20 } },
+ { "apple", NULL, "roman",
+ APPLE_ROMAN, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "apple", NULL, "centeuro",
+ APPLE_CENTEURO, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "microsoft",
+ NULL, "symbol",
+ MS_SYMBOL, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "microsoft_symbol",
+ NULL, NULL,
+ MS_SYMBOL, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "ms", NULL, "symbol",
+ MS_SYMBOL, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "ms_symbol",
+ NULL, NULL,
+ MS_SYMBOL, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+CODECONV_TEMPLATE(cc_iso8859_1_to_apple_roman);
+CODECONV_TEMPLATE(cc_ms_symbol_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_1, EPlfmISO, EEncISO8859_1, NULL, NULL },
+ { ISO8859_1, EPlfmISO, EEncISO10646, NULL, NULL },
+ { ISO8859_1, EPlfmUnicode, EEncAny, NULL, NULL },
+ { ISO8859_1, EPlfmMS, EEncMSUnicode, NULL, NULL },
+ { ISO8859_1, EPlfmApple, EEncAppleRoman,
+ cc_iso8859_1_to_apple_roman, NULL },
+ { ISO8859_1, EPlfmApple, EEncAppleJapanese, NULL, NULL },
+ { ISO8859_1, EPlfmMS, EEncMSShiftJIS, NULL, NULL },
+ { ASCII, EPlfmISO, EEncISOASCII, NULL, NULL },
+ { ASCII, EPlfmISO, EEncISO8859_1, NULL, NULL },
+ { ASCII, EPlfmISO, EEncISO10646, NULL, NULL },
+ { ASCII, EPlfmUnicode, EEncAny, NULL, NULL },
+ { ASCII, EPlfmMS, EEncMSUnicode, NULL, NULL },
+ { ASCII, EPlfmApple, EEncAppleRoman, NULL, NULL },
+ /*
+ To avoid the difficulty on the OS/2 Warp Japanese Fonts
+ (OEM from Dynalab), we must place the following platform/encoding
+ 'Apple Japanese' before 'MS Shift JIS'.
+ These fonts has both the below encodings, but MS S-JIS is incorrect.
+ */
+ { ASCII, EPlfmApple, EEncAppleJapanese, NULL, NULL },
+ { ASCII, EPlfmMS, EEncMSShiftJIS, NULL, NULL },
+ { APPLE_CENTEURO,
+ EPlfmApple, EEncAppleCenteuro, NULL, NULL },
+ { APPLE_CYRILLIC,
+ EPlfmApple, EEncAppleCyrillic, NULL, NULL },
+ { MS_SYMBOL, EPlfmMS, EEncMSSymbol,
+ cc_ms_symbol_to_ucs2, NULL },
+#ifndef I_HATE_UNICODE
+ { UNICODE, EPlfmUnicode, EEncAny, NULL, NULL },
+ { UNICODE, EPlfmISO, EEncISO10646, NULL, NULL },
+ { UNICODE, EPlfmISO, EEncISO10646, NULL, NULL },
+ { UNICODE, EPlfmMS, EEncMSUnicode, NULL, NULL },
+ { -1, 0, 0, NULL, NULL }
+#endif /* I_HATE_UNICODE */
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_1_entrypoint)
+
+
+/*
+ MS Symbol
+ */
+
+ft_char_code_t /* result charCodeDest */
+cc_ms_symbol_to_ucs2(ft_char_code_t codeSrc)
+{
+ ucs2_t codeDst = codeSrc | 0xf000;
+
+ return codeDst;
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.10/ISO8859_10toUCS2.c b/xc/extras/X-TrueType/ISO8859.10/ISO8859_10toUCS2.c
new file mode 100644
index 000000000..b3ff605b7
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.10/ISO8859_10toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ This table from xfsft:
+ Copyright (c) 1997 by Mark Leisher
+ Copyright (c) 1998 by Juliusz Chroboczek
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_10ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7,
+ 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
+ 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7,
+ 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2014, 0x016B, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
+ 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168,
+ 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169,
+ 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_10_to_ucs2, /* function name */
+ tblIso8859_10ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.10/Imakefile b/xc/extras/X-TrueType/ISO8859.10/Imakefile
new file mode 100644
index 000000000..f01bfe814
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.10/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.10 */
+
+#define ModuleName ISO8859_10
+SRCS = ISO8859_10toUCS2.c main.c
+OBJS = ISO8859_10toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.10/main.c b/xc/extras/X-TrueType/ISO8859.10/main.c
new file mode 100644
index 000000000..c0b810b14
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.10/main.c
@@ -0,0 +1,68 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_10
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "10", ISO8859_10, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_10_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_10, EPlfmISO, EEncISO10646,
+ cc_iso8859_10_to_ucs2, NULL },
+ { ISO8859_10, EPlfmUnicode, EEncAny,
+ cc_iso8859_10_to_ucs2, NULL },
+ { ISO8859_10, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_10_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_10_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.11/ISO8859_11toUCS2.c b/xc/extras/X-TrueType/ISO8859.11/ISO8859_11toUCS2.c
new file mode 100644
index 000000000..4cd0667e6
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.11/ISO8859_11toUCS2.c
@@ -0,0 +1,73 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ ISO-8859-11 (Thai) to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Table build by looking into <X11/keysymdef.h>, the unicode chart,
+ and an actual X11 font using iso8859-11 encoding.
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_11ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00a0, 0x0e01, 0x0e02, 0x0e03, 0x0e04, 0x0e05, 0x0e06, 0x0e07,
+ 0x0e08, 0x0e09, 0x0e0a, 0x0e0b, 0x0e0c, 0x0e0d, 0x0e0e, 0x0e0f,
+ 0x0e10, 0x0e11, 0x0e12, 0x0e13, 0x0e14, 0x0e15, 0x0e16, 0x0e17,
+ 0x0e18, 0x0e19, 0x0e1a, 0x0e1b, 0x0e1c, 0x0e1d, 0x0e1e, 0x0e1f,
+ 0x0e20, 0x0e21, 0x0e22, 0x0e23, 0x0e24, 0x0e25, 0x0e26, 0x0e27,
+ 0x0e28, 0x0e29, 0x0e2a, 0x0e2b, 0x0e2c, 0x0e2d, 0x0e2e, 0x0e2f,
+ 0x0e30, 0x0e31, 0x0e32, 0x0e33, 0x0e34, 0x0e35, 0x0e36, 0x0e37,
+ 0x0e38, 0x0e39, 0x0e3a, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x0e3f,
+ 0x0e40, 0x0e41, 0x0e42, 0x0e43, 0x0e44, 0x0e45, 0x0e46, 0x0e47,
+ 0x0e48, 0x0e49, 0x0e4a, 0x0e4b, 0x0e4c, 0x0e4d, 0x0e4e, 0x0e4f,
+ 0x0e50, 0x0e51, 0x0e52, 0x0e53, 0x0e54, 0x0e55, 0x0e56, 0x0e57,
+ 0x0e58, 0x0e59, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_11_to_ucs2, /* function name */
+ tblIso8859_11ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.11/Imakefile b/xc/extras/X-TrueType/ISO8859.11/Imakefile
new file mode 100644
index 000000000..c5e52a8f8
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.11/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.11 */
+
+#define ModuleName ISO8859_11
+SRCS = ISO8859_11toUCS2.c main.c
+OBJS = ISO8859_11toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.11/main.c b/xc/extras/X-TrueType/ISO8859.11/main.c
new file mode 100644
index 000000000..93ad0f315
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.11/main.c
@@ -0,0 +1,71 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_11
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "11", ISO8859_11, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "tis620", "2529", "1", ISO8859_11, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "tis620", "2533", "0", ISO8859_11, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_11_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_11, EPlfmISO, EEncISO10646,
+ cc_iso8859_11_to_ucs2, NULL },
+ { ISO8859_11, EPlfmUnicode, EEncAny,
+ cc_iso8859_11_to_ucs2, NULL },
+ { ISO8859_11, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_11_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_11_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.14/ISO8859_14toUCS2.c b/xc/extras/X-TrueType/ISO8859.14/ISO8859_14toUCS2.c
new file mode 100644
index 000000000..4f962a782
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.14/ISO8859_14toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-14.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_14ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7,
+ 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
+ 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56,
+ 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_14_to_ucs2, /* function name */
+ tblIso8859_14ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.14/Imakefile b/xc/extras/X-TrueType/ISO8859.14/Imakefile
new file mode 100644
index 000000000..c98894ccd
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.14/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.14 */
+
+#define ModuleName ISO8859_14
+SRCS = ISO8859_14toUCS2.c main.c
+OBJS = ISO8859_14toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.14/main.c b/xc/extras/X-TrueType/ISO8859.14/main.c
new file mode 100644
index 000000000..6eb93d7a9
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.14/main.c
@@ -0,0 +1,68 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_14
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "14", ISO8859_14, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_14_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_14, EPlfmISO, EEncISO10646,
+ cc_iso8859_14_to_ucs2, NULL },
+ { ISO8859_14, EPlfmUnicode, EEncAny,
+ cc_iso8859_14_to_ucs2, NULL },
+ { ISO8859_14, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_14_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_14_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.15/Imakefile b/xc/extras/X-TrueType/ISO8859.15/Imakefile
new file mode 100644
index 000000000..293d3825b
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.15/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.15 */
+
+#define ModuleName ISO8859_15
+SRCS = main.c
+OBJS = main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.15/main.c b/xc/extras/X-TrueType/ISO8859.15/main.c
new file mode 100644
index 000000000..cb4230b86
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.15/main.c
@@ -0,0 +1,100 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_15
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "15", ISO8859_15, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_15_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_15, EPlfmISO, EEncISO10646,
+ cc_iso8859_15_to_ucs2, NULL },
+ { ISO8859_15, EPlfmUnicode, EEncAny,
+ cc_iso8859_15_to_ucs2, NULL },
+ { ISO8859_15, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_15_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_15_entrypoint)
+
+
+/*************************************************
+ Calculatable code convert functions
+ */
+
+/*
+ iso8859-15 -> UCS2
+
+ This from xfsft:
+ Copyright (c) 1997 by Mark Leisher
+ Copyright (c) 1998 by Juliusz Chroboczek
+
+ */
+ucs2_t /* result charCodeDest */
+cc_iso8859_15_to_ucs2(ft_char_code_t codeSrc)
+{
+ ucs2_t codeDst=codeSrc;
+
+ switch(codeSrc) {
+ case 0xA4: codeDst = 0x20AC; break;
+ case 0xA6: codeDst = 0x0160; break;
+ case 0xA8: codeDst = 0x0161; break;
+ case 0xB4: codeDst = 0x017D; break;
+ case 0xB8: codeDst = 0x017E; break;
+ case 0xBC: codeDst = 0x0152; break;
+ case 0xBD: codeDst = 0x0153; break;
+ case 0xBE: codeDst = 0x0178; break;
+ }
+
+ return codeDst;
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.2/ISO8859_2toACNTRO.c b/xc/extras/X-TrueType/ISO8859.2/ISO8859_2toACNTRO.c
new file mode 100644
index 000000000..9bbfa54cd
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.2/ISO8859_2toACNTRO.c
@@ -0,0 +1,72 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+ This table from xfsft:
+ Copyright (c) 1997 by Mark Leisher
+ Copyright (c) 1998 by Juliusz Chroboczek
+
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ft_char_code_t tblIso8859_2ToAppleCenteuro[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00CA, 0x0084, ALTCHR, 0x00FC, ALTCHR, 0x00BB, 0x00E5, 0x00A4,
+ 0x00AC, 0x00E1, ALTCHR, 0x00E8, 0x008F, ALTCHR, 0x00EB, 0x00FB,
+ 0x00A1, 0x0088, ALTCHR, 0x00B8, ALTCHR, 0x00BC, 0x00E6, 0x00FF,
+ ALTCHR, 0x00E4, ALTCHR, 0x00E9, 0x0090, ALTCHR, 0x00EC, 0x00FD,
+ 0x00D9, 0x00E7, ALTCHR, ALTCHR, 0x0080, 0x00BD, 0x008C, ALTCHR,
+ 0x0089, 0x0083, 0x00A2, ALTCHR, 0x009D, 0x00EA, ALTCHR, 0x0091,
+ ALTCHR, 0x00C1, 0x00C5, 0x00EE, 0x00EF, 0x00CC, 0x0085, ALTCHR,
+ 0x00DB, 0x00F1, 0x00F2, 0x00F4, 0x0086, 0x00F8, ALTCHR, 0x00A7,
+ 0x00DA, 0x0087, ALTCHR, ALTCHR, 0x008A, 0x00BE, 0x008D, ALTCHR,
+ 0x008B, 0x008E, 0x00AB, ALTCHR, 0x009E, 0x0092, ALTCHR, 0x0093,
+ ALTCHR, 0x00C4, 0x00CB, 0x0097, 0x0099, 0x00CE, 0x009A, 0x00D6,
+ 0x00DE, 0x00F3, 0x009C, 0x00F5, 0x009F, 0x00F9, ALTCHR, ALTCHR
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_2_to_apple_centeuro, /* function name */
+ tblIso8859_2ToAppleCenteuro, /* table name */
+ ALTCHR /* alt char code (on ARoman) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.2/ISO8859_2toUCS2.c b/xc/extras/X-TrueType/ISO8859.2/ISO8859_2toUCS2.c
new file mode 100644
index 000000000..14bc25d10
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.2/ISO8859_2toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-2.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_2ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7,
+ 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
+ 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7,
+ 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
+ 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
+ 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
+ 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
+ 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
+ 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
+ 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_2_to_ucs2, /* function name */
+ tblIso8859_2ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.2/Imakefile b/xc/extras/X-TrueType/ISO8859.2/Imakefile
new file mode 100644
index 000000000..c143c7e01
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.2/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.2 */
+
+#define ModuleName ISO8859_2
+SRCS = ISO8859_2toACNTRO.c ISO8859_2toUCS2.c main.c
+OBJS = ISO8859_2toACNTRO.o ISO8859_2toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.2/main.c b/xc/extras/X-TrueType/ISO8859.2/main.c
new file mode 100644
index 000000000..7c1861b9a
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.2/main.c
@@ -0,0 +1,71 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_2
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "2", ISO8859_2, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_2_to_apple_centeuro);
+CODECONV_TEMPLATE(cc_iso8859_2_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_2, EPlfmISO, EEncISO10646,
+ cc_iso8859_2_to_ucs2, NULL },
+ { ISO8859_2, EPlfmUnicode, EEncAny,
+ cc_iso8859_2_to_ucs2, NULL },
+ { ISO8859_2, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_2_to_ucs2, NULL },
+ { ISO8859_2, EPlfmApple, EEncAppleCenteuro,
+ cc_iso8859_2_to_apple_centeuro, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_2_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.3/ISO8859_3toUCS2.c b/xc/extras/X-TrueType/ISO8859.3/ISO8859_3toUCS2.c
new file mode 100644
index 000000000..71cdd56e0
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.3/ISO8859_3toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-3.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_3ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, ALTCHR, 0x0124, 0x00A7,
+ 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, ALTCHR, 0x017B,
+ 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7,
+ 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, ALTCHR, 0x017C,
+ 0x00C0, 0x00C1, 0x00C2, ALTCHR, 0x00C4, 0x010A, 0x0108, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ ALTCHR, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7,
+ 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, ALTCHR, 0x00E4, 0x010B, 0x0109, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ ALTCHR, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
+ 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_3_to_ucs2, /* function name */
+ tblIso8859_3ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.3/Imakefile b/xc/extras/X-TrueType/ISO8859.3/Imakefile
new file mode 100644
index 000000000..cc6ed715c
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.3/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.3 */
+
+#define ModuleName ISO8859_3
+SRCS = ISO8859_3toUCS2.c main.c
+OBJS = ISO8859_3toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.3/main.c b/xc/extras/X-TrueType/ISO8859.3/main.c
new file mode 100644
index 000000000..ec4f2288c
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.3/main.c
@@ -0,0 +1,68 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_3
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "3", ISO8859_3, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_3_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_3, EPlfmISO, EEncISO10646,
+ cc_iso8859_3_to_ucs2, NULL },
+ { ISO8859_3, EPlfmUnicode, EEncAny,
+ cc_iso8859_3_to_ucs2, NULL },
+ { ISO8859_3, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_3_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_3_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.4/ISO8859_4toUCS2.c b/xc/extras/X-TrueType/ISO8859.4/ISO8859_4toUCS2.c
new file mode 100644
index 000000000..9e1ec219a
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.4/ISO8859_4toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-4.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_4ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7,
+ 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
+ 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7,
+ 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
+ 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
+ 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
+ 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
+ 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
+ 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
+ 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_4_to_ucs2, /* function name */
+ tblIso8859_4ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.4/Imakefile b/xc/extras/X-TrueType/ISO8859.4/Imakefile
new file mode 100644
index 000000000..6791021ab
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.4/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.4 */
+
+#define ModuleName ISO8859_4
+SRCS = ISO8859_4toUCS2.c main.c
+OBJS = ISO8859_4toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.4/main.c b/xc/extras/X-TrueType/ISO8859.4/main.c
new file mode 100644
index 000000000..0f9923b4c
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.4/main.c
@@ -0,0 +1,68 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_4
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "4", ISO8859_4, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_4_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_4, EPlfmISO, EEncISO10646,
+ cc_iso8859_4_to_ucs2, NULL },
+ { ISO8859_4, EPlfmUnicode, EEncAny,
+ cc_iso8859_4_to_ucs2, NULL },
+ { ISO8859_4, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_4_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_4_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.5/ISO8859_5toACYRIL.c b/xc/extras/X-TrueType/ISO8859.5/ISO8859_5toACYRIL.c
new file mode 100644
index 000000000..cb179b3d1
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.5/ISO8859_5toACYRIL.c
@@ -0,0 +1,72 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+ This table from xfsft:
+ Copyright (c) 1997 by Mark Leisher
+ Copyright (c) 1998 by Juliusz Chroboczek
+
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ft_char_code_t tblIso8859_5ToAppleCyrillic[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00CA, 0x00DD, 0x00AB, 0x00AE, 0x00B8, 0x00C1, 0x00A7, 0x00BA,
+ 0x00B7, 0x00BC, 0x00BE, 0x00CB, 0x00CD, ALTCHR, 0x00D8, 0x00DA,
+ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
+ 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
+ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
+ 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00DF,
+ 0x00DC, 0x00DE, 0x00AC, 0x00AF, 0x00B9, 0x00CF, 0x00B4, 0x00BB,
+ 0x00C0, 0x00BD, 0x00BF, 0x00CC, 0x00CE, 0x00A4, 0x00D9, 0x00DB
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_5_to_apple_cyrillic, /* function name */
+ tblIso8859_5ToAppleCyrillic, /* table name */
+ ALTCHR /* alt char code (on ARoman) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.5/ISO8859_5toUCS2.c b/xc/extras/X-TrueType/ISO8859.5/ISO8859_5toUCS2.c
new file mode 100644
index 000000000..881cbf52e
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.5/ISO8859_5toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-5.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_5ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
+ 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
+ 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
+ 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
+ 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
+ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
+ 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
+ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
+ 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
+ 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_5_to_ucs2, /* function name */
+ tblIso8859_5ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.5/Imakefile b/xc/extras/X-TrueType/ISO8859.5/Imakefile
new file mode 100644
index 000000000..8e4ece04e
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.5/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.5 */
+
+#define ModuleName ISO8859_5
+SRCS = ISO8859_5toACYRIL.c ISO8859_5toUCS2.c main.c
+OBJS = ISO8859_5toACYRIL.o ISO8859_5toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.5/main.c b/xc/extras/X-TrueType/ISO8859.5/main.c
new file mode 100644
index 000000000..bde331af6
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.5/main.c
@@ -0,0 +1,71 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_5
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "5", ISO8859_5, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_5_to_apple_cyrillic);
+CODECONV_TEMPLATE(cc_iso8859_5_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_5, EPlfmISO, EEncISO10646,
+ cc_iso8859_5_to_ucs2, NULL },
+ { ISO8859_5, EPlfmUnicode, EEncAny,
+ cc_iso8859_5_to_ucs2, NULL },
+ { ISO8859_5, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_5_to_ucs2, NULL },
+ { ISO8859_5, EPlfmApple, EEncAppleCenteuro,
+ cc_iso8859_5_to_apple_cyrillic, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_5_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.6/ISO8859_6toUCS2.c b/xc/extras/X-TrueType/ISO8859.6/ISO8859_6toUCS2.c
new file mode 100644
index 000000000..728b038d1
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.6/ISO8859_6toUCS2.c
@@ -0,0 +1,194 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998,1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-6.TXT)
+
+ added support for iso-8859-6-8, iso-8859-6-16 and asmo 449+
+ encoded fonts -- srtxg
+
+ Font encoding data from:
+ http://www.langbox.com/fontara8.html (iso-8859-8)
+ http://www.langbox.com/fontara16.html (iso-8859-16)
+ http://www.langbox.com/asmo449.html (asmo 449+)
+
+ NOTE: in iso-8859-6-16 the codes 0x91 (damatan medial)
+ and 0x92 (kasratan medial) are not listed on unicode; however
+ from the unicode charts it seems logical that those two chars
+ are going to 0xfe73 and 0xfe75; and as those unicode values
+ are not attributed I'll use them; if they get attributed it is
+ likely that they will be to those damatan medial and
+ kasratan medial glyphs.
+ 0x81 (fathatan on shadda isolated), 0x98 (fathatan on
+ shadda medial), 0x99 (damatan on shadda medial) and 0x9a (kasratan
+ on shadda medial) have no unicode equivalents; the same is true for:
+
+ 0xF1 U+ ARABIC LAM FOR LIGATURE LAM ALEF INITIAL FORM (TWO CELL GLYPH)
+ 0xF2 U+ ARABIC LAM FOR LIGATURE LAM ALEF MEDIAL FORM (TWO CELL GLYPH)
+ 0xF3 U+ ARABIC ALEF FOR LIGATURE LAM ALEF (TWO CELL GLYPH)
+ 0xF4 U+ ARABIC MADDA ON ALEF FOR LIGATURE MADDA ON LAM ALEF (TWO CELL GLYPH)
+ 0xF5 U+ ARABIC HAMZA ON ALEF FOR LIGATURE HAMZA ON LAM ALEF (TWO CELL GLYPH)
+ 0xF6 U+ ARABIC HAMZA UNDER ALEF FOR LIGATURE HAMZA UNDER LAM ALEF (TWO CELL GLYPH)
+ 0xF7 U+ ARABIC COMBO (TAIL EXTENSION FOR SEEN, SHIN, SAAD, DAAD IN TWO CELL GLYPH)
+
+ for ISO-8859-6-8 the following have no unicode values either:
+
+ 0xA1 U+ ARABIC LIGATURE ALEF OF LAM ALEF (TWO CELL GLYPH)
+ 0xA2 U+ ARABIC LIGATURE MADDA ON ALEF OF LAM ALEF (TWO CELL GLYPH)
+ 0xA3 U+ ARABIC LIGATURE HAMZA ON ALEF OF LAM ALEF (TWO CELL GLYPH)
+ 0xA4 U+ ARABIC LIGATURE HAMZA UNDER ALEF OF LAM ALEF (TWO CELL GLYPH)
+ 0xA5 U+ ARABIC LIGATURE LAM OF LAM ALEF INITIAL FORM (TWO CELL GLYPH)
+ 0xA6 U+ ARABIC LIGATURE LAM OF LAM ALEF MEDIAL FORM (TWO CELL GLYPH)
+
+ I put 0xf0?? for them so if the True Type font has also
+ a microsoft-symbol encoding table the glyphs will match. -- srtxg
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_6ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, ALTCHR, ALTCHR, ALTCHR, 0x00A4, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x060C, 0x00AD, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, 0x061B, ALTCHR, ALTCHR, ALTCHR, 0x061F,
+ ALTCHR, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
+ 0x0638, 0x0639, 0x063A, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
+ 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
+ 0x0650, 0x0651, 0x0652, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+};
+
+static ucs2_t tblIso8859_6_8ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0xf0a1, 0xf0a2, 0xf0a3, 0xf0a4, 0xf0a5, 0xf0a6, ALTCHR,
+ 0x064b, 0x064c, 0x064d, 0x064e, 0x064f, 0x0650, 0x0651, 0x0652,
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667,
+ 0x0668, 0x0669, 0x060c, 0x061B, 0xfe71, 0xfe73, 0xfe75, 0x061F,
+ 0xfe8b, 0xfe80, 0xfe82, 0xfe84, 0xfe86, 0xfe88, 0xfe8a, 0xfe8e,
+ 0xfe90, 0xfe94, 0xfe96, 0xfe9a, 0xfe9e, 0xfea2, 0xfea6, 0xfeab,
+ 0xfeac, 0xfeae, 0xfeb0, 0xfeb2, 0xfeb6, 0xfeba, 0xfebe, 0xfec4,
+ 0xfec8, 0xfeca, 0xfece, 0xfe77, 0xfe79, 0xfe7b, 0xfe7f, 0xfe7d,
+ 0x0640, 0xfed2, 0xfed6, 0xfeda, 0xfede, 0xfee2, 0xfee6, 0xfeea,
+ 0xfeee, 0xfef0, 0xfef2, 0xfe92, 0xfe98, 0xfe9c, 0xfea0, 0xfea4,
+ 0xfea8, 0xfeb4, 0xfeb8, 0xfebc, 0xfec0, 0xfecc, 0xfed0, 0xfed4,
+ 0xfed8, 0xfedc, 0xfee0, 0xfee4, 0xfee8, 0xfeec, 0xfef4, ALTCHR,
+};
+
+static ucs2_t tblIso8859_6_16ToUcs2[] = {
+/* 0x0000 - 0x007F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x066A, 0x0026, 0x0027,
+ 0x0029, 0x0028, 0x002a, 0x002b, 0x060C, 0x00AD, 0x06d4, 0x002f,
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667,
+ 0x0668, 0x0669, 0x003a, 0x061B, 0x203a, 0x003d, 0x2039, 0x061F,
+ 0x0040, 0xfe80, 0xfe81, 0xfe83, 0xfe85, 0xfe87, 0xfe89, 0xfe8d,
+ 0xfe8f, 0xfe93, 0xfe95, 0xfe99, 0xfe9d, 0xfea1, 0xfea5, 0xfea9,
+ 0xfeab, 0xfead, 0xfeaf, 0xfeb1, 0xfeb5, 0xfeb9, 0xfebd, 0xfec1,
+ 0xfec5, 0xfec9, 0xfecd, 0x005d, 0x005c, 0x005b, 0x005e, 0x005f,
+ 0x0640, 0xfed1, 0xfed5, 0xfed9, 0xfedd, 0xfee1, 0xfee5, 0xfee9,
+ 0xfeed, 0xfeef, 0xfef1, 0x064b, 0x064c, 0x064d, 0x064e, 0x064f,
+ 0x0650, 0x0651, 0x0652, ALTCHR, ALTCHR, ALTCHR, 0xfef5, 0xfef7,
+ 0xfef9, 0xfefb, ALTCHR, 0x007d, 0x007c, 0x007b, 0x007e, ALTCHR,
+/* 0x0080 - 0x009F */
+ ALTCHR, 0xf081, 0xfc5e, 0xfc5f, 0xfc60, 0xfc61, 0xfc62, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0xfe71, 0xfe73, 0xfe75, 0xfe77, 0xfe79, 0xfe7b, 0xfe7f, 0xfe7d,
+ 0xf098, 0xf099, 0xf09a, ALTCHR, 0xfcfd, 0xfcf3, 0xfcf4, ALTCHR,
+/* 0x00A0 - 0x00FF */
+ 0xfe8c, 0xfe82, 0xfe84, 0xfe86, 0xfe88, 0xfe8e, 0xfeaa, 0xfeac,
+ 0xfeae, 0xfeb0, 0xfeee, 0xfef0, 0xfe91, 0xfe92, 0xfe90, 0xfe97,
+ 0xfe98, 0xfe94, 0xfe97, 0xfe98, 0xfe96, 0xfe9b, 0xfe9c, 0xfe9a,
+ 0xfe9f, 0xfea0, 0xfe9e, 0xfea3, 0xfea4, 0xfea2, 0xfea7, 0xfea8,
+ 0xfea6, 0xfeb3, 0xfeb4, 0xfeb2, 0xfeb7, 0xfeb8, 0xfeb6, 0xfebb,
+ 0xfebc, 0xfeba, 0xfebf, 0xfec0, 0xfebe, 0xfec3, 0xfec4, 0xfec2,
+ 0xfec7, 0xfec8, 0xfec6, 0xfecb, 0xfecc, 0xfeca, 0xfeef, 0xfed0,
+ 0xfeee, 0xfed3, 0xfed4, 0xfed2, 0xfed7, 0xfed8, 0xfed6, 0xfedb,
+ 0xfedc, 0xfeda, 0xfedf, 0xfee0, 0xfede, 0xfee3, 0xfee4, 0xfee2,
+ 0xfee7, 0xfee8, 0xfee6, 0xfeeb, 0xfeec, 0xfeea, 0xfef3, 0xfef4,
+ 0xfef2, 0xf0f1, 0xf0f2, 0xf0f3, 0xf0f4, 0xf0f5, 0xf0f6, 0xf0f7,
+ 0xfe8b, 0xfe8a, 0xfef6, 0xfefa, 0xfef8, 0xfefc, ALTCHR, ALTCHR
+};
+
+static ucs2_t tblAsmo449ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x0021, 0x0022, 0x0023, 0x0024, 0x066A, 0x0026, 0x0027,
+ 0x0029, 0x0028, 0x002a, 0x002b, 0x060C, 0x00AD, 0x06d4, 0x002f,
+ 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667,
+ 0x0668, 0x0669, 0x003a, 0x061B, 0x203a, 0x003d, 0x2039, 0x061F,
+ 0x0040, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
+ 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
+ 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
+ 0x0638, 0x0639, 0x063A, 0x005d, 0x005c, 0x005b, 0x005e, 0x005f,
+ 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
+ 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
+ 0x0650, 0x0651, 0x0652, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, 0x007d, 0x007c, 0x007b, 0x007e, ALTCHR,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_6_to_ucs2, /* function name */
+ tblIso8859_6ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_6_8_to_ucs2, /* function name */
+ tblIso8859_6_8ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_iso8859_6_16_to_ucs2, /* function name */
+ tblIso8859_6_16ToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+CODE_CONV_ISO8859_TO_UCS2(cc_asmo449_to_ucs2, /* function name */
+ tblAsmo449ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.6/Imakefile b/xc/extras/X-TrueType/ISO8859.6/Imakefile
new file mode 100644
index 000000000..8305e0ea2
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.6/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.6 */
+
+#define ModuleName ISO8859_6
+SRCS = ISO8859_6toUCS2.c main.c
+OBJS = ISO8859_6toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.6/main.c b/xc/extras/X-TrueType/ISO8859.6/main.c
new file mode 100644
index 000000000..04944a7e8
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.6/main.c
@@ -0,0 +1,111 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1998,1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ added support for iso-8859-6-8 and iso-8859-16 encoded fonts
+ and for asmo 449+ encoded ones.
+
+ PROBLEM: I have no idea what the X11 names are for those encodings
+ I need input here. In the meanwhile I'll use *-iso8859-6_{8,16}
+ and *-iso8859-6_asmo
+ Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_6,
+ ISO8859_6_8,
+ ISO8859_6_16,
+ ASMO449
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "6", ISO8859_6,
+ { 0x20, 0xff, 0, 0, 0x20 } },
+ { "iso8859", NULL, "6_8", ISO8859_6_8,
+ { 0x20, 0xff, 0, 0, 0x20 } },
+ { "iso8859", NULL, "6_16", ISO8859_6_16,
+ { 0x20, 0xff, 0, 0, 0x20 } },
+ { "iso8859", NULL, "6_asmo", ASMO449,
+ { 0x20, 0xff, 0, 0, 0x20 } },
+ { "asmo", NULL, "449", ASMO449,
+ { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_6_to_ucs2);
+CODECONV_TEMPLATE(cc_iso8859_6_8_to_ucs2);
+CODECONV_TEMPLATE(cc_iso8859_6_16_to_ucs2);
+CODECONV_TEMPLATE(cc_asmo449_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_6, EPlfmISO, EEncISO10646,
+ cc_iso8859_6_to_ucs2, NULL },
+ { ISO8859_6, EPlfmUnicode, EEncAny,
+ cc_iso8859_6_to_ucs2, NULL },
+ { ISO8859_6, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_6_to_ucs2, NULL },
+ { ISO8859_6_8, EPlfmISO, EEncISO10646,
+ cc_iso8859_6_8_to_ucs2, NULL },
+ { ISO8859_6_8, EPlfmUnicode, EEncAny,
+ cc_iso8859_6_8_to_ucs2, NULL },
+ { ISO8859_6_8, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_6_8_to_ucs2, NULL },
+ { ISO8859_6_16, EPlfmISO, EEncISO10646,
+ cc_iso8859_6_16_to_ucs2, NULL },
+ { ISO8859_6_16, EPlfmUnicode, EEncAny,
+ cc_iso8859_6_16_to_ucs2, NULL },
+ { ISO8859_6_16, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_6_16_to_ucs2, NULL },
+ { ASMO449, EPlfmISO, EEncISO10646,
+ cc_asmo449_to_ucs2, NULL },
+ { ASMO449, EPlfmUnicode, EEncAny,
+ cc_asmo449_to_ucs2, NULL },
+ { ASMO449, EPlfmMS, EEncMSUnicode,
+ cc_asmo449_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_6_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.7/ISO8859_7toUCS2.c b/xc/extras/X-TrueType/ISO8859.7/ISO8859_7toUCS2.c
new file mode 100644
index 000000000..e8e7dbf08
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.7/ISO8859_7toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-7.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_7ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x02BD, 0x02BC, 0x00A3, ALTCHR, ALTCHR, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, ALTCHR, 0x00AB, 0x00AC, 0x00AD, ALTCHR, 0x2015,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7,
+ 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
+ 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, ALTCHR, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
+ 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
+ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
+ 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, ALTCHR,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_7_to_ucs2, /* function name */
+ tblIso8859_7ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.7/Imakefile b/xc/extras/X-TrueType/ISO8859.7/Imakefile
new file mode 100644
index 000000000..10a616d93
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.7/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.7 */
+
+#define ModuleName ISO8859_7
+SRCS = ISO8859_7toUCS2.c main.c
+OBJS = ISO8859_7toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.7/main.c b/xc/extras/X-TrueType/ISO8859.7/main.c
new file mode 100644
index 000000000..a6953559a
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.7/main.c
@@ -0,0 +1,68 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_7
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "7", ISO8859_7, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_7_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_7, EPlfmISO, EEncISO10646,
+ cc_iso8859_7_to_ucs2, NULL },
+ { ISO8859_7, EPlfmUnicode, EEncAny,
+ cc_iso8859_7_to_ucs2, NULL },
+ { ISO8859_7, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_7_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_7_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.8/ISO8859_8toUCS2.c b/xc/extras/X-TrueType/ISO8859.8/ISO8859_8toUCS2.c
new file mode 100644
index 000000000..38f870d83
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.8/ISO8859_8toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-8.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_8ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, ALTCHR, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x203E,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x2017,
+ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
+ 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
+ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
+ 0x05E8, 0x05E9, 0x05EA, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_8_to_ucs2, /* function name */
+ tblIso8859_8ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.8/Imakefile b/xc/extras/X-TrueType/ISO8859.8/Imakefile
new file mode 100644
index 000000000..dc0248f35
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.8/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.8 */
+
+#define ModuleName ISO8859_8
+SRCS = ISO8859_8toUCS2.c main.c
+OBJS = ISO8859_8toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.8/main.c b/xc/extras/X-TrueType/ISO8859.8/main.c
new file mode 100644
index 000000000..c48edd572
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.8/main.c
@@ -0,0 +1,68 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_8
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "8", ISO8859_8, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_8_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_8, EPlfmISO, EEncISO10646,
+ cc_iso8859_8_to_ucs2, NULL },
+ { ISO8859_8, EPlfmUnicode, EEncAny,
+ cc_iso8859_8_to_ucs2, NULL },
+ { ISO8859_8, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_8_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_8_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.9/ISO8859_9toUCS2.c b/xc/extras/X-TrueType/ISO8859.9/ISO8859_9toUCS2.c
new file mode 100644
index 000000000..ca4cd0dd6
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.9/ISO8859_9toUCS2.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-9.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblIso8859_9ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
+ 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
+ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
+ 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
+ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
+ 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
+ 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
+ 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
+ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
+ 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
+ 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
+ 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF,
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_iso8859_9_to_ucs2, /* function name */
+ tblIso8859_9ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.9/Imakefile b/xc/extras/X-TrueType/ISO8859.9/Imakefile
new file mode 100644
index 000000000..851b9848a
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.9/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: ISO8859.9 */
+
+#define ModuleName ISO8859_9
+SRCS = ISO8859_9toUCS2.c main.c
+OBJS = ISO8859_9toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/ISO8859.9/main.c b/xc/extras/X-TrueType/ISO8859.9/main.c
new file mode 100644
index 000000000..f95d3aed5
--- /dev/null
+++ b/xc/extras/X-TrueType/ISO8859.9/main.c
@@ -0,0 +1,68 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ ISO8859_9
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "iso8859", NULL, "9", ISO8859_9, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_iso8859_9_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { ISO8859_9, EPlfmISO, EEncISO10646,
+ cc_iso8859_9_to_ucs2, NULL },
+ { ISO8859_9, EPlfmUnicode, EEncAny,
+ cc_iso8859_9_to_ucs2, NULL },
+ { ISO8859_9, EPlfmMS, EEncMSUnicode,
+ cc_iso8859_9_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(ISO8859_9_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/Imakefile b/xc/extras/X-TrueType/Imakefile
new file mode 100644
index 000000000..c26ae009e
--- /dev/null
+++ b/xc/extras/X-TrueType/Imakefile
@@ -0,0 +1,108 @@
+/*
+ * X-TrueType Server
+ */
+
+#define IHaveSubdirs
+
+#include <Server.tmpl>
+
+XTT_CCONV_DEFAULT_SUBDIRS = ISO8859.1
+XTT_CCONV_DEFAULT_DONES = DONE ISO8859.1/DONE
+#if XTrueTypeUseOptEncodings
+ XTT_USE_OPT_ENC_DEFINES = -DOPT_ENCODINGS
+ XTT_CCONV_OPT_SUBDIRS = \
+ BIG5 GB2312 JISX0201 JISX0208 JISX0212 KSC5601 KSCJOHAB \
+ ISO8859.2 ISO8859.3 ISO8859.4 ISO8859.5 ISO8859.6 \
+ ISO8859.7 ISO8859.8 ISO8859.9 ISO8859.10 ISO8859.11 \
+ ISO8859.14 ISO8859.15 KOI8 VISCII TCVN ARMSCII8 \
+ ARABIC MULEENCODING DOSENCODING
+ XTT_CCONV_OPT_DONES = \
+ BIG5/DONE GB2312/DONE JISX0201/DONE JISX0208/DONE \
+ JISX0212/DONE KSC5601/DONE KSCJOHAB/DONE \
+ ISO8859.1/DONE ISO8859.2/DONE ISO8859.3/DONE ISO8859.4/DONE \
+ ISO8859.5/DONE ISO8859.6/DONE ISO8859.7/DONE ISO8859.8/DONE \
+ ISO8859.9/DONE ISO8859.10/DONE ISO8859.11/DONE ISO8859.14/DONE \
+ ISO8859.15/DONE KOI8/DONE VISCII/DONE TCVN/DONE ARMSCII8/DONE \
+ ARABIC/DONE MULEENCODING/DONE DOSENCODING/DONE
+#endif
+
+/* If you cannot compile with the code for 'Very Lazy Method',
+ * then please validate the following line.
+ */
+/* XTT_LAZY_DEFINES = -DVERY_LAZY=0 */
+
+XTT_SRCS = \
+ xttcache.c xttchinfo.c xttprop.c xttfuncs.c xttcconv.c xttcap.c xttmisc.c
+XTT_OBJS = \
+ xttcache.o xttchinfo.o xttprop.o xttfuncs.o xttcconv.o xttcap.o xttmisc.o
+#if XTrueTypeDebugXTT
+ XTT_DUMP_DEFINES = -DDUMP
+ XTT_DEBUG_SRCS = xttdump.c
+ XTT_DEBUG_OBJS = xttdump.o
+#endif
+
+#if XTrueTypeCConvModule
+ XTT_CCONV_MODULE_DIR = XTrueTypeCConvModuleDir
+ XTT_CCONV_MODULE_DEFINES = \
+ -DCCONV_MODULE -DCCONV_MODULE_DIR=\"$(XTT_CCONV_MODULE_DIR)\"
+#endif
+
+XTT_CCONV_HEADERS = xttcap.h xttcconv.h xttcconvP.h xttcommon.h
+
+#if XTrueTypeInstallCConvHeaders
+ XTT_CCONVINSTDIR = XTrueTypeCConvIncDir
+InstallMultipleFlags($(XTT_CCONV_HEADERS),$(XTT_CCONVINSTDIR),$(INSTINCFLAGS))
+#endif
+
+#ifdef UseInstalled
+ XTT_CONFIG_SRCDIR = $(TOP)/config/cf
+ XTT_CONFIG_FILES = \
+ $(XTT_CONFIG_SRCDIR)/xtt.tmpl $(XTT_CONFIG_SRCDIR)/xttmod.rules \
+ $(XTT_CONFIG_SRCDIR)/xttsite.def $(XTT_CONFIG_SRCDIR)/Imake.rules \
+ $(XTT_CONFIG_SRCDIR)/Imake.tmpl $(XTT_CONFIG_SRCDIR)/X11.tmpl \
+ $(XTT_CONFIG_SRCDIR)/bsdLib.rules $(XTT_CONFIG_SRCDIR)/ibmLib.rules \
+ $(XTT_CONFIG_SRCDIR)/linux.cf
+# if XTrueTypeInstallConfigFiles
+InstallMultipleDestFlags(install,$(XTT_CONFIG_FILES),$(CONFIGDIR),$(INSTDATFLAGS))
+# endif
+#endif
+
+FREETYPEINCLUDES = FreeTypeIncDir
+
+
+all::
+
+#define DoNormalLib NormalLibFont
+#define DoSharedLib SharedLibFont
+#define DoDebugLib DebugLibFont
+#define DoProfileLib ProfileLibFont
+#include <Library.tmpl>
+
+
+SRCS = $(XTT_SRCS) $(XTT_DEBUG_SRCS) $(FREETYPE_SRCS)
+OBJS = $(XTT_OBJS) $(XTT_DEBUG_OBJS) $(FREETYPE_OBJS)
+SUBDIRS = $(XTT_CCONV_DEFAULT_SUBDIRS) $(XTT_CCONV_OPT_SUBDIRS)
+DONES = DONE $(XTT_DEFAULT_CCONV_DONES) $(XTT_CCONV_OPT_DONES)
+
+INCLUDES = -I$(XTOP)/include/fonts -I$(XTOP)/lib/font/include \
+ -I$(XTOP)/programs/Xserver/include -I$(FREETYPEINCLUDES)
+DEFINES = $(XTT_USE_OPT_ENC_DEFINES) $(XTT_LAZY_DEFINES) $(XTT_DUMP_DEFINES) \
+ $(XTT_CCONV_MODULE_DEFINES)
+
+#if HasParallelMake
+MakeMutex($(SUBDIRS) $(DONES))
+#endif
+
+#if HasGnuMake || HasBsdMake
+$(DONES): $(SUBDIRS)
+#endif
+all:: $(SUBDIRS)
+
+
+LibraryObjectRule()
+
+SubdirLibraryRule($(OBJS))
+NormalLintTarget($(SRCS))
+MakeSubdirs($(SUBDIRS))
+DependSubdirs($(SUBDIRS))
+DependTarget()
diff --git a/xc/extras/X-TrueType/JISX0201/Imakefile b/xc/extras/X-TrueType/JISX0201/Imakefile
new file mode 100644
index 000000000..98ff6b5e7
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0201/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: JISX0201 */
+
+#define ModuleName JISX0201
+SRCS = JISX0201toUCS2.c main.c
+OBJS = JISX0201toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0201/JISX0201toUCS2.c b/xc/extras/X-TrueType/JISX0201/JISX0201toUCS2.c
new file mode 100644
index 000000000..16649dbb2
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0201/JISX0201toUCS2.c
@@ -0,0 +1,82 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPING/EASTASIA/JIS/JIS0201.TXT)
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblJisx0201ToWinUcs2[] = {
+/* 0x0020 - 0x00DF */
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E/*0x203E*/, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67,
+ 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F,
+ 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77,
+ 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F,
+ 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87,
+ 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F,
+ 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97,
+ 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F,
+};
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_jisx0201_to_win_ucs2, /* function name */
+ tblJisx0201ToWinUcs2, /* table name */
+ 0x20, 0xDF, /* code range */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0201/main.c b/xc/extras/X-TrueType/JISX0201/main.c
new file mode 100644
index 000000000..3b17ee1c8
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0201/main.c
@@ -0,0 +1,106 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ JISX0201
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "jisx0201", NULL, NULL, JISX0201, { 0x20, 0xdf, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_jisx0201_to_win_ucs2);
+CODECONV_TEMPLATE(cc_jisx0201_to_std_ucs2);
+CODECONV_CALLBACK_TEMPLATE(cb_jisx0201_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { JISX0201, EPlfmISO, EEncISO10646,
+ cc_jisx0201_to_std_ucs2,
+ cb_jisx0201_to_ucs2 },
+ { JISX0201, EPlfmUnicode, EEncAny,
+ cc_jisx0201_to_std_ucs2,
+ cb_jisx0201_to_ucs2 },
+ { JISX0201, EPlfmMS, EEncMSUnicode,
+ cc_jisx0201_to_win_ucs2,
+ cb_jisx0201_to_ucs2 },
+ /*
+ To avoid the difficulty on the OS/2 Warp Japanese Fonts
+ (OEM from Dynalab), we must place the following platform/encoding
+ 'Apple Japanese' before 'MS Shift JIS'.
+ These fonts has both the below encodings, but MS S-JIS is incorrect.
+ */
+ { JISX0201, EPlfmApple, EEncAppleJapanese, NULL, NULL },
+ { JISX0201, EPlfmMS, EEncMSShiftJIS, NULL, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(JISX0201_entrypoint)
+CODECONV_CALLBACK_TEMPLATE(cb_jisx0201_to_ucs2)
+{
+ SPropRecValContainer contRecValue;
+
+ if (SPropRecValList_search_record(charSetHints->refListPropRecVal,
+ &contRecValue,
+ "EncodingOptions")) {
+ char const *str =
+ SPropContainer_value_str(contRecValue);
+ if (tolower(*str) == 'm') {
+ refCodeConverterInfo->ptrCodeConverter = cc_jisx0201_to_win_ucs2;
+ } else if (tolower(*str) == 'i') {
+ refCodeConverterInfo->ptrCodeConverter = cc_jisx0201_to_std_ucs2;
+ }
+ }
+}
+
+ft_char_code_t /* result charCodeDest */
+cc_jisx0201_to_std_ucs2(ft_char_code_t idx)
+{
+ if (idx == 0x005c) {
+ return 0x00a5;
+ }
+ return cc_jisx0201_to_win_ucs2(idx);
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0208/Imakefile b/xc/extras/X-TrueType/JISX0208/Imakefile
new file mode 100644
index 000000000..5f0736e3c
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0208/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: JISX0208 */
+
+#define ModuleName JISX0208
+SRCS = JISX0208toUCS2.c main.c
+OBJS = JISX0208toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0208/JISX0208toUCS2.c b/xc/extras/X-TrueType/JISX0208/JISX0208toUCS2.c
new file mode 100644
index 000000000..dc2089989
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0208/JISX0208toUCS2.c
@@ -0,0 +1,1150 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPING/EASTASIA/JIS/JIS0208.TXT)
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x3000
+
+static ucs2_t tblJisx0208ToWinUcs2[] = {
+/* 0x2120 - 0x217F */
+ ALTCHR, 0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A,
+ 0xFF1B, 0xFF1F, 0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8,
+ 0xFF3E, 0xFFE3, 0xFF3F, 0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003,
+ 0x4EDD, 0x3005, 0x3006, 0x3007, 0x30FC, 0x2015, 0x2010, 0xFF0F,
+ 0xFF3C, 0xFF5E, 0x2225, 0xFF5C, 0x2026, 0x2025, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0xFF08, 0xFF09, 0x3014, 0x3015, 0xFF3B, 0xFF3D,
+ 0xFF5B, 0xFF5D, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D,
+ 0x300E, 0x300F, 0x3010, 0x3011, 0xFF0B, 0xFF0D, 0x00B1, 0x00D7,
+ 0x00F7, 0xFF1D, 0x2260, 0xFF1C, 0xFF1E, 0x2266, 0x2267, 0x221E,
+ 0x2234, 0x2642, 0x2640, 0x00B0, 0x2032, 0x2033, 0x2103, 0xFFE5,
+ 0xFF04, 0xFFE0, 0xFFE1, 0xFF05, 0xFF03, 0xFF06, 0xFF0A, 0xFF20,
+ 0x00A7, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, ALTCHR,
+/* 0x2220 - 0x227F */
+ ALTCHR, 0x25C6, 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC,
+ 0x203B, 0x3012, 0x2192, 0x2190, 0x2191, 0x2193, 0x3013, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, 0x2208, 0x220B, 0x2286, 0x2287, 0x2282, 0x2283,
+ 0x222A, 0x2229, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, 0x2227, 0x2228, 0xFFE2, 0x21D2, 0x21D4, 0x2200,
+ 0x2203, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x2220, 0x22A5, 0x2312, 0x2202,
+ 0x2207, 0x2261, 0x2252, 0x226A, 0x226B, 0x221A, 0x223D, 0x221D,
+ 0x2235, 0x222B, 0x222C, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, 0x212B, 0x2030, 0x266F, 0x266D, 0x266A, 0x2020,
+ 0x2021, 0x00B6, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x25EF, ALTCHR,
+/* 0x2320 - 0x237F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17,
+ 0xFF18, 0xFF19, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27,
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F,
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37,
+ 0xFF38, 0xFF39, 0xFF3A, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47,
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F,
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57,
+ 0xFF58, 0xFF59, 0xFF5A, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2420 - 0x247F */
+ ALTCHR, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2520 - 0x257F */
+ ALTCHR, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF,
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7,
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF,
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7,
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7,
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7,
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF,
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2620 - 0x267F */
+ ALTCHR, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,
+ 0x03A9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+ 0x03C9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2720 - 0x277F */
+ ALTCHR, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401,
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D,
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D,
+ 0x042E, 0x042F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451,
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D,
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D,
+ 0x044E, 0x044F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2820 - 0x287F */
+ ALTCHR, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C,
+ 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513,
+ 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520,
+ 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538,
+ 0x2542, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2920 - 0x297F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2A20 - 0x2A7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2B20 - 0x2B7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2C20 - 0x2C7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2D20 - 0x2D7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2E20 - 0x2E7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2F20 - 0x2F7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x3020 - 0x307F */
+ ALTCHR, 0x4E9C, 0x5516, 0x5A03, 0x963F, 0x54C0, 0x611B, 0x6328,
+ 0x59F6, 0x9022, 0x8475, 0x831C, 0x7A50, 0x60AA, 0x63E1, 0x6E25,
+ 0x65ED, 0x8466, 0x82A6, 0x9BF5, 0x6893, 0x5727, 0x65A1, 0x6271,
+ 0x5B9B, 0x59D0, 0x867B, 0x98F4, 0x7D62, 0x7DBE, 0x9B8E, 0x6216,
+ 0x7C9F, 0x88B7, 0x5B89, 0x5EB5, 0x6309, 0x6697, 0x6848, 0x95C7,
+ 0x978D, 0x674F, 0x4EE5, 0x4F0A, 0x4F4D, 0x4F9D, 0x5049, 0x56F2,
+ 0x5937, 0x59D4, 0x5A01, 0x5C09, 0x60DF, 0x610F, 0x6170, 0x6613,
+ 0x6905, 0x70BA, 0x754F, 0x7570, 0x79FB, 0x7DAD, 0x7DEF, 0x80C3,
+ 0x840E, 0x8863, 0x8B02, 0x9055, 0x907A, 0x533B, 0x4E95, 0x4EA5,
+ 0x57DF, 0x80B2, 0x90C1, 0x78EF, 0x4E00, 0x58F1, 0x6EA2, 0x9038,
+ 0x7A32, 0x8328, 0x828B, 0x9C2F, 0x5141, 0x5370, 0x54BD, 0x54E1,
+ 0x56E0, 0x59FB, 0x5F15, 0x98F2, 0x6DEB, 0x80E4, 0x852D, ALTCHR,
+/* 0x3120 - 0x317F */
+ ALTCHR, 0x9662, 0x9670, 0x96A0, 0x97FB, 0x540B, 0x53F3, 0x5B87,
+ 0x70CF, 0x7FBD, 0x8FC2, 0x96E8, 0x536F, 0x9D5C, 0x7ABA, 0x4E11,
+ 0x7893, 0x81FC, 0x6E26, 0x5618, 0x5504, 0x6B1D, 0x851A, 0x9C3B,
+ 0x59E5, 0x53A9, 0x6D66, 0x74DC, 0x958F, 0x5642, 0x4E91, 0x904B,
+ 0x96F2, 0x834F, 0x990C, 0x53E1, 0x55B6, 0x5B30, 0x5F71, 0x6620,
+ 0x66F3, 0x6804, 0x6C38, 0x6CF3, 0x6D29, 0x745B, 0x76C8, 0x7A4E,
+ 0x9834, 0x82F1, 0x885B, 0x8A60, 0x92ED, 0x6DB2, 0x75AB, 0x76CA,
+ 0x99C5, 0x60A6, 0x8B01, 0x8D8A, 0x95B2, 0x698E, 0x53AD, 0x5186,
+ 0x5712, 0x5830, 0x5944, 0x5BB4, 0x5EF6, 0x6028, 0x63A9, 0x63F4,
+ 0x6CBF, 0x6F14, 0x708E, 0x7114, 0x7159, 0x71D5, 0x733F, 0x7E01,
+ 0x8276, 0x82D1, 0x8597, 0x9060, 0x925B, 0x9D1B, 0x5869, 0x65BC,
+ 0x6C5A, 0x7525, 0x51F9, 0x592E, 0x5965, 0x5F80, 0x5FDC, ALTCHR,
+/* 0x3220 - 0x327F */
+ ALTCHR, 0x62BC, 0x65FA, 0x6A2A, 0x6B27, 0x6BB4, 0x738B, 0x7FC1,
+ 0x8956, 0x9D2C, 0x9D0E, 0x9EC4, 0x5CA1, 0x6C96, 0x837B, 0x5104,
+ 0x5C4B, 0x61B6, 0x81C6, 0x6876, 0x7261, 0x4E59, 0x4FFA, 0x5378,
+ 0x6069, 0x6E29, 0x7A4F, 0x97F3, 0x4E0B, 0x5316, 0x4EEE, 0x4F55,
+ 0x4F3D, 0x4FA1, 0x4F73, 0x52A0, 0x53EF, 0x5609, 0x590F, 0x5AC1,
+ 0x5BB6, 0x5BE1, 0x79D1, 0x6687, 0x679C, 0x67B6, 0x6B4C, 0x6CB3,
+ 0x706B, 0x73C2, 0x798D, 0x79BE, 0x7A3C, 0x7B87, 0x82B1, 0x82DB,
+ 0x8304, 0x8377, 0x83EF, 0x83D3, 0x8766, 0x8AB2, 0x5629, 0x8CA8,
+ 0x8FE6, 0x904E, 0x971E, 0x868A, 0x4FC4, 0x5CE8, 0x6211, 0x7259,
+ 0x753B, 0x81E5, 0x82BD, 0x86FE, 0x8CC0, 0x96C5, 0x9913, 0x99D5,
+ 0x4ECB, 0x4F1A, 0x89E3, 0x56DE, 0x584A, 0x58CA, 0x5EFB, 0x5FEB,
+ 0x602A, 0x6094, 0x6062, 0x61D0, 0x6212, 0x62D0, 0x6539, ALTCHR,
+/* 0x3320 - 0x337F */
+ ALTCHR, 0x9B41, 0x6666, 0x68B0, 0x6D77, 0x7070, 0x754C, 0x7686,
+ 0x7D75, 0x82A5, 0x87F9, 0x958B, 0x968E, 0x8C9D, 0x51F1, 0x52BE,
+ 0x5916, 0x54B3, 0x5BB3, 0x5D16, 0x6168, 0x6982, 0x6DAF, 0x788D,
+ 0x84CB, 0x8857, 0x8A72, 0x93A7, 0x9AB8, 0x6D6C, 0x99A8, 0x86D9,
+ 0x57A3, 0x67FF, 0x86CE, 0x920E, 0x5283, 0x5687, 0x5404, 0x5ED3,
+ 0x62E1, 0x64B9, 0x683C, 0x6838, 0x6BBB, 0x7372, 0x78BA, 0x7A6B,
+ 0x899A, 0x89D2, 0x8D6B, 0x8F03, 0x90ED, 0x95A3, 0x9694, 0x9769,
+ 0x5B66, 0x5CB3, 0x697D, 0x984D, 0x984E, 0x639B, 0x7B20, 0x6A2B,
+ 0x6A7F, 0x68B6, 0x9C0D, 0x6F5F, 0x5272, 0x559D, 0x6070, 0x62EC,
+ 0x6D3B, 0x6E07, 0x6ED1, 0x845B, 0x8910, 0x8F44, 0x4E14, 0x9C39,
+ 0x53F6, 0x691B, 0x6A3A, 0x9784, 0x682A, 0x515C, 0x7AC3, 0x84B2,
+ 0x91DC, 0x938C, 0x565B, 0x9D28, 0x6822, 0x8305, 0x8431, ALTCHR,
+/* 0x3420 - 0x347F */
+ ALTCHR, 0x7CA5, 0x5208, 0x82C5, 0x74E6, 0x4E7E, 0x4F83, 0x51A0,
+ 0x5BD2, 0x520A, 0x52D8, 0x52E7, 0x5DFB, 0x559A, 0x582A, 0x59E6,
+ 0x5B8C, 0x5B98, 0x5BDB, 0x5E72, 0x5E79, 0x60A3, 0x611F, 0x6163,
+ 0x61BE, 0x63DB, 0x6562, 0x67D1, 0x6853, 0x68FA, 0x6B3E, 0x6B53,
+ 0x6C57, 0x6F22, 0x6F97, 0x6F45, 0x74B0, 0x7518, 0x76E3, 0x770B,
+ 0x7AFF, 0x7BA1, 0x7C21, 0x7DE9, 0x7F36, 0x7FF0, 0x809D, 0x8266,
+ 0x839E, 0x89B3, 0x8ACC, 0x8CAB, 0x9084, 0x9451, 0x9593, 0x9591,
+ 0x95A2, 0x9665, 0x97D3, 0x9928, 0x8218, 0x4E38, 0x542B, 0x5CB8,
+ 0x5DCC, 0x73A9, 0x764C, 0x773C, 0x5CA9, 0x7FEB, 0x8D0B, 0x96C1,
+ 0x9811, 0x9854, 0x9858, 0x4F01, 0x4F0E, 0x5371, 0x559C, 0x5668,
+ 0x57FA, 0x5947, 0x5B09, 0x5BC4, 0x5C90, 0x5E0C, 0x5E7E, 0x5FCC,
+ 0x63EE, 0x673A, 0x65D7, 0x65E2, 0x671F, 0x68CB, 0x68C4, ALTCHR,
+/* 0x3520 - 0x357F */
+ ALTCHR, 0x6A5F, 0x5E30, 0x6BC5, 0x6C17, 0x6C7D, 0x757F, 0x7948,
+ 0x5B63, 0x7A00, 0x7D00, 0x5FBD, 0x898F, 0x8A18, 0x8CB4, 0x8D77,
+ 0x8ECC, 0x8F1D, 0x98E2, 0x9A0E, 0x9B3C, 0x4E80, 0x507D, 0x5100,
+ 0x5993, 0x5B9C, 0x622F, 0x6280, 0x64EC, 0x6B3A, 0x72A0, 0x7591,
+ 0x7947, 0x7FA9, 0x87FB, 0x8ABC, 0x8B70, 0x63AC, 0x83CA, 0x97A0,
+ 0x5409, 0x5403, 0x55AB, 0x6854, 0x6A58, 0x8A70, 0x7827, 0x6775,
+ 0x9ECD, 0x5374, 0x5BA2, 0x811A, 0x8650, 0x9006, 0x4E18, 0x4E45,
+ 0x4EC7, 0x4F11, 0x53CA, 0x5438, 0x5BAE, 0x5F13, 0x6025, 0x6551,
+ 0x673D, 0x6C42, 0x6C72, 0x6CE3, 0x7078, 0x7403, 0x7A76, 0x7AAE,
+ 0x7B08, 0x7D1A, 0x7CFE, 0x7D66, 0x65E7, 0x725B, 0x53BB, 0x5C45,
+ 0x5DE8, 0x62D2, 0x62E0, 0x6319, 0x6E20, 0x865A, 0x8A31, 0x8DDD,
+ 0x92F8, 0x6F01, 0x79A6, 0x9B5A, 0x4EA8, 0x4EAB, 0x4EAC, ALTCHR,
+/* 0x3620 - 0x367F */
+ ALTCHR, 0x4F9B, 0x4FA0, 0x50D1, 0x5147, 0x7AF6, 0x5171, 0x51F6,
+ 0x5354, 0x5321, 0x537F, 0x53EB, 0x55AC, 0x5883, 0x5CE1, 0x5F37,
+ 0x5F4A, 0x602F, 0x6050, 0x606D, 0x631F, 0x6559, 0x6A4B, 0x6CC1,
+ 0x72C2, 0x72ED, 0x77EF, 0x80F8, 0x8105, 0x8208, 0x854E, 0x90F7,
+ 0x93E1, 0x97FF, 0x9957, 0x9A5A, 0x4EF0, 0x51DD, 0x5C2D, 0x6681,
+ 0x696D, 0x5C40, 0x66F2, 0x6975, 0x7389, 0x6850, 0x7C81, 0x50C5,
+ 0x52E4, 0x5747, 0x5DFE, 0x9326, 0x65A4, 0x6B23, 0x6B3D, 0x7434,
+ 0x7981, 0x79BD, 0x7B4B, 0x7DCA, 0x82B9, 0x83CC, 0x887F, 0x895F,
+ 0x8B39, 0x8FD1, 0x91D1, 0x541F, 0x9280, 0x4E5D, 0x5036, 0x53E5,
+ 0x533A, 0x72D7, 0x7396, 0x77E9, 0x82E6, 0x8EAF, 0x99C6, 0x99C8,
+ 0x99D2, 0x5177, 0x611A, 0x865E, 0x55B0, 0x7A7A, 0x5076, 0x5BD3,
+ 0x9047, 0x9685, 0x4E32, 0x6ADB, 0x91E7, 0x5C51, 0x5C48, ALTCHR,
+/* 0x3720 - 0x377F */
+ ALTCHR, 0x6398, 0x7A9F, 0x6C93, 0x9774, 0x8F61, 0x7AAA, 0x718A,
+ 0x9688, 0x7C82, 0x6817, 0x7E70, 0x6851, 0x936C, 0x52F2, 0x541B,
+ 0x85AB, 0x8A13, 0x7FA4, 0x8ECD, 0x90E1, 0x5366, 0x8888, 0x7941,
+ 0x4FC2, 0x50BE, 0x5211, 0x5144, 0x5553, 0x572D, 0x73EA, 0x578B,
+ 0x5951, 0x5F62, 0x5F84, 0x6075, 0x6176, 0x6167, 0x61A9, 0x63B2,
+ 0x643A, 0x656C, 0x666F, 0x6842, 0x6E13, 0x7566, 0x7A3D, 0x7CFB,
+ 0x7D4C, 0x7D99, 0x7E4B, 0x7F6B, 0x830E, 0x834A, 0x86CD, 0x8A08,
+ 0x8A63, 0x8B66, 0x8EFD, 0x981A, 0x9D8F, 0x82B8, 0x8FCE, 0x9BE8,
+ 0x5287, 0x621F, 0x6483, 0x6FC0, 0x9699, 0x6841, 0x5091, 0x6B20,
+ 0x6C7A, 0x6F54, 0x7A74, 0x7D50, 0x8840, 0x8A23, 0x6708, 0x4EF6,
+ 0x5039, 0x5026, 0x5065, 0x517C, 0x5238, 0x5263, 0x55A7, 0x570F,
+ 0x5805, 0x5ACC, 0x5EFA, 0x61B2, 0x61F8, 0x62F3, 0x6372, ALTCHR,
+/* 0x3820 - 0x387F */
+ ALTCHR, 0x691C, 0x6A29, 0x727D, 0x72AC, 0x732E, 0x7814, 0x786F,
+ 0x7D79, 0x770C, 0x80A9, 0x898B, 0x8B19, 0x8CE2, 0x8ED2, 0x9063,
+ 0x9375, 0x967A, 0x9855, 0x9A13, 0x9E78, 0x5143, 0x539F, 0x53B3,
+ 0x5E7B, 0x5F26, 0x6E1B, 0x6E90, 0x7384, 0x73FE, 0x7D43, 0x8237,
+ 0x8A00, 0x8AFA, 0x9650, 0x4E4E, 0x500B, 0x53E4, 0x547C, 0x56FA,
+ 0x59D1, 0x5B64, 0x5DF1, 0x5EAB, 0x5F27, 0x6238, 0x6545, 0x67AF,
+ 0x6E56, 0x72D0, 0x7CCA, 0x88B4, 0x80A1, 0x80E1, 0x83F0, 0x864E,
+ 0x8A87, 0x8DE8, 0x9237, 0x96C7, 0x9867, 0x9F13, 0x4E94, 0x4E92,
+ 0x4F0D, 0x5348, 0x5449, 0x543E, 0x5A2F, 0x5F8C, 0x5FA1, 0x609F,
+ 0x68A7, 0x6A8E, 0x745A, 0x7881, 0x8A9E, 0x8AA4, 0x8B77, 0x9190,
+ 0x4E5E, 0x9BC9, 0x4EA4, 0x4F7C, 0x4FAF, 0x5019, 0x5016, 0x5149,
+ 0x516C, 0x529F, 0x52B9, 0x52FE, 0x539A, 0x53E3, 0x5411, ALTCHR,
+/* 0x3920 - 0x397F */
+ ALTCHR, 0x540E, 0x5589, 0x5751, 0x57A2, 0x597D, 0x5B54, 0x5B5D,
+ 0x5B8F, 0x5DE5, 0x5DE7, 0x5DF7, 0x5E78, 0x5E83, 0x5E9A, 0x5EB7,
+ 0x5F18, 0x6052, 0x614C, 0x6297, 0x62D8, 0x63A7, 0x653B, 0x6602,
+ 0x6643, 0x66F4, 0x676D, 0x6821, 0x6897, 0x69CB, 0x6C5F, 0x6D2A,
+ 0x6D69, 0x6E2F, 0x6E9D, 0x7532, 0x7687, 0x786C, 0x7A3F, 0x7CE0,
+ 0x7D05, 0x7D18, 0x7D5E, 0x7DB1, 0x8015, 0x8003, 0x80AF, 0x80B1,
+ 0x8154, 0x818F, 0x822A, 0x8352, 0x884C, 0x8861, 0x8B1B, 0x8CA2,
+ 0x8CFC, 0x90CA, 0x9175, 0x9271, 0x783F, 0x92FC, 0x95A4, 0x964D,
+ 0x9805, 0x9999, 0x9AD8, 0x9D3B, 0x525B, 0x52AB, 0x53F7, 0x5408,
+ 0x58D5, 0x62F7, 0x6FE0, 0x8C6A, 0x8F5F, 0x9EB9, 0x514B, 0x523B,
+ 0x544A, 0x56FD, 0x7A40, 0x9177, 0x9D60, 0x9ED2, 0x7344, 0x6F09,
+ 0x8170, 0x7511, 0x5FFD, 0x60DA, 0x9AA8, 0x72DB, 0x8FBC, ALTCHR,
+/* 0x3A20 - 0x3A7F */
+ ALTCHR, 0x6B64, 0x9803, 0x4ECA, 0x56F0, 0x5764, 0x58BE, 0x5A5A,
+ 0x6068, 0x61C7, 0x660F, 0x6606, 0x6839, 0x68B1, 0x6DF7, 0x75D5,
+ 0x7D3A, 0x826E, 0x9B42, 0x4E9B, 0x4F50, 0x53C9, 0x5506, 0x5D6F,
+ 0x5DE6, 0x5DEE, 0x67FB, 0x6C99, 0x7473, 0x7802, 0x8A50, 0x9396,
+ 0x88DF, 0x5750, 0x5EA7, 0x632B, 0x50B5, 0x50AC, 0x518D, 0x6700,
+ 0x54C9, 0x585E, 0x59BB, 0x5BB0, 0x5F69, 0x624D, 0x63A1, 0x683D,
+ 0x6B73, 0x6E08, 0x707D, 0x91C7, 0x7280, 0x7815, 0x7826, 0x796D,
+ 0x658E, 0x7D30, 0x83DC, 0x88C1, 0x8F09, 0x969B, 0x5264, 0x5728,
+ 0x6750, 0x7F6A, 0x8CA1, 0x51B4, 0x5742, 0x962A, 0x583A, 0x698A,
+ 0x80B4, 0x54B2, 0x5D0E, 0x57FC, 0x7895, 0x9DFA, 0x4F5C, 0x524A,
+ 0x548B, 0x643E, 0x6628, 0x6714, 0x67F5, 0x7A84, 0x7B56, 0x7D22,
+ 0x932F, 0x685C, 0x9BAD, 0x7B39, 0x5319, 0x518A, 0x5237, ALTCHR,
+/* 0x3B20 - 0x3B7F */
+ ALTCHR, 0x5BDF, 0x62F6, 0x64AE, 0x64E6, 0x672D, 0x6BBA, 0x85A9,
+ 0x96D1, 0x7690, 0x9BD6, 0x634C, 0x9306, 0x9BAB, 0x76BF, 0x6652,
+ 0x4E09, 0x5098, 0x53C2, 0x5C71, 0x60E8, 0x6492, 0x6563, 0x685F,
+ 0x71E6, 0x73CA, 0x7523, 0x7B97, 0x7E82, 0x8695, 0x8B83, 0x8CDB,
+ 0x9178, 0x9910, 0x65AC, 0x66AB, 0x6B8B, 0x4ED5, 0x4ED4, 0x4F3A,
+ 0x4F7F, 0x523A, 0x53F8, 0x53F2, 0x55E3, 0x56DB, 0x58EB, 0x59CB,
+ 0x59C9, 0x59FF, 0x5B50, 0x5C4D, 0x5E02, 0x5E2B, 0x5FD7, 0x601D,
+ 0x6307, 0x652F, 0x5B5C, 0x65AF, 0x65BD, 0x65E8, 0x679D, 0x6B62,
+ 0x6B7B, 0x6C0F, 0x7345, 0x7949, 0x79C1, 0x7CF8, 0x7D19, 0x7D2B,
+ 0x80A2, 0x8102, 0x81F3, 0x8996, 0x8A5E, 0x8A69, 0x8A66, 0x8A8C,
+ 0x8AEE, 0x8CC7, 0x8CDC, 0x96CC, 0x98FC, 0x6B6F, 0x4E8B, 0x4F3C,
+ 0x4F8D, 0x5150, 0x5B57, 0x5BFA, 0x6148, 0x6301, 0x6642, ALTCHR,
+/* 0x3C20 - 0x3C7F */
+ ALTCHR, 0x6B21, 0x6ECB, 0x6CBB, 0x723E, 0x74BD, 0x75D4, 0x78C1,
+ 0x793A, 0x800C, 0x8033, 0x81EA, 0x8494, 0x8F9E, 0x6C50, 0x9E7F,
+ 0x5F0F, 0x8B58, 0x9D2B, 0x7AFA, 0x8EF8, 0x5B8D, 0x96EB, 0x4E03,
+ 0x53F1, 0x57F7, 0x5931, 0x5AC9, 0x5BA4, 0x6089, 0x6E7F, 0x6F06,
+ 0x75BE, 0x8CEA, 0x5B9F, 0x8500, 0x7BE0, 0x5072, 0x67F4, 0x829D,
+ 0x5C61, 0x854A, 0x7E1E, 0x820E, 0x5199, 0x5C04, 0x6368, 0x8D66,
+ 0x659C, 0x716E, 0x793E, 0x7D17, 0x8005, 0x8B1D, 0x8ECA, 0x906E,
+ 0x86C7, 0x90AA, 0x501F, 0x52FA, 0x5C3A, 0x6753, 0x707C, 0x7235,
+ 0x914C, 0x91C8, 0x932B, 0x82E5, 0x5BC2, 0x5F31, 0x60F9, 0x4E3B,
+ 0x53D6, 0x5B88, 0x624B, 0x6731, 0x6B8A, 0x72E9, 0x73E0, 0x7A2E,
+ 0x816B, 0x8DA3, 0x9152, 0x9996, 0x5112, 0x53D7, 0x546A, 0x5BFF,
+ 0x6388, 0x6A39, 0x7DAC, 0x9700, 0x56DA, 0x53CE, 0x5468, ALTCHR,
+/* 0x3D20 - 0x3D7F */
+ ALTCHR, 0x5B97, 0x5C31, 0x5DDE, 0x4FEE, 0x6101, 0x62FE, 0x6D32,
+ 0x79C0, 0x79CB, 0x7D42, 0x7E4D, 0x7FD2, 0x81ED, 0x821F, 0x8490,
+ 0x8846, 0x8972, 0x8B90, 0x8E74, 0x8F2F, 0x9031, 0x914B, 0x916C,
+ 0x96C6, 0x919C, 0x4EC0, 0x4F4F, 0x5145, 0x5341, 0x5F93, 0x620E,
+ 0x67D4, 0x6C41, 0x6E0B, 0x7363, 0x7E26, 0x91CD, 0x9283, 0x53D4,
+ 0x5919, 0x5BBF, 0x6DD1, 0x795D, 0x7E2E, 0x7C9B, 0x587E, 0x719F,
+ 0x51FA, 0x8853, 0x8FF0, 0x4FCA, 0x5CFB, 0x6625, 0x77AC, 0x7AE3,
+ 0x821C, 0x99FF, 0x51C6, 0x5FAA, 0x65EC, 0x696F, 0x6B89, 0x6DF3,
+ 0x6E96, 0x6F64, 0x76FE, 0x7D14, 0x5DE1, 0x9075, 0x9187, 0x9806,
+ 0x51E6, 0x521D, 0x6240, 0x6691, 0x66D9, 0x6E1A, 0x5EB6, 0x7DD2,
+ 0x7F72, 0x66F8, 0x85AF, 0x85F7, 0x8AF8, 0x52A9, 0x53D9, 0x5973,
+ 0x5E8F, 0x5F90, 0x6055, 0x92E4, 0x9664, 0x50B7, 0x511F, ALTCHR,
+/* 0x3E20 - 0x3E7F */
+ ALTCHR, 0x52DD, 0x5320, 0x5347, 0x53EC, 0x54E8, 0x5546, 0x5531,
+ 0x5617, 0x5968, 0x59BE, 0x5A3C, 0x5BB5, 0x5C06, 0x5C0F, 0x5C11,
+ 0x5C1A, 0x5E84, 0x5E8A, 0x5EE0, 0x5F70, 0x627F, 0x6284, 0x62DB,
+ 0x638C, 0x6377, 0x6607, 0x660C, 0x662D, 0x6676, 0x677E, 0x68A2,
+ 0x6A1F, 0x6A35, 0x6CBC, 0x6D88, 0x6E09, 0x6E58, 0x713C, 0x7126,
+ 0x7167, 0x75C7, 0x7701, 0x785D, 0x7901, 0x7965, 0x79F0, 0x7AE0,
+ 0x7B11, 0x7CA7, 0x7D39, 0x8096, 0x83D6, 0x848B, 0x8549, 0x885D,
+ 0x88F3, 0x8A1F, 0x8A3C, 0x8A54, 0x8A73, 0x8C61, 0x8CDE, 0x91A4,
+ 0x9266, 0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E,
+ 0x4E57, 0x5197, 0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38,
+ 0x60C5, 0x64FE, 0x6761, 0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63,
+ 0x84B8, 0x8B72, 0x91B8, 0x9320, 0x5631, 0x57F4, 0x98FE, ALTCHR,
+/* 0x3F20 - 0x3F7F */
+ ALTCHR, 0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077, 0x8272,
+ 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5,
+ 0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0,
+ 0x664B, 0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F,
+ 0x795E, 0x79E6, 0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A,
+ 0x8EAB, 0x8F9B, 0x9032, 0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203,
+ 0x5875, 0x58EC, 0x5C0B, 0x751A, 0x5C3D, 0x814E, 0x8A0A, 0x8FC5,
+ 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808, 0x9162, 0x56F3, 0x53A8,
+ 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34, 0x708A, 0x7761,
+ 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318, 0x968F,
+ 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB,
+ 0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, ALTCHR,
+/* 0x4020 - 0x407F */
+ ALTCHR, 0x6F84, 0x647A, 0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F,
+ 0x51C4, 0x5236, 0x52E2, 0x59D3, 0x5F81, 0x6027, 0x6210, 0x653F,
+ 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816, 0x6B63, 0x6E05, 0x7272,
+ 0x751F, 0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD, 0x897F, 0x8AA0,
+ 0x8A93, 0x8ACB, 0x901D, 0x9192, 0x9752, 0x9759, 0x6589, 0x7A0E,
+ 0x8106, 0x96BB, 0x5E2D, 0x60DC, 0x621A, 0x65A5, 0x6614, 0x6790,
+ 0x77F3, 0x7A4D, 0x7C4D, 0x7E3E, 0x810A, 0x8CAC, 0x8D64, 0x8DE1,
+ 0x8E5F, 0x78A9, 0x5207, 0x62D9, 0x63A5, 0x6442, 0x6298, 0x8A2D,
+ 0x7A83, 0x7BC0, 0x8AAC, 0x96EA, 0x7D76, 0x820C, 0x8749, 0x4ED9,
+ 0x5148, 0x5343, 0x5360, 0x5BA3, 0x5C02, 0x5C16, 0x5DDD, 0x6226,
+ 0x6247, 0x64B0, 0x6813, 0x6834, 0x6CC9, 0x6D45, 0x6D17, 0x67D3,
+ 0x6F5C, 0x714E, 0x717D, 0x65CB, 0x7A7F, 0x7BAD, 0x7DDA, ALTCHR,
+/* 0x4120 - 0x417F */
+ ALTCHR, 0x7E4A, 0x7FA8, 0x817A, 0x821B, 0x8239, 0x85A6, 0x8A6E,
+ 0x8CCE, 0x8DF5, 0x9078, 0x9077, 0x92AD, 0x9291, 0x9583, 0x9BAE,
+ 0x524D, 0x5584, 0x6F38, 0x7136, 0x5168, 0x7985, 0x7E55, 0x81B3,
+ 0x7CCE, 0x564C, 0x5851, 0x5CA8, 0x63AA, 0x66FE, 0x66FD, 0x695A,
+ 0x72D9, 0x758F, 0x758E, 0x790E, 0x7956, 0x79DF, 0x7C97, 0x7D20,
+ 0x7D44, 0x8607, 0x8A34, 0x963B, 0x9061, 0x9F20, 0x50E7, 0x5275,
+ 0x53CC, 0x53E2, 0x5009, 0x55AA, 0x58EE, 0x594F, 0x723D, 0x5B8B,
+ 0x5C64, 0x531D, 0x60E3, 0x60F3, 0x635C, 0x6383, 0x633F, 0x63BB,
+ 0x64CD, 0x65E9, 0x66F9, 0x5DE3, 0x69CD, 0x69FD, 0x6F15, 0x71E5,
+ 0x4E89, 0x75E9, 0x76F8, 0x7A93, 0x7CDF, 0x7DCF, 0x7D9C, 0x8061,
+ 0x8349, 0x8358, 0x846C, 0x84BC, 0x85FB, 0x88C5, 0x8D70, 0x9001,
+ 0x906D, 0x9397, 0x971C, 0x9A12, 0x50CF, 0x5897, 0x618E, ALTCHR,
+/* 0x4220 - 0x427F */
+ ALTCHR, 0x81D3, 0x8535, 0x8D08, 0x9020, 0x4FC3, 0x5074, 0x5247,
+ 0x5373, 0x606F, 0x6349, 0x675F, 0x6E2C, 0x8DB3, 0x901F, 0x4FD7,
+ 0x5C5E, 0x8CCA, 0x65CF, 0x7D9A, 0x5352, 0x8896, 0x5176, 0x63C3,
+ 0x5B58, 0x5B6B, 0x5C0A, 0x640D, 0x6751, 0x905C, 0x4ED6, 0x591A,
+ 0x592A, 0x6C70, 0x8A51, 0x553E, 0x5815, 0x59A5, 0x60F0, 0x6253,
+ 0x67C1, 0x8235, 0x6955, 0x9640, 0x99C4, 0x9A28, 0x4F53, 0x5806,
+ 0x5BFE, 0x8010, 0x5CB1, 0x5E2F, 0x5F85, 0x6020, 0x614B, 0x6234,
+ 0x66FF, 0x6CF0, 0x6EDE, 0x80CE, 0x817F, 0x82D4, 0x888B, 0x8CB8,
+ 0x9000, 0x902E, 0x968A, 0x9EDB, 0x9BDB, 0x4EE3, 0x53F0, 0x5927,
+ 0x7B2C, 0x918D, 0x984C, 0x9DF9, 0x6EDD, 0x7027, 0x5353, 0x5544,
+ 0x5B85, 0x6258, 0x629E, 0x62D3, 0x6CA2, 0x6FEF, 0x7422, 0x8A17,
+ 0x9438, 0x6FC1, 0x8AFE, 0x8338, 0x51E7, 0x86F8, 0x53EA, ALTCHR,
+/* 0x4320 - 0x437F */
+ ALTCHR, 0x53E9, 0x4F46, 0x9054, 0x8FB0, 0x596A, 0x8131, 0x5DFD,
+ 0x7AEA, 0x8FBF, 0x68DA, 0x8C37, 0x72F8, 0x9C48, 0x6A3D, 0x8AB0,
+ 0x4E39, 0x5358, 0x5606, 0x5766, 0x62C5, 0x63A2, 0x65E6, 0x6B4E,
+ 0x6DE1, 0x6E5B, 0x70AD, 0x77ED, 0x7AEF, 0x7BAA, 0x7DBB, 0x803D,
+ 0x80C6, 0x86CB, 0x8A95, 0x935B, 0x56E3, 0x58C7, 0x5F3E, 0x65AD,
+ 0x6696, 0x6A80, 0x6BB5, 0x7537, 0x8AC7, 0x5024, 0x77E5, 0x5730,
+ 0x5F1B, 0x6065, 0x667A, 0x6C60, 0x75F4, 0x7A1A, 0x7F6E, 0x81F4,
+ 0x8718, 0x9045, 0x99B3, 0x7BC9, 0x755C, 0x7AF9, 0x7B51, 0x84C4,
+ 0x9010, 0x79E9, 0x7A92, 0x8336, 0x5AE1, 0x7740, 0x4E2D, 0x4EF2,
+ 0x5B99, 0x5FE0, 0x62BD, 0x663C, 0x67F1, 0x6CE8, 0x866B, 0x8877,
+ 0x8A3B, 0x914E, 0x92F3, 0x99D0, 0x6A17, 0x7026, 0x732A, 0x82E7,
+ 0x8457, 0x8CAF, 0x4E01, 0x5146, 0x51CB, 0x558B, 0x5BF5, ALTCHR,
+/* 0x4420 - 0x447F */
+ ALTCHR, 0x5E16, 0x5E33, 0x5E81, 0x5F14, 0x5F35, 0x5F6B, 0x5FB4,
+ 0x61F2, 0x6311, 0x66A2, 0x671D, 0x6F6E, 0x7252, 0x753A, 0x773A,
+ 0x8074, 0x8139, 0x8178, 0x8776, 0x8ABF, 0x8ADC, 0x8D85, 0x8DF3,
+ 0x929A, 0x9577, 0x9802, 0x9CE5, 0x52C5, 0x6357, 0x76F4, 0x6715,
+ 0x6C88, 0x73CD, 0x8CC3, 0x93AE, 0x9673, 0x6D25, 0x589C, 0x690E,
+ 0x69CC, 0x8FFD, 0x939A, 0x75DB, 0x901A, 0x585A, 0x6802, 0x63B4,
+ 0x69FB, 0x4F43, 0x6F2C, 0x67D8, 0x8FBB, 0x8526, 0x7DB4, 0x9354,
+ 0x693F, 0x6F70, 0x576A, 0x58F7, 0x5B2C, 0x7D2C, 0x722A, 0x540A,
+ 0x91E3, 0x9DB4, 0x4EAD, 0x4F4E, 0x505C, 0x5075, 0x5243, 0x8C9E,
+ 0x5448, 0x5824, 0x5B9A, 0x5E1D, 0x5E95, 0x5EAD, 0x5EF7, 0x5F1F,
+ 0x608C, 0x62B5, 0x633A, 0x63D0, 0x68AF, 0x6C40, 0x7887, 0x798E,
+ 0x7A0B, 0x7DE0, 0x8247, 0x8A02, 0x8AE6, 0x8E44, 0x9013, ALTCHR,
+/* 0x4520 - 0x457F */
+ ALTCHR, 0x90B8, 0x912D, 0x91D8, 0x9F0E, 0x6CE5, 0x6458, 0x64E2,
+ 0x6575, 0x6EF4, 0x7684, 0x7B1B, 0x9069, 0x93D1, 0x6EBA, 0x54F2,
+ 0x5FB9, 0x64A4, 0x8F4D, 0x8FED, 0x9244, 0x5178, 0x586B, 0x5929,
+ 0x5C55, 0x5E97, 0x6DFB, 0x7E8F, 0x751C, 0x8CBC, 0x8EE2, 0x985B,
+ 0x70B9, 0x4F1D, 0x6BBF, 0x6FB1, 0x7530, 0x96FB, 0x514E, 0x5410,
+ 0x5835, 0x5857, 0x59AC, 0x5C60, 0x5F92, 0x6597, 0x675C, 0x6E21,
+ 0x767B, 0x83DF, 0x8CED, 0x9014, 0x90FD, 0x934D, 0x7825, 0x783A,
+ 0x52AA, 0x5EA6, 0x571F, 0x5974, 0x6012, 0x5012, 0x515A, 0x51AC,
+ 0x51CD, 0x5200, 0x5510, 0x5854, 0x5858, 0x5957, 0x5B95, 0x5CF6,
+ 0x5D8B, 0x60BC, 0x6295, 0x642D, 0x6771, 0x6843, 0x68BC, 0x68DF,
+ 0x76D7, 0x6DD8, 0x6E6F, 0x6D9B, 0x706F, 0x71C8, 0x5F53, 0x75D8,
+ 0x7977, 0x7B49, 0x7B54, 0x7B52, 0x7CD6, 0x7D71, 0x5230, ALTCHR,
+/* 0x4620 - 0x467F */
+ ALTCHR, 0x8463, 0x8569, 0x85E4, 0x8A0E, 0x8B04, 0x8C46, 0x8E0F,
+ 0x9003, 0x900F, 0x9419, 0x9676, 0x982D, 0x9A30, 0x95D8, 0x50CD,
+ 0x52D5, 0x540C, 0x5802, 0x5C0E, 0x61A7, 0x649E, 0x6D1E, 0x77B3,
+ 0x7AE5, 0x80F4, 0x8404, 0x9053, 0x9285, 0x5CE0, 0x9D07, 0x533F,
+ 0x5F97, 0x5FB3, 0x6D9C, 0x7279, 0x7763, 0x79BF, 0x7BE4, 0x6BD2,
+ 0x72EC, 0x8AAD, 0x6803, 0x6A61, 0x51F8, 0x7A81, 0x6934, 0x5C4A,
+ 0x9CF6, 0x82EB, 0x5BC5, 0x9149, 0x701E, 0x5678, 0x5C6F, 0x60C7,
+ 0x6566, 0x6C8C, 0x8C5A, 0x9041, 0x9813, 0x5451, 0x66C7, 0x920D,
+ 0x5948, 0x90A3, 0x5185, 0x4E4D, 0x51EA, 0x8599, 0x8B0E, 0x7058,
+ 0x637A, 0x934B, 0x6962, 0x99B4, 0x7E04, 0x7577, 0x5357, 0x6960,
+ 0x8EDF, 0x96E3, 0x6C5D, 0x4E8C, 0x5C3C, 0x5F10, 0x8FE9, 0x5302,
+ 0x8CD1, 0x8089, 0x8679, 0x5EFF, 0x65E5, 0x4E73, 0x5165, ALTCHR,
+/* 0x4720 - 0x477F */
+ ALTCHR, 0x5982, 0x5C3F, 0x97EE, 0x4EFB, 0x598A, 0x5FCD, 0x8A8D,
+ 0x6FE1, 0x79B0, 0x7962, 0x5BE7, 0x8471, 0x732B, 0x71B1, 0x5E74,
+ 0x5FF5, 0x637B, 0x649A, 0x71C3, 0x7C98, 0x4E43, 0x5EFC, 0x4E4B,
+ 0x57DC, 0x56A2, 0x60A9, 0x6FC3, 0x7D0D, 0x80FD, 0x8133, 0x81BF,
+ 0x8FB2, 0x8997, 0x86A4, 0x5DF4, 0x628A, 0x64AD, 0x8987, 0x6777,
+ 0x6CE2, 0x6D3E, 0x7436, 0x7834, 0x5A46, 0x7F75, 0x82AD, 0x99AC,
+ 0x4FF3, 0x5EC3, 0x62DD, 0x6392, 0x6557, 0x676F, 0x76C3, 0x724C,
+ 0x80CC, 0x80BA, 0x8F29, 0x914D, 0x500D, 0x57F9, 0x5A92, 0x6885,
+ 0x6973, 0x7164, 0x72FD, 0x8CB7, 0x58F2, 0x8CE0, 0x966A, 0x9019,
+ 0x877F, 0x79E4, 0x77E7, 0x8429, 0x4F2F, 0x5265, 0x535A, 0x62CD,
+ 0x67CF, 0x6CCA, 0x767D, 0x7B94, 0x7C95, 0x8236, 0x8584, 0x8FEB,
+ 0x66DD, 0x6F20, 0x7206, 0x7E1B, 0x83AB, 0x99C1, 0x9EA6, ALTCHR,
+/* 0x4820 - 0x487F */
+ ALTCHR, 0x51FD, 0x7BB1, 0x7872, 0x7BB8, 0x8087, 0x7B48, 0x6AE8,
+ 0x5E61, 0x808C, 0x7551, 0x7560, 0x516B, 0x9262, 0x6E8C, 0x767A,
+ 0x9197, 0x9AEA, 0x4F10, 0x7F70, 0x629C, 0x7B4F, 0x95A5, 0x9CE9,
+ 0x567A, 0x5859, 0x86E4, 0x96BC, 0x4F34, 0x5224, 0x534A, 0x53CD,
+ 0x53DB, 0x5E06, 0x642C, 0x6591, 0x677F, 0x6C3E, 0x6C4E, 0x7248,
+ 0x72AF, 0x73ED, 0x7554, 0x7E41, 0x822C, 0x85E9, 0x8CA9, 0x7BC4,
+ 0x91C6, 0x7169, 0x9812, 0x98EF, 0x633D, 0x6669, 0x756A, 0x76E4,
+ 0x78D0, 0x8543, 0x86EE, 0x532A, 0x5351, 0x5426, 0x5983, 0x5E87,
+ 0x5F7C, 0x60B2, 0x6249, 0x6279, 0x62AB, 0x6590, 0x6BD4, 0x6CCC,
+ 0x75B2, 0x76AE, 0x7891, 0x79D8, 0x7DCB, 0x7F77, 0x80A5, 0x88AB,
+ 0x8AB9, 0x8CBB, 0x907F, 0x975E, 0x98DB, 0x6A0B, 0x7C38, 0x5099,
+ 0x5C3E, 0x5FAE, 0x6787, 0x6BD8, 0x7435, 0x7709, 0x7F8E, ALTCHR,
+/* 0x4920 - 0x497F */
+ ALTCHR, 0x9F3B, 0x67CA, 0x7A17, 0x5339, 0x758B, 0x9AED, 0x5F66,
+ 0x819D, 0x83F1, 0x8098, 0x5F3C, 0x5FC5, 0x7562, 0x7B46, 0x903C,
+ 0x6867, 0x59EB, 0x5A9B, 0x7D10, 0x767E, 0x8B2C, 0x4FF5, 0x5F6A,
+ 0x6A19, 0x6C37, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8A55, 0x8C79,
+ 0x5EDF, 0x63CF, 0x75C5, 0x79D2, 0x82D7, 0x9328, 0x92F2, 0x849C,
+ 0x86ED, 0x9C2D, 0x54C1, 0x5F6C, 0x658C, 0x6D5C, 0x7015, 0x8CA7,
+ 0x8CD3, 0x983B, 0x654F, 0x74F6, 0x4E0D, 0x4ED8, 0x57E0, 0x592B,
+ 0x5A66, 0x5BCC, 0x51A8, 0x5E03, 0x5E9C, 0x6016, 0x6276, 0x6577,
+ 0x65A7, 0x666E, 0x6D6E, 0x7236, 0x7B26, 0x8150, 0x819A, 0x8299,
+ 0x8B5C, 0x8CA0, 0x8CE6, 0x8D74, 0x961C, 0x9644, 0x4FAE, 0x64AB,
+ 0x6B66, 0x821E, 0x8461, 0x856A, 0x90E8, 0x5C01, 0x6953, 0x98A8,
+ 0x847A, 0x8557, 0x4F0F, 0x526F, 0x5FA9, 0x5E45, 0x670D, ALTCHR,
+/* 0x4A20 - 0x4A7F */
+ ALTCHR, 0x798F, 0x8179, 0x8907, 0x8986, 0x6DF5, 0x5F17, 0x6255,
+ 0x6CB8, 0x4ECF, 0x7269, 0x9B92, 0x5206, 0x543B, 0x5674, 0x58B3,
+ 0x61A4, 0x626E, 0x711A, 0x596E, 0x7C89, 0x7CDE, 0x7D1B, 0x96F0,
+ 0x6587, 0x805E, 0x4E19, 0x4F75, 0x5175, 0x5840, 0x5E63, 0x5E73,
+ 0x5F0A, 0x67C4, 0x4E26, 0x853D, 0x9589, 0x965B, 0x7C73, 0x9801,
+ 0x50FB, 0x58C1, 0x7656, 0x78A7, 0x5225, 0x77A5, 0x8511, 0x7B86,
+ 0x504F, 0x5909, 0x7247, 0x7BC7, 0x7DE8, 0x8FBA, 0x8FD4, 0x904D,
+ 0x4FBF, 0x52C9, 0x5A29, 0x5F01, 0x97AD, 0x4FDD, 0x8217, 0x92EA,
+ 0x5703, 0x6355, 0x6B69, 0x752B, 0x88DC, 0x8F14, 0x7A42, 0x52DF,
+ 0x5893, 0x6155, 0x620A, 0x66AE, 0x6BCD, 0x7C3F, 0x83E9, 0x5023,
+ 0x4FF8, 0x5305, 0x5446, 0x5831, 0x5949, 0x5B9D, 0x5CF0, 0x5CEF,
+ 0x5D29, 0x5E96, 0x62B1, 0x6367, 0x653E, 0x65B9, 0x670B, ALTCHR,
+/* 0x4B20 - 0x4B7F */
+ ALTCHR, 0x6CD5, 0x6CE1, 0x70F9, 0x7832, 0x7E2B, 0x80DE, 0x82B3,
+ 0x840C, 0x84EC, 0x8702, 0x8912, 0x8A2A, 0x8C4A, 0x90A6, 0x92D2,
+ 0x98FD, 0x9CF3, 0x9D6C, 0x4E4F, 0x4EA1, 0x508D, 0x5256, 0x574A,
+ 0x59A8, 0x5E3D, 0x5FD8, 0x5FD9, 0x623F, 0x66B4, 0x671B, 0x67D0,
+ 0x68D2, 0x5192, 0x7D21, 0x80AA, 0x81A8, 0x8B00, 0x8C8C, 0x8CBF,
+ 0x927E, 0x9632, 0x5420, 0x982C, 0x5317, 0x50D5, 0x535C, 0x58A8,
+ 0x64B2, 0x6734, 0x7267, 0x7766, 0x7A46, 0x91E6, 0x52C3, 0x6CA1,
+ 0x6B86, 0x5800, 0x5E4C, 0x5954, 0x672C, 0x7FFB, 0x51E1, 0x76C6,
+ 0x6469, 0x78E8, 0x9B54, 0x9EBB, 0x57CB, 0x59B9, 0x6627, 0x679A,
+ 0x6BCE, 0x54E9, 0x69D9, 0x5E55, 0x819C, 0x6795, 0x9BAA, 0x67FE,
+ 0x9C52, 0x685D, 0x4EA6, 0x4FE3, 0x53C8, 0x62B9, 0x672B, 0x6CAB,
+ 0x8FC4, 0x4FAD, 0x7E6D, 0x9EBF, 0x4E07, 0x6162, 0x6E80, ALTCHR,
+/* 0x4C20 - 0x4C7F */
+ ALTCHR, 0x6F2B, 0x8513, 0x5473, 0x672A, 0x9B45, 0x5DF3, 0x7B95,
+ 0x5CAC, 0x5BC6, 0x871C, 0x6E4A, 0x84D1, 0x7A14, 0x8108, 0x5999,
+ 0x7C8D, 0x6C11, 0x7720, 0x52D9, 0x5922, 0x7121, 0x725F, 0x77DB,
+ 0x9727, 0x9D61, 0x690B, 0x5A7F, 0x5A18, 0x51A5, 0x540D, 0x547D,
+ 0x660E, 0x76DF, 0x8FF7, 0x9298, 0x9CF4, 0x59EA, 0x725D, 0x6EC5,
+ 0x514D, 0x68C9, 0x7DBF, 0x7DEC, 0x9762, 0x9EBA, 0x6478, 0x6A21,
+ 0x8302, 0x5984, 0x5B5F, 0x6BDB, 0x731B, 0x76F2, 0x7DB2, 0x8017,
+ 0x8499, 0x5132, 0x6728, 0x9ED9, 0x76EE, 0x6762, 0x52FF, 0x9905,
+ 0x5C24, 0x623B, 0x7C7E, 0x8CB0, 0x554F, 0x60B6, 0x7D0B, 0x9580,
+ 0x5301, 0x4E5F, 0x51B6, 0x591C, 0x723A, 0x8036, 0x91CE, 0x5F25,
+ 0x77E2, 0x5384, 0x5F79, 0x7D04, 0x85AC, 0x8A33, 0x8E8D, 0x9756,
+ 0x67F3, 0x85AE, 0x9453, 0x6109, 0x6108, 0x6CB9, 0x7652, ALTCHR,
+/* 0x4D20 - 0x4D7F */
+ ALTCHR, 0x8AED, 0x8F38, 0x552F, 0x4F51, 0x512A, 0x52C7, 0x53CB,
+ 0x5BA5, 0x5E7D, 0x60A0, 0x6182, 0x63D6, 0x6709, 0x67DA, 0x6E67,
+ 0x6D8C, 0x7336, 0x7337, 0x7531, 0x7950, 0x88D5, 0x8A98, 0x904A,
+ 0x9091, 0x90F5, 0x96C4, 0x878D, 0x5915, 0x4E88, 0x4F59, 0x4E0E,
+ 0x8A89, 0x8F3F, 0x9810, 0x50AD, 0x5E7C, 0x5996, 0x5BB9, 0x5EB8,
+ 0x63DA, 0x63FA, 0x64C1, 0x66DC, 0x694A, 0x69D8, 0x6D0B, 0x6EB6,
+ 0x7194, 0x7528, 0x7AAF, 0x7F8A, 0x8000, 0x8449, 0x84C9, 0x8981,
+ 0x8B21, 0x8E0A, 0x9065, 0x967D, 0x990A, 0x617E, 0x6291, 0x6B32,
+ 0x6C83, 0x6D74, 0x7FCC, 0x7FFC, 0x6DC0, 0x7F85, 0x87BA, 0x88F8,
+ 0x6765, 0x83B1, 0x983C, 0x96F7, 0x6D1B, 0x7D61, 0x843D, 0x916A,
+ 0x4E71, 0x5375, 0x5D50, 0x6B04, 0x6FEB, 0x85CD, 0x862D, 0x89A7,
+ 0x5229, 0x540F, 0x5C65, 0x674E, 0x68A8, 0x7406, 0x7483, ALTCHR,
+/* 0x4E20 - 0x4E7F */
+ ALTCHR, 0x75E2, 0x88CF, 0x88E1, 0x91CC, 0x96E2, 0x9678, 0x5F8B,
+ 0x7387, 0x7ACB, 0x844E, 0x63A0, 0x7565, 0x5289, 0x6D41, 0x6E9C,
+ 0x7409, 0x7559, 0x786B, 0x7C92, 0x9686, 0x7ADC, 0x9F8D, 0x4FB6,
+ 0x616E, 0x65C5, 0x865C, 0x4E86, 0x4EAE, 0x50DA, 0x4E21, 0x51CC,
+ 0x5BEE, 0x6599, 0x6881, 0x6DBC, 0x731F, 0x7642, 0x77AD, 0x7A1C,
+ 0x7CE7, 0x826F, 0x8AD2, 0x907C, 0x91CF, 0x9675, 0x9818, 0x529B,
+ 0x7DD1, 0x502B, 0x5398, 0x6797, 0x6DCB, 0x71D0, 0x7433, 0x81E8,
+ 0x8F2A, 0x96A3, 0x9C57, 0x9E9F, 0x7460, 0x5841, 0x6D99, 0x7D2F,
+ 0x985E, 0x4EE4, 0x4F36, 0x4F8B, 0x51B7, 0x52B1, 0x5DBA, 0x601C,
+ 0x73B2, 0x793C, 0x82D3, 0x9234, 0x96B7, 0x96F6, 0x970A, 0x9E97,
+ 0x9F62, 0x66A6, 0x6B74, 0x5217, 0x52A3, 0x70C8, 0x88C2, 0x5EC9,
+ 0x604B, 0x6190, 0x6F23, 0x7149, 0x7C3E, 0x7DF4, 0x806F, ALTCHR,
+/* 0x4F20 - 0x4F7F */
+ ALTCHR, 0x84EE, 0x9023, 0x932C, 0x5442, 0x9B6F, 0x6AD3, 0x7089,
+ 0x8CC2, 0x8DEF, 0x9732, 0x52B4, 0x5A41, 0x5ECA, 0x5F04, 0x6717,
+ 0x697C, 0x6994, 0x6D6A, 0x6F0F, 0x7262, 0x72FC, 0x7BED, 0x8001,
+ 0x807E, 0x874B, 0x90CE, 0x516D, 0x9E93, 0x7984, 0x808B, 0x9332,
+ 0x8AD6, 0x502D, 0x548C, 0x8A71, 0x6B6A, 0x8CC4, 0x8107, 0x60D1,
+ 0x67A0, 0x9DF2, 0x4E99, 0x4E98, 0x9C10, 0x8A6B, 0x85C1, 0x8568,
+ 0x6900, 0x6E7E, 0x7897, 0x8155, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x5020 - 0x507F */
+ ALTCHR, 0x5F0C, 0x4E10, 0x4E15, 0x4E2A, 0x4E31, 0x4E36, 0x4E3C,
+ 0x4E3F, 0x4E42, 0x4E56, 0x4E58, 0x4E82, 0x4E85, 0x8C6B, 0x4E8A,
+ 0x8212, 0x5F0D, 0x4E8E, 0x4E9E, 0x4E9F, 0x4EA0, 0x4EA2, 0x4EB0,
+ 0x4EB3, 0x4EB6, 0x4ECE, 0x4ECD, 0x4EC4, 0x4EC6, 0x4EC2, 0x4ED7,
+ 0x4EDE, 0x4EED, 0x4EDF, 0x4EF7, 0x4F09, 0x4F5A, 0x4F30, 0x4F5B,
+ 0x4F5D, 0x4F57, 0x4F47, 0x4F76, 0x4F88, 0x4F8F, 0x4F98, 0x4F7B,
+ 0x4F69, 0x4F70, 0x4F91, 0x4F6F, 0x4F86, 0x4F96, 0x5118, 0x4FD4,
+ 0x4FDF, 0x4FCE, 0x4FD8, 0x4FDB, 0x4FD1, 0x4FDA, 0x4FD0, 0x4FE4,
+ 0x4FE5, 0x501A, 0x5028, 0x5014, 0x502A, 0x5025, 0x5005, 0x4F1C,
+ 0x4FF6, 0x5021, 0x5029, 0x502C, 0x4FFE, 0x4FEF, 0x5011, 0x5006,
+ 0x5043, 0x5047, 0x6703, 0x5055, 0x5050, 0x5048, 0x505A, 0x5056,
+ 0x506C, 0x5078, 0x5080, 0x509A, 0x5085, 0x50B4, 0x50B2, ALTCHR,
+/* 0x5120 - 0x517F */
+ ALTCHR, 0x50C9, 0x50CA, 0x50B3, 0x50C2, 0x50D6, 0x50DE, 0x50E5,
+ 0x50ED, 0x50E3, 0x50EE, 0x50F9, 0x50F5, 0x5109, 0x5101, 0x5102,
+ 0x5116, 0x5115, 0x5114, 0x511A, 0x5121, 0x513A, 0x5137, 0x513C,
+ 0x513B, 0x513F, 0x5140, 0x5152, 0x514C, 0x5154, 0x5162, 0x7AF8,
+ 0x5169, 0x516A, 0x516E, 0x5180, 0x5182, 0x56D8, 0x518C, 0x5189,
+ 0x518F, 0x5191, 0x5193, 0x5195, 0x5196, 0x51A4, 0x51A6, 0x51A2,
+ 0x51A9, 0x51AA, 0x51AB, 0x51B3, 0x51B1, 0x51B2, 0x51B0, 0x51B5,
+ 0x51BD, 0x51C5, 0x51C9, 0x51DB, 0x51E0, 0x8655, 0x51E9, 0x51ED,
+ 0x51F0, 0x51F5, 0x51FE, 0x5204, 0x520B, 0x5214, 0x520E, 0x5227,
+ 0x522A, 0x522E, 0x5233, 0x5239, 0x524F, 0x5244, 0x524B, 0x524C,
+ 0x525E, 0x5254, 0x526A, 0x5274, 0x5269, 0x5273, 0x527F, 0x527D,
+ 0x528D, 0x5294, 0x5292, 0x5271, 0x5288, 0x5291, 0x8FA8, ALTCHR,
+/* 0x5220 - 0x527F */
+ ALTCHR, 0x8FA7, 0x52AC, 0x52AD, 0x52BC, 0x52B5, 0x52C1, 0x52CD,
+ 0x52D7, 0x52DE, 0x52E3, 0x52E6, 0x98ED, 0x52E0, 0x52F3, 0x52F5,
+ 0x52F8, 0x52F9, 0x5306, 0x5308, 0x7538, 0x530D, 0x5310, 0x530F,
+ 0x5315, 0x531A, 0x5323, 0x532F, 0x5331, 0x5333, 0x5338, 0x5340,
+ 0x5346, 0x5345, 0x4E17, 0x5349, 0x534D, 0x51D6, 0x535E, 0x5369,
+ 0x536E, 0x5918, 0x537B, 0x5377, 0x5382, 0x5396, 0x53A0, 0x53A6,
+ 0x53A5, 0x53AE, 0x53B0, 0x53B6, 0x53C3, 0x7C12, 0x96D9, 0x53DF,
+ 0x66FC, 0x71EE, 0x53EE, 0x53E8, 0x53ED, 0x53FA, 0x5401, 0x543D,
+ 0x5440, 0x542C, 0x542D, 0x543C, 0x542E, 0x5436, 0x5429, 0x541D,
+ 0x544E, 0x548F, 0x5475, 0x548E, 0x545F, 0x5471, 0x5477, 0x5470,
+ 0x5492, 0x547B, 0x5480, 0x5476, 0x5484, 0x5490, 0x5486, 0x54C7,
+ 0x54A2, 0x54B8, 0x54A5, 0x54AC, 0x54C4, 0x54C8, 0x54A8, ALTCHR,
+/* 0x5320 - 0x537F */
+ ALTCHR, 0x54AB, 0x54C2, 0x54A4, 0x54BE, 0x54BC, 0x54D8, 0x54E5,
+ 0x54E6, 0x550F, 0x5514, 0x54FD, 0x54EE, 0x54ED, 0x54FA, 0x54E2,
+ 0x5539, 0x5540, 0x5563, 0x554C, 0x552E, 0x555C, 0x5545, 0x5556,
+ 0x5557, 0x5538, 0x5533, 0x555D, 0x5599, 0x5580, 0x54AF, 0x558A,
+ 0x559F, 0x557B, 0x557E, 0x5598, 0x559E, 0x55AE, 0x557C, 0x5583,
+ 0x55A9, 0x5587, 0x55A8, 0x55DA, 0x55C5, 0x55DF, 0x55C4, 0x55DC,
+ 0x55E4, 0x55D4, 0x5614, 0x55F7, 0x5616, 0x55FE, 0x55FD, 0x561B,
+ 0x55F9, 0x564E, 0x5650, 0x71DF, 0x5634, 0x5636, 0x5632, 0x5638,
+ 0x566B, 0x5664, 0x562F, 0x566C, 0x566A, 0x5686, 0x5680, 0x568A,
+ 0x56A0, 0x5694, 0x568F, 0x56A5, 0x56AE, 0x56B6, 0x56B4, 0x56C2,
+ 0x56BC, 0x56C1, 0x56C3, 0x56C0, 0x56C8, 0x56CE, 0x56D1, 0x56D3,
+ 0x56D7, 0x56EE, 0x56F9, 0x5700, 0x56FF, 0x5704, 0x5709, ALTCHR,
+/* 0x5420 - 0x547F */
+ ALTCHR, 0x5708, 0x570B, 0x570D, 0x5713, 0x5718, 0x5716, 0x55C7,
+ 0x571C, 0x5726, 0x5737, 0x5738, 0x574E, 0x573B, 0x5740, 0x574F,
+ 0x5769, 0x57C0, 0x5788, 0x5761, 0x577F, 0x5789, 0x5793, 0x57A0,
+ 0x57B3, 0x57A4, 0x57AA, 0x57B0, 0x57C3, 0x57C6, 0x57D4, 0x57D2,
+ 0x57D3, 0x580A, 0x57D6, 0x57E3, 0x580B, 0x5819, 0x581D, 0x5872,
+ 0x5821, 0x5862, 0x584B, 0x5870, 0x6BC0, 0x5852, 0x583D, 0x5879,
+ 0x5885, 0x58B9, 0x589F, 0x58AB, 0x58BA, 0x58DE, 0x58BB, 0x58B8,
+ 0x58AE, 0x58C5, 0x58D3, 0x58D1, 0x58D7, 0x58D9, 0x58D8, 0x58E5,
+ 0x58DC, 0x58E4, 0x58DF, 0x58EF, 0x58FA, 0x58F9, 0x58FB, 0x58FC,
+ 0x58FD, 0x5902, 0x590A, 0x5910, 0x591B, 0x68A6, 0x5925, 0x592C,
+ 0x592D, 0x5932, 0x5938, 0x593E, 0x7AD2, 0x5955, 0x5950, 0x594E,
+ 0x595A, 0x5958, 0x5962, 0x5960, 0x5967, 0x596C, 0x5969, ALTCHR,
+/* 0x5520 - 0x557F */
+ ALTCHR, 0x5978, 0x5981, 0x599D, 0x4F5E, 0x4FAB, 0x59A3, 0x59B2,
+ 0x59C6, 0x59E8, 0x59DC, 0x598D, 0x59D9, 0x59DA, 0x5A25, 0x5A1F,
+ 0x5A11, 0x5A1C, 0x5A09, 0x5A1A, 0x5A40, 0x5A6C, 0x5A49, 0x5A35,
+ 0x5A36, 0x5A62, 0x5A6A, 0x5A9A, 0x5ABC, 0x5ABE, 0x5ACB, 0x5AC2,
+ 0x5ABD, 0x5AE3, 0x5AD7, 0x5AE6, 0x5AE9, 0x5AD6, 0x5AFA, 0x5AFB,
+ 0x5B0C, 0x5B0B, 0x5B16, 0x5B32, 0x5AD0, 0x5B2A, 0x5B36, 0x5B3E,
+ 0x5B43, 0x5B45, 0x5B40, 0x5B51, 0x5B55, 0x5B5A, 0x5B5B, 0x5B65,
+ 0x5B69, 0x5B70, 0x5B73, 0x5B75, 0x5B78, 0x6588, 0x5B7A, 0x5B80,
+ 0x5B83, 0x5BA6, 0x5BB8, 0x5BC3, 0x5BC7, 0x5BC9, 0x5BD4, 0x5BD0,
+ 0x5BE4, 0x5BE6, 0x5BE2, 0x5BDE, 0x5BE5, 0x5BEB, 0x5BF0, 0x5BF6,
+ 0x5BF3, 0x5C05, 0x5C07, 0x5C08, 0x5C0D, 0x5C13, 0x5C20, 0x5C22,
+ 0x5C28, 0x5C38, 0x5C39, 0x5C41, 0x5C46, 0x5C4E, 0x5C53, ALTCHR,
+/* 0x5620 - 0x567F */
+ ALTCHR, 0x5C50, 0x5C4F, 0x5B71, 0x5C6C, 0x5C6E, 0x4E62, 0x5C76,
+ 0x5C79, 0x5C8C, 0x5C91, 0x5C94, 0x599B, 0x5CAB, 0x5CBB, 0x5CB6,
+ 0x5CBC, 0x5CB7, 0x5CC5, 0x5CBE, 0x5CC7, 0x5CD9, 0x5CE9, 0x5CFD,
+ 0x5CFA, 0x5CED, 0x5D8C, 0x5CEA, 0x5D0B, 0x5D15, 0x5D17, 0x5D5C,
+ 0x5D1F, 0x5D1B, 0x5D11, 0x5D14, 0x5D22, 0x5D1A, 0x5D19, 0x5D18,
+ 0x5D4C, 0x5D52, 0x5D4E, 0x5D4B, 0x5D6C, 0x5D73, 0x5D76, 0x5D87,
+ 0x5D84, 0x5D82, 0x5DA2, 0x5D9D, 0x5DAC, 0x5DAE, 0x5DBD, 0x5D90,
+ 0x5DB7, 0x5DBC, 0x5DC9, 0x5DCD, 0x5DD3, 0x5DD2, 0x5DD6, 0x5DDB,
+ 0x5DEB, 0x5DF2, 0x5DF5, 0x5E0B, 0x5E1A, 0x5E19, 0x5E11, 0x5E1B,
+ 0x5E36, 0x5E37, 0x5E44, 0x5E43, 0x5E40, 0x5E4E, 0x5E57, 0x5E54,
+ 0x5E5F, 0x5E62, 0x5E64, 0x5E47, 0x5E75, 0x5E76, 0x5E7A, 0x9EBC,
+ 0x5E7F, 0x5EA0, 0x5EC1, 0x5EC2, 0x5EC8, 0x5ED0, 0x5ECF, ALTCHR,
+/* 0x5720 - 0x577F */
+ ALTCHR, 0x5ED6, 0x5EE3, 0x5EDD, 0x5EDA, 0x5EDB, 0x5EE2, 0x5EE1,
+ 0x5EE8, 0x5EE9, 0x5EEC, 0x5EF1, 0x5EF3, 0x5EF0, 0x5EF4, 0x5EF8,
+ 0x5EFE, 0x5F03, 0x5F09, 0x5F5D, 0x5F5C, 0x5F0B, 0x5F11, 0x5F16,
+ 0x5F29, 0x5F2D, 0x5F38, 0x5F41, 0x5F48, 0x5F4C, 0x5F4E, 0x5F2F,
+ 0x5F51, 0x5F56, 0x5F57, 0x5F59, 0x5F61, 0x5F6D, 0x5F73, 0x5F77,
+ 0x5F83, 0x5F82, 0x5F7F, 0x5F8A, 0x5F88, 0x5F91, 0x5F87, 0x5F9E,
+ 0x5F99, 0x5F98, 0x5FA0, 0x5FA8, 0x5FAD, 0x5FBC, 0x5FD6, 0x5FFB,
+ 0x5FE4, 0x5FF8, 0x5FF1, 0x5FDD, 0x60B3, 0x5FFF, 0x6021, 0x6060,
+ 0x6019, 0x6010, 0x6029, 0x600E, 0x6031, 0x601B, 0x6015, 0x602B,
+ 0x6026, 0x600F, 0x603A, 0x605A, 0x6041, 0x606A, 0x6077, 0x605F,
+ 0x604A, 0x6046, 0x604D, 0x6063, 0x6043, 0x6064, 0x6042, 0x606C,
+ 0x606B, 0x6059, 0x6081, 0x608D, 0x60E7, 0x6083, 0x609A, ALTCHR,
+/* 0x5820 - 0x587F */
+ ALTCHR, 0x6084, 0x609B, 0x6096, 0x6097, 0x6092, 0x60A7, 0x608B,
+ 0x60E1, 0x60B8, 0x60E0, 0x60D3, 0x60B4, 0x5FF0, 0x60BD, 0x60C6,
+ 0x60B5, 0x60D8, 0x614D, 0x6115, 0x6106, 0x60F6, 0x60F7, 0x6100,
+ 0x60F4, 0x60FA, 0x6103, 0x6121, 0x60FB, 0x60F1, 0x610D, 0x610E,
+ 0x6147, 0x613E, 0x6128, 0x6127, 0x614A, 0x613F, 0x613C, 0x612C,
+ 0x6134, 0x613D, 0x6142, 0x6144, 0x6173, 0x6177, 0x6158, 0x6159,
+ 0x615A, 0x616B, 0x6174, 0x616F, 0x6165, 0x6171, 0x615F, 0x615D,
+ 0x6153, 0x6175, 0x6199, 0x6196, 0x6187, 0x61AC, 0x6194, 0x619A,
+ 0x618A, 0x6191, 0x61AB, 0x61AE, 0x61CC, 0x61CA, 0x61C9, 0x61F7,
+ 0x61C8, 0x61C3, 0x61C6, 0x61BA, 0x61CB, 0x7F79, 0x61CD, 0x61E6,
+ 0x61E3, 0x61F6, 0x61FA, 0x61F4, 0x61FF, 0x61FD, 0x61FC, 0x61FE,
+ 0x6200, 0x6208, 0x6209, 0x620D, 0x620C, 0x6214, 0x621B, ALTCHR,
+/* 0x5920 - 0x597F */
+ ALTCHR, 0x621E, 0x6221, 0x622A, 0x622E, 0x6230, 0x6232, 0x6233,
+ 0x6241, 0x624E, 0x625E, 0x6263, 0x625B, 0x6260, 0x6268, 0x627C,
+ 0x6282, 0x6289, 0x627E, 0x6292, 0x6293, 0x6296, 0x62D4, 0x6283,
+ 0x6294, 0x62D7, 0x62D1, 0x62BB, 0x62CF, 0x62FF, 0x62C6, 0x64D4,
+ 0x62C8, 0x62DC, 0x62CC, 0x62CA, 0x62C2, 0x62C7, 0x629B, 0x62C9,
+ 0x630C, 0x62EE, 0x62F1, 0x6327, 0x6302, 0x6308, 0x62EF, 0x62F5,
+ 0x6350, 0x633E, 0x634D, 0x641C, 0x634F, 0x6396, 0x638E, 0x6380,
+ 0x63AB, 0x6376, 0x63A3, 0x638F, 0x6389, 0x639F, 0x63B5, 0x636B,
+ 0x6369, 0x63BE, 0x63E9, 0x63C0, 0x63C6, 0x63E3, 0x63C9, 0x63D2,
+ 0x63F6, 0x63C4, 0x6416, 0x6434, 0x6406, 0x6413, 0x6426, 0x6436,
+ 0x651D, 0x6417, 0x6428, 0x640F, 0x6467, 0x646F, 0x6476, 0x644E,
+ 0x652A, 0x6495, 0x6493, 0x64A5, 0x64A9, 0x6488, 0x64BC, ALTCHR,
+/* 0x5A20 - 0x5A7F */
+ ALTCHR, 0x64DA, 0x64D2, 0x64C5, 0x64C7, 0x64BB, 0x64D8, 0x64C2,
+ 0x64F1, 0x64E7, 0x8209, 0x64E0, 0x64E1, 0x62AC, 0x64E3, 0x64EF,
+ 0x652C, 0x64F6, 0x64F4, 0x64F2, 0x64FA, 0x6500, 0x64FD, 0x6518,
+ 0x651C, 0x6505, 0x6524, 0x6523, 0x652B, 0x6534, 0x6535, 0x6537,
+ 0x6536, 0x6538, 0x754B, 0x6548, 0x6556, 0x6555, 0x654D, 0x6558,
+ 0x655E, 0x655D, 0x6572, 0x6578, 0x6582, 0x6583, 0x8B8A, 0x659B,
+ 0x659F, 0x65AB, 0x65B7, 0x65C3, 0x65C6, 0x65C1, 0x65C4, 0x65CC,
+ 0x65D2, 0x65DB, 0x65D9, 0x65E0, 0x65E1, 0x65F1, 0x6772, 0x660A,
+ 0x6603, 0x65FB, 0x6773, 0x6635, 0x6636, 0x6634, 0x661C, 0x664F,
+ 0x6644, 0x6649, 0x6641, 0x665E, 0x665D, 0x6664, 0x6667, 0x6668,
+ 0x665F, 0x6662, 0x6670, 0x6683, 0x6688, 0x668E, 0x6689, 0x6684,
+ 0x6698, 0x669D, 0x66C1, 0x66B9, 0x66C9, 0x66BE, 0x66BC, ALTCHR,
+/* 0x5B20 - 0x5B7F */
+ ALTCHR, 0x66C4, 0x66B8, 0x66D6, 0x66DA, 0x66E0, 0x663F, 0x66E6,
+ 0x66E9, 0x66F0, 0x66F5, 0x66F7, 0x670F, 0x6716, 0x671E, 0x6726,
+ 0x6727, 0x9738, 0x672E, 0x673F, 0x6736, 0x6741, 0x6738, 0x6737,
+ 0x6746, 0x675E, 0x6760, 0x6759, 0x6763, 0x6764, 0x6789, 0x6770,
+ 0x67A9, 0x677C, 0x676A, 0x678C, 0x678B, 0x67A6, 0x67A1, 0x6785,
+ 0x67B7, 0x67EF, 0x67B4, 0x67EC, 0x67B3, 0x67E9, 0x67B8, 0x67E4,
+ 0x67DE, 0x67DD, 0x67E2, 0x67EE, 0x67B9, 0x67CE, 0x67C6, 0x67E7,
+ 0x6A9C, 0x681E, 0x6846, 0x6829, 0x6840, 0x684D, 0x6832, 0x684E,
+ 0x68B3, 0x682B, 0x6859, 0x6863, 0x6877, 0x687F, 0x689F, 0x688F,
+ 0x68AD, 0x6894, 0x689D, 0x689B, 0x6883, 0x6AAE, 0x68B9, 0x6874,
+ 0x68B5, 0x68A0, 0x68BA, 0x690F, 0x688D, 0x687E, 0x6901, 0x68CA,
+ 0x6908, 0x68D8, 0x6922, 0x6926, 0x68E1, 0x690C, 0x68CD, ALTCHR,
+/* 0x5C20 - 0x5C7F */
+ ALTCHR, 0x68D4, 0x68E7, 0x68D5, 0x6936, 0x6912, 0x6904, 0x68D7,
+ 0x68E3, 0x6925, 0x68F9, 0x68E0, 0x68EF, 0x6928, 0x692A, 0x691A,
+ 0x6923, 0x6921, 0x68C6, 0x6979, 0x6977, 0x695C, 0x6978, 0x696B,
+ 0x6954, 0x697E, 0x696E, 0x6939, 0x6974, 0x693D, 0x6959, 0x6930,
+ 0x6961, 0x695E, 0x695D, 0x6981, 0x696A, 0x69B2, 0x69AE, 0x69D0,
+ 0x69BF, 0x69C1, 0x69D3, 0x69BE, 0x69CE, 0x5BE8, 0x69CA, 0x69DD,
+ 0x69BB, 0x69C3, 0x69A7, 0x6A2E, 0x6991, 0x69A0, 0x699C, 0x6995,
+ 0x69B4, 0x69DE, 0x69E8, 0x6A02, 0x6A1B, 0x69FF, 0x6B0A, 0x69F9,
+ 0x69F2, 0x69E7, 0x6A05, 0x69B1, 0x6A1E, 0x69ED, 0x6A14, 0x69EB,
+ 0x6A0A, 0x6A12, 0x6AC1, 0x6A23, 0x6A13, 0x6A44, 0x6A0C, 0x6A72,
+ 0x6A36, 0x6A78, 0x6A47, 0x6A62, 0x6A59, 0x6A66, 0x6A48, 0x6A38,
+ 0x6A22, 0x6A90, 0x6A8D, 0x6AA0, 0x6A84, 0x6AA2, 0x6AA3, ALTCHR,
+/* 0x5D20 - 0x5D7F */
+ ALTCHR, 0x6A97, 0x8617, 0x6ABB, 0x6AC3, 0x6AC2, 0x6AB8, 0x6AB3,
+ 0x6AAC, 0x6ADE, 0x6AD1, 0x6ADF, 0x6AAA, 0x6ADA, 0x6AEA, 0x6AFB,
+ 0x6B05, 0x8616, 0x6AFA, 0x6B12, 0x6B16, 0x9B31, 0x6B1F, 0x6B38,
+ 0x6B37, 0x76DC, 0x6B39, 0x98EE, 0x6B47, 0x6B43, 0x6B49, 0x6B50,
+ 0x6B59, 0x6B54, 0x6B5B, 0x6B5F, 0x6B61, 0x6B78, 0x6B79, 0x6B7F,
+ 0x6B80, 0x6B84, 0x6B83, 0x6B8D, 0x6B98, 0x6B95, 0x6B9E, 0x6BA4,
+ 0x6BAA, 0x6BAB, 0x6BAF, 0x6BB2, 0x6BB1, 0x6BB3, 0x6BB7, 0x6BBC,
+ 0x6BC6, 0x6BCB, 0x6BD3, 0x6BDF, 0x6BEC, 0x6BEB, 0x6BF3, 0x6BEF,
+ 0x9EBE, 0x6C08, 0x6C13, 0x6C14, 0x6C1B, 0x6C24, 0x6C23, 0x6C5E,
+ 0x6C55, 0x6C62, 0x6C6A, 0x6C82, 0x6C8D, 0x6C9A, 0x6C81, 0x6C9B,
+ 0x6C7E, 0x6C68, 0x6C73, 0x6C92, 0x6C90, 0x6CC4, 0x6CF1, 0x6CD3,
+ 0x6CBD, 0x6CD7, 0x6CC5, 0x6CDD, 0x6CAE, 0x6CB1, 0x6CBE, ALTCHR,
+/* 0x5E20 - 0x5E7F */
+ ALTCHR, 0x6CBA, 0x6CDB, 0x6CEF, 0x6CD9, 0x6CEA, 0x6D1F, 0x884D,
+ 0x6D36, 0x6D2B, 0x6D3D, 0x6D38, 0x6D19, 0x6D35, 0x6D33, 0x6D12,
+ 0x6D0C, 0x6D63, 0x6D93, 0x6D64, 0x6D5A, 0x6D79, 0x6D59, 0x6D8E,
+ 0x6D95, 0x6FE4, 0x6D85, 0x6DF9, 0x6E15, 0x6E0A, 0x6DB5, 0x6DC7,
+ 0x6DE6, 0x6DB8, 0x6DC6, 0x6DEC, 0x6DDE, 0x6DCC, 0x6DE8, 0x6DD2,
+ 0x6DC5, 0x6DFA, 0x6DD9, 0x6DE4, 0x6DD5, 0x6DEA, 0x6DEE, 0x6E2D,
+ 0x6E6E, 0x6E2E, 0x6E19, 0x6E72, 0x6E5F, 0x6E3E, 0x6E23, 0x6E6B,
+ 0x6E2B, 0x6E76, 0x6E4D, 0x6E1F, 0x6E43, 0x6E3A, 0x6E4E, 0x6E24,
+ 0x6EFF, 0x6E1D, 0x6E38, 0x6E82, 0x6EAA, 0x6E98, 0x6EC9, 0x6EB7,
+ 0x6ED3, 0x6EBD, 0x6EAF, 0x6EC4, 0x6EB2, 0x6ED4, 0x6ED5, 0x6E8F,
+ 0x6EA5, 0x6EC2, 0x6E9F, 0x6F41, 0x6F11, 0x704C, 0x6EEC, 0x6EF8,
+ 0x6EFE, 0x6F3F, 0x6EF2, 0x6F31, 0x6EEF, 0x6F32, 0x6ECC, ALTCHR,
+/* 0x5F20 - 0x5F7F */
+ ALTCHR, 0x6F3E, 0x6F13, 0x6EF7, 0x6F86, 0x6F7A, 0x6F78, 0x6F81,
+ 0x6F80, 0x6F6F, 0x6F5B, 0x6FF3, 0x6F6D, 0x6F82, 0x6F7C, 0x6F58,
+ 0x6F8E, 0x6F91, 0x6FC2, 0x6F66, 0x6FB3, 0x6FA3, 0x6FA1, 0x6FA4,
+ 0x6FB9, 0x6FC6, 0x6FAA, 0x6FDF, 0x6FD5, 0x6FEC, 0x6FD4, 0x6FD8,
+ 0x6FF1, 0x6FEE, 0x6FDB, 0x7009, 0x700B, 0x6FFA, 0x7011, 0x7001,
+ 0x700F, 0x6FFE, 0x701B, 0x701A, 0x6F74, 0x701D, 0x7018, 0x701F,
+ 0x7030, 0x703E, 0x7032, 0x7051, 0x7063, 0x7099, 0x7092, 0x70AF,
+ 0x70F1, 0x70AC, 0x70B8, 0x70B3, 0x70AE, 0x70DF, 0x70CB, 0x70DD,
+ 0x70D9, 0x7109, 0x70FD, 0x711C, 0x7119, 0x7165, 0x7155, 0x7188,
+ 0x7166, 0x7162, 0x714C, 0x7156, 0x716C, 0x718F, 0x71FB, 0x7184,
+ 0x7195, 0x71A8, 0x71AC, 0x71D7, 0x71B9, 0x71BE, 0x71D2, 0x71C9,
+ 0x71D4, 0x71CE, 0x71E0, 0x71EC, 0x71E7, 0x71F5, 0x71FC, ALTCHR,
+/* 0x6020 - 0x607F */
+ ALTCHR, 0x71F9, 0x71FF, 0x720D, 0x7210, 0x721B, 0x7228, 0x722D,
+ 0x722C, 0x7230, 0x7232, 0x723B, 0x723C, 0x723F, 0x7240, 0x7246,
+ 0x724B, 0x7258, 0x7274, 0x727E, 0x7282, 0x7281, 0x7287, 0x7292,
+ 0x7296, 0x72A2, 0x72A7, 0x72B9, 0x72B2, 0x72C3, 0x72C6, 0x72C4,
+ 0x72CE, 0x72D2, 0x72E2, 0x72E0, 0x72E1, 0x72F9, 0x72F7, 0x500F,
+ 0x7317, 0x730A, 0x731C, 0x7316, 0x731D, 0x7334, 0x732F, 0x7329,
+ 0x7325, 0x733E, 0x734E, 0x734F, 0x9ED8, 0x7357, 0x736A, 0x7368,
+ 0x7370, 0x7378, 0x7375, 0x737B, 0x737A, 0x73C8, 0x73B3, 0x73CE,
+ 0x73BB, 0x73C0, 0x73E5, 0x73EE, 0x73DE, 0x74A2, 0x7405, 0x746F,
+ 0x7425, 0x73F8, 0x7432, 0x743A, 0x7455, 0x743F, 0x745F, 0x7459,
+ 0x7441, 0x745C, 0x7469, 0x7470, 0x7463, 0x746A, 0x7476, 0x747E,
+ 0x748B, 0x749E, 0x74A7, 0x74CA, 0x74CF, 0x74D4, 0x73F1, ALTCHR,
+/* 0x6120 - 0x617F */
+ ALTCHR, 0x74E0, 0x74E3, 0x74E7, 0x74E9, 0x74EE, 0x74F2, 0x74F0,
+ 0x74F1, 0x74F8, 0x74F7, 0x7504, 0x7503, 0x7505, 0x750C, 0x750E,
+ 0x750D, 0x7515, 0x7513, 0x751E, 0x7526, 0x752C, 0x753C, 0x7544,
+ 0x754D, 0x754A, 0x7549, 0x755B, 0x7546, 0x755A, 0x7569, 0x7564,
+ 0x7567, 0x756B, 0x756D, 0x7578, 0x7576, 0x7586, 0x7587, 0x7574,
+ 0x758A, 0x7589, 0x7582, 0x7594, 0x759A, 0x759D, 0x75A5, 0x75A3,
+ 0x75C2, 0x75B3, 0x75C3, 0x75B5, 0x75BD, 0x75B8, 0x75BC, 0x75B1,
+ 0x75CD, 0x75CA, 0x75D2, 0x75D9, 0x75E3, 0x75DE, 0x75FE, 0x75FF,
+ 0x75FC, 0x7601, 0x75F0, 0x75FA, 0x75F2, 0x75F3, 0x760B, 0x760D,
+ 0x7609, 0x761F, 0x7627, 0x7620, 0x7621, 0x7622, 0x7624, 0x7634,
+ 0x7630, 0x763B, 0x7647, 0x7648, 0x7646, 0x765C, 0x7658, 0x7661,
+ 0x7662, 0x7668, 0x7669, 0x766A, 0x7667, 0x766C, 0x7670, ALTCHR,
+/* 0x6220 - 0x627F */
+ ALTCHR, 0x7672, 0x7676, 0x7678, 0x767C, 0x7680, 0x7683, 0x7688,
+ 0x768B, 0x768E, 0x7696, 0x7693, 0x7699, 0x769A, 0x76B0, 0x76B4,
+ 0x76B8, 0x76B9, 0x76BA, 0x76C2, 0x76CD, 0x76D6, 0x76D2, 0x76DE,
+ 0x76E1, 0x76E5, 0x76E7, 0x76EA, 0x862F, 0x76FB, 0x7708, 0x7707,
+ 0x7704, 0x7729, 0x7724, 0x771E, 0x7725, 0x7726, 0x771B, 0x7737,
+ 0x7738, 0x7747, 0x775A, 0x7768, 0x776B, 0x775B, 0x7765, 0x777F,
+ 0x777E, 0x7779, 0x778E, 0x778B, 0x7791, 0x77A0, 0x779E, 0x77B0,
+ 0x77B6, 0x77B9, 0x77BF, 0x77BC, 0x77BD, 0x77BB, 0x77C7, 0x77CD,
+ 0x77D7, 0x77DA, 0x77DC, 0x77E3, 0x77EE, 0x77FC, 0x780C, 0x7812,
+ 0x7926, 0x7820, 0x792A, 0x7845, 0x788E, 0x7874, 0x7886, 0x787C,
+ 0x789A, 0x788C, 0x78A3, 0x78B5, 0x78AA, 0x78AF, 0x78D1, 0x78C6,
+ 0x78CB, 0x78D4, 0x78BE, 0x78BC, 0x78C5, 0x78CA, 0x78EC, ALTCHR,
+/* 0x6320 - 0x637F */
+ ALTCHR, 0x78E7, 0x78DA, 0x78FD, 0x78F4, 0x7907, 0x7912, 0x7911,
+ 0x7919, 0x792C, 0x792B, 0x7940, 0x7960, 0x7957, 0x795F, 0x795A,
+ 0x7955, 0x7953, 0x797A, 0x797F, 0x798A, 0x799D, 0x79A7, 0x9F4B,
+ 0x79AA, 0x79AE, 0x79B3, 0x79B9, 0x79BA, 0x79C9, 0x79D5, 0x79E7,
+ 0x79EC, 0x79E1, 0x79E3, 0x7A08, 0x7A0D, 0x7A18, 0x7A19, 0x7A20,
+ 0x7A1F, 0x7980, 0x7A31, 0x7A3B, 0x7A3E, 0x7A37, 0x7A43, 0x7A57,
+ 0x7A49, 0x7A61, 0x7A62, 0x7A69, 0x9F9D, 0x7A70, 0x7A79, 0x7A7D,
+ 0x7A88, 0x7A97, 0x7A95, 0x7A98, 0x7A96, 0x7AA9, 0x7AC8, 0x7AB0,
+ 0x7AB6, 0x7AC5, 0x7AC4, 0x7ABF, 0x9083, 0x7AC7, 0x7ACA, 0x7ACD,
+ 0x7ACF, 0x7AD5, 0x7AD3, 0x7AD9, 0x7ADA, 0x7ADD, 0x7AE1, 0x7AE2,
+ 0x7AE6, 0x7AED, 0x7AF0, 0x7B02, 0x7B0F, 0x7B0A, 0x7B06, 0x7B33,
+ 0x7B18, 0x7B19, 0x7B1E, 0x7B35, 0x7B28, 0x7B36, 0x7B50, ALTCHR,
+/* 0x6420 - 0x647F */
+ ALTCHR, 0x7B7A, 0x7B04, 0x7B4D, 0x7B0B, 0x7B4C, 0x7B45, 0x7B75,
+ 0x7B65, 0x7B74, 0x7B67, 0x7B70, 0x7B71, 0x7B6C, 0x7B6E, 0x7B9D,
+ 0x7B98, 0x7B9F, 0x7B8D, 0x7B9C, 0x7B9A, 0x7B8B, 0x7B92, 0x7B8F,
+ 0x7B5D, 0x7B99, 0x7BCB, 0x7BC1, 0x7BCC, 0x7BCF, 0x7BB4, 0x7BC6,
+ 0x7BDD, 0x7BE9, 0x7C11, 0x7C14, 0x7BE6, 0x7BE5, 0x7C60, 0x7C00,
+ 0x7C07, 0x7C13, 0x7BF3, 0x7BF7, 0x7C17, 0x7C0D, 0x7BF6, 0x7C23,
+ 0x7C27, 0x7C2A, 0x7C1F, 0x7C37, 0x7C2B, 0x7C3D, 0x7C4C, 0x7C43,
+ 0x7C54, 0x7C4F, 0x7C40, 0x7C50, 0x7C58, 0x7C5F, 0x7C64, 0x7C56,
+ 0x7C65, 0x7C6C, 0x7C75, 0x7C83, 0x7C90, 0x7CA4, 0x7CAD, 0x7CA2,
+ 0x7CAB, 0x7CA1, 0x7CA8, 0x7CB3, 0x7CB2, 0x7CB1, 0x7CAE, 0x7CB9,
+ 0x7CBD, 0x7CC0, 0x7CC5, 0x7CC2, 0x7CD8, 0x7CD2, 0x7CDC, 0x7CE2,
+ 0x9B3B, 0x7CEF, 0x7CF2, 0x7CF4, 0x7CF6, 0x7CFA, 0x7D06, ALTCHR,
+/* 0x6520 - 0x657F */
+ ALTCHR, 0x7D02, 0x7D1C, 0x7D15, 0x7D0A, 0x7D45, 0x7D4B, 0x7D2E,
+ 0x7D32, 0x7D3F, 0x7D35, 0x7D46, 0x7D73, 0x7D56, 0x7D4E, 0x7D72,
+ 0x7D68, 0x7D6E, 0x7D4F, 0x7D63, 0x7D93, 0x7D89, 0x7D5B, 0x7D8F,
+ 0x7D7D, 0x7D9B, 0x7DBA, 0x7DAE, 0x7DA3, 0x7DB5, 0x7DC7, 0x7DBD,
+ 0x7DAB, 0x7E3D, 0x7DA2, 0x7DAF, 0x7DDC, 0x7DB8, 0x7D9F, 0x7DB0,
+ 0x7DD8, 0x7DDD, 0x7DE4, 0x7DDE, 0x7DFB, 0x7DF2, 0x7DE1, 0x7E05,
+ 0x7E0A, 0x7E23, 0x7E21, 0x7E12, 0x7E31, 0x7E1F, 0x7E09, 0x7E0B,
+ 0x7E22, 0x7E46, 0x7E66, 0x7E3B, 0x7E35, 0x7E39, 0x7E43, 0x7E37,
+ 0x7E32, 0x7E3A, 0x7E67, 0x7E5D, 0x7E56, 0x7E5E, 0x7E59, 0x7E5A,
+ 0x7E79, 0x7E6A, 0x7E69, 0x7E7C, 0x7E7B, 0x7E83, 0x7DD5, 0x7E7D,
+ 0x8FAE, 0x7E7F, 0x7E88, 0x7E89, 0x7E8C, 0x7E92, 0x7E90, 0x7E93,
+ 0x7E94, 0x7E96, 0x7E8E, 0x7E9B, 0x7E9C, 0x7F38, 0x7F3A, ALTCHR,
+/* 0x6620 - 0x667F */
+ ALTCHR, 0x7F45, 0x7F4C, 0x7F4D, 0x7F4E, 0x7F50, 0x7F51, 0x7F55,
+ 0x7F54, 0x7F58, 0x7F5F, 0x7F60, 0x7F68, 0x7F69, 0x7F67, 0x7F78,
+ 0x7F82, 0x7F86, 0x7F83, 0x7F88, 0x7F87, 0x7F8C, 0x7F94, 0x7F9E,
+ 0x7F9D, 0x7F9A, 0x7FA3, 0x7FAF, 0x7FB2, 0x7FB9, 0x7FAE, 0x7FB6,
+ 0x7FB8, 0x8B71, 0x7FC5, 0x7FC6, 0x7FCA, 0x7FD5, 0x7FD4, 0x7FE1,
+ 0x7FE6, 0x7FE9, 0x7FF3, 0x7FF9, 0x98DC, 0x8006, 0x8004, 0x800B,
+ 0x8012, 0x8018, 0x8019, 0x801C, 0x8021, 0x8028, 0x803F, 0x803B,
+ 0x804A, 0x8046, 0x8052, 0x8058, 0x805A, 0x805F, 0x8062, 0x8068,
+ 0x8073, 0x8072, 0x8070, 0x8076, 0x8079, 0x807D, 0x807F, 0x8084,
+ 0x8086, 0x8085, 0x809B, 0x8093, 0x809A, 0x80AD, 0x5190, 0x80AC,
+ 0x80DB, 0x80E5, 0x80D9, 0x80DD, 0x80C4, 0x80DA, 0x80D6, 0x8109,
+ 0x80EF, 0x80F1, 0x811B, 0x8129, 0x8123, 0x812F, 0x814B, ALTCHR,
+/* 0x6720 - 0x677F */
+ ALTCHR, 0x968B, 0x8146, 0x813E, 0x8153, 0x8151, 0x80FC, 0x8171,
+ 0x816E, 0x8165, 0x8166, 0x8174, 0x8183, 0x8188, 0x818A, 0x8180,
+ 0x8182, 0x81A0, 0x8195, 0x81A4, 0x81A3, 0x815F, 0x8193, 0x81A9,
+ 0x81B0, 0x81B5, 0x81BE, 0x81B8, 0x81BD, 0x81C0, 0x81C2, 0x81BA,
+ 0x81C9, 0x81CD, 0x81D1, 0x81D9, 0x81D8, 0x81C8, 0x81DA, 0x81DF,
+ 0x81E0, 0x81E7, 0x81FA, 0x81FB, 0x81FE, 0x8201, 0x8202, 0x8205,
+ 0x8207, 0x820A, 0x820D, 0x8210, 0x8216, 0x8229, 0x822B, 0x8238,
+ 0x8233, 0x8240, 0x8259, 0x8258, 0x825D, 0x825A, 0x825F, 0x8264,
+ 0x8262, 0x8268, 0x826A, 0x826B, 0x822E, 0x8271, 0x8277, 0x8278,
+ 0x827E, 0x828D, 0x8292, 0x82AB, 0x829F, 0x82BB, 0x82AC, 0x82E1,
+ 0x82E3, 0x82DF, 0x82D2, 0x82F4, 0x82F3, 0x82FA, 0x8393, 0x8303,
+ 0x82FB, 0x82F9, 0x82DE, 0x8306, 0x82DC, 0x8309, 0x82D9, ALTCHR,
+/* 0x6820 - 0x687F */
+ ALTCHR, 0x8335, 0x8334, 0x8316, 0x8332, 0x8331, 0x8340, 0x8339,
+ 0x8350, 0x8345, 0x832F, 0x832B, 0x8317, 0x8318, 0x8385, 0x839A,
+ 0x83AA, 0x839F, 0x83A2, 0x8396, 0x8323, 0x838E, 0x8387, 0x838A,
+ 0x837C, 0x83B5, 0x8373, 0x8375, 0x83A0, 0x8389, 0x83A8, 0x83F4,
+ 0x8413, 0x83EB, 0x83CE, 0x83FD, 0x8403, 0x83D8, 0x840B, 0x83C1,
+ 0x83F7, 0x8407, 0x83E0, 0x83F2, 0x840D, 0x8422, 0x8420, 0x83BD,
+ 0x8438, 0x8506, 0x83FB, 0x846D, 0x842A, 0x843C, 0x855A, 0x8484,
+ 0x8477, 0x846B, 0x84AD, 0x846E, 0x8482, 0x8469, 0x8446, 0x842C,
+ 0x846F, 0x8479, 0x8435, 0x84CA, 0x8462, 0x84B9, 0x84BF, 0x849F,
+ 0x84D9, 0x84CD, 0x84BB, 0x84DA, 0x84D0, 0x84C1, 0x84C6, 0x84D6,
+ 0x84A1, 0x8521, 0x84FF, 0x84F4, 0x8517, 0x8518, 0x852C, 0x851F,
+ 0x8515, 0x8514, 0x84FC, 0x8540, 0x8563, 0x8558, 0x8548, ALTCHR,
+/* 0x6920 - 0x697F */
+ ALTCHR, 0x8541, 0x8602, 0x854B, 0x8555, 0x8580, 0x85A4, 0x8588,
+ 0x8591, 0x858A, 0x85A8, 0x856D, 0x8594, 0x859B, 0x85EA, 0x8587,
+ 0x859C, 0x8577, 0x857E, 0x8590, 0x85C9, 0x85BA, 0x85CF, 0x85B9,
+ 0x85D0, 0x85D5, 0x85DD, 0x85E5, 0x85DC, 0x85F9, 0x860A, 0x8613,
+ 0x860B, 0x85FE, 0x85FA, 0x8606, 0x8622, 0x861A, 0x8630, 0x863F,
+ 0x864D, 0x4E55, 0x8654, 0x865F, 0x8667, 0x8671, 0x8693, 0x86A3,
+ 0x86A9, 0x86AA, 0x868B, 0x868C, 0x86B6, 0x86AF, 0x86C4, 0x86C6,
+ 0x86B0, 0x86C9, 0x8823, 0x86AB, 0x86D4, 0x86DE, 0x86E9, 0x86EC,
+ 0x86DF, 0x86DB, 0x86EF, 0x8712, 0x8706, 0x8708, 0x8700, 0x8703,
+ 0x86FB, 0x8711, 0x8709, 0x870D, 0x86F9, 0x870A, 0x8734, 0x873F,
+ 0x8737, 0x873B, 0x8725, 0x8729, 0x871A, 0x8760, 0x875F, 0x8778,
+ 0x874C, 0x874E, 0x8774, 0x8757, 0x8768, 0x876E, 0x8759, ALTCHR,
+/* 0x6A20 - 0x6A7F */
+ ALTCHR, 0x8753, 0x8763, 0x876A, 0x8805, 0x87A2, 0x879F, 0x8782,
+ 0x87AF, 0x87CB, 0x87BD, 0x87C0, 0x87D0, 0x96D6, 0x87AB, 0x87C4,
+ 0x87B3, 0x87C7, 0x87C6, 0x87BB, 0x87EF, 0x87F2, 0x87E0, 0x880F,
+ 0x880D, 0x87FE, 0x87F6, 0x87F7, 0x880E, 0x87D2, 0x8811, 0x8816,
+ 0x8815, 0x8822, 0x8821, 0x8831, 0x8836, 0x8839, 0x8827, 0x883B,
+ 0x8844, 0x8842, 0x8852, 0x8859, 0x885E, 0x8862, 0x886B, 0x8881,
+ 0x887E, 0x889E, 0x8875, 0x887D, 0x88B5, 0x8872, 0x8882, 0x8897,
+ 0x8892, 0x88AE, 0x8899, 0x88A2, 0x888D, 0x88A4, 0x88B0, 0x88BF,
+ 0x88B1, 0x88C3, 0x88C4, 0x88D4, 0x88D8, 0x88D9, 0x88DD, 0x88F9,
+ 0x8902, 0x88FC, 0x88F4, 0x88E8, 0x88F2, 0x8904, 0x890C, 0x890A,
+ 0x8913, 0x8943, 0x891E, 0x8925, 0x892A, 0x892B, 0x8941, 0x8944,
+ 0x893B, 0x8936, 0x8938, 0x894C, 0x891D, 0x8960, 0x895E, ALTCHR,
+/* 0x6B20 - 0x6B7F */
+ ALTCHR, 0x8966, 0x8964, 0x896D, 0x896A, 0x896F, 0x8974, 0x8977,
+ 0x897E, 0x8983, 0x8988, 0x898A, 0x8993, 0x8998, 0x89A1, 0x89A9,
+ 0x89A6, 0x89AC, 0x89AF, 0x89B2, 0x89BA, 0x89BD, 0x89BF, 0x89C0,
+ 0x89DA, 0x89DC, 0x89DD, 0x89E7, 0x89F4, 0x89F8, 0x8A03, 0x8A16,
+ 0x8A10, 0x8A0C, 0x8A1B, 0x8A1D, 0x8A25, 0x8A36, 0x8A41, 0x8A5B,
+ 0x8A52, 0x8A46, 0x8A48, 0x8A7C, 0x8A6D, 0x8A6C, 0x8A62, 0x8A85,
+ 0x8A82, 0x8A84, 0x8AA8, 0x8AA1, 0x8A91, 0x8AA5, 0x8AA6, 0x8A9A,
+ 0x8AA3, 0x8AC4, 0x8ACD, 0x8AC2, 0x8ADA, 0x8AEB, 0x8AF3, 0x8AE7,
+ 0x8AE4, 0x8AF1, 0x8B14, 0x8AE0, 0x8AE2, 0x8AF7, 0x8ADE, 0x8ADB,
+ 0x8B0C, 0x8B07, 0x8B1A, 0x8AE1, 0x8B16, 0x8B10, 0x8B17, 0x8B20,
+ 0x8B33, 0x97AB, 0x8B26, 0x8B2B, 0x8B3E, 0x8B28, 0x8B41, 0x8B4C,
+ 0x8B4F, 0x8B4E, 0x8B49, 0x8B56, 0x8B5B, 0x8B5A, 0x8B6B, ALTCHR,
+/* 0x6C20 - 0x6C7F */
+ ALTCHR, 0x8B5F, 0x8B6C, 0x8B6F, 0x8B74, 0x8B7D, 0x8B80, 0x8B8C,
+ 0x8B8E, 0x8B92, 0x8B93, 0x8B96, 0x8B99, 0x8B9A, 0x8C3A, 0x8C41,
+ 0x8C3F, 0x8C48, 0x8C4C, 0x8C4E, 0x8C50, 0x8C55, 0x8C62, 0x8C6C,
+ 0x8C78, 0x8C7A, 0x8C82, 0x8C89, 0x8C85, 0x8C8A, 0x8C8D, 0x8C8E,
+ 0x8C94, 0x8C7C, 0x8C98, 0x621D, 0x8CAD, 0x8CAA, 0x8CBD, 0x8CB2,
+ 0x8CB3, 0x8CAE, 0x8CB6, 0x8CC8, 0x8CC1, 0x8CE4, 0x8CE3, 0x8CDA,
+ 0x8CFD, 0x8CFA, 0x8CFB, 0x8D04, 0x8D05, 0x8D0A, 0x8D07, 0x8D0F,
+ 0x8D0D, 0x8D10, 0x9F4E, 0x8D13, 0x8CCD, 0x8D14, 0x8D16, 0x8D67,
+ 0x8D6D, 0x8D71, 0x8D73, 0x8D81, 0x8D99, 0x8DC2, 0x8DBE, 0x8DBA,
+ 0x8DCF, 0x8DDA, 0x8DD6, 0x8DCC, 0x8DDB, 0x8DCB, 0x8DEA, 0x8DEB,
+ 0x8DDF, 0x8DE3, 0x8DFC, 0x8E08, 0x8E09, 0x8DFF, 0x8E1D, 0x8E1E,
+ 0x8E10, 0x8E1F, 0x8E42, 0x8E35, 0x8E30, 0x8E34, 0x8E4A, ALTCHR,
+/* 0x6D20 - 0x6D7F */
+ ALTCHR, 0x8E47, 0x8E49, 0x8E4C, 0x8E50, 0x8E48, 0x8E59, 0x8E64,
+ 0x8E60, 0x8E2A, 0x8E63, 0x8E55, 0x8E76, 0x8E72, 0x8E7C, 0x8E81,
+ 0x8E87, 0x8E85, 0x8E84, 0x8E8B, 0x8E8A, 0x8E93, 0x8E91, 0x8E94,
+ 0x8E99, 0x8EAA, 0x8EA1, 0x8EAC, 0x8EB0, 0x8EC6, 0x8EB1, 0x8EBE,
+ 0x8EC5, 0x8EC8, 0x8ECB, 0x8EDB, 0x8EE3, 0x8EFC, 0x8EFB, 0x8EEB,
+ 0x8EFE, 0x8F0A, 0x8F05, 0x8F15, 0x8F12, 0x8F19, 0x8F13, 0x8F1C,
+ 0x8F1F, 0x8F1B, 0x8F0C, 0x8F26, 0x8F33, 0x8F3B, 0x8F39, 0x8F45,
+ 0x8F42, 0x8F3E, 0x8F4C, 0x8F49, 0x8F46, 0x8F4E, 0x8F57, 0x8F5C,
+ 0x8F62, 0x8F63, 0x8F64, 0x8F9C, 0x8F9F, 0x8FA3, 0x8FAD, 0x8FAF,
+ 0x8FB7, 0x8FDA, 0x8FE5, 0x8FE2, 0x8FEA, 0x8FEF, 0x9087, 0x8FF4,
+ 0x9005, 0x8FF9, 0x8FFA, 0x9011, 0x9015, 0x9021, 0x900D, 0x901E,
+ 0x9016, 0x900B, 0x9027, 0x9036, 0x9035, 0x9039, 0x8FF8, ALTCHR,
+/* 0x6E20 - 0x6E7F */
+ ALTCHR, 0x904F, 0x9050, 0x9051, 0x9052, 0x900E, 0x9049, 0x903E,
+ 0x9056, 0x9058, 0x905E, 0x9068, 0x906F, 0x9076, 0x96A8, 0x9072,
+ 0x9082, 0x907D, 0x9081, 0x9080, 0x908A, 0x9089, 0x908F, 0x90A8,
+ 0x90AF, 0x90B1, 0x90B5, 0x90E2, 0x90E4, 0x6248, 0x90DB, 0x9102,
+ 0x9112, 0x9119, 0x9132, 0x9130, 0x914A, 0x9156, 0x9158, 0x9163,
+ 0x9165, 0x9169, 0x9173, 0x9172, 0x918B, 0x9189, 0x9182, 0x91A2,
+ 0x91AB, 0x91AF, 0x91AA, 0x91B5, 0x91B4, 0x91BA, 0x91C0, 0x91C1,
+ 0x91C9, 0x91CB, 0x91D0, 0x91D6, 0x91DF, 0x91E1, 0x91DB, 0x91FC,
+ 0x91F5, 0x91F6, 0x921E, 0x91FF, 0x9214, 0x922C, 0x9215, 0x9211,
+ 0x925E, 0x9257, 0x9245, 0x9249, 0x9264, 0x9248, 0x9295, 0x923F,
+ 0x924B, 0x9250, 0x929C, 0x9296, 0x9293, 0x929B, 0x925A, 0x92CF,
+ 0x92B9, 0x92B7, 0x92E9, 0x930F, 0x92FA, 0x9344, 0x932E, ALTCHR,
+/* 0x6F20 - 0x6F7F */
+ ALTCHR, 0x9319, 0x9322, 0x931A, 0x9323, 0x933A, 0x9335, 0x933B,
+ 0x935C, 0x9360, 0x937C, 0x936E, 0x9356, 0x93B0, 0x93AC, 0x93AD,
+ 0x9394, 0x93B9, 0x93D6, 0x93D7, 0x93E8, 0x93E5, 0x93D8, 0x93C3,
+ 0x93DD, 0x93D0, 0x93C8, 0x93E4, 0x941A, 0x9414, 0x9413, 0x9403,
+ 0x9407, 0x9410, 0x9436, 0x942B, 0x9435, 0x9421, 0x943A, 0x9441,
+ 0x9452, 0x9444, 0x945B, 0x9460, 0x9462, 0x945E, 0x946A, 0x9229,
+ 0x9470, 0x9475, 0x9477, 0x947D, 0x945A, 0x947C, 0x947E, 0x9481,
+ 0x947F, 0x9582, 0x9587, 0x958A, 0x9594, 0x9596, 0x9598, 0x9599,
+ 0x95A0, 0x95A8, 0x95A7, 0x95AD, 0x95BC, 0x95BB, 0x95B9, 0x95BE,
+ 0x95CA, 0x6FF6, 0x95C3, 0x95CD, 0x95CC, 0x95D5, 0x95D4, 0x95D6,
+ 0x95DC, 0x95E1, 0x95E5, 0x95E2, 0x9621, 0x9628, 0x962E, 0x962F,
+ 0x9642, 0x964C, 0x964F, 0x964B, 0x9677, 0x965C, 0x965E, ALTCHR,
+/* 0x7020 - 0x707F */
+ ALTCHR, 0x965D, 0x965F, 0x9666, 0x9672, 0x966C, 0x968D, 0x9698,
+ 0x9695, 0x9697, 0x96AA, 0x96A7, 0x96B1, 0x96B2, 0x96B0, 0x96B4,
+ 0x96B6, 0x96B8, 0x96B9, 0x96CE, 0x96CB, 0x96C9, 0x96CD, 0x894D,
+ 0x96DC, 0x970D, 0x96D5, 0x96F9, 0x9704, 0x9706, 0x9708, 0x9713,
+ 0x970E, 0x9711, 0x970F, 0x9716, 0x9719, 0x9724, 0x972A, 0x9730,
+ 0x9739, 0x973D, 0x973E, 0x9744, 0x9746, 0x9748, 0x9742, 0x9749,
+ 0x975C, 0x9760, 0x9764, 0x9766, 0x9768, 0x52D2, 0x976B, 0x9771,
+ 0x9779, 0x9785, 0x977C, 0x9781, 0x977A, 0x9786, 0x978B, 0x978F,
+ 0x9790, 0x979C, 0x97A8, 0x97A6, 0x97A3, 0x97B3, 0x97B4, 0x97C3,
+ 0x97C6, 0x97C8, 0x97CB, 0x97DC, 0x97ED, 0x9F4F, 0x97F2, 0x7ADF,
+ 0x97F6, 0x97F5, 0x980F, 0x980C, 0x9838, 0x9824, 0x9821, 0x9837,
+ 0x983D, 0x9846, 0x984F, 0x984B, 0x986B, 0x986F, 0x9870, ALTCHR,
+/* 0x7120 - 0x717F */
+ ALTCHR, 0x9871, 0x9874, 0x9873, 0x98AA, 0x98AF, 0x98B1, 0x98B6,
+ 0x98C4, 0x98C3, 0x98C6, 0x98E9, 0x98EB, 0x9903, 0x9909, 0x9912,
+ 0x9914, 0x9918, 0x9921, 0x991D, 0x991E, 0x9924, 0x9920, 0x992C,
+ 0x992E, 0x993D, 0x993E, 0x9942, 0x9949, 0x9945, 0x9950, 0x994B,
+ 0x9951, 0x9952, 0x994C, 0x9955, 0x9997, 0x9998, 0x99A5, 0x99AD,
+ 0x99AE, 0x99BC, 0x99DF, 0x99DB, 0x99DD, 0x99D8, 0x99D1, 0x99ED,
+ 0x99EE, 0x99F1, 0x99F2, 0x99FB, 0x99F8, 0x9A01, 0x9A0F, 0x9A05,
+ 0x99E2, 0x9A19, 0x9A2B, 0x9A37, 0x9A45, 0x9A42, 0x9A40, 0x9A43,
+ 0x9A3E, 0x9A55, 0x9A4D, 0x9A5B, 0x9A57, 0x9A5F, 0x9A62, 0x9A65,
+ 0x9A64, 0x9A69, 0x9A6B, 0x9A6A, 0x9AAD, 0x9AB0, 0x9ABC, 0x9AC0,
+ 0x9ACF, 0x9AD1, 0x9AD3, 0x9AD4, 0x9ADE, 0x9ADF, 0x9AE2, 0x9AE3,
+ 0x9AE6, 0x9AEF, 0x9AEB, 0x9AEE, 0x9AF4, 0x9AF1, 0x9AF7, ALTCHR,
+/* 0x7220 - 0x727F */
+ ALTCHR, 0x9AFB, 0x9B06, 0x9B18, 0x9B1A, 0x9B1F, 0x9B22, 0x9B23,
+ 0x9B25, 0x9B27, 0x9B28, 0x9B29, 0x9B2A, 0x9B2E, 0x9B2F, 0x9B32,
+ 0x9B44, 0x9B43, 0x9B4F, 0x9B4D, 0x9B4E, 0x9B51, 0x9B58, 0x9B74,
+ 0x9B93, 0x9B83, 0x9B91, 0x9B96, 0x9B97, 0x9B9F, 0x9BA0, 0x9BA8,
+ 0x9BB4, 0x9BC0, 0x9BCA, 0x9BB9, 0x9BC6, 0x9BCF, 0x9BD1, 0x9BD2,
+ 0x9BE3, 0x9BE2, 0x9BE4, 0x9BD4, 0x9BE1, 0x9C3A, 0x9BF2, 0x9BF1,
+ 0x9BF0, 0x9C15, 0x9C14, 0x9C09, 0x9C13, 0x9C0C, 0x9C06, 0x9C08,
+ 0x9C12, 0x9C0A, 0x9C04, 0x9C2E, 0x9C1B, 0x9C25, 0x9C24, 0x9C21,
+ 0x9C30, 0x9C47, 0x9C32, 0x9C46, 0x9C3E, 0x9C5A, 0x9C60, 0x9C67,
+ 0x9C76, 0x9C78, 0x9CE7, 0x9CEC, 0x9CF0, 0x9D09, 0x9D08, 0x9CEB,
+ 0x9D03, 0x9D06, 0x9D2A, 0x9D26, 0x9DAF, 0x9D23, 0x9D1F, 0x9D44,
+ 0x9D15, 0x9D12, 0x9D41, 0x9D3F, 0x9D3E, 0x9D46, 0x9D48, ALTCHR,
+/* 0x7320 - 0x737F */
+ ALTCHR, 0x9D5D, 0x9D5E, 0x9D64, 0x9D51, 0x9D50, 0x9D59, 0x9D72,
+ 0x9D89, 0x9D87, 0x9DAB, 0x9D6F, 0x9D7A, 0x9D9A, 0x9DA4, 0x9DA9,
+ 0x9DB2, 0x9DC4, 0x9DC1, 0x9DBB, 0x9DB8, 0x9DBA, 0x9DC6, 0x9DCF,
+ 0x9DC2, 0x9DD9, 0x9DD3, 0x9DF8, 0x9DE6, 0x9DED, 0x9DEF, 0x9DFD,
+ 0x9E1A, 0x9E1B, 0x9E1E, 0x9E75, 0x9E79, 0x9E7D, 0x9E81, 0x9E88,
+ 0x9E8B, 0x9E8C, 0x9E92, 0x9E95, 0x9E91, 0x9E9D, 0x9EA5, 0x9EA9,
+ 0x9EB8, 0x9EAA, 0x9EAD, 0x9761, 0x9ECC, 0x9ECE, 0x9ECF, 0x9ED0,
+ 0x9ED4, 0x9EDC, 0x9EDE, 0x9EDD, 0x9EE0, 0x9EE5, 0x9EE8, 0x9EEF,
+ 0x9EF4, 0x9EF6, 0x9EF7, 0x9EF9, 0x9EFB, 0x9EFC, 0x9EFD, 0x9F07,
+ 0x9F08, 0x76B7, 0x9F15, 0x9F21, 0x9F2C, 0x9F3E, 0x9F4A, 0x9F52,
+ 0x9F54, 0x9F63, 0x9F5F, 0x9F60, 0x9F61, 0x9F66, 0x9F67, 0x9F6C,
+ 0x9F6A, 0x9F77, 0x9F72, 0x9F76, 0x9F95, 0x9F9C, 0x9FA0, ALTCHR,
+/* 0x7420 - 0x747F */
+ ALTCHR, 0x582F, 0x69C7, 0x9059, 0x7464, 0x51DC, 0x7199, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+};
+
+CODE_CONV_TWO_OCTET_TO_UCS2(cc_jisx0208_to_win_ucs2, /* function name */
+ tblJisx0208ToWinUcs2, /* table name */
+ 0x0021, 0x0074, /* code range (high byte) */
+ 0x0020, 0x007F, /* code range (low byte) */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0208/main.c b/xc/extras/X-TrueType/JISX0208/main.c
new file mode 100644
index 000000000..254fb8fd8
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0208/main.c
@@ -0,0 +1,163 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ JISX0208
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "jisx0208", NULL, NULL, JISX0208, { 0x21, 0x7e, 0x21, 0x74, 0x2121 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_jisx0208_to_win_ucs2);
+CODECONV_TEMPLATE(cc_jisx0208_to_sjis);
+CODECONV_TEMPLATE(cc_jisx0208_to_std_ucs2);
+CODECONV_CALLBACK_TEMPLATE(cb_jisx0208_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { JISX0208, EPlfmISO, EEncISO10646,
+ cc_jisx0208_to_std_ucs2,
+ cb_jisx0208_to_ucs2 },
+ { JISX0208, EPlfmUnicode, EEncAny,
+ cc_jisx0208_to_std_ucs2,
+ cb_jisx0208_to_ucs2 },
+ { JISX0208, EPlfmMS, EEncMSUnicode,
+ cc_jisx0208_to_win_ucs2,
+ cb_jisx0208_to_ucs2 },
+ /*
+ To avoid the difficulty on the OS/2 Warp Japanese Fonts
+ (OEM from Dynalab), we must place the following platform/encoding
+ 'Apple Japanese' before 'MS Shift JIS'.
+ These fonts has both the below encodings, but MS S-JIS is incorrect.
+ */
+ { JISX0208, EPlfmApple, EEncAppleJapanese,
+ cc_jisx0208_to_sjis,
+ NULL },
+ { JISX0208, EPlfmMS, EEncMSShiftJIS,
+ cc_jisx0208_to_sjis,
+ NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(JISX0208_entrypoint)
+
+
+/*************************************************
+ callback - switch code converter by encoding options
+ */
+
+CODECONV_CALLBACK_TEMPLATE(cb_jisx0208_to_ucs2)
+{
+ SPropRecValContainer contRecValue;
+
+ if (SPropRecValList_search_record(charSetHints->refListPropRecVal,
+ &contRecValue,
+ "EncodingOptions")) {
+ char const *str =
+ SPropContainer_value_str(contRecValue);
+ if (tolower(*str) == 'm') {
+ refCodeConverterInfo->ptrCodeConverter = cc_jisx0208_to_win_ucs2;
+ } else if (tolower(*str) == 'i') {
+ refCodeConverterInfo->ptrCodeConverter = cc_jisx0208_to_std_ucs2;
+ }
+ }
+}
+
+
+/*************************************************
+ Calculatable code convert functions
+ */
+
+/* JIS -> SJIS */
+ft_char_code_t /* result charCodeDest */
+cc_jisx0208_to_sjis(ft_char_code_t idx)
+{
+ unsigned c1, c2, d1, d2;
+
+ c1 = (idx >> 8) & 0xff;
+ c2 = idx & 0xff;
+ d1 = ((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0);
+ d2 = c2 + ((c1 & 1) ? (c2 < 0x60 ? 0x1f : 0x20) : 0x7e);
+
+ return (d1<<8) + d2;
+}
+
+
+/* JISX0208 -> Standard UCS2 */
+ft_char_code_t /* result charCodeDest */
+cc_jisx0208_to_std_ucs2(ft_char_code_t codeSrc)
+{
+ ucs2_t codeDst;
+
+ switch (codeSrc) {
+ case 0x2140:
+ codeDst = 0x005c;
+ break;
+ case 0x2141:
+ codeDst = 0x301c;
+ break;
+ case 0x2142:
+ codeDst = 0x2016;
+ break;
+ case 0x215d:
+ codeDst = 0x00b1;
+ break;
+ case 0x2171:
+ codeDst = 0x00a2;
+ break;
+ case 0x2172:
+ codeDst = 0x00a3;
+ break;
+ case 0x224c:
+ codeDst = 0x00ac;
+ break;
+ default:
+ return cc_jisx0208_to_win_ucs2(codeSrc);
+ }
+
+ return codeDst;
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0212/Imakefile b/xc/extras/X-TrueType/JISX0212/Imakefile
new file mode 100644
index 000000000..7191adf4a
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0212/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: JISX0212 */
+
+#define ModuleName JISX0212
+SRCS = JISX0212toUCS2.c main.c
+OBJS = JISX0212toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0212/JISX0212toUCS2.c b/xc/extras/X-TrueType/JISX0212/JISX0212toUCS2.c
new file mode 100644
index 000000000..50d7c5821
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0212/JISX0212toUCS2.c
@@ -0,0 +1,1046 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPING/EASTASIA/JIS/JIS0212.TXT)
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x3000
+
+static ucs2_t tblJisx0212ToUcs2[] = {
+/* 0x2220 - 0x227F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x02D8,
+ 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0x007E,
+ 0x0384, 0x0385, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, 0x00A1, 0x00A6, 0x00BF, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, 0x00BA, 0x00AA, 0x00A9, 0x00AE, 0x2122,
+ 0x00A4, 0x2116, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2320 - 0x237F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2420 - 0x247F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2520 - 0x257F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2620 - 0x267F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0386, 0x0388, 0x0389, 0x038A, 0x03AA, ALTCHR, 0x038C,
+ ALTCHR, 0x038E, 0x03AB, ALTCHR, 0x038F, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x03AC, 0x03AD, 0x03AE, 0x03AF, 0x03CA, 0x0390, 0x03CC,
+ 0x03C2, 0x03CD, 0x03CB, 0x03B0, 0x03CE, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2720 - 0x277F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x040E, 0x040F, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045E, 0x045F, ALTCHR,
+/* 0x2820 - 0x287F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2920 - 0x297F */
+ ALTCHR, 0x00C6, 0x0110, ALTCHR, 0x0126, ALTCHR, 0x0132, ALTCHR,
+ 0x0141, 0x013F, ALTCHR, 0x014A, 0x00D8, 0x0152, ALTCHR, 0x0166,
+ 0x00DE, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138,
+ 0x0142, 0x0140, 0x0149, 0x014B, 0x00F8, 0x0153, 0x00DF, 0x0167,
+ 0x00FE, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2A20 - 0x2A7F */
+ ALTCHR, 0x00C1, 0x00C0, 0x00C4, 0x00C2, 0x0102, 0x01CD, 0x0100,
+ 0x0104, 0x00C5, 0x00C3, 0x0106, 0x0108, 0x010C, 0x00C7, 0x010A,
+ 0x010E, 0x00C9, 0x00C8, 0x00CB, 0x00CA, 0x011A, 0x0116, 0x0112,
+ 0x0118, ALTCHR, 0x011C, 0x011E, 0x0122, 0x0120, 0x0124, 0x00CD,
+ 0x00CC, 0x00CF, 0x00CE, 0x01CF, 0x0130, 0x012A, 0x012E, 0x0128,
+ 0x0134, 0x0136, 0x0139, 0x013D, 0x013B, 0x0143, 0x0147, 0x0145,
+ 0x00D1, 0x00D3, 0x00D2, 0x00D6, 0x00D4, 0x01D1, 0x0150, 0x014C,
+ 0x00D5, 0x0154, 0x0158, 0x0156, 0x015A, 0x015C, 0x0160, 0x015E,
+ 0x0164, 0x0162, 0x00DA, 0x00D9, 0x00DC, 0x00DB, 0x016C, 0x01D3,
+ 0x0170, 0x016A, 0x0172, 0x016E, 0x0168, 0x01D7, 0x01DB, 0x01D9,
+ 0x01D5, 0x0174, 0x00DD, 0x0178, 0x0176, 0x0179, 0x017D, 0x017B,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2B20 - 0x2B7F */
+ ALTCHR, 0x00E1, 0x00E0, 0x00E4, 0x00E2, 0x0103, 0x01CE, 0x0101,
+ 0x0105, 0x00E5, 0x00E3, 0x0107, 0x0109, 0x010D, 0x00E7, 0x010B,
+ 0x010F, 0x00E9, 0x00E8, 0x00EB, 0x00EA, 0x011B, 0x0117, 0x0113,
+ 0x0119, 0x01F5, 0x011D, 0x011F, ALTCHR, 0x0121, 0x0125, 0x00ED,
+ 0x00EC, 0x00EF, 0x00EE, 0x01D0, ALTCHR, 0x012B, 0x012F, 0x0129,
+ 0x0135, 0x0137, 0x013A, 0x013E, 0x013C, 0x0144, 0x0148, 0x0146,
+ 0x00F1, 0x00F3, 0x00F2, 0x00F6, 0x00F4, 0x01D2, 0x0151, 0x014D,
+ 0x00F5, 0x0155, 0x0159, 0x0157, 0x015B, 0x015D, 0x0161, 0x015F,
+ 0x0165, 0x0163, 0x00FA, 0x00F9, 0x00FC, 0x00FB, 0x016D, 0x01D4,
+ 0x0171, 0x016B, 0x0173, 0x016F, 0x0169, 0x01D8, 0x01DC, 0x01DA,
+ 0x01D6, 0x0175, 0x00FD, 0x00FF, 0x0177, 0x017A, 0x017E, 0x017C,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2C20 - 0x2C7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2D20 - 0x2D7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2E20 - 0x2E7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2F20 - 0x2F7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x3020 - 0x307F */
+ ALTCHR, 0x4E02, 0x4E04, 0x4E05, 0x4E0C, 0x4E12, 0x4E1F, 0x4E23,
+ 0x4E24, 0x4E28, 0x4E2B, 0x4E2E, 0x4E2F, 0x4E30, 0x4E35, 0x4E40,
+ 0x4E41, 0x4E44, 0x4E47, 0x4E51, 0x4E5A, 0x4E5C, 0x4E63, 0x4E68,
+ 0x4E69, 0x4E74, 0x4E75, 0x4E79, 0x4E7F, 0x4E8D, 0x4E96, 0x4E97,
+ 0x4E9D, 0x4EAF, 0x4EB9, 0x4EC3, 0x4ED0, 0x4EDA, 0x4EDB, 0x4EE0,
+ 0x4EE1, 0x4EE2, 0x4EE8, 0x4EEF, 0x4EF1, 0x4EF3, 0x4EF5, 0x4EFD,
+ 0x4EFE, 0x4EFF, 0x4F00, 0x4F02, 0x4F03, 0x4F08, 0x4F0B, 0x4F0C,
+ 0x4F12, 0x4F15, 0x4F16, 0x4F17, 0x4F19, 0x4F2E, 0x4F31, 0x4F60,
+ 0x4F33, 0x4F35, 0x4F37, 0x4F39, 0x4F3B, 0x4F3E, 0x4F40, 0x4F42,
+ 0x4F48, 0x4F49, 0x4F4B, 0x4F4C, 0x4F52, 0x4F54, 0x4F56, 0x4F58,
+ 0x4F5F, 0x4F63, 0x4F6A, 0x4F6C, 0x4F6E, 0x4F71, 0x4F77, 0x4F78,
+ 0x4F79, 0x4F7A, 0x4F7D, 0x4F7E, 0x4F81, 0x4F82, 0x4F84, ALTCHR,
+/* 0x3120 - 0x317F */
+ ALTCHR, 0x4F85, 0x4F89, 0x4F8A, 0x4F8C, 0x4F8E, 0x4F90, 0x4F92,
+ 0x4F93, 0x4F94, 0x4F97, 0x4F99, 0x4F9A, 0x4F9E, 0x4F9F, 0x4FB2,
+ 0x4FB7, 0x4FB9, 0x4FBB, 0x4FBC, 0x4FBD, 0x4FBE, 0x4FC0, 0x4FC1,
+ 0x4FC5, 0x4FC6, 0x4FC8, 0x4FC9, 0x4FCB, 0x4FCC, 0x4FCD, 0x4FCF,
+ 0x4FD2, 0x4FDC, 0x4FE0, 0x4FE2, 0x4FF0, 0x4FF2, 0x4FFC, 0x4FFD,
+ 0x4FFF, 0x5000, 0x5001, 0x5004, 0x5007, 0x500A, 0x500C, 0x500E,
+ 0x5010, 0x5013, 0x5017, 0x5018, 0x501B, 0x501C, 0x501D, 0x501E,
+ 0x5022, 0x5027, 0x502E, 0x5030, 0x5032, 0x5033, 0x5035, 0x5040,
+ 0x5041, 0x5042, 0x5045, 0x5046, 0x504A, 0x504C, 0x504E, 0x5051,
+ 0x5052, 0x5053, 0x5057, 0x5059, 0x505F, 0x5060, 0x5062, 0x5063,
+ 0x5066, 0x5067, 0x506A, 0x506D, 0x5070, 0x5071, 0x503B, 0x5081,
+ 0x5083, 0x5084, 0x5086, 0x508A, 0x508E, 0x508F, 0x5090, ALTCHR,
+/* 0x3220 - 0x327F */
+ ALTCHR, 0x5092, 0x5093, 0x5094, 0x5096, 0x509B, 0x509C, 0x509E,
+ 0x509F, 0x50A0, 0x50A1, 0x50A2, 0x50AA, 0x50AF, 0x50B0, 0x50B9,
+ 0x50BA, 0x50BD, 0x50C0, 0x50C3, 0x50C4, 0x50C7, 0x50CC, 0x50CE,
+ 0x50D0, 0x50D3, 0x50D4, 0x50D8, 0x50DC, 0x50DD, 0x50DF, 0x50E2,
+ 0x50E4, 0x50E6, 0x50E8, 0x50E9, 0x50EF, 0x50F1, 0x50F6, 0x50FA,
+ 0x50FE, 0x5103, 0x5106, 0x5107, 0x5108, 0x510B, 0x510C, 0x510D,
+ 0x510E, 0x50F2, 0x5110, 0x5117, 0x5119, 0x511B, 0x511C, 0x511D,
+ 0x511E, 0x5123, 0x5127, 0x5128, 0x512C, 0x512D, 0x512F, 0x5131,
+ 0x5133, 0x5134, 0x5135, 0x5138, 0x5139, 0x5142, 0x514A, 0x514F,
+ 0x5153, 0x5155, 0x5157, 0x5158, 0x515F, 0x5164, 0x5166, 0x517E,
+ 0x5183, 0x5184, 0x518B, 0x518E, 0x5198, 0x519D, 0x51A1, 0x51A3,
+ 0x51AD, 0x51B8, 0x51BA, 0x51BC, 0x51BE, 0x51BF, 0x51C2, ALTCHR,
+/* 0x3320 - 0x337F */
+ ALTCHR, 0x51C8, 0x51CF, 0x51D1, 0x51D2, 0x51D3, 0x51D5, 0x51D8,
+ 0x51DE, 0x51E2, 0x51E5, 0x51EE, 0x51F2, 0x51F3, 0x51F4, 0x51F7,
+ 0x5201, 0x5202, 0x5205, 0x5212, 0x5213, 0x5215, 0x5216, 0x5218,
+ 0x5222, 0x5228, 0x5231, 0x5232, 0x5235, 0x523C, 0x5245, 0x5249,
+ 0x5255, 0x5257, 0x5258, 0x525A, 0x525C, 0x525F, 0x5260, 0x5261,
+ 0x5266, 0x526E, 0x5277, 0x5278, 0x5279, 0x5280, 0x5282, 0x5285,
+ 0x528A, 0x528C, 0x5293, 0x5295, 0x5296, 0x5297, 0x5298, 0x529A,
+ 0x529C, 0x52A4, 0x52A5, 0x52A6, 0x52A7, 0x52AF, 0x52B0, 0x52B6,
+ 0x52B7, 0x52B8, 0x52BA, 0x52BB, 0x52BD, 0x52C0, 0x52C4, 0x52C6,
+ 0x52C8, 0x52CC, 0x52CF, 0x52D1, 0x52D4, 0x52D6, 0x52DB, 0x52DC,
+ 0x52E1, 0x52E5, 0x52E8, 0x52E9, 0x52EA, 0x52EC, 0x52F0, 0x52F1,
+ 0x52F4, 0x52F6, 0x52F7, 0x5300, 0x5303, 0x530A, 0x530B, ALTCHR,
+/* 0x3420 - 0x347F */
+ ALTCHR, 0x530C, 0x5311, 0x5313, 0x5318, 0x531B, 0x531C, 0x531E,
+ 0x531F, 0x5325, 0x5327, 0x5328, 0x5329, 0x532B, 0x532C, 0x532D,
+ 0x5330, 0x5332, 0x5335, 0x533C, 0x533D, 0x533E, 0x5342, 0x534C,
+ 0x534B, 0x5359, 0x535B, 0x5361, 0x5363, 0x5365, 0x536C, 0x536D,
+ 0x5372, 0x5379, 0x537E, 0x5383, 0x5387, 0x5388, 0x538E, 0x5393,
+ 0x5394, 0x5399, 0x539D, 0x53A1, 0x53A4, 0x53AA, 0x53AB, 0x53AF,
+ 0x53B2, 0x53B4, 0x53B5, 0x53B7, 0x53B8, 0x53BA, 0x53BD, 0x53C0,
+ 0x53C5, 0x53CF, 0x53D2, 0x53D3, 0x53D5, 0x53DA, 0x53DD, 0x53DE,
+ 0x53E0, 0x53E6, 0x53E7, 0x53F5, 0x5402, 0x5413, 0x541A, 0x5421,
+ 0x5427, 0x5428, 0x542A, 0x542F, 0x5431, 0x5434, 0x5435, 0x5443,
+ 0x5444, 0x5447, 0x544D, 0x544F, 0x545E, 0x5462, 0x5464, 0x5466,
+ 0x5467, 0x5469, 0x546B, 0x546D, 0x546E, 0x5474, 0x547F, ALTCHR,
+/* 0x3520 - 0x357F */
+ ALTCHR, 0x5481, 0x5483, 0x5485, 0x5488, 0x5489, 0x548D, 0x5491,
+ 0x5495, 0x5496, 0x549C, 0x549F, 0x54A1, 0x54A6, 0x54A7, 0x54A9,
+ 0x54AA, 0x54AD, 0x54AE, 0x54B1, 0x54B7, 0x54B9, 0x54BA, 0x54BB,
+ 0x54BF, 0x54C6, 0x54CA, 0x54CD, 0x54CE, 0x54E0, 0x54EA, 0x54EC,
+ 0x54EF, 0x54F6, 0x54FC, 0x54FE, 0x54FF, 0x5500, 0x5501, 0x5505,
+ 0x5508, 0x5509, 0x550C, 0x550D, 0x550E, 0x5515, 0x552A, 0x552B,
+ 0x5532, 0x5535, 0x5536, 0x553B, 0x553C, 0x553D, 0x5541, 0x5547,
+ 0x5549, 0x554A, 0x554D, 0x5550, 0x5551, 0x5558, 0x555A, 0x555B,
+ 0x555E, 0x5560, 0x5561, 0x5564, 0x5566, 0x557F, 0x5581, 0x5582,
+ 0x5586, 0x5588, 0x558E, 0x558F, 0x5591, 0x5592, 0x5593, 0x5594,
+ 0x5597, 0x55A3, 0x55A4, 0x55AD, 0x55B2, 0x55BF, 0x55C1, 0x55C3,
+ 0x55C6, 0x55C9, 0x55CB, 0x55CC, 0x55CE, 0x55D1, 0x55D2, ALTCHR,
+/* 0x3620 - 0x367F */
+ ALTCHR, 0x55D3, 0x55D7, 0x55D8, 0x55DB, 0x55DE, 0x55E2, 0x55E9,
+ 0x55F6, 0x55FF, 0x5605, 0x5608, 0x560A, 0x560D, 0x560E, 0x560F,
+ 0x5610, 0x5611, 0x5612, 0x5619, 0x562C, 0x5630, 0x5633, 0x5635,
+ 0x5637, 0x5639, 0x563B, 0x563C, 0x563D, 0x563F, 0x5640, 0x5641,
+ 0x5643, 0x5644, 0x5646, 0x5649, 0x564B, 0x564D, 0x564F, 0x5654,
+ 0x565E, 0x5660, 0x5661, 0x5662, 0x5663, 0x5666, 0x5669, 0x566D,
+ 0x566F, 0x5671, 0x5672, 0x5675, 0x5684, 0x5685, 0x5688, 0x568B,
+ 0x568C, 0x5695, 0x5699, 0x569A, 0x569D, 0x569E, 0x569F, 0x56A6,
+ 0x56A7, 0x56A8, 0x56A9, 0x56AB, 0x56AC, 0x56AD, 0x56B1, 0x56B3,
+ 0x56B7, 0x56BE, 0x56C5, 0x56C9, 0x56CA, 0x56CB, 0x56CF, 0x56D0,
+ 0x56CC, 0x56CD, 0x56D9, 0x56DC, 0x56DD, 0x56DF, 0x56E1, 0x56E4,
+ 0x56E5, 0x56E6, 0x56E7, 0x56E8, 0x56F1, 0x56EB, 0x56ED, ALTCHR,
+/* 0x3720 - 0x377F */
+ ALTCHR, 0x56F6, 0x56F7, 0x5701, 0x5702, 0x5707, 0x570A, 0x570C,
+ 0x5711, 0x5715, 0x571A, 0x571B, 0x571D, 0x5720, 0x5722, 0x5723,
+ 0x5724, 0x5725, 0x5729, 0x572A, 0x572C, 0x572E, 0x572F, 0x5733,
+ 0x5734, 0x573D, 0x573E, 0x573F, 0x5745, 0x5746, 0x574C, 0x574D,
+ 0x5752, 0x5762, 0x5765, 0x5767, 0x5768, 0x576B, 0x576D, 0x576E,
+ 0x576F, 0x5770, 0x5771, 0x5773, 0x5774, 0x5775, 0x5777, 0x5779,
+ 0x577A, 0x577B, 0x577C, 0x577E, 0x5781, 0x5783, 0x578C, 0x5794,
+ 0x5797, 0x5799, 0x579A, 0x579C, 0x579D, 0x579E, 0x579F, 0x57A1,
+ 0x5795, 0x57A7, 0x57A8, 0x57A9, 0x57AC, 0x57B8, 0x57BD, 0x57C7,
+ 0x57C8, 0x57CC, 0x57CF, 0x57D5, 0x57DD, 0x57DE, 0x57E4, 0x57E6,
+ 0x57E7, 0x57E9, 0x57ED, 0x57F0, 0x57F5, 0x57F6, 0x57F8, 0x57FD,
+ 0x57FE, 0x57FF, 0x5803, 0x5804, 0x5808, 0x5809, 0x57E1, ALTCHR,
+/* 0x3820 - 0x387F */
+ ALTCHR, 0x580C, 0x580D, 0x581B, 0x581E, 0x581F, 0x5820, 0x5826,
+ 0x5827, 0x582D, 0x5832, 0x5839, 0x583F, 0x5849, 0x584C, 0x584D,
+ 0x584F, 0x5850, 0x5855, 0x585F, 0x5861, 0x5864, 0x5867, 0x5868,
+ 0x5878, 0x587C, 0x587F, 0x5880, 0x5881, 0x5887, 0x5888, 0x5889,
+ 0x588A, 0x588C, 0x588D, 0x588F, 0x5890, 0x5894, 0x5896, 0x589D,
+ 0x58A0, 0x58A1, 0x58A2, 0x58A6, 0x58A9, 0x58B1, 0x58B2, 0x58C4,
+ 0x58BC, 0x58C2, 0x58C8, 0x58CD, 0x58CE, 0x58D0, 0x58D2, 0x58D4,
+ 0x58D6, 0x58DA, 0x58DD, 0x58E1, 0x58E2, 0x58E9, 0x58F3, 0x5905,
+ 0x5906, 0x590B, 0x590C, 0x5912, 0x5913, 0x5914, 0x8641, 0x591D,
+ 0x5921, 0x5923, 0x5924, 0x5928, 0x592F, 0x5930, 0x5933, 0x5935,
+ 0x5936, 0x593F, 0x5943, 0x5946, 0x5952, 0x5953, 0x5959, 0x595B,
+ 0x595D, 0x595E, 0x595F, 0x5961, 0x5963, 0x596B, 0x596D, ALTCHR,
+/* 0x3920 - 0x397F */
+ ALTCHR, 0x596F, 0x5972, 0x5975, 0x5976, 0x5979, 0x597B, 0x597C,
+ 0x598B, 0x598C, 0x598E, 0x5992, 0x5995, 0x5997, 0x599F, 0x59A4,
+ 0x59A7, 0x59AD, 0x59AE, 0x59AF, 0x59B0, 0x59B3, 0x59B7, 0x59BA,
+ 0x59BC, 0x59C1, 0x59C3, 0x59C4, 0x59C8, 0x59CA, 0x59CD, 0x59D2,
+ 0x59DD, 0x59DE, 0x59DF, 0x59E3, 0x59E4, 0x59E7, 0x59EE, 0x59EF,
+ 0x59F1, 0x59F2, 0x59F4, 0x59F7, 0x5A00, 0x5A04, 0x5A0C, 0x5A0D,
+ 0x5A0E, 0x5A12, 0x5A13, 0x5A1E, 0x5A23, 0x5A24, 0x5A27, 0x5A28,
+ 0x5A2A, 0x5A2D, 0x5A30, 0x5A44, 0x5A45, 0x5A47, 0x5A48, 0x5A4C,
+ 0x5A50, 0x5A55, 0x5A5E, 0x5A63, 0x5A65, 0x5A67, 0x5A6D, 0x5A77,
+ 0x5A7A, 0x5A7B, 0x5A7E, 0x5A8B, 0x5A90, 0x5A93, 0x5A96, 0x5A99,
+ 0x5A9C, 0x5A9E, 0x5A9F, 0x5AA0, 0x5AA2, 0x5AA7, 0x5AAC, 0x5AB1,
+ 0x5AB2, 0x5AB3, 0x5AB5, 0x5AB8, 0x5ABA, 0x5ABB, 0x5ABF, ALTCHR,
+/* 0x3A20 - 0x3A7F */
+ ALTCHR, 0x5AC4, 0x5AC6, 0x5AC8, 0x5ACF, 0x5ADA, 0x5ADC, 0x5AE0,
+ 0x5AE5, 0x5AEA, 0x5AEE, 0x5AF5, 0x5AF6, 0x5AFD, 0x5B00, 0x5B01,
+ 0x5B08, 0x5B17, 0x5B34, 0x5B19, 0x5B1B, 0x5B1D, 0x5B21, 0x5B25,
+ 0x5B2D, 0x5B38, 0x5B41, 0x5B4B, 0x5B4C, 0x5B52, 0x5B56, 0x5B5E,
+ 0x5B68, 0x5B6E, 0x5B6F, 0x5B7C, 0x5B7D, 0x5B7E, 0x5B7F, 0x5B81,
+ 0x5B84, 0x5B86, 0x5B8A, 0x5B8E, 0x5B90, 0x5B91, 0x5B93, 0x5B94,
+ 0x5B96, 0x5BA8, 0x5BA9, 0x5BAC, 0x5BAD, 0x5BAF, 0x5BB1, 0x5BB2,
+ 0x5BB7, 0x5BBA, 0x5BBC, 0x5BC0, 0x5BC1, 0x5BCD, 0x5BCF, 0x5BD6,
+ 0x5BD7, 0x5BD8, 0x5BD9, 0x5BDA, 0x5BE0, 0x5BEF, 0x5BF1, 0x5BF4,
+ 0x5BFD, 0x5C0C, 0x5C17, 0x5C1E, 0x5C1F, 0x5C23, 0x5C26, 0x5C29,
+ 0x5C2B, 0x5C2C, 0x5C2E, 0x5C30, 0x5C32, 0x5C35, 0x5C36, 0x5C59,
+ 0x5C5A, 0x5C5C, 0x5C62, 0x5C63, 0x5C67, 0x5C68, 0x5C69, ALTCHR,
+/* 0x3B20 - 0x3B7F */
+ ALTCHR, 0x5C6D, 0x5C70, 0x5C74, 0x5C75, 0x5C7A, 0x5C7B, 0x5C7C,
+ 0x5C7D, 0x5C87, 0x5C88, 0x5C8A, 0x5C8F, 0x5C92, 0x5C9D, 0x5C9F,
+ 0x5CA0, 0x5CA2, 0x5CA3, 0x5CA6, 0x5CAA, 0x5CB2, 0x5CB4, 0x5CB5,
+ 0x5CBA, 0x5CC9, 0x5CCB, 0x5CD2, 0x5CDD, 0x5CD7, 0x5CEE, 0x5CF1,
+ 0x5CF2, 0x5CF4, 0x5D01, 0x5D06, 0x5D0D, 0x5D12, 0x5D2B, 0x5D23,
+ 0x5D24, 0x5D26, 0x5D27, 0x5D31, 0x5D34, 0x5D39, 0x5D3D, 0x5D3F,
+ 0x5D42, 0x5D43, 0x5D46, 0x5D48, 0x5D55, 0x5D51, 0x5D59, 0x5D4A,
+ 0x5D5F, 0x5D60, 0x5D61, 0x5D62, 0x5D64, 0x5D6A, 0x5D6D, 0x5D70,
+ 0x5D79, 0x5D7A, 0x5D7E, 0x5D7F, 0x5D81, 0x5D83, 0x5D88, 0x5D8A,
+ 0x5D92, 0x5D93, 0x5D94, 0x5D95, 0x5D99, 0x5D9B, 0x5D9F, 0x5DA0,
+ 0x5DA7, 0x5DAB, 0x5DB0, 0x5DB4, 0x5DB8, 0x5DB9, 0x5DC3, 0x5DC7,
+ 0x5DCB, 0x5DD0, 0x5DCE, 0x5DD8, 0x5DD9, 0x5DE0, 0x5DE4, ALTCHR,
+/* 0x3C20 - 0x3C7F */
+ ALTCHR, 0x5DE9, 0x5DF8, 0x5DF9, 0x5E00, 0x5E07, 0x5E0D, 0x5E12,
+ 0x5E14, 0x5E15, 0x5E18, 0x5E1F, 0x5E20, 0x5E2E, 0x5E28, 0x5E32,
+ 0x5E35, 0x5E3E, 0x5E4B, 0x5E50, 0x5E49, 0x5E51, 0x5E56, 0x5E58,
+ 0x5E5B, 0x5E5C, 0x5E5E, 0x5E68, 0x5E6A, 0x5E6B, 0x5E6C, 0x5E6D,
+ 0x5E6E, 0x5E70, 0x5E80, 0x5E8B, 0x5E8E, 0x5EA2, 0x5EA4, 0x5EA5,
+ 0x5EA8, 0x5EAA, 0x5EAC, 0x5EB1, 0x5EB3, 0x5EBD, 0x5EBE, 0x5EBF,
+ 0x5EC6, 0x5ECC, 0x5ECB, 0x5ECE, 0x5ED1, 0x5ED2, 0x5ED4, 0x5ED5,
+ 0x5EDC, 0x5EDE, 0x5EE5, 0x5EEB, 0x5F02, 0x5F06, 0x5F07, 0x5F08,
+ 0x5F0E, 0x5F19, 0x5F1C, 0x5F1D, 0x5F21, 0x5F22, 0x5F23, 0x5F24,
+ 0x5F28, 0x5F2B, 0x5F2C, 0x5F2E, 0x5F30, 0x5F34, 0x5F36, 0x5F3B,
+ 0x5F3D, 0x5F3F, 0x5F40, 0x5F44, 0x5F45, 0x5F47, 0x5F4D, 0x5F50,
+ 0x5F54, 0x5F58, 0x5F5B, 0x5F60, 0x5F63, 0x5F64, 0x5F67, ALTCHR,
+/* 0x3D20 - 0x3D7F */
+ ALTCHR, 0x5F6F, 0x5F72, 0x5F74, 0x5F75, 0x5F78, 0x5F7A, 0x5F7D,
+ 0x5F7E, 0x5F89, 0x5F8D, 0x5F8F, 0x5F96, 0x5F9C, 0x5F9D, 0x5FA2,
+ 0x5FA7, 0x5FAB, 0x5FA4, 0x5FAC, 0x5FAF, 0x5FB0, 0x5FB1, 0x5FB8,
+ 0x5FC4, 0x5FC7, 0x5FC8, 0x5FC9, 0x5FCB, 0x5FD0, 0x5FD1, 0x5FD2,
+ 0x5FD3, 0x5FD4, 0x5FDE, 0x5FE1, 0x5FE2, 0x5FE8, 0x5FE9, 0x5FEA,
+ 0x5FEC, 0x5FED, 0x5FEE, 0x5FEF, 0x5FF2, 0x5FF3, 0x5FF6, 0x5FFA,
+ 0x5FFC, 0x6007, 0x600A, 0x600D, 0x6013, 0x6014, 0x6017, 0x6018,
+ 0x601A, 0x601F, 0x6024, 0x602D, 0x6033, 0x6035, 0x6040, 0x6047,
+ 0x6048, 0x6049, 0x604C, 0x6051, 0x6054, 0x6056, 0x6057, 0x605D,
+ 0x6061, 0x6067, 0x6071, 0x607E, 0x607F, 0x6082, 0x6086, 0x6088,
+ 0x608A, 0x608E, 0x6091, 0x6093, 0x6095, 0x6098, 0x609D, 0x609E,
+ 0x60A2, 0x60A4, 0x60A5, 0x60A8, 0x60B0, 0x60B1, 0x60B7, ALTCHR,
+/* 0x3E20 - 0x3E7F */
+ ALTCHR, 0x60BB, 0x60BE, 0x60C2, 0x60C4, 0x60C8, 0x60C9, 0x60CA,
+ 0x60CB, 0x60CE, 0x60CF, 0x60D4, 0x60D5, 0x60D9, 0x60DB, 0x60DD,
+ 0x60DE, 0x60E2, 0x60E5, 0x60F2, 0x60F5, 0x60F8, 0x60FC, 0x60FD,
+ 0x6102, 0x6107, 0x610A, 0x610C, 0x6110, 0x6111, 0x6112, 0x6113,
+ 0x6114, 0x6116, 0x6117, 0x6119, 0x611C, 0x611E, 0x6122, 0x612A,
+ 0x612B, 0x6130, 0x6131, 0x6135, 0x6136, 0x6137, 0x6139, 0x6141,
+ 0x6145, 0x6146, 0x6149, 0x615E, 0x6160, 0x616C, 0x6172, 0x6178,
+ 0x617B, 0x617C, 0x617F, 0x6180, 0x6181, 0x6183, 0x6184, 0x618B,
+ 0x618D, 0x6192, 0x6193, 0x6197, 0x6198, 0x619C, 0x619D, 0x619F,
+ 0x61A0, 0x61A5, 0x61A8, 0x61AA, 0x61AD, 0x61B8, 0x61B9, 0x61BC,
+ 0x61C0, 0x61C1, 0x61C2, 0x61CE, 0x61CF, 0x61D5, 0x61DC, 0x61DD,
+ 0x61DE, 0x61DF, 0x61E1, 0x61E2, 0x61E7, 0x61E9, 0x61E5, ALTCHR,
+/* 0x3F20 - 0x3F7F */
+ ALTCHR, 0x61EC, 0x61ED, 0x61EF, 0x6201, 0x6203, 0x6204, 0x6207,
+ 0x6213, 0x6215, 0x621C, 0x6220, 0x6222, 0x6223, 0x6227, 0x6229,
+ 0x622B, 0x6239, 0x623D, 0x6242, 0x6243, 0x6244, 0x6246, 0x624C,
+ 0x6250, 0x6251, 0x6252, 0x6254, 0x6256, 0x625A, 0x625C, 0x6264,
+ 0x626D, 0x626F, 0x6273, 0x627A, 0x627D, 0x628D, 0x628E, 0x628F,
+ 0x6290, 0x62A6, 0x62A8, 0x62B3, 0x62B6, 0x62B7, 0x62BA, 0x62BE,
+ 0x62BF, 0x62C4, 0x62CE, 0x62D5, 0x62D6, 0x62DA, 0x62EA, 0x62F2,
+ 0x62F4, 0x62FC, 0x62FD, 0x6303, 0x6304, 0x630A, 0x630B, 0x630D,
+ 0x6310, 0x6313, 0x6316, 0x6318, 0x6329, 0x632A, 0x632D, 0x6335,
+ 0x6336, 0x6339, 0x633C, 0x6341, 0x6342, 0x6343, 0x6344, 0x6346,
+ 0x634A, 0x634B, 0x634E, 0x6352, 0x6353, 0x6354, 0x6358, 0x635B,
+ 0x6365, 0x6366, 0x636C, 0x636D, 0x6371, 0x6374, 0x6375, ALTCHR,
+/* 0x4020 - 0x407F */
+ ALTCHR, 0x6378, 0x637C, 0x637D, 0x637F, 0x6382, 0x6384, 0x6387,
+ 0x638A, 0x6390, 0x6394, 0x6395, 0x6399, 0x639A, 0x639E, 0x63A4,
+ 0x63A6, 0x63AD, 0x63AE, 0x63AF, 0x63BD, 0x63C1, 0x63C5, 0x63C8,
+ 0x63CE, 0x63D1, 0x63D3, 0x63D4, 0x63D5, 0x63DC, 0x63E0, 0x63E5,
+ 0x63EA, 0x63EC, 0x63F2, 0x63F3, 0x63F5, 0x63F8, 0x63F9, 0x6409,
+ 0x640A, 0x6410, 0x6412, 0x6414, 0x6418, 0x641E, 0x6420, 0x6422,
+ 0x6424, 0x6425, 0x6429, 0x642A, 0x642F, 0x6430, 0x6435, 0x643D,
+ 0x643F, 0x644B, 0x644F, 0x6451, 0x6452, 0x6453, 0x6454, 0x645A,
+ 0x645B, 0x645C, 0x645D, 0x645F, 0x6460, 0x6461, 0x6463, 0x646D,
+ 0x6473, 0x6474, 0x647B, 0x647D, 0x6485, 0x6487, 0x648F, 0x6490,
+ 0x6491, 0x6498, 0x6499, 0x649B, 0x649D, 0x649F, 0x64A1, 0x64A3,
+ 0x64A6, 0x64A8, 0x64AC, 0x64B3, 0x64BD, 0x64BE, 0x64BF, ALTCHR,
+/* 0x4120 - 0x417F */
+ ALTCHR, 0x64C4, 0x64C9, 0x64CA, 0x64CB, 0x64CC, 0x64CE, 0x64D0,
+ 0x64D1, 0x64D5, 0x64D7, 0x64E4, 0x64E5, 0x64E9, 0x64EA, 0x64ED,
+ 0x64F0, 0x64F5, 0x64F7, 0x64FB, 0x64FF, 0x6501, 0x6504, 0x6508,
+ 0x6509, 0x650A, 0x650F, 0x6513, 0x6514, 0x6516, 0x6519, 0x651B,
+ 0x651E, 0x651F, 0x6522, 0x6526, 0x6529, 0x652E, 0x6531, 0x653A,
+ 0x653C, 0x653D, 0x6543, 0x6547, 0x6549, 0x6550, 0x6552, 0x6554,
+ 0x655F, 0x6560, 0x6567, 0x656B, 0x657A, 0x657D, 0x6581, 0x6585,
+ 0x658A, 0x6592, 0x6595, 0x6598, 0x659D, 0x65A0, 0x65A3, 0x65A6,
+ 0x65AE, 0x65B2, 0x65B3, 0x65B4, 0x65BF, 0x65C2, 0x65C8, 0x65C9,
+ 0x65CE, 0x65D0, 0x65D4, 0x65D6, 0x65D8, 0x65DF, 0x65F0, 0x65F2,
+ 0x65F4, 0x65F5, 0x65F9, 0x65FE, 0x65FF, 0x6600, 0x6604, 0x6608,
+ 0x6609, 0x660D, 0x6611, 0x6612, 0x6615, 0x6616, 0x661D, ALTCHR,
+/* 0x4220 - 0x427F */
+ ALTCHR, 0x661E, 0x6621, 0x6622, 0x6623, 0x6624, 0x6626, 0x6629,
+ 0x662A, 0x662B, 0x662C, 0x662E, 0x6630, 0x6631, 0x6633, 0x6639,
+ 0x6637, 0x6640, 0x6645, 0x6646, 0x664A, 0x664C, 0x6651, 0x664E,
+ 0x6657, 0x6658, 0x6659, 0x665B, 0x665C, 0x6660, 0x6661, 0x66FB,
+ 0x666A, 0x666B, 0x666C, 0x667E, 0x6673, 0x6675, 0x667F, 0x6677,
+ 0x6678, 0x6679, 0x667B, 0x6680, 0x667C, 0x668B, 0x668C, 0x668D,
+ 0x6690, 0x6692, 0x6699, 0x669A, 0x669B, 0x669C, 0x669F, 0x66A0,
+ 0x66A4, 0x66AD, 0x66B1, 0x66B2, 0x66B5, 0x66BB, 0x66BF, 0x66C0,
+ 0x66C2, 0x66C3, 0x66C8, 0x66CC, 0x66CE, 0x66CF, 0x66D4, 0x66DB,
+ 0x66DF, 0x66E8, 0x66EB, 0x66EC, 0x66EE, 0x66FA, 0x6705, 0x6707,
+ 0x670E, 0x6713, 0x6719, 0x671C, 0x6720, 0x6722, 0x6733, 0x673E,
+ 0x6745, 0x6747, 0x6748, 0x674C, 0x6754, 0x6755, 0x675D, ALTCHR,
+/* 0x4320 - 0x437F */
+ ALTCHR, 0x6766, 0x676C, 0x676E, 0x6774, 0x6776, 0x677B, 0x6781,
+ 0x6784, 0x678E, 0x678F, 0x6791, 0x6793, 0x6796, 0x6798, 0x6799,
+ 0x679B, 0x67B0, 0x67B1, 0x67B2, 0x67B5, 0x67BB, 0x67BC, 0x67BD,
+ 0x67F9, 0x67C0, 0x67C2, 0x67C3, 0x67C5, 0x67C8, 0x67C9, 0x67D2,
+ 0x67D7, 0x67D9, 0x67DC, 0x67E1, 0x67E6, 0x67F0, 0x67F2, 0x67F6,
+ 0x67F7, 0x6852, 0x6814, 0x6819, 0x681D, 0x681F, 0x6828, 0x6827,
+ 0x682C, 0x682D, 0x682F, 0x6830, 0x6831, 0x6833, 0x683B, 0x683F,
+ 0x6844, 0x6845, 0x684A, 0x684C, 0x6855, 0x6857, 0x6858, 0x685B,
+ 0x686B, 0x686E, 0x686F, 0x6870, 0x6871, 0x6872, 0x6875, 0x6879,
+ 0x687A, 0x687B, 0x687C, 0x6882, 0x6884, 0x6886, 0x6888, 0x6896,
+ 0x6898, 0x689A, 0x689C, 0x68A1, 0x68A3, 0x68A5, 0x68A9, 0x68AA,
+ 0x68AE, 0x68B2, 0x68BB, 0x68C5, 0x68C8, 0x68CC, 0x68CF, ALTCHR,
+/* 0x4420 - 0x447F */
+ ALTCHR, 0x68D0, 0x68D1, 0x68D3, 0x68D6, 0x68D9, 0x68DC, 0x68DD,
+ 0x68E5, 0x68E8, 0x68EA, 0x68EB, 0x68EC, 0x68ED, 0x68F0, 0x68F1,
+ 0x68F5, 0x68F6, 0x68FB, 0x68FC, 0x68FD, 0x6906, 0x6909, 0x690A,
+ 0x6910, 0x6911, 0x6913, 0x6916, 0x6917, 0x6931, 0x6933, 0x6935,
+ 0x6938, 0x693B, 0x6942, 0x6945, 0x6949, 0x694E, 0x6957, 0x695B,
+ 0x6963, 0x6964, 0x6965, 0x6966, 0x6968, 0x6969, 0x696C, 0x6970,
+ 0x6971, 0x6972, 0x697A, 0x697B, 0x697F, 0x6980, 0x698D, 0x6992,
+ 0x6996, 0x6998, 0x69A1, 0x69A5, 0x69A6, 0x69A8, 0x69AB, 0x69AD,
+ 0x69AF, 0x69B7, 0x69B8, 0x69BA, 0x69BC, 0x69C5, 0x69C8, 0x69D1,
+ 0x69D6, 0x69D7, 0x69E2, 0x69E5, 0x69EE, 0x69EF, 0x69F1, 0x69F3,
+ 0x69F5, 0x69FE, 0x6A00, 0x6A01, 0x6A03, 0x6A0F, 0x6A11, 0x6A15,
+ 0x6A1A, 0x6A1D, 0x6A20, 0x6A24, 0x6A28, 0x6A30, 0x6A32, ALTCHR,
+/* 0x4520 - 0x457F */
+ ALTCHR, 0x6A34, 0x6A37, 0x6A3B, 0x6A3E, 0x6A3F, 0x6A45, 0x6A46,
+ 0x6A49, 0x6A4A, 0x6A4E, 0x6A50, 0x6A51, 0x6A52, 0x6A55, 0x6A56,
+ 0x6A5B, 0x6A64, 0x6A67, 0x6A6A, 0x6A71, 0x6A73, 0x6A7E, 0x6A81,
+ 0x6A83, 0x6A86, 0x6A87, 0x6A89, 0x6A8B, 0x6A91, 0x6A9B, 0x6A9D,
+ 0x6A9E, 0x6A9F, 0x6AA5, 0x6AAB, 0x6AAF, 0x6AB0, 0x6AB1, 0x6AB4,
+ 0x6ABD, 0x6ABE, 0x6ABF, 0x6AC6, 0x6AC9, 0x6AC8, 0x6ACC, 0x6AD0,
+ 0x6AD4, 0x6AD5, 0x6AD6, 0x6ADC, 0x6ADD, 0x6AE4, 0x6AE7, 0x6AEC,
+ 0x6AF0, 0x6AF1, 0x6AF2, 0x6AFC, 0x6AFD, 0x6B02, 0x6B03, 0x6B06,
+ 0x6B07, 0x6B09, 0x6B0F, 0x6B10, 0x6B11, 0x6B17, 0x6B1B, 0x6B1E,
+ 0x6B24, 0x6B28, 0x6B2B, 0x6B2C, 0x6B2F, 0x6B35, 0x6B36, 0x6B3B,
+ 0x6B3F, 0x6B46, 0x6B4A, 0x6B4D, 0x6B52, 0x6B56, 0x6B58, 0x6B5D,
+ 0x6B60, 0x6B67, 0x6B6B, 0x6B6E, 0x6B70, 0x6B75, 0x6B7D, ALTCHR,
+/* 0x4620 - 0x467F */
+ ALTCHR, 0x6B7E, 0x6B82, 0x6B85, 0x6B97, 0x6B9B, 0x6B9F, 0x6BA0,
+ 0x6BA2, 0x6BA3, 0x6BA8, 0x6BA9, 0x6BAC, 0x6BAD, 0x6BAE, 0x6BB0,
+ 0x6BB8, 0x6BB9, 0x6BBD, 0x6BBE, 0x6BC3, 0x6BC4, 0x6BC9, 0x6BCC,
+ 0x6BD6, 0x6BDA, 0x6BE1, 0x6BE3, 0x6BE6, 0x6BE7, 0x6BEE, 0x6BF1,
+ 0x6BF7, 0x6BF9, 0x6BFF, 0x6C02, 0x6C04, 0x6C05, 0x6C09, 0x6C0D,
+ 0x6C0E, 0x6C10, 0x6C12, 0x6C19, 0x6C1F, 0x6C26, 0x6C27, 0x6C28,
+ 0x6C2C, 0x6C2E, 0x6C33, 0x6C35, 0x6C36, 0x6C3A, 0x6C3B, 0x6C3F,
+ 0x6C4A, 0x6C4B, 0x6C4D, 0x6C4F, 0x6C52, 0x6C54, 0x6C59, 0x6C5B,
+ 0x6C5C, 0x6C6B, 0x6C6D, 0x6C6F, 0x6C74, 0x6C76, 0x6C78, 0x6C79,
+ 0x6C7B, 0x6C85, 0x6C86, 0x6C87, 0x6C89, 0x6C94, 0x6C95, 0x6C97,
+ 0x6C98, 0x6C9C, 0x6C9F, 0x6CB0, 0x6CB2, 0x6CB4, 0x6CC2, 0x6CC6,
+ 0x6CCD, 0x6CCF, 0x6CD0, 0x6CD1, 0x6CD2, 0x6CD4, 0x6CD6, ALTCHR,
+/* 0x4720 - 0x477F */
+ ALTCHR, 0x6CDA, 0x6CDC, 0x6CE0, 0x6CE7, 0x6CE9, 0x6CEB, 0x6CEC,
+ 0x6CEE, 0x6CF2, 0x6CF4, 0x6D04, 0x6D07, 0x6D0A, 0x6D0E, 0x6D0F,
+ 0x6D11, 0x6D13, 0x6D1A, 0x6D26, 0x6D27, 0x6D28, 0x6C67, 0x6D2E,
+ 0x6D2F, 0x6D31, 0x6D39, 0x6D3C, 0x6D3F, 0x6D57, 0x6D5E, 0x6D5F,
+ 0x6D61, 0x6D65, 0x6D67, 0x6D6F, 0x6D70, 0x6D7C, 0x6D82, 0x6D87,
+ 0x6D91, 0x6D92, 0x6D94, 0x6D96, 0x6D97, 0x6D98, 0x6DAA, 0x6DAC,
+ 0x6DB4, 0x6DB7, 0x6DB9, 0x6DBD, 0x6DBF, 0x6DC4, 0x6DC8, 0x6DCA,
+ 0x6DCE, 0x6DCF, 0x6DD6, 0x6DDB, 0x6DDD, 0x6DDF, 0x6DE0, 0x6DE2,
+ 0x6DE5, 0x6DE9, 0x6DEF, 0x6DF0, 0x6DF4, 0x6DF6, 0x6DFC, 0x6E00,
+ 0x6E04, 0x6E1E, 0x6E22, 0x6E27, 0x6E32, 0x6E36, 0x6E39, 0x6E3B,
+ 0x6E3C, 0x6E44, 0x6E45, 0x6E48, 0x6E49, 0x6E4B, 0x6E4F, 0x6E51,
+ 0x6E52, 0x6E53, 0x6E54, 0x6E57, 0x6E5C, 0x6E5D, 0x6E5E, ALTCHR,
+/* 0x4820 - 0x487F */
+ ALTCHR, 0x6E62, 0x6E63, 0x6E68, 0x6E73, 0x6E7B, 0x6E7D, 0x6E8D,
+ 0x6E93, 0x6E99, 0x6EA0, 0x6EA7, 0x6EAD, 0x6EAE, 0x6EB1, 0x6EB3,
+ 0x6EBB, 0x6EBF, 0x6EC0, 0x6EC1, 0x6EC3, 0x6EC7, 0x6EC8, 0x6ECA,
+ 0x6ECD, 0x6ECE, 0x6ECF, 0x6EEB, 0x6EED, 0x6EEE, 0x6EF9, 0x6EFB,
+ 0x6EFD, 0x6F04, 0x6F08, 0x6F0A, 0x6F0C, 0x6F0D, 0x6F16, 0x6F18,
+ 0x6F1A, 0x6F1B, 0x6F26, 0x6F29, 0x6F2A, 0x6F2F, 0x6F30, 0x6F33,
+ 0x6F36, 0x6F3B, 0x6F3C, 0x6F2D, 0x6F4F, 0x6F51, 0x6F52, 0x6F53,
+ 0x6F57, 0x6F59, 0x6F5A, 0x6F5D, 0x6F5E, 0x6F61, 0x6F62, 0x6F68,
+ 0x6F6C, 0x6F7D, 0x6F7E, 0x6F83, 0x6F87, 0x6F88, 0x6F8B, 0x6F8C,
+ 0x6F8D, 0x6F90, 0x6F92, 0x6F93, 0x6F94, 0x6F96, 0x6F9A, 0x6F9F,
+ 0x6FA0, 0x6FA5, 0x6FA6, 0x6FA7, 0x6FA8, 0x6FAE, 0x6FAF, 0x6FB0,
+ 0x6FB5, 0x6FB6, 0x6FBC, 0x6FC5, 0x6FC7, 0x6FC8, 0x6FCA, ALTCHR,
+/* 0x4920 - 0x497F */
+ ALTCHR, 0x6FDA, 0x6FDE, 0x6FE8, 0x6FE9, 0x6FF0, 0x6FF5, 0x6FF9,
+ 0x6FFC, 0x6FFD, 0x7000, 0x7005, 0x7006, 0x7007, 0x700D, 0x7017,
+ 0x7020, 0x7023, 0x702F, 0x7034, 0x7037, 0x7039, 0x703C, 0x7043,
+ 0x7044, 0x7048, 0x7049, 0x704A, 0x704B, 0x7054, 0x7055, 0x705D,
+ 0x705E, 0x704E, 0x7064, 0x7065, 0x706C, 0x706E, 0x7075, 0x7076,
+ 0x707E, 0x7081, 0x7085, 0x7086, 0x7094, 0x7095, 0x7096, 0x7097,
+ 0x7098, 0x709B, 0x70A4, 0x70AB, 0x70B0, 0x70B1, 0x70B4, 0x70B7,
+ 0x70CA, 0x70D1, 0x70D3, 0x70D4, 0x70D5, 0x70D6, 0x70D8, 0x70DC,
+ 0x70E4, 0x70FA, 0x7103, 0x7104, 0x7105, 0x7106, 0x7107, 0x710B,
+ 0x710C, 0x710F, 0x711E, 0x7120, 0x712B, 0x712D, 0x712F, 0x7130,
+ 0x7131, 0x7138, 0x7141, 0x7145, 0x7146, 0x7147, 0x714A, 0x714B,
+ 0x7150, 0x7152, 0x7157, 0x715A, 0x715C, 0x715E, 0x7160, ALTCHR,
+/* 0x4A20 - 0x4A7F */
+ ALTCHR, 0x7168, 0x7179, 0x7180, 0x7185, 0x7187, 0x718C, 0x7192,
+ 0x719A, 0x719B, 0x71A0, 0x71A2, 0x71AF, 0x71B0, 0x71B2, 0x71B3,
+ 0x71BA, 0x71BF, 0x71C0, 0x71C1, 0x71C4, 0x71CB, 0x71CC, 0x71D3,
+ 0x71D6, 0x71D9, 0x71DA, 0x71DC, 0x71F8, 0x71FE, 0x7200, 0x7207,
+ 0x7208, 0x7209, 0x7213, 0x7217, 0x721A, 0x721D, 0x721F, 0x7224,
+ 0x722B, 0x722F, 0x7234, 0x7238, 0x7239, 0x7241, 0x7242, 0x7243,
+ 0x7245, 0x724E, 0x724F, 0x7250, 0x7253, 0x7255, 0x7256, 0x725A,
+ 0x725C, 0x725E, 0x7260, 0x7263, 0x7268, 0x726B, 0x726E, 0x726F,
+ 0x7271, 0x7277, 0x7278, 0x727B, 0x727C, 0x727F, 0x7284, 0x7289,
+ 0x728D, 0x728E, 0x7293, 0x729B, 0x72A8, 0x72AD, 0x72AE, 0x72B1,
+ 0x72B4, 0x72BE, 0x72C1, 0x72C7, 0x72C9, 0x72CC, 0x72D5, 0x72D6,
+ 0x72D8, 0x72DF, 0x72E5, 0x72F3, 0x72F4, 0x72FA, 0x72FB, ALTCHR,
+/* 0x4B20 - 0x4B7F */
+ ALTCHR, 0x72FE, 0x7302, 0x7304, 0x7305, 0x7307, 0x730B, 0x730D,
+ 0x7312, 0x7313, 0x7318, 0x7319, 0x731E, 0x7322, 0x7324, 0x7327,
+ 0x7328, 0x732C, 0x7331, 0x7332, 0x7335, 0x733A, 0x733B, 0x733D,
+ 0x7343, 0x734D, 0x7350, 0x7352, 0x7356, 0x7358, 0x735D, 0x735E,
+ 0x735F, 0x7360, 0x7366, 0x7367, 0x7369, 0x736B, 0x736C, 0x736E,
+ 0x736F, 0x7371, 0x7377, 0x7379, 0x737C, 0x7380, 0x7381, 0x7383,
+ 0x7385, 0x7386, 0x738E, 0x7390, 0x7393, 0x7395, 0x7397, 0x7398,
+ 0x739C, 0x739E, 0x739F, 0x73A0, 0x73A2, 0x73A5, 0x73A6, 0x73AA,
+ 0x73AB, 0x73AD, 0x73B5, 0x73B7, 0x73B9, 0x73BC, 0x73BD, 0x73BF,
+ 0x73C5, 0x73C6, 0x73C9, 0x73CB, 0x73CC, 0x73CF, 0x73D2, 0x73D3,
+ 0x73D6, 0x73D9, 0x73DD, 0x73E1, 0x73E3, 0x73E6, 0x73E7, 0x73E9,
+ 0x73F4, 0x73F5, 0x73F7, 0x73F9, 0x73FA, 0x73FB, 0x73FD, ALTCHR,
+/* 0x4C20 - 0x4C7F */
+ ALTCHR, 0x73FF, 0x7400, 0x7401, 0x7404, 0x7407, 0x740A, 0x7411,
+ 0x741A, 0x741B, 0x7424, 0x7426, 0x7428, 0x7429, 0x742A, 0x742B,
+ 0x742C, 0x742D, 0x742E, 0x742F, 0x7430, 0x7431, 0x7439, 0x7440,
+ 0x7443, 0x7444, 0x7446, 0x7447, 0x744B, 0x744D, 0x7451, 0x7452,
+ 0x7457, 0x745D, 0x7462, 0x7466, 0x7467, 0x7468, 0x746B, 0x746D,
+ 0x746E, 0x7471, 0x7472, 0x7480, 0x7481, 0x7485, 0x7486, 0x7487,
+ 0x7489, 0x748F, 0x7490, 0x7491, 0x7492, 0x7498, 0x7499, 0x749A,
+ 0x749C, 0x749F, 0x74A0, 0x74A1, 0x74A3, 0x74A6, 0x74A8, 0x74A9,
+ 0x74AA, 0x74AB, 0x74AE, 0x74AF, 0x74B1, 0x74B2, 0x74B5, 0x74B9,
+ 0x74BB, 0x74BF, 0x74C8, 0x74C9, 0x74CC, 0x74D0, 0x74D3, 0x74D8,
+ 0x74DA, 0x74DB, 0x74DE, 0x74DF, 0x74E4, 0x74E8, 0x74EA, 0x74EB,
+ 0x74EF, 0x74F4, 0x74FA, 0x74FB, 0x74FC, 0x74FF, 0x7506, ALTCHR,
+/* 0x4D20 - 0x4D7F */
+ ALTCHR, 0x7512, 0x7516, 0x7517, 0x7520, 0x7521, 0x7524, 0x7527,
+ 0x7529, 0x752A, 0x752F, 0x7536, 0x7539, 0x753D, 0x753E, 0x753F,
+ 0x7540, 0x7543, 0x7547, 0x7548, 0x754E, 0x7550, 0x7552, 0x7557,
+ 0x755E, 0x755F, 0x7561, 0x756F, 0x7571, 0x7579, 0x757A, 0x757B,
+ 0x757C, 0x757D, 0x757E, 0x7581, 0x7585, 0x7590, 0x7592, 0x7593,
+ 0x7595, 0x7599, 0x759C, 0x75A2, 0x75A4, 0x75B4, 0x75BA, 0x75BF,
+ 0x75C0, 0x75C1, 0x75C4, 0x75C6, 0x75CC, 0x75CE, 0x75CF, 0x75D7,
+ 0x75DC, 0x75DF, 0x75E0, 0x75E1, 0x75E4, 0x75E7, 0x75EC, 0x75EE,
+ 0x75EF, 0x75F1, 0x75F9, 0x7600, 0x7602, 0x7603, 0x7604, 0x7607,
+ 0x7608, 0x760A, 0x760C, 0x760F, 0x7612, 0x7613, 0x7615, 0x7616,
+ 0x7619, 0x761B, 0x761C, 0x761D, 0x761E, 0x7623, 0x7625, 0x7626,
+ 0x7629, 0x762D, 0x7632, 0x7633, 0x7635, 0x7638, 0x7639, ALTCHR,
+/* 0x4E20 - 0x4E7F */
+ ALTCHR, 0x763A, 0x763C, 0x764A, 0x7640, 0x7641, 0x7643, 0x7644,
+ 0x7645, 0x7649, 0x764B, 0x7655, 0x7659, 0x765F, 0x7664, 0x7665,
+ 0x766D, 0x766E, 0x766F, 0x7671, 0x7674, 0x7681, 0x7685, 0x768C,
+ 0x768D, 0x7695, 0x769B, 0x769C, 0x769D, 0x769F, 0x76A0, 0x76A2,
+ 0x76A3, 0x76A4, 0x76A5, 0x76A6, 0x76A7, 0x76A8, 0x76AA, 0x76AD,
+ 0x76BD, 0x76C1, 0x76C5, 0x76C9, 0x76CB, 0x76CC, 0x76CE, 0x76D4,
+ 0x76D9, 0x76E0, 0x76E6, 0x76E8, 0x76EC, 0x76F0, 0x76F1, 0x76F6,
+ 0x76F9, 0x76FC, 0x7700, 0x7706, 0x770A, 0x770E, 0x7712, 0x7714,
+ 0x7715, 0x7717, 0x7719, 0x771A, 0x771C, 0x7722, 0x7728, 0x772D,
+ 0x772E, 0x772F, 0x7734, 0x7735, 0x7736, 0x7739, 0x773D, 0x773E,
+ 0x7742, 0x7745, 0x7746, 0x774A, 0x774D, 0x774E, 0x774F, 0x7752,
+ 0x7756, 0x7757, 0x775C, 0x775E, 0x775F, 0x7760, 0x7762, ALTCHR,
+/* 0x4F20 - 0x4F7F */
+ ALTCHR, 0x7764, 0x7767, 0x776A, 0x776C, 0x7770, 0x7772, 0x7773,
+ 0x7774, 0x777A, 0x777D, 0x7780, 0x7784, 0x778C, 0x778D, 0x7794,
+ 0x7795, 0x7796, 0x779A, 0x779F, 0x77A2, 0x77A7, 0x77AA, 0x77AE,
+ 0x77AF, 0x77B1, 0x77B5, 0x77BE, 0x77C3, 0x77C9, 0x77D1, 0x77D2,
+ 0x77D5, 0x77D9, 0x77DE, 0x77DF, 0x77E0, 0x77E4, 0x77E6, 0x77EA,
+ 0x77EC, 0x77F0, 0x77F1, 0x77F4, 0x77F8, 0x77FB, 0x7805, 0x7806,
+ 0x7809, 0x780D, 0x780E, 0x7811, 0x781D, 0x7821, 0x7822, 0x7823,
+ 0x782D, 0x782E, 0x7830, 0x7835, 0x7837, 0x7843, 0x7844, 0x7847,
+ 0x7848, 0x784C, 0x784E, 0x7852, 0x785C, 0x785E, 0x7860, 0x7861,
+ 0x7863, 0x7864, 0x7868, 0x786A, 0x786E, 0x787A, 0x787E, 0x788A,
+ 0x788F, 0x7894, 0x7898, 0x78A1, 0x789D, 0x789E, 0x789F, 0x78A4,
+ 0x78A8, 0x78AC, 0x78AD, 0x78B0, 0x78B1, 0x78B2, 0x78B3, ALTCHR,
+/* 0x5020 - 0x507F */
+ ALTCHR, 0x78BB, 0x78BD, 0x78BF, 0x78C7, 0x78C8, 0x78C9, 0x78CC,
+ 0x78CE, 0x78D2, 0x78D3, 0x78D5, 0x78D6, 0x78E4, 0x78DB, 0x78DF,
+ 0x78E0, 0x78E1, 0x78E6, 0x78EA, 0x78F2, 0x78F3, 0x7900, 0x78F6,
+ 0x78F7, 0x78FA, 0x78FB, 0x78FF, 0x7906, 0x790C, 0x7910, 0x791A,
+ 0x791C, 0x791E, 0x791F, 0x7920, 0x7925, 0x7927, 0x7929, 0x792D,
+ 0x7931, 0x7934, 0x7935, 0x793B, 0x793D, 0x793F, 0x7944, 0x7945,
+ 0x7946, 0x794A, 0x794B, 0x794F, 0x7951, 0x7954, 0x7958, 0x795B,
+ 0x795C, 0x7967, 0x7969, 0x796B, 0x7972, 0x7979, 0x797B, 0x797C,
+ 0x797E, 0x798B, 0x798C, 0x7991, 0x7993, 0x7994, 0x7995, 0x7996,
+ 0x7998, 0x799B, 0x799C, 0x79A1, 0x79A8, 0x79A9, 0x79AB, 0x79AF,
+ 0x79B1, 0x79B4, 0x79B8, 0x79BB, 0x79C2, 0x79C4, 0x79C7, 0x79C8,
+ 0x79CA, 0x79CF, 0x79D4, 0x79D6, 0x79DA, 0x79DD, 0x79DE, ALTCHR,
+/* 0x5120 - 0x517F */
+ ALTCHR, 0x79E0, 0x79E2, 0x79E5, 0x79EA, 0x79EB, 0x79ED, 0x79F1,
+ 0x79F8, 0x79FC, 0x7A02, 0x7A03, 0x7A07, 0x7A09, 0x7A0A, 0x7A0C,
+ 0x7A11, 0x7A15, 0x7A1B, 0x7A1E, 0x7A21, 0x7A27, 0x7A2B, 0x7A2D,
+ 0x7A2F, 0x7A30, 0x7A34, 0x7A35, 0x7A38, 0x7A39, 0x7A3A, 0x7A44,
+ 0x7A45, 0x7A47, 0x7A48, 0x7A4C, 0x7A55, 0x7A56, 0x7A59, 0x7A5C,
+ 0x7A5D, 0x7A5F, 0x7A60, 0x7A65, 0x7A67, 0x7A6A, 0x7A6D, 0x7A75,
+ 0x7A78, 0x7A7E, 0x7A80, 0x7A82, 0x7A85, 0x7A86, 0x7A8A, 0x7A8B,
+ 0x7A90, 0x7A91, 0x7A94, 0x7A9E, 0x7AA0, 0x7AA3, 0x7AAC, 0x7AB3,
+ 0x7AB5, 0x7AB9, 0x7ABB, 0x7ABC, 0x7AC6, 0x7AC9, 0x7ACC, 0x7ACE,
+ 0x7AD1, 0x7ADB, 0x7AE8, 0x7AE9, 0x7AEB, 0x7AEC, 0x7AF1, 0x7AF4,
+ 0x7AFB, 0x7AFD, 0x7AFE, 0x7B07, 0x7B14, 0x7B1F, 0x7B23, 0x7B27,
+ 0x7B29, 0x7B2A, 0x7B2B, 0x7B2D, 0x7B2E, 0x7B2F, 0x7B30, ALTCHR,
+/* 0x5220 - 0x527F */
+ ALTCHR, 0x7B31, 0x7B34, 0x7B3D, 0x7B3F, 0x7B40, 0x7B41, 0x7B47,
+ 0x7B4E, 0x7B55, 0x7B60, 0x7B64, 0x7B66, 0x7B69, 0x7B6A, 0x7B6D,
+ 0x7B6F, 0x7B72, 0x7B73, 0x7B77, 0x7B84, 0x7B89, 0x7B8E, 0x7B90,
+ 0x7B91, 0x7B96, 0x7B9B, 0x7B9E, 0x7BA0, 0x7BA5, 0x7BAC, 0x7BAF,
+ 0x7BB0, 0x7BB2, 0x7BB5, 0x7BB6, 0x7BBA, 0x7BBB, 0x7BBC, 0x7BBD,
+ 0x7BC2, 0x7BC5, 0x7BC8, 0x7BCA, 0x7BD4, 0x7BD6, 0x7BD7, 0x7BD9,
+ 0x7BDA, 0x7BDB, 0x7BE8, 0x7BEA, 0x7BF2, 0x7BF4, 0x7BF5, 0x7BF8,
+ 0x7BF9, 0x7BFA, 0x7BFC, 0x7BFE, 0x7C01, 0x7C02, 0x7C03, 0x7C04,
+ 0x7C06, 0x7C09, 0x7C0B, 0x7C0C, 0x7C0E, 0x7C0F, 0x7C19, 0x7C1B,
+ 0x7C20, 0x7C25, 0x7C26, 0x7C28, 0x7C2C, 0x7C31, 0x7C33, 0x7C34,
+ 0x7C36, 0x7C39, 0x7C3A, 0x7C46, 0x7C4A, 0x7C55, 0x7C51, 0x7C52,
+ 0x7C53, 0x7C59, 0x7C5A, 0x7C5B, 0x7C5C, 0x7C5D, 0x7C5E, ALTCHR,
+/* 0x5320 - 0x537F */
+ ALTCHR, 0x7C61, 0x7C63, 0x7C67, 0x7C69, 0x7C6D, 0x7C6E, 0x7C70,
+ 0x7C72, 0x7C79, 0x7C7C, 0x7C7D, 0x7C86, 0x7C87, 0x7C8F, 0x7C94,
+ 0x7C9E, 0x7CA0, 0x7CA6, 0x7CB0, 0x7CB6, 0x7CB7, 0x7CBA, 0x7CBB,
+ 0x7CBC, 0x7CBF, 0x7CC4, 0x7CC7, 0x7CC8, 0x7CC9, 0x7CCD, 0x7CCF,
+ 0x7CD3, 0x7CD4, 0x7CD5, 0x7CD7, 0x7CD9, 0x7CDA, 0x7CDD, 0x7CE6,
+ 0x7CE9, 0x7CEB, 0x7CF5, 0x7D03, 0x7D07, 0x7D08, 0x7D09, 0x7D0F,
+ 0x7D11, 0x7D12, 0x7D13, 0x7D16, 0x7D1D, 0x7D1E, 0x7D23, 0x7D26,
+ 0x7D2A, 0x7D2D, 0x7D31, 0x7D3C, 0x7D3D, 0x7D3E, 0x7D40, 0x7D41,
+ 0x7D47, 0x7D48, 0x7D4D, 0x7D51, 0x7D53, 0x7D57, 0x7D59, 0x7D5A,
+ 0x7D5C, 0x7D5D, 0x7D65, 0x7D67, 0x7D6A, 0x7D70, 0x7D78, 0x7D7A,
+ 0x7D7B, 0x7D7F, 0x7D81, 0x7D82, 0x7D83, 0x7D85, 0x7D86, 0x7D88,
+ 0x7D8B, 0x7D8C, 0x7D8D, 0x7D91, 0x7D96, 0x7D97, 0x7D9D, ALTCHR,
+/* 0x5420 - 0x547F */
+ ALTCHR, 0x7D9E, 0x7DA6, 0x7DA7, 0x7DAA, 0x7DB3, 0x7DB6, 0x7DB7,
+ 0x7DB9, 0x7DC2, 0x7DC3, 0x7DC4, 0x7DC5, 0x7DC6, 0x7DCC, 0x7DCD,
+ 0x7DCE, 0x7DD7, 0x7DD9, 0x7E00, 0x7DE2, 0x7DE5, 0x7DE6, 0x7DEA,
+ 0x7DEB, 0x7DED, 0x7DF1, 0x7DF5, 0x7DF6, 0x7DF9, 0x7DFA, 0x7E08,
+ 0x7E10, 0x7E11, 0x7E15, 0x7E17, 0x7E1C, 0x7E1D, 0x7E20, 0x7E27,
+ 0x7E28, 0x7E2C, 0x7E2D, 0x7E2F, 0x7E33, 0x7E36, 0x7E3F, 0x7E44,
+ 0x7E45, 0x7E47, 0x7E4E, 0x7E50, 0x7E52, 0x7E58, 0x7E5F, 0x7E61,
+ 0x7E62, 0x7E65, 0x7E6B, 0x7E6E, 0x7E6F, 0x7E73, 0x7E78, 0x7E7E,
+ 0x7E81, 0x7E86, 0x7E87, 0x7E8A, 0x7E8D, 0x7E91, 0x7E95, 0x7E98,
+ 0x7E9A, 0x7E9D, 0x7E9E, 0x7F3C, 0x7F3B, 0x7F3D, 0x7F3E, 0x7F3F,
+ 0x7F43, 0x7F44, 0x7F47, 0x7F4F, 0x7F52, 0x7F53, 0x7F5B, 0x7F5C,
+ 0x7F5D, 0x7F61, 0x7F63, 0x7F64, 0x7F65, 0x7F66, 0x7F6D, ALTCHR,
+/* 0x5520 - 0x557F */
+ ALTCHR, 0x7F71, 0x7F7D, 0x7F7E, 0x7F7F, 0x7F80, 0x7F8B, 0x7F8D,
+ 0x7F8F, 0x7F90, 0x7F91, 0x7F96, 0x7F97, 0x7F9C, 0x7FA1, 0x7FA2,
+ 0x7FA6, 0x7FAA, 0x7FAD, 0x7FB4, 0x7FBC, 0x7FBF, 0x7FC0, 0x7FC3,
+ 0x7FC8, 0x7FCE, 0x7FCF, 0x7FDB, 0x7FDF, 0x7FE3, 0x7FE5, 0x7FE8,
+ 0x7FEC, 0x7FEE, 0x7FEF, 0x7FF2, 0x7FFA, 0x7FFD, 0x7FFE, 0x7FFF,
+ 0x8007, 0x8008, 0x800A, 0x800D, 0x800E, 0x800F, 0x8011, 0x8013,
+ 0x8014, 0x8016, 0x801D, 0x801E, 0x801F, 0x8020, 0x8024, 0x8026,
+ 0x802C, 0x802E, 0x8030, 0x8034, 0x8035, 0x8037, 0x8039, 0x803A,
+ 0x803C, 0x803E, 0x8040, 0x8044, 0x8060, 0x8064, 0x8066, 0x806D,
+ 0x8071, 0x8075, 0x8081, 0x8088, 0x808E, 0x809C, 0x809E, 0x80A6,
+ 0x80A7, 0x80AB, 0x80B8, 0x80B9, 0x80C8, 0x80CD, 0x80CF, 0x80D2,
+ 0x80D4, 0x80D5, 0x80D7, 0x80D8, 0x80E0, 0x80ED, 0x80EE, ALTCHR,
+/* 0x5620 - 0x567F */
+ ALTCHR, 0x80F0, 0x80F2, 0x80F3, 0x80F6, 0x80F9, 0x80FA, 0x80FE,
+ 0x8103, 0x810B, 0x8116, 0x8117, 0x8118, 0x811C, 0x811E, 0x8120,
+ 0x8124, 0x8127, 0x812C, 0x8130, 0x8135, 0x813A, 0x813C, 0x8145,
+ 0x8147, 0x814A, 0x814C, 0x8152, 0x8157, 0x8160, 0x8161, 0x8167,
+ 0x8168, 0x8169, 0x816D, 0x816F, 0x8177, 0x8181, 0x8190, 0x8184,
+ 0x8185, 0x8186, 0x818B, 0x818E, 0x8196, 0x8198, 0x819B, 0x819E,
+ 0x81A2, 0x81AE, 0x81B2, 0x81B4, 0x81BB, 0x81CB, 0x81C3, 0x81C5,
+ 0x81CA, 0x81CE, 0x81CF, 0x81D5, 0x81D7, 0x81DB, 0x81DD, 0x81DE,
+ 0x81E1, 0x81E4, 0x81EB, 0x81EC, 0x81F0, 0x81F1, 0x81F2, 0x81F5,
+ 0x81F6, 0x81F8, 0x81F9, 0x81FD, 0x81FF, 0x8200, 0x8203, 0x820F,
+ 0x8213, 0x8214, 0x8219, 0x821A, 0x821D, 0x8221, 0x8222, 0x8228,
+ 0x8232, 0x8234, 0x823A, 0x8243, 0x8244, 0x8245, 0x8246, ALTCHR,
+/* 0x5720 - 0x577F */
+ ALTCHR, 0x824B, 0x824E, 0x824F, 0x8251, 0x8256, 0x825C, 0x8260,
+ 0x8263, 0x8267, 0x826D, 0x8274, 0x827B, 0x827D, 0x827F, 0x8280,
+ 0x8281, 0x8283, 0x8284, 0x8287, 0x8289, 0x828A, 0x828E, 0x8291,
+ 0x8294, 0x8296, 0x8298, 0x829A, 0x829B, 0x82A0, 0x82A1, 0x82A3,
+ 0x82A4, 0x82A7, 0x82A8, 0x82A9, 0x82AA, 0x82AE, 0x82B0, 0x82B2,
+ 0x82B4, 0x82B7, 0x82BA, 0x82BC, 0x82BE, 0x82BF, 0x82C6, 0x82D0,
+ 0x82D5, 0x82DA, 0x82E0, 0x82E2, 0x82E4, 0x82E8, 0x82EA, 0x82ED,
+ 0x82EF, 0x82F6, 0x82F7, 0x82FD, 0x82FE, 0x8300, 0x8301, 0x8307,
+ 0x8308, 0x830A, 0x830B, 0x8354, 0x831B, 0x831D, 0x831E, 0x831F,
+ 0x8321, 0x8322, 0x832C, 0x832D, 0x832E, 0x8330, 0x8333, 0x8337,
+ 0x833A, 0x833C, 0x833D, 0x8342, 0x8343, 0x8344, 0x8347, 0x834D,
+ 0x834E, 0x8351, 0x8355, 0x8356, 0x8357, 0x8370, 0x8378, ALTCHR,
+/* 0x5820 - 0x587F */
+ ALTCHR, 0x837D, 0x837F, 0x8380, 0x8382, 0x8384, 0x8386, 0x838D,
+ 0x8392, 0x8394, 0x8395, 0x8398, 0x8399, 0x839B, 0x839C, 0x839D,
+ 0x83A6, 0x83A7, 0x83A9, 0x83AC, 0x83BE, 0x83BF, 0x83C0, 0x83C7,
+ 0x83C9, 0x83CF, 0x83D0, 0x83D1, 0x83D4, 0x83DD, 0x8353, 0x83E8,
+ 0x83EA, 0x83F6, 0x83F8, 0x83F9, 0x83FC, 0x8401, 0x8406, 0x840A,
+ 0x840F, 0x8411, 0x8415, 0x8419, 0x83AD, 0x842F, 0x8439, 0x8445,
+ 0x8447, 0x8448, 0x844A, 0x844D, 0x844F, 0x8451, 0x8452, 0x8456,
+ 0x8458, 0x8459, 0x845A, 0x845C, 0x8460, 0x8464, 0x8465, 0x8467,
+ 0x846A, 0x8470, 0x8473, 0x8474, 0x8476, 0x8478, 0x847C, 0x847D,
+ 0x8481, 0x8485, 0x8492, 0x8493, 0x8495, 0x849E, 0x84A6, 0x84A8,
+ 0x84A9, 0x84AA, 0x84AF, 0x84B1, 0x84B4, 0x84BA, 0x84BD, 0x84BE,
+ 0x84C0, 0x84C2, 0x84C7, 0x84C8, 0x84CC, 0x84CF, 0x84D3, ALTCHR,
+/* 0x5920 - 0x597F */
+ ALTCHR, 0x84DC, 0x84E7, 0x84EA, 0x84EF, 0x84F0, 0x84F1, 0x84F2,
+ 0x84F7, 0x8532, 0x84FA, 0x84FB, 0x84FD, 0x8502, 0x8503, 0x8507,
+ 0x850C, 0x850E, 0x8510, 0x851C, 0x851E, 0x8522, 0x8523, 0x8524,
+ 0x8525, 0x8527, 0x852A, 0x852B, 0x852F, 0x8533, 0x8534, 0x8536,
+ 0x853F, 0x8546, 0x854F, 0x8550, 0x8551, 0x8552, 0x8553, 0x8556,
+ 0x8559, 0x855C, 0x855D, 0x855E, 0x855F, 0x8560, 0x8561, 0x8562,
+ 0x8564, 0x856B, 0x856F, 0x8579, 0x857A, 0x857B, 0x857D, 0x857F,
+ 0x8581, 0x8585, 0x8586, 0x8589, 0x858B, 0x858C, 0x858F, 0x8593,
+ 0x8598, 0x859D, 0x859F, 0x85A0, 0x85A2, 0x85A5, 0x85A7, 0x85B4,
+ 0x85B6, 0x85B7, 0x85B8, 0x85BC, 0x85BD, 0x85BE, 0x85BF, 0x85C2,
+ 0x85C7, 0x85CA, 0x85CB, 0x85CE, 0x85AD, 0x85D8, 0x85DA, 0x85DF,
+ 0x85E0, 0x85E6, 0x85E8, 0x85ED, 0x85F3, 0x85F6, 0x85FC, ALTCHR,
+/* 0x5A20 - 0x5A7F */
+ ALTCHR, 0x85FF, 0x8600, 0x8604, 0x8605, 0x860D, 0x860E, 0x8610,
+ 0x8611, 0x8612, 0x8618, 0x8619, 0x861B, 0x861E, 0x8621, 0x8627,
+ 0x8629, 0x8636, 0x8638, 0x863A, 0x863C, 0x863D, 0x8640, 0x8642,
+ 0x8646, 0x8652, 0x8653, 0x8656, 0x8657, 0x8658, 0x8659, 0x865D,
+ 0x8660, 0x8661, 0x8662, 0x8663, 0x8664, 0x8669, 0x866C, 0x866F,
+ 0x8675, 0x8676, 0x8677, 0x867A, 0x868D, 0x8691, 0x8696, 0x8698,
+ 0x869A, 0x869C, 0x86A1, 0x86A6, 0x86A7, 0x86A8, 0x86AD, 0x86B1,
+ 0x86B3, 0x86B4, 0x86B5, 0x86B7, 0x86B8, 0x86B9, 0x86BF, 0x86C0,
+ 0x86C1, 0x86C3, 0x86C5, 0x86D1, 0x86D2, 0x86D5, 0x86D7, 0x86DA,
+ 0x86DC, 0x86E0, 0x86E3, 0x86E5, 0x86E7, 0x8688, 0x86FA, 0x86FC,
+ 0x86FD, 0x8704, 0x8705, 0x8707, 0x870B, 0x870E, 0x870F, 0x8710,
+ 0x8713, 0x8714, 0x8719, 0x871E, 0x871F, 0x8721, 0x8723, ALTCHR,
+/* 0x5B20 - 0x5B7F */
+ ALTCHR, 0x8728, 0x872E, 0x872F, 0x8731, 0x8732, 0x8739, 0x873A,
+ 0x873C, 0x873D, 0x873E, 0x8740, 0x8743, 0x8745, 0x874D, 0x8758,
+ 0x875D, 0x8761, 0x8764, 0x8765, 0x876F, 0x8771, 0x8772, 0x877B,
+ 0x8783, 0x8784, 0x8785, 0x8786, 0x8787, 0x8788, 0x8789, 0x878B,
+ 0x878C, 0x8790, 0x8793, 0x8795, 0x8797, 0x8798, 0x8799, 0x879E,
+ 0x87A0, 0x87A3, 0x87A7, 0x87AC, 0x87AD, 0x87AE, 0x87B1, 0x87B5,
+ 0x87BE, 0x87BF, 0x87C1, 0x87C8, 0x87C9, 0x87CA, 0x87CE, 0x87D5,
+ 0x87D6, 0x87D9, 0x87DA, 0x87DC, 0x87DF, 0x87E2, 0x87E3, 0x87E4,
+ 0x87EA, 0x87EB, 0x87ED, 0x87F1, 0x87F3, 0x87F8, 0x87FA, 0x87FF,
+ 0x8801, 0x8803, 0x8806, 0x8809, 0x880A, 0x880B, 0x8810, 0x8819,
+ 0x8812, 0x8813, 0x8814, 0x8818, 0x881A, 0x881B, 0x881C, 0x881E,
+ 0x881F, 0x8828, 0x882D, 0x882E, 0x8830, 0x8832, 0x8835, ALTCHR,
+/* 0x5C20 - 0x5C7F */
+ ALTCHR, 0x883A, 0x883C, 0x8841, 0x8843, 0x8845, 0x8848, 0x8849,
+ 0x884A, 0x884B, 0x884E, 0x8851, 0x8855, 0x8856, 0x8858, 0x885A,
+ 0x885C, 0x885F, 0x8860, 0x8864, 0x8869, 0x8871, 0x8879, 0x887B,
+ 0x8880, 0x8898, 0x889A, 0x889B, 0x889C, 0x889F, 0x88A0, 0x88A8,
+ 0x88AA, 0x88BA, 0x88BD, 0x88BE, 0x88C0, 0x88CA, 0x88CB, 0x88CC,
+ 0x88CD, 0x88CE, 0x88D1, 0x88D2, 0x88D3, 0x88DB, 0x88DE, 0x88E7,
+ 0x88EF, 0x88F0, 0x88F1, 0x88F5, 0x88F7, 0x8901, 0x8906, 0x890D,
+ 0x890E, 0x890F, 0x8915, 0x8916, 0x8918, 0x8919, 0x891A, 0x891C,
+ 0x8920, 0x8926, 0x8927, 0x8928, 0x8930, 0x8931, 0x8932, 0x8935,
+ 0x8939, 0x893A, 0x893E, 0x8940, 0x8942, 0x8945, 0x8946, 0x8949,
+ 0x894F, 0x8952, 0x8957, 0x895A, 0x895B, 0x895C, 0x8961, 0x8962,
+ 0x8963, 0x896B, 0x896E, 0x8970, 0x8973, 0x8975, 0x897A, ALTCHR,
+/* 0x5D20 - 0x5D7F */
+ ALTCHR, 0x897B, 0x897C, 0x897D, 0x8989, 0x898D, 0x8990, 0x8994,
+ 0x8995, 0x899B, 0x899C, 0x899F, 0x89A0, 0x89A5, 0x89B0, 0x89B4,
+ 0x89B5, 0x89B6, 0x89B7, 0x89BC, 0x89D4, 0x89D5, 0x89D6, 0x89D7,
+ 0x89D8, 0x89E5, 0x89E9, 0x89EB, 0x89ED, 0x89F1, 0x89F3, 0x89F6,
+ 0x89F9, 0x89FD, 0x89FF, 0x8A04, 0x8A05, 0x8A07, 0x8A0F, 0x8A11,
+ 0x8A12, 0x8A14, 0x8A15, 0x8A1E, 0x8A20, 0x8A22, 0x8A24, 0x8A26,
+ 0x8A2B, 0x8A2C, 0x8A2F, 0x8A35, 0x8A37, 0x8A3D, 0x8A3E, 0x8A40,
+ 0x8A43, 0x8A45, 0x8A47, 0x8A49, 0x8A4D, 0x8A4E, 0x8A53, 0x8A56,
+ 0x8A57, 0x8A58, 0x8A5C, 0x8A5D, 0x8A61, 0x8A65, 0x8A67, 0x8A75,
+ 0x8A76, 0x8A77, 0x8A79, 0x8A7A, 0x8A7B, 0x8A7E, 0x8A7F, 0x8A80,
+ 0x8A83, 0x8A86, 0x8A8B, 0x8A8F, 0x8A90, 0x8A92, 0x8A96, 0x8A97,
+ 0x8A99, 0x8A9F, 0x8AA7, 0x8AA9, 0x8AAE, 0x8AAF, 0x8AB3, ALTCHR,
+/* 0x5E20 - 0x5E7F */
+ ALTCHR, 0x8AB6, 0x8AB7, 0x8ABB, 0x8ABE, 0x8AC3, 0x8AC6, 0x8AC8,
+ 0x8AC9, 0x8ACA, 0x8AD1, 0x8AD3, 0x8AD4, 0x8AD5, 0x8AD7, 0x8ADD,
+ 0x8ADF, 0x8AEC, 0x8AF0, 0x8AF4, 0x8AF5, 0x8AF6, 0x8AFC, 0x8AFF,
+ 0x8B05, 0x8B06, 0x8B0B, 0x8B11, 0x8B1C, 0x8B1E, 0x8B1F, 0x8B0A,
+ 0x8B2D, 0x8B30, 0x8B37, 0x8B3C, 0x8B42, 0x8B43, 0x8B44, 0x8B45,
+ 0x8B46, 0x8B48, 0x8B52, 0x8B53, 0x8B54, 0x8B59, 0x8B4D, 0x8B5E,
+ 0x8B63, 0x8B6D, 0x8B76, 0x8B78, 0x8B79, 0x8B7C, 0x8B7E, 0x8B81,
+ 0x8B84, 0x8B85, 0x8B8B, 0x8B8D, 0x8B8F, 0x8B94, 0x8B95, 0x8B9C,
+ 0x8B9E, 0x8B9F, 0x8C38, 0x8C39, 0x8C3D, 0x8C3E, 0x8C45, 0x8C47,
+ 0x8C49, 0x8C4B, 0x8C4F, 0x8C51, 0x8C53, 0x8C54, 0x8C57, 0x8C58,
+ 0x8C5B, 0x8C5D, 0x8C59, 0x8C63, 0x8C64, 0x8C66, 0x8C68, 0x8C69,
+ 0x8C6D, 0x8C73, 0x8C75, 0x8C76, 0x8C7B, 0x8C7E, 0x8C86, ALTCHR,
+/* 0x5F20 - 0x5F7F */
+ ALTCHR, 0x8C87, 0x8C8B, 0x8C90, 0x8C92, 0x8C93, 0x8C99, 0x8C9B,
+ 0x8C9C, 0x8CA4, 0x8CB9, 0x8CBA, 0x8CC5, 0x8CC6, 0x8CC9, 0x8CCB,
+ 0x8CCF, 0x8CD6, 0x8CD5, 0x8CD9, 0x8CDD, 0x8CE1, 0x8CE8, 0x8CEC,
+ 0x8CEF, 0x8CF0, 0x8CF2, 0x8CF5, 0x8CF7, 0x8CF8, 0x8CFE, 0x8CFF,
+ 0x8D01, 0x8D03, 0x8D09, 0x8D12, 0x8D17, 0x8D1B, 0x8D65, 0x8D69,
+ 0x8D6C, 0x8D6E, 0x8D7F, 0x8D82, 0x8D84, 0x8D88, 0x8D8D, 0x8D90,
+ 0x8D91, 0x8D95, 0x8D9E, 0x8D9F, 0x8DA0, 0x8DA6, 0x8DAB, 0x8DAC,
+ 0x8DAF, 0x8DB2, 0x8DB5, 0x8DB7, 0x8DB9, 0x8DBB, 0x8DC0, 0x8DC5,
+ 0x8DC6, 0x8DC7, 0x8DC8, 0x8DCA, 0x8DCE, 0x8DD1, 0x8DD4, 0x8DD5,
+ 0x8DD7, 0x8DD9, 0x8DE4, 0x8DE5, 0x8DE7, 0x8DEC, 0x8DF0, 0x8DBC,
+ 0x8DF1, 0x8DF2, 0x8DF4, 0x8DFD, 0x8E01, 0x8E04, 0x8E05, 0x8E06,
+ 0x8E0B, 0x8E11, 0x8E14, 0x8E16, 0x8E20, 0x8E21, 0x8E22, ALTCHR,
+/* 0x6020 - 0x607F */
+ ALTCHR, 0x8E23, 0x8E26, 0x8E27, 0x8E31, 0x8E33, 0x8E36, 0x8E37,
+ 0x8E38, 0x8E39, 0x8E3D, 0x8E40, 0x8E41, 0x8E4B, 0x8E4D, 0x8E4E,
+ 0x8E4F, 0x8E54, 0x8E5B, 0x8E5C, 0x8E5D, 0x8E5E, 0x8E61, 0x8E62,
+ 0x8E69, 0x8E6C, 0x8E6D, 0x8E6F, 0x8E70, 0x8E71, 0x8E79, 0x8E7A,
+ 0x8E7B, 0x8E82, 0x8E83, 0x8E89, 0x8E90, 0x8E92, 0x8E95, 0x8E9A,
+ 0x8E9B, 0x8E9D, 0x8E9E, 0x8EA2, 0x8EA7, 0x8EA9, 0x8EAD, 0x8EAE,
+ 0x8EB3, 0x8EB5, 0x8EBA, 0x8EBB, 0x8EC0, 0x8EC1, 0x8EC3, 0x8EC4,
+ 0x8EC7, 0x8ECF, 0x8ED1, 0x8ED4, 0x8EDC, 0x8EE8, 0x8EEE, 0x8EF0,
+ 0x8EF1, 0x8EF7, 0x8EF9, 0x8EFA, 0x8EED, 0x8F00, 0x8F02, 0x8F07,
+ 0x8F08, 0x8F0F, 0x8F10, 0x8F16, 0x8F17, 0x8F18, 0x8F1E, 0x8F20,
+ 0x8F21, 0x8F23, 0x8F25, 0x8F27, 0x8F28, 0x8F2C, 0x8F2D, 0x8F2E,
+ 0x8F34, 0x8F35, 0x8F36, 0x8F37, 0x8F3A, 0x8F40, 0x8F41, ALTCHR,
+/* 0x6120 - 0x617F */
+ ALTCHR, 0x8F43, 0x8F47, 0x8F4F, 0x8F51, 0x8F52, 0x8F53, 0x8F54,
+ 0x8F55, 0x8F58, 0x8F5D, 0x8F5E, 0x8F65, 0x8F9D, 0x8FA0, 0x8FA1,
+ 0x8FA4, 0x8FA5, 0x8FA6, 0x8FB5, 0x8FB6, 0x8FB8, 0x8FBE, 0x8FC0,
+ 0x8FC1, 0x8FC6, 0x8FCA, 0x8FCB, 0x8FCD, 0x8FD0, 0x8FD2, 0x8FD3,
+ 0x8FD5, 0x8FE0, 0x8FE3, 0x8FE4, 0x8FE8, 0x8FEE, 0x8FF1, 0x8FF5,
+ 0x8FF6, 0x8FFB, 0x8FFE, 0x9002, 0x9004, 0x9008, 0x900C, 0x9018,
+ 0x901B, 0x9028, 0x9029, 0x902F, 0x902A, 0x902C, 0x902D, 0x9033,
+ 0x9034, 0x9037, 0x903F, 0x9043, 0x9044, 0x904C, 0x905B, 0x905D,
+ 0x9062, 0x9066, 0x9067, 0x906C, 0x9070, 0x9074, 0x9079, 0x9085,
+ 0x9088, 0x908B, 0x908C, 0x908E, 0x9090, 0x9095, 0x9097, 0x9098,
+ 0x9099, 0x909B, 0x90A0, 0x90A1, 0x90A2, 0x90A5, 0x90B0, 0x90B2,
+ 0x90B3, 0x90B4, 0x90B6, 0x90BD, 0x90CC, 0x90BE, 0x90C3, ALTCHR,
+/* 0x6220 - 0x627F */
+ ALTCHR, 0x90C4, 0x90C5, 0x90C7, 0x90C8, 0x90D5, 0x90D7, 0x90D8,
+ 0x90D9, 0x90DC, 0x90DD, 0x90DF, 0x90E5, 0x90D2, 0x90F6, 0x90EB,
+ 0x90EF, 0x90F0, 0x90F4, 0x90FE, 0x90FF, 0x9100, 0x9104, 0x9105,
+ 0x9106, 0x9108, 0x910D, 0x9110, 0x9114, 0x9116, 0x9117, 0x9118,
+ 0x911A, 0x911C, 0x911E, 0x9120, 0x9125, 0x9122, 0x9123, 0x9127,
+ 0x9129, 0x912E, 0x912F, 0x9131, 0x9134, 0x9136, 0x9137, 0x9139,
+ 0x913A, 0x913C, 0x913D, 0x9143, 0x9147, 0x9148, 0x914F, 0x9153,
+ 0x9157, 0x9159, 0x915A, 0x915B, 0x9161, 0x9164, 0x9167, 0x916D,
+ 0x9174, 0x9179, 0x917A, 0x917B, 0x9181, 0x9183, 0x9185, 0x9186,
+ 0x918A, 0x918E, 0x9191, 0x9193, 0x9194, 0x9195, 0x9198, 0x919E,
+ 0x91A1, 0x91A6, 0x91A8, 0x91AC, 0x91AD, 0x91AE, 0x91B0, 0x91B1,
+ 0x91B2, 0x91B3, 0x91B6, 0x91BB, 0x91BC, 0x91BD, 0x91BF, ALTCHR,
+/* 0x6320 - 0x637F */
+ ALTCHR, 0x91C2, 0x91C3, 0x91C5, 0x91D3, 0x91D4, 0x91D7, 0x91D9,
+ 0x91DA, 0x91DE, 0x91E4, 0x91E5, 0x91E9, 0x91EA, 0x91EC, 0x91ED,
+ 0x91EE, 0x91EF, 0x91F0, 0x91F1, 0x91F7, 0x91F9, 0x91FB, 0x91FD,
+ 0x9200, 0x9201, 0x9204, 0x9205, 0x9206, 0x9207, 0x9209, 0x920A,
+ 0x920C, 0x9210, 0x9212, 0x9213, 0x9216, 0x9218, 0x921C, 0x921D,
+ 0x9223, 0x9224, 0x9225, 0x9226, 0x9228, 0x922E, 0x922F, 0x9230,
+ 0x9233, 0x9235, 0x9236, 0x9238, 0x9239, 0x923A, 0x923C, 0x923E,
+ 0x9240, 0x9242, 0x9243, 0x9246, 0x9247, 0x924A, 0x924D, 0x924E,
+ 0x924F, 0x9251, 0x9258, 0x9259, 0x925C, 0x925D, 0x9260, 0x9261,
+ 0x9265, 0x9267, 0x9268, 0x9269, 0x926E, 0x926F, 0x9270, 0x9275,
+ 0x9276, 0x9277, 0x9278, 0x9279, 0x927B, 0x927C, 0x927D, 0x927F,
+ 0x9288, 0x9289, 0x928A, 0x928D, 0x928E, 0x9292, 0x9297, ALTCHR,
+/* 0x6420 - 0x647F */
+ ALTCHR, 0x9299, 0x929F, 0x92A0, 0x92A4, 0x92A5, 0x92A7, 0x92A8,
+ 0x92AB, 0x92AF, 0x92B2, 0x92B6, 0x92B8, 0x92BA, 0x92BB, 0x92BC,
+ 0x92BD, 0x92BF, 0x92C0, 0x92C1, 0x92C2, 0x92C3, 0x92C5, 0x92C6,
+ 0x92C7, 0x92C8, 0x92CB, 0x92CC, 0x92CD, 0x92CE, 0x92D0, 0x92D3,
+ 0x92D5, 0x92D7, 0x92D8, 0x92D9, 0x92DC, 0x92DD, 0x92DF, 0x92E0,
+ 0x92E1, 0x92E3, 0x92E5, 0x92E7, 0x92E8, 0x92EC, 0x92EE, 0x92F0,
+ 0x92F9, 0x92FB, 0x92FF, 0x9300, 0x9302, 0x9308, 0x930D, 0x9311,
+ 0x9314, 0x9315, 0x931C, 0x931D, 0x931E, 0x931F, 0x9321, 0x9324,
+ 0x9325, 0x9327, 0x9329, 0x932A, 0x9333, 0x9334, 0x9336, 0x9337,
+ 0x9347, 0x9348, 0x9349, 0x9350, 0x9351, 0x9352, 0x9355, 0x9357,
+ 0x9358, 0x935A, 0x935E, 0x9364, 0x9365, 0x9367, 0x9369, 0x936A,
+ 0x936D, 0x936F, 0x9370, 0x9371, 0x9373, 0x9374, 0x9376, ALTCHR,
+/* 0x6520 - 0x657F */
+ ALTCHR, 0x937A, 0x937D, 0x937F, 0x9380, 0x9381, 0x9382, 0x9388,
+ 0x938A, 0x938B, 0x938D, 0x938F, 0x9392, 0x9395, 0x9398, 0x939B,
+ 0x939E, 0x93A1, 0x93A3, 0x93A4, 0x93A6, 0x93A8, 0x93AB, 0x93B4,
+ 0x93B5, 0x93B6, 0x93BA, 0x93A9, 0x93C1, 0x93C4, 0x93C5, 0x93C6,
+ 0x93C7, 0x93C9, 0x93CA, 0x93CB, 0x93CC, 0x93CD, 0x93D3, 0x93D9,
+ 0x93DC, 0x93DE, 0x93DF, 0x93E2, 0x93E6, 0x93E7, 0x93F9, 0x93F7,
+ 0x93F8, 0x93FA, 0x93FB, 0x93FD, 0x9401, 0x9402, 0x9404, 0x9408,
+ 0x9409, 0x940D, 0x940E, 0x940F, 0x9415, 0x9416, 0x9417, 0x941F,
+ 0x942E, 0x942F, 0x9431, 0x9432, 0x9433, 0x9434, 0x943B, 0x943F,
+ 0x943D, 0x9443, 0x9445, 0x9448, 0x944A, 0x944C, 0x9455, 0x9459,
+ 0x945C, 0x945F, 0x9461, 0x9463, 0x9468, 0x946B, 0x946D, 0x946E,
+ 0x946F, 0x9471, 0x9472, 0x9484, 0x9483, 0x9578, 0x9579, ALTCHR,
+/* 0x6620 - 0x667F */
+ ALTCHR, 0x957E, 0x9584, 0x9588, 0x958C, 0x958D, 0x958E, 0x959D,
+ 0x959E, 0x959F, 0x95A1, 0x95A6, 0x95A9, 0x95AB, 0x95AC, 0x95B4,
+ 0x95B6, 0x95BA, 0x95BD, 0x95BF, 0x95C6, 0x95C8, 0x95C9, 0x95CB,
+ 0x95D0, 0x95D1, 0x95D2, 0x95D3, 0x95D9, 0x95DA, 0x95DD, 0x95DE,
+ 0x95DF, 0x95E0, 0x95E4, 0x95E6, 0x961D, 0x961E, 0x9622, 0x9624,
+ 0x9625, 0x9626, 0x962C, 0x9631, 0x9633, 0x9637, 0x9638, 0x9639,
+ 0x963A, 0x963C, 0x963D, 0x9641, 0x9652, 0x9654, 0x9656, 0x9657,
+ 0x9658, 0x9661, 0x966E, 0x9674, 0x967B, 0x967C, 0x967E, 0x967F,
+ 0x9681, 0x9682, 0x9683, 0x9684, 0x9689, 0x9691, 0x9696, 0x969A,
+ 0x969D, 0x969F, 0x96A4, 0x96A5, 0x96A6, 0x96A9, 0x96AE, 0x96AF,
+ 0x96B3, 0x96BA, 0x96CA, 0x96D2, 0x5DB2, 0x96D8, 0x96DA, 0x96DD,
+ 0x96DE, 0x96DF, 0x96E9, 0x96EF, 0x96F1, 0x96FA, 0x9702, ALTCHR,
+/* 0x6720 - 0x677F */
+ ALTCHR, 0x9703, 0x9705, 0x9709, 0x971A, 0x971B, 0x971D, 0x9721,
+ 0x9722, 0x9723, 0x9728, 0x9731, 0x9733, 0x9741, 0x9743, 0x974A,
+ 0x974E, 0x974F, 0x9755, 0x9757, 0x9758, 0x975A, 0x975B, 0x9763,
+ 0x9767, 0x976A, 0x976E, 0x9773, 0x9776, 0x9777, 0x9778, 0x977B,
+ 0x977D, 0x977F, 0x9780, 0x9789, 0x9795, 0x9796, 0x9797, 0x9799,
+ 0x979A, 0x979E, 0x979F, 0x97A2, 0x97AC, 0x97AE, 0x97B1, 0x97B2,
+ 0x97B5, 0x97B6, 0x97B8, 0x97B9, 0x97BA, 0x97BC, 0x97BE, 0x97BF,
+ 0x97C1, 0x97C4, 0x97C5, 0x97C7, 0x97C9, 0x97CA, 0x97CC, 0x97CD,
+ 0x97CE, 0x97D0, 0x97D1, 0x97D4, 0x97D7, 0x97D8, 0x97D9, 0x97DD,
+ 0x97DE, 0x97E0, 0x97DB, 0x97E1, 0x97E4, 0x97EF, 0x97F1, 0x97F4,
+ 0x97F7, 0x97F8, 0x97FA, 0x9807, 0x980A, 0x9819, 0x980D, 0x980E,
+ 0x9814, 0x9816, 0x981C, 0x981E, 0x9820, 0x9823, 0x9826, ALTCHR,
+/* 0x6820 - 0x687F */
+ ALTCHR, 0x982B, 0x982E, 0x982F, 0x9830, 0x9832, 0x9833, 0x9835,
+ 0x9825, 0x983E, 0x9844, 0x9847, 0x984A, 0x9851, 0x9852, 0x9853,
+ 0x9856, 0x9857, 0x9859, 0x985A, 0x9862, 0x9863, 0x9865, 0x9866,
+ 0x986A, 0x986C, 0x98AB, 0x98AD, 0x98AE, 0x98B0, 0x98B4, 0x98B7,
+ 0x98B8, 0x98BA, 0x98BB, 0x98BF, 0x98C2, 0x98C5, 0x98C8, 0x98CC,
+ 0x98E1, 0x98E3, 0x98E5, 0x98E6, 0x98E7, 0x98EA, 0x98F3, 0x98F6,
+ 0x9902, 0x9907, 0x9908, 0x9911, 0x9915, 0x9916, 0x9917, 0x991A,
+ 0x991B, 0x991C, 0x991F, 0x9922, 0x9926, 0x9927, 0x992B, 0x9931,
+ 0x9932, 0x9933, 0x9934, 0x9935, 0x9939, 0x993A, 0x993B, 0x993C,
+ 0x9940, 0x9941, 0x9946, 0x9947, 0x9948, 0x994D, 0x994E, 0x9954,
+ 0x9958, 0x9959, 0x995B, 0x995C, 0x995E, 0x995F, 0x9960, 0x999B,
+ 0x999D, 0x999F, 0x99A6, 0x99B0, 0x99B1, 0x99B2, 0x99B5, ALTCHR,
+/* 0x6920 - 0x697F */
+ ALTCHR, 0x99B9, 0x99BA, 0x99BD, 0x99BF, 0x99C3, 0x99C9, 0x99D3,
+ 0x99D4, 0x99D9, 0x99DA, 0x99DC, 0x99DE, 0x99E7, 0x99EA, 0x99EB,
+ 0x99EC, 0x99F0, 0x99F4, 0x99F5, 0x99F9, 0x99FD, 0x99FE, 0x9A02,
+ 0x9A03, 0x9A04, 0x9A0B, 0x9A0C, 0x9A10, 0x9A11, 0x9A16, 0x9A1E,
+ 0x9A20, 0x9A22, 0x9A23, 0x9A24, 0x9A27, 0x9A2D, 0x9A2E, 0x9A33,
+ 0x9A35, 0x9A36, 0x9A38, 0x9A47, 0x9A41, 0x9A44, 0x9A4A, 0x9A4B,
+ 0x9A4C, 0x9A4E, 0x9A51, 0x9A54, 0x9A56, 0x9A5D, 0x9AAA, 0x9AAC,
+ 0x9AAE, 0x9AAF, 0x9AB2, 0x9AB4, 0x9AB5, 0x9AB6, 0x9AB9, 0x9ABB,
+ 0x9ABE, 0x9ABF, 0x9AC1, 0x9AC3, 0x9AC6, 0x9AC8, 0x9ACE, 0x9AD0,
+ 0x9AD2, 0x9AD5, 0x9AD6, 0x9AD7, 0x9ADB, 0x9ADC, 0x9AE0, 0x9AE4,
+ 0x9AE5, 0x9AE7, 0x9AE9, 0x9AEC, 0x9AF2, 0x9AF3, 0x9AF5, 0x9AF9,
+ 0x9AFA, 0x9AFD, 0x9AFF, 0x9B00, 0x9B01, 0x9B02, 0x9B03, ALTCHR,
+/* 0x6A20 - 0x6A7F */
+ ALTCHR, 0x9B04, 0x9B05, 0x9B08, 0x9B09, 0x9B0B, 0x9B0C, 0x9B0D,
+ 0x9B0E, 0x9B10, 0x9B12, 0x9B16, 0x9B19, 0x9B1B, 0x9B1C, 0x9B20,
+ 0x9B26, 0x9B2B, 0x9B2D, 0x9B33, 0x9B34, 0x9B35, 0x9B37, 0x9B39,
+ 0x9B3A, 0x9B3D, 0x9B48, 0x9B4B, 0x9B4C, 0x9B55, 0x9B56, 0x9B57,
+ 0x9B5B, 0x9B5E, 0x9B61, 0x9B63, 0x9B65, 0x9B66, 0x9B68, 0x9B6A,
+ 0x9B6B, 0x9B6C, 0x9B6D, 0x9B6E, 0x9B73, 0x9B75, 0x9B77, 0x9B78,
+ 0x9B79, 0x9B7F, 0x9B80, 0x9B84, 0x9B85, 0x9B86, 0x9B87, 0x9B89,
+ 0x9B8A, 0x9B8B, 0x9B8D, 0x9B8F, 0x9B90, 0x9B94, 0x9B9A, 0x9B9D,
+ 0x9B9E, 0x9BA6, 0x9BA7, 0x9BA9, 0x9BAC, 0x9BB0, 0x9BB1, 0x9BB2,
+ 0x9BB7, 0x9BB8, 0x9BBB, 0x9BBC, 0x9BBE, 0x9BBF, 0x9BC1, 0x9BC7,
+ 0x9BC8, 0x9BCE, 0x9BD0, 0x9BD7, 0x9BD8, 0x9BDD, 0x9BDF, 0x9BE5,
+ 0x9BE7, 0x9BEA, 0x9BEB, 0x9BEF, 0x9BF3, 0x9BF7, 0x9BF8, ALTCHR,
+/* 0x6B20 - 0x6B7F */
+ ALTCHR, 0x9BF9, 0x9BFA, 0x9BFD, 0x9BFF, 0x9C00, 0x9C02, 0x9C0B,
+ 0x9C0F, 0x9C11, 0x9C16, 0x9C18, 0x9C19, 0x9C1A, 0x9C1C, 0x9C1E,
+ 0x9C22, 0x9C23, 0x9C26, 0x9C27, 0x9C28, 0x9C29, 0x9C2A, 0x9C31,
+ 0x9C35, 0x9C36, 0x9C37, 0x9C3D, 0x9C41, 0x9C43, 0x9C44, 0x9C45,
+ 0x9C49, 0x9C4A, 0x9C4E, 0x9C4F, 0x9C50, 0x9C53, 0x9C54, 0x9C56,
+ 0x9C58, 0x9C5B, 0x9C5D, 0x9C5E, 0x9C5F, 0x9C63, 0x9C69, 0x9C6A,
+ 0x9C5C, 0x9C6B, 0x9C68, 0x9C6E, 0x9C70, 0x9C72, 0x9C75, 0x9C77,
+ 0x9C7B, 0x9CE6, 0x9CF2, 0x9CF7, 0x9CF9, 0x9D0B, 0x9D02, 0x9D11,
+ 0x9D17, 0x9D18, 0x9D1C, 0x9D1D, 0x9D1E, 0x9D2F, 0x9D30, 0x9D32,
+ 0x9D33, 0x9D34, 0x9D3A, 0x9D3C, 0x9D45, 0x9D3D, 0x9D42, 0x9D43,
+ 0x9D47, 0x9D4A, 0x9D53, 0x9D54, 0x9D5F, 0x9D63, 0x9D62, 0x9D65,
+ 0x9D69, 0x9D6A, 0x9D6B, 0x9D70, 0x9D76, 0x9D77, 0x9D7B, ALTCHR,
+/* 0x6C20 - 0x6C7F */
+ ALTCHR, 0x9D7C, 0x9D7E, 0x9D83, 0x9D84, 0x9D86, 0x9D8A, 0x9D8D,
+ 0x9D8E, 0x9D92, 0x9D93, 0x9D95, 0x9D96, 0x9D97, 0x9D98, 0x9DA1,
+ 0x9DAA, 0x9DAC, 0x9DAE, 0x9DB1, 0x9DB5, 0x9DB9, 0x9DBC, 0x9DBF,
+ 0x9DC3, 0x9DC7, 0x9DC9, 0x9DCA, 0x9DD4, 0x9DD5, 0x9DD6, 0x9DD7,
+ 0x9DDA, 0x9DDE, 0x9DDF, 0x9DE0, 0x9DE5, 0x9DE7, 0x9DE9, 0x9DEB,
+ 0x9DEE, 0x9DF0, 0x9DF3, 0x9DF4, 0x9DFE, 0x9E0A, 0x9E02, 0x9E07,
+ 0x9E0E, 0x9E10, 0x9E11, 0x9E12, 0x9E15, 0x9E16, 0x9E19, 0x9E1C,
+ 0x9E1D, 0x9E7A, 0x9E7B, 0x9E7C, 0x9E80, 0x9E82, 0x9E83, 0x9E84,
+ 0x9E85, 0x9E87, 0x9E8E, 0x9E8F, 0x9E96, 0x9E98, 0x9E9B, 0x9E9E,
+ 0x9EA4, 0x9EA8, 0x9EAC, 0x9EAE, 0x9EAF, 0x9EB0, 0x9EB3, 0x9EB4,
+ 0x9EB5, 0x9EC6, 0x9EC8, 0x9ECB, 0x9ED5, 0x9EDF, 0x9EE4, 0x9EE7,
+ 0x9EEC, 0x9EED, 0x9EEE, 0x9EF0, 0x9EF1, 0x9EF2, 0x9EF5, ALTCHR,
+/* 0x6D20 - 0x6D7F */
+ ALTCHR, 0x9EF8, 0x9EFF, 0x9F02, 0x9F03, 0x9F09, 0x9F0F, 0x9F10,
+ 0x9F11, 0x9F12, 0x9F14, 0x9F16, 0x9F17, 0x9F19, 0x9F1A, 0x9F1B,
+ 0x9F1F, 0x9F22, 0x9F26, 0x9F2A, 0x9F2B, 0x9F2F, 0x9F31, 0x9F32,
+ 0x9F34, 0x9F37, 0x9F39, 0x9F3A, 0x9F3C, 0x9F3D, 0x9F3F, 0x9F41,
+ 0x9F43, 0x9F44, 0x9F45, 0x9F46, 0x9F47, 0x9F53, 0x9F55, 0x9F56,
+ 0x9F57, 0x9F58, 0x9F5A, 0x9F5D, 0x9F5E, 0x9F68, 0x9F69, 0x9F6D,
+ 0x9F6E, 0x9F6F, 0x9F70, 0x9F71, 0x9F73, 0x9F75, 0x9F7A, 0x9F7D,
+ 0x9F8F, 0x9F90, 0x9F91, 0x9F92, 0x9F94, 0x9F96, 0x9F97, 0x9F9E,
+ 0x9FA1, 0x9FA2, 0x9FA3, 0x9FA5, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+};
+
+CODE_CONV_TWO_OCTET_TO_UCS2(cc_jisx0212_to_ucs2, /* function name */
+ tblJisx0212ToUcs2, /* table name */
+ 0x0022, 0x006D, /* code range (high byte) */
+ 0x0020, 0x007F, /* code range (low byte) */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/JISX0212/main.c b/xc/extras/X-TrueType/JISX0212/main.c
new file mode 100644
index 000000000..e082ccb36
--- /dev/null
+++ b/xc/extras/X-TrueType/JISX0212/main.c
@@ -0,0 +1,93 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+typedef enum
+{
+ JISX0212
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "jisx0212", NULL, NULL, JISX0212, { 0x21, 0x7e, 0x21, 0x6d, 0x2121 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_jisx0212_to_ucs2);
+CODECONV_TEMPLATE(cc_jisx0212_to_win_sjis);
+static MapIDRelation const mapIDRelations[] = {
+ { JISX0212, EPlfmISO, EEncISO10646,
+ cc_jisx0212_to_ucs2, NULL },
+ { JISX0212, EPlfmUnicode, EEncAny,
+ cc_jisx0212_to_ucs2, NULL },
+ { JISX0212, EPlfmMS, EEncMSUnicode,
+ cc_jisx0212_to_ucs2, NULL },
+ { JISX0212, EPlfmMS, EEncMSShiftJIS,
+ cc_jisx0212_to_win_sjis, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(JISX0212_entrypoint)
+
+
+/*************************************************
+ Calculatable code convert functions
+ */
+
+/* JIS X 0212 -> Windows Shift JIS Auxiliary Kanji Mapping */
+ft_char_code_t /* result charCodeDest */
+cc_jisx0212_to_win_sjis(ft_char_code_t idx)
+{
+ unsigned c1, c2, d1, d2;
+
+ c1 = (idx >> 8) & 0xff;
+ c2 = idx & 0xff;
+
+ if (c1 >= 0x4f) c1++; /* Slide after 0x4f00 */
+
+ /* jis to sjis */
+ d1 = ((c1 + 1) >> 1) + (c1 < 0x5f ? 0x70 : 0xb0);
+ d2 = c2 + ((c1 & 1) ? (c2 < 0x60 ? 0x1f : 0x20) : 0x7e);
+
+ return (d1<<8) + d2;
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KOI8/Imakefile b/xc/extras/X-TrueType/KOI8/Imakefile
new file mode 100644
index 000000000..b4b45dc2c
--- /dev/null
+++ b/xc/extras/X-TrueType/KOI8/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: KOI8 */
+
+#define ModuleName KOI8
+SRCS = KOI8_RtoUCS2.c KOI8_UNItoUCS2.c main.c
+OBJS = KOI8_RtoUCS2.o KOI8_UNItoUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KOI8/KOI8_RtoUCS2.c b/xc/extras/X-TrueType/KOI8/KOI8_RtoUCS2.c
new file mode 100644
index 000000000..32e6655b5
--- /dev/null
+++ b/xc/extras/X-TrueType/KOI8/KOI8_RtoUCS2.c
@@ -0,0 +1,81 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-2.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblKoi8_rToUcs2[] = {
+/* 0x0080 - 0x00FF */
+ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
+ 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2022, 0x221A, 0x2248,
+ 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
+ 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
+ 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E,
+ 0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
+ 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9,
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A
+};
+
+ft_char_code_t /* result charCodeDst */
+cc_koi8_r_to_ucs2(ft_char_code_t codeSrc)
+{
+ ucs2_t codeDst = codeSrc;
+
+ if (codeSrc>=0x80)
+ codeDst = tblKoi8_rToUcs2[codeSrc-0x80];
+
+ return codeDst;
+}
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KOI8/KOI8_UNItoUCS2.c b/xc/extras/X-TrueType/KOI8/KOI8_UNItoUCS2.c
new file mode 100644
index 000000000..f1be9a295
--- /dev/null
+++ b/xc/extras/X-TrueType/KOI8/KOI8_UNItoUCS2.c
@@ -0,0 +1,81 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPINGS/ISO8859/8859-2.TXT)
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblKoi8_UniToUcs2[] = {
+/* 0x0080 - 0x00FF */
+ 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
+ 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
+ 0x2591, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
+ 0x00A9, 0x2122, 0x00A0, 0x00BB, 0x00AE, 0x00AB, 0x00B7, 0x00A4,
+ 0x00A0, 0x0452, 0x0453, 0x0451, 0x0454, 0x0455, 0x0456, 0x0457,
+ 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x0491, 0x045E, 0x045F,
+ 0x2116, 0x0402, 0x0403, 0x0401, 0x0404, 0x0405, 0x0406, 0x0407,
+ 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x0490, 0x040E, 0x040F,
+ 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
+ 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
+ 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
+ 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
+ 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
+ 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
+ 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
+ 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A
+};
+
+ft_char_code_t /* result charCodeDst */
+cc_koi8_uni_to_ucs2(ft_char_code_t codeSrc)
+{
+ ucs2_t codeDst = codeSrc;
+
+ if (codeSrc>=0x80)
+ codeDst = tblKoi8_UniToUcs2[codeSrc-0x80];
+
+ return codeDst;
+}
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KOI8/main.c b/xc/extras/X-TrueType/KOI8/main.c
new file mode 100644
index 000000000..ec5e0e095
--- /dev/null
+++ b/xc/extras/X-TrueType/KOI8/main.c
@@ -0,0 +1,156 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ KOI8_R,
+ KOI8_U,
+ KOI8_RU,
+ KOI8_UNI
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "koi8", NULL, "1", KOI8_R, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "koi8", NULL, "r", KOI8_R, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "koi8", NULL, "u", KOI8_U, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "koi8", NULL, "ru", KOI8_RU, { 0x20, 0xff, 0, 0, 0x20 } },
+ { "koi8", NULL, "uni", KOI8_UNI, { 0x20, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_koi8_r_to_ucs2);
+CODECONV_TEMPLATE(cc_koi8_u_to_ucs2);
+CODECONV_TEMPLATE(cc_koi8_ru_to_ucs2);
+CODECONV_TEMPLATE(cc_koi8_uni_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { KOI8_R, EPlfmISO, EEncISO10646,
+ cc_koi8_r_to_ucs2, NULL },
+ { KOI8_R, EPlfmUnicode, EEncAny,
+ cc_koi8_r_to_ucs2, NULL },
+ { KOI8_R, EPlfmMS, EEncMSUnicode,
+ cc_koi8_r_to_ucs2, NULL },
+ { KOI8_U, EPlfmISO, EEncISO10646,
+ cc_koi8_u_to_ucs2, NULL },
+ { KOI8_U, EPlfmUnicode, EEncAny,
+ cc_koi8_u_to_ucs2, NULL },
+ { KOI8_U, EPlfmMS, EEncMSUnicode,
+ cc_koi8_u_to_ucs2, NULL },
+ { KOI8_RU, EPlfmISO, EEncISO10646,
+ cc_koi8_ru_to_ucs2, NULL },
+ { KOI8_RU, EPlfmUnicode, EEncAny,
+ cc_koi8_ru_to_ucs2, NULL },
+ { KOI8_RU, EPlfmMS, EEncMSUnicode,
+ cc_koi8_ru_to_ucs2, NULL },
+ { KOI8_UNI, EPlfmISO, EEncISO10646,
+ cc_koi8_uni_to_ucs2, NULL },
+ { KOI8_UNI, EPlfmUnicode, EEncAny,
+ cc_koi8_uni_to_ucs2, NULL },
+ { KOI8_UNI, EPlfmMS, EEncMSUnicode,
+ cc_koi8_uni_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(KOI8_entrypoint)
+
+/*
+ koi-* -> UCS2
+
+ This from xfsft:
+ Copyright (c) 1997 by Mark Leisher
+ Copyright (c) 1998 by Juliusz Chroboczek
+
+ */
+
+ucs2_t
+cc_koi8_u_to_ucs2(ft_char_code_t codeSrc)
+{
+ ucs2_t codeDst;
+
+ switch(codeSrc) {
+ case 0xA4: codeDst = 0x0454; break;
+ case 0xA6: codeDst = 0x0456; break;
+ case 0xA7: codeDst = 0x0457; break;
+ case 0xAD: codeDst = 0x0491; break;
+ case 0xB4: codeDst = 0x0403; break;
+ case 0xB6: codeDst = 0x0406; break;
+ case 0xB7: codeDst = 0x0407; break;
+ case 0xBD: codeDst = 0x0490; break;
+ default: codeDst = cc_koi8_r_to_ucs2(codeSrc);
+ }
+
+ return codeDst;
+}
+
+ucs2_t
+cc_koi8_ru_to_ucs2(ft_char_code_t codeSrc)
+{
+ ucs2_t codeDst;
+
+ switch(codeSrc) {
+ case 0x93: codeDst = 0x201C; break;
+ case 0x96: codeDst = 0x201D; break;
+ case 0x97: codeDst = 0x2014; break;
+ case 0x98: codeDst = 0x2116; break;
+ case 0x99: codeDst = 0x2122; break;
+ case 0x9B: codeDst = 0x00BB; break;
+ case 0x9C: codeDst = 0x00AE; break;
+ case 0x9D: codeDst = 0x00AB; break;
+ case 0x9F: codeDst = 0x00A4; break;
+ case 0xA4: codeDst = 0x0454; break;
+ case 0xA6: codeDst = 0x0456; break;
+ case 0xA7: codeDst = 0x0457; break;
+ case 0xAD: codeDst = 0x0491; break;
+ case 0xAE: codeDst = 0x045E; break;
+ case 0xB4: codeDst = 0x0404; break;
+ case 0xB6: codeDst = 0x0406; break;
+ case 0xB7: codeDst = 0x0407; break;
+ case 0xBD: codeDst = 0x0490; break;
+ case 0xBE: codeDst = 0x040E; break;
+ default: codeDst = cc_koi8_r_to_ucs2(codeSrc);
+ }
+
+ return codeDst;
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KSC5601/Imakefile b/xc/extras/X-TrueType/KSC5601/Imakefile
new file mode 100644
index 000000000..17e6bcec7
--- /dev/null
+++ b/xc/extras/X-TrueType/KSC5601/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: KSC5601 */
+
+#define ModuleName KSC5601
+SRCS = KSC5601toUCS2.c main.c
+OBJS = KSC5601toUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KSC5601/KSC5601toUCS2.c b/xc/extras/X-TrueType/KSC5601/KSC5601toUCS2.c
new file mode 100644
index 000000000..bfff31e27
--- /dev/null
+++ b/xc/extras/X-TrueType/KSC5601/KSC5601toUCS2.c
@@ -0,0 +1,1270 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from Unicode, Inc.
+ (ftp://ftp.unicode.org/Public/MAPPING/EASTASIA/KSC/KSC5601.TXT)
+
+ convert UHC to genuine KSC5601 by Jungshik Shin.
+ (http://pantheon.yale.edu/~jshin/faq/KSC5601.TXT.gz)
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x3000
+
+static ucs2_t tblKsc5601ToUcs2[] = {
+/* 0x2120 - 0x217F */
+ ALTCHR, 0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8,
+ 0x3003, 0x00AD, 0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B,
+ 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0x00B1, 0x00D7,
+ 0x00F7, 0x2260, 0x2264, 0x2265, 0x221E, 0x2234, 0x00B0, 0x2032,
+ 0x2033, 0x2103, 0x212B, 0xFFE0, 0xFFE1, 0xFFE5, 0x2642, 0x2640,
+ 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00A7,
+ 0x203B, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6,
+ 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x2192, 0x2190,
+ 0x2191, 0x2193, 0x2194, 0x3013, 0x226A, 0x226B, 0x221A, 0x223D,
+ 0x221D, 0x2235, 0x222B, 0x222C, 0x2208, 0x220B, 0x2286, 0x2287,
+ 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228, 0xFFE2, ALTCHR,
+/* 0x2220 - 0x227F */
+ ALTCHR, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4, 0xFF5E, 0x02C7,
+ 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB, 0x00A1, 0x00BF,
+ 0x02D0, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109, 0x2030, 0x25C1,
+ 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667,
+ 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1, 0x2592, 0x25A4,
+ 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E,
+ 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199,
+ 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C, 0x327F, 0x321C,
+ 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2320 - 0x237F */
+ ALTCHR, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07,
+ 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F,
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17,
+ 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F,
+ 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27,
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F,
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37,
+ 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F,
+ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47,
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F,
+ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57,
+ 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFFE3, ALTCHR,
+/* 0x2420 - 0x247F */
+ ALTCHR, 0x3131, 0x3132, 0x3133, 0x3134, 0x3135, 0x3136, 0x3137,
+ 0x3138, 0x3139, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F,
+ 0x3140, 0x3141, 0x3142, 0x3143, 0x3144, 0x3145, 0x3146, 0x3147,
+ 0x3148, 0x3149, 0x314A, 0x314B, 0x314C, 0x314D, 0x314E, 0x314F,
+ 0x3150, 0x3151, 0x3152, 0x3153, 0x3154, 0x3155, 0x3156, 0x3157,
+ 0x3158, 0x3159, 0x315A, 0x315B, 0x315C, 0x315D, 0x315E, 0x315F,
+ 0x3160, 0x3161, 0x3162, 0x3163, 0x3164, 0x3165, 0x3166, 0x3167,
+ 0x3168, 0x3169, 0x316A, 0x316B, 0x316C, 0x316D, 0x316E, 0x316F,
+ 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177,
+ 0x3178, 0x3179, 0x317A, 0x317B, 0x317C, 0x317D, 0x317E, 0x317F,
+ 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187,
+ 0x3188, 0x3189, 0x318A, 0x318B, 0x318C, 0x318D, 0x318E, ALTCHR,
+/* 0x2520 - 0x257F */
+ ALTCHR, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176,
+ 0x2177, 0x2178, 0x2179, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167,
+ 0x2168, 0x2169, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,
+ 0x03A9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
+ 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,
+ 0x03C9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2620 - 0x267F */
+ ALTCHR, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C,
+ 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513,
+ 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520,
+ 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538,
+ 0x2542, 0x2512, 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E,
+ 0x250D, 0x251E, 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529,
+ 0x252A, 0x252D, 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539,
+ 0x253A, 0x253D, 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545,
+ 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2720 - 0x277F */
+ ALTCHR, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33C4, 0x33A3,
+ 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B, 0x339C, 0x339D,
+ 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA, 0x338D, 0x338E,
+ 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7, 0x33A8, 0x33B0,
+ 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6, 0x33B7, 0x33B8,
+ 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33BA, 0x33BB,
+ 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391, 0x3392, 0x3393,
+ 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B, 0x338C, 0x33D6,
+ 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9, 0x33AA, 0x33AB,
+ 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9, 0x33DC, 0x33C6,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2820 - 0x287F */
+ ALTCHR, 0x00C6, 0x00D0, 0x00AA, 0x0126, ALTCHR, 0x0132, ALTCHR,
+ 0x013F, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A,
+ ALTCHR, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266,
+ 0x3267, 0x3268, 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E,
+ 0x326F, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276,
+ 0x3277, 0x3278, 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2,
+ 0x24D3, 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA,
+ 0x24DB, 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2,
+ 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460,
+ 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468,
+ 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153,
+ 0x2154, 0x00BC, 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, ALTCHR,
+/* 0x2920 - 0x297F */
+ ALTCHR, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138,
+ 0x0140, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x0167, 0x014B,
+ 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206,
+ 0x3207, 0x3208, 0x3209, 0x320A, 0x320B, 0x320C, 0x320D, 0x320E,
+ 0x320F, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216,
+ 0x3217, 0x3218, 0x3219, 0x321A, 0x321B, 0x249C, 0x249D, 0x249E,
+ 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4, 0x24A5, 0x24A6,
+ 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE,
+ 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x2474,
+ 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, 0x247C,
+ 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482, 0x00B9, 0x00B2,
+ 0x00B3, 0x2074, 0x207F, 0x2081, 0x2082, 0x2083, 0x2084, ALTCHR,
+/* 0x2A20 - 0x2A7F */
+ ALTCHR, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2B20 - 0x2B7F */
+ ALTCHR, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF,
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7,
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF,
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7,
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7,
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7,
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, 0x30EF,
+ 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5, 0x30F6, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2C20 - 0x2C7F */
+ ALTCHR, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401,
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D,
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D,
+ 0x042E, 0x042F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451,
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D,
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D,
+ 0x044E, 0x044F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2D20 - 0x2D7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2E20 - 0x2E7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2F20 - 0x2F7F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x3020 - 0x307F */
+ ALTCHR, 0xAC00, 0xAC01, 0xAC04, 0xAC07, 0xAC08, 0xAC09, 0xAC0A,
+ 0xAC10, 0xAC11, 0xAC12, 0xAC13, 0xAC14, 0xAC15, 0xAC16, 0xAC17,
+ 0xAC19, 0xAC1A, 0xAC1B, 0xAC1C, 0xAC1D, 0xAC20, 0xAC24, 0xAC2C,
+ 0xAC2D, 0xAC2F, 0xAC30, 0xAC31, 0xAC38, 0xAC39, 0xAC3C, 0xAC40,
+ 0xAC4B, 0xAC4D, 0xAC54, 0xAC58, 0xAC5C, 0xAC70, 0xAC71, 0xAC74,
+ 0xAC77, 0xAC78, 0xAC7A, 0xAC80, 0xAC81, 0xAC83, 0xAC84, 0xAC85,
+ 0xAC86, 0xAC89, 0xAC8A, 0xAC8B, 0xAC8C, 0xAC90, 0xAC94, 0xAC9C,
+ 0xAC9D, 0xAC9F, 0xACA0, 0xACA1, 0xACA8, 0xACA9, 0xACAA, 0xACAC,
+ 0xACAF, 0xACB0, 0xACB8, 0xACB9, 0xACBB, 0xACBC, 0xACBD, 0xACC1,
+ 0xACC4, 0xACC8, 0xACCC, 0xACD5, 0xACD7, 0xACE0, 0xACE1, 0xACE4,
+ 0xACE7, 0xACE8, 0xACEA, 0xACEC, 0xACEF, 0xACF0, 0xACF1, 0xACF3,
+ 0xACF5, 0xACF6, 0xACFC, 0xACFD, 0xAD00, 0xAD04, 0xAD06, ALTCHR,
+/* 0x3120 - 0x317F */
+ ALTCHR, 0xAD0C, 0xAD0D, 0xAD0F, 0xAD11, 0xAD18, 0xAD1C, 0xAD20,
+ 0xAD29, 0xAD2C, 0xAD2D, 0xAD34, 0xAD35, 0xAD38, 0xAD3C, 0xAD44,
+ 0xAD45, 0xAD47, 0xAD49, 0xAD50, 0xAD54, 0xAD58, 0xAD61, 0xAD63,
+ 0xAD6C, 0xAD6D, 0xAD70, 0xAD73, 0xAD74, 0xAD75, 0xAD76, 0xAD7B,
+ 0xAD7C, 0xAD7D, 0xAD7F, 0xAD81, 0xAD82, 0xAD88, 0xAD89, 0xAD8C,
+ 0xAD90, 0xAD9C, 0xAD9D, 0xADA4, 0xADB7, 0xADC0, 0xADC1, 0xADC4,
+ 0xADC8, 0xADD0, 0xADD1, 0xADD3, 0xADDC, 0xADE0, 0xADE4, 0xADF8,
+ 0xADF9, 0xADFC, 0xADFF, 0xAE00, 0xAE01, 0xAE08, 0xAE09, 0xAE0B,
+ 0xAE0D, 0xAE14, 0xAE30, 0xAE31, 0xAE34, 0xAE37, 0xAE38, 0xAE3A,
+ 0xAE40, 0xAE41, 0xAE43, 0xAE45, 0xAE46, 0xAE4A, 0xAE4C, 0xAE4D,
+ 0xAE4E, 0xAE50, 0xAE54, 0xAE56, 0xAE5C, 0xAE5D, 0xAE5F, 0xAE60,
+ 0xAE61, 0xAE65, 0xAE68, 0xAE69, 0xAE6C, 0xAE70, 0xAE78, ALTCHR,
+/* 0x3220 - 0x327F */
+ ALTCHR, 0xAE79, 0xAE7B, 0xAE7C, 0xAE7D, 0xAE84, 0xAE85, 0xAE8C,
+ 0xAEBC, 0xAEBD, 0xAEBE, 0xAEC0, 0xAEC4, 0xAECC, 0xAECD, 0xAECF,
+ 0xAED0, 0xAED1, 0xAED8, 0xAED9, 0xAEDC, 0xAEE8, 0xAEEB, 0xAEED,
+ 0xAEF4, 0xAEF8, 0xAEFC, 0xAF07, 0xAF08, 0xAF0D, 0xAF10, 0xAF2C,
+ 0xAF2D, 0xAF30, 0xAF32, 0xAF34, 0xAF3C, 0xAF3D, 0xAF3F, 0xAF41,
+ 0xAF42, 0xAF43, 0xAF48, 0xAF49, 0xAF50, 0xAF5C, 0xAF5D, 0xAF64,
+ 0xAF65, 0xAF79, 0xAF80, 0xAF84, 0xAF88, 0xAF90, 0xAF91, 0xAF95,
+ 0xAF9C, 0xAFB8, 0xAFB9, 0xAFBC, 0xAFC0, 0xAFC7, 0xAFC8, 0xAFC9,
+ 0xAFCB, 0xAFCD, 0xAFCE, 0xAFD4, 0xAFDC, 0xAFE8, 0xAFE9, 0xAFF0,
+ 0xAFF1, 0xAFF4, 0xAFF8, 0xB000, 0xB001, 0xB004, 0xB00C, 0xB010,
+ 0xB014, 0xB01C, 0xB01D, 0xB028, 0xB044, 0xB045, 0xB048, 0xB04A,
+ 0xB04C, 0xB04E, 0xB053, 0xB054, 0xB055, 0xB057, 0xB059, ALTCHR,
+/* 0x3320 - 0x337F */
+ ALTCHR, 0xB05D, 0xB07C, 0xB07D, 0xB080, 0xB084, 0xB08C, 0xB08D,
+ 0xB08F, 0xB091, 0xB098, 0xB099, 0xB09A, 0xB09C, 0xB09F, 0xB0A0,
+ 0xB0A1, 0xB0A2, 0xB0A8, 0xB0A9, 0xB0AB, 0xB0AC, 0xB0AD, 0xB0AE,
+ 0xB0AF, 0xB0B1, 0xB0B3, 0xB0B4, 0xB0B5, 0xB0B8, 0xB0BC, 0xB0C4,
+ 0xB0C5, 0xB0C7, 0xB0C8, 0xB0C9, 0xB0D0, 0xB0D1, 0xB0D4, 0xB0D8,
+ 0xB0E0, 0xB0E5, 0xB108, 0xB109, 0xB10B, 0xB10C, 0xB110, 0xB112,
+ 0xB113, 0xB118, 0xB119, 0xB11B, 0xB11C, 0xB11D, 0xB123, 0xB124,
+ 0xB125, 0xB128, 0xB12C, 0xB134, 0xB135, 0xB137, 0xB138, 0xB139,
+ 0xB140, 0xB141, 0xB144, 0xB148, 0xB150, 0xB151, 0xB154, 0xB155,
+ 0xB158, 0xB15C, 0xB160, 0xB178, 0xB179, 0xB17C, 0xB180, 0xB182,
+ 0xB188, 0xB189, 0xB18B, 0xB18D, 0xB192, 0xB193, 0xB194, 0xB198,
+ 0xB19C, 0xB1A8, 0xB1CC, 0xB1D0, 0xB1D4, 0xB1DC, 0xB1DD, ALTCHR,
+/* 0x3420 - 0x347F */
+ ALTCHR, 0xB1DF, 0xB1E8, 0xB1E9, 0xB1EC, 0xB1F0, 0xB1F9, 0xB1FB,
+ 0xB1FD, 0xB204, 0xB205, 0xB208, 0xB20B, 0xB20C, 0xB214, 0xB215,
+ 0xB217, 0xB219, 0xB220, 0xB234, 0xB23C, 0xB258, 0xB25C, 0xB260,
+ 0xB268, 0xB269, 0xB274, 0xB275, 0xB27C, 0xB284, 0xB285, 0xB289,
+ 0xB290, 0xB291, 0xB294, 0xB298, 0xB299, 0xB29A, 0xB2A0, 0xB2A1,
+ 0xB2A3, 0xB2A5, 0xB2A6, 0xB2AA, 0xB2AC, 0xB2B0, 0xB2B4, 0xB2C8,
+ 0xB2C9, 0xB2CC, 0xB2D0, 0xB2D2, 0xB2D8, 0xB2D9, 0xB2DB, 0xB2DD,
+ 0xB2E2, 0xB2E4, 0xB2E5, 0xB2E6, 0xB2E8, 0xB2EB, 0xB2EC, 0xB2ED,
+ 0xB2EE, 0xB2EF, 0xB2F3, 0xB2F4, 0xB2F5, 0xB2F7, 0xB2F8, 0xB2F9,
+ 0xB2FA, 0xB2FB, 0xB2FF, 0xB300, 0xB301, 0xB304, 0xB308, 0xB310,
+ 0xB311, 0xB313, 0xB314, 0xB315, 0xB31C, 0xB354, 0xB355, 0xB356,
+ 0xB358, 0xB35B, 0xB35C, 0xB35E, 0xB35F, 0xB364, 0xB365, ALTCHR,
+/* 0x3520 - 0x357F */
+ ALTCHR, 0xB367, 0xB369, 0xB36B, 0xB36E, 0xB370, 0xB371, 0xB374,
+ 0xB378, 0xB380, 0xB381, 0xB383, 0xB384, 0xB385, 0xB38C, 0xB390,
+ 0xB394, 0xB3A0, 0xB3A1, 0xB3A8, 0xB3AC, 0xB3C4, 0xB3C5, 0xB3C8,
+ 0xB3CB, 0xB3CC, 0xB3CE, 0xB3D0, 0xB3D4, 0xB3D5, 0xB3D7, 0xB3D9,
+ 0xB3DB, 0xB3DD, 0xB3E0, 0xB3E4, 0xB3E8, 0xB3FC, 0xB410, 0xB418,
+ 0xB41C, 0xB420, 0xB428, 0xB429, 0xB42B, 0xB434, 0xB450, 0xB451,
+ 0xB454, 0xB458, 0xB460, 0xB461, 0xB463, 0xB465, 0xB46C, 0xB480,
+ 0xB488, 0xB49D, 0xB4A4, 0xB4A8, 0xB4AC, 0xB4B5, 0xB4B7, 0xB4B9,
+ 0xB4C0, 0xB4C4, 0xB4C8, 0xB4D0, 0xB4D5, 0xB4DC, 0xB4DD, 0xB4E0,
+ 0xB4E3, 0xB4E4, 0xB4E6, 0xB4EC, 0xB4ED, 0xB4EF, 0xB4F1, 0xB4F8,
+ 0xB514, 0xB515, 0xB518, 0xB51B, 0xB51C, 0xB524, 0xB525, 0xB527,
+ 0xB528, 0xB529, 0xB52A, 0xB530, 0xB531, 0xB534, 0xB538, ALTCHR,
+/* 0x3620 - 0x367F */
+ ALTCHR, 0xB540, 0xB541, 0xB543, 0xB544, 0xB545, 0xB54B, 0xB54C,
+ 0xB54D, 0xB550, 0xB554, 0xB55C, 0xB55D, 0xB55F, 0xB560, 0xB561,
+ 0xB5A0, 0xB5A1, 0xB5A4, 0xB5A8, 0xB5AA, 0xB5AB, 0xB5B0, 0xB5B1,
+ 0xB5B3, 0xB5B4, 0xB5B5, 0xB5BB, 0xB5BC, 0xB5BD, 0xB5C0, 0xB5C4,
+ 0xB5CC, 0xB5CD, 0xB5CF, 0xB5D0, 0xB5D1, 0xB5D8, 0xB5EC, 0xB610,
+ 0xB611, 0xB614, 0xB618, 0xB625, 0xB62C, 0xB634, 0xB648, 0xB664,
+ 0xB668, 0xB69C, 0xB69D, 0xB6A0, 0xB6A4, 0xB6AB, 0xB6AC, 0xB6B1,
+ 0xB6D4, 0xB6F0, 0xB6F4, 0xB6F8, 0xB700, 0xB701, 0xB705, 0xB728,
+ 0xB729, 0xB72C, 0xB72F, 0xB730, 0xB738, 0xB739, 0xB73B, 0xB744,
+ 0xB748, 0xB74C, 0xB754, 0xB755, 0xB760, 0xB764, 0xB768, 0xB770,
+ 0xB771, 0xB773, 0xB775, 0xB77C, 0xB77D, 0xB780, 0xB784, 0xB78C,
+ 0xB78D, 0xB78F, 0xB790, 0xB791, 0xB792, 0xB796, 0xB797, ALTCHR,
+/* 0x3720 - 0x377F */
+ ALTCHR, 0xB798, 0xB799, 0xB79C, 0xB7A0, 0xB7A8, 0xB7A9, 0xB7AB,
+ 0xB7AC, 0xB7AD, 0xB7B4, 0xB7B5, 0xB7B8, 0xB7C7, 0xB7C9, 0xB7EC,
+ 0xB7ED, 0xB7F0, 0xB7F4, 0xB7FC, 0xB7FD, 0xB7FF, 0xB800, 0xB801,
+ 0xB807, 0xB808, 0xB809, 0xB80C, 0xB810, 0xB818, 0xB819, 0xB81B,
+ 0xB81D, 0xB824, 0xB825, 0xB828, 0xB82C, 0xB834, 0xB835, 0xB837,
+ 0xB838, 0xB839, 0xB840, 0xB844, 0xB851, 0xB853, 0xB85C, 0xB85D,
+ 0xB860, 0xB864, 0xB86C, 0xB86D, 0xB86F, 0xB871, 0xB878, 0xB87C,
+ 0xB88D, 0xB8A8, 0xB8B0, 0xB8B4, 0xB8B8, 0xB8C0, 0xB8C1, 0xB8C3,
+ 0xB8C5, 0xB8CC, 0xB8D0, 0xB8D4, 0xB8DD, 0xB8DF, 0xB8E1, 0xB8E8,
+ 0xB8E9, 0xB8EC, 0xB8F0, 0xB8F8, 0xB8F9, 0xB8FB, 0xB8FD, 0xB904,
+ 0xB918, 0xB920, 0xB93C, 0xB93D, 0xB940, 0xB944, 0xB94C, 0xB94F,
+ 0xB951, 0xB958, 0xB959, 0xB95C, 0xB960, 0xB968, 0xB969, ALTCHR,
+/* 0x3820 - 0x387F */
+ ALTCHR, 0xB96B, 0xB96D, 0xB974, 0xB975, 0xB978, 0xB97C, 0xB984,
+ 0xB985, 0xB987, 0xB989, 0xB98A, 0xB98D, 0xB98E, 0xB9AC, 0xB9AD,
+ 0xB9B0, 0xB9B4, 0xB9BC, 0xB9BD, 0xB9BF, 0xB9C1, 0xB9C8, 0xB9C9,
+ 0xB9CC, 0xB9CE, 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D8, 0xB9D9,
+ 0xB9DB, 0xB9DD, 0xB9DE, 0xB9E1, 0xB9E3, 0xB9E4, 0xB9E5, 0xB9E8,
+ 0xB9EC, 0xB9F4, 0xB9F5, 0xB9F7, 0xB9F8, 0xB9F9, 0xB9FA, 0xBA00,
+ 0xBA01, 0xBA08, 0xBA15, 0xBA38, 0xBA39, 0xBA3C, 0xBA40, 0xBA42,
+ 0xBA48, 0xBA49, 0xBA4B, 0xBA4D, 0xBA4E, 0xBA53, 0xBA54, 0xBA55,
+ 0xBA58, 0xBA5C, 0xBA64, 0xBA65, 0xBA67, 0xBA68, 0xBA69, 0xBA70,
+ 0xBA71, 0xBA74, 0xBA78, 0xBA83, 0xBA84, 0xBA85, 0xBA87, 0xBA8C,
+ 0xBAA8, 0xBAA9, 0xBAAB, 0xBAAC, 0xBAB0, 0xBAB2, 0xBAB8, 0xBAB9,
+ 0xBABB, 0xBABD, 0xBAC4, 0xBAC8, 0xBAD8, 0xBAD9, 0xBAFC, ALTCHR,
+/* 0x3920 - 0x397F */
+ ALTCHR, 0xBB00, 0xBB04, 0xBB0D, 0xBB0F, 0xBB11, 0xBB18, 0xBB1C,
+ 0xBB20, 0xBB29, 0xBB2B, 0xBB34, 0xBB35, 0xBB36, 0xBB38, 0xBB3B,
+ 0xBB3C, 0xBB3D, 0xBB3E, 0xBB44, 0xBB45, 0xBB47, 0xBB49, 0xBB4D,
+ 0xBB4F, 0xBB50, 0xBB54, 0xBB58, 0xBB61, 0xBB63, 0xBB6C, 0xBB88,
+ 0xBB8C, 0xBB90, 0xBBA4, 0xBBA8, 0xBBAC, 0xBBB4, 0xBBB7, 0xBBC0,
+ 0xBBC4, 0xBBC8, 0xBBD0, 0xBBD3, 0xBBF8, 0xBBF9, 0xBBFC, 0xBBFF,
+ 0xBC00, 0xBC02, 0xBC08, 0xBC09, 0xBC0B, 0xBC0C, 0xBC0D, 0xBC0F,
+ 0xBC11, 0xBC14, 0xBC15, 0xBC16, 0xBC17, 0xBC18, 0xBC1B, 0xBC1C,
+ 0xBC1D, 0xBC1E, 0xBC1F, 0xBC24, 0xBC25, 0xBC27, 0xBC29, 0xBC2D,
+ 0xBC30, 0xBC31, 0xBC34, 0xBC38, 0xBC40, 0xBC41, 0xBC43, 0xBC44,
+ 0xBC45, 0xBC49, 0xBC4C, 0xBC4D, 0xBC50, 0xBC5D, 0xBC84, 0xBC85,
+ 0xBC88, 0xBC8B, 0xBC8C, 0xBC8E, 0xBC94, 0xBC95, 0xBC97, ALTCHR,
+/* 0x3A20 - 0x3A7F */
+ ALTCHR, 0xBC99, 0xBC9A, 0xBCA0, 0xBCA1, 0xBCA4, 0xBCA7, 0xBCA8,
+ 0xBCB0, 0xBCB1, 0xBCB3, 0xBCB4, 0xBCB5, 0xBCBC, 0xBCBD, 0xBCC0,
+ 0xBCC4, 0xBCCD, 0xBCCF, 0xBCD0, 0xBCD1, 0xBCD5, 0xBCD8, 0xBCDC,
+ 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF8, 0xBCFC, 0xBD04, 0xBD05, 0xBD07,
+ 0xBD09, 0xBD10, 0xBD14, 0xBD24, 0xBD2C, 0xBD40, 0xBD48, 0xBD49,
+ 0xBD4C, 0xBD50, 0xBD58, 0xBD59, 0xBD64, 0xBD68, 0xBD80, 0xBD81,
+ 0xBD84, 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD90, 0xBD91, 0xBD93,
+ 0xBD95, 0xBD99, 0xBD9A, 0xBD9C, 0xBDA4, 0xBDB0, 0xBDB8, 0xBDD4,
+ 0xBDD5, 0xBDD8, 0xBDDC, 0xBDE9, 0xBDF0, 0xBDF4, 0xBDF8, 0xBE00,
+ 0xBE03, 0xBE05, 0xBE0C, 0xBE0D, 0xBE10, 0xBE14, 0xBE1C, 0xBE1D,
+ 0xBE1F, 0xBE44, 0xBE45, 0xBE48, 0xBE4C, 0xBE4E, 0xBE54, 0xBE55,
+ 0xBE57, 0xBE59, 0xBE5A, 0xBE5B, 0xBE60, 0xBE61, 0xBE64, ALTCHR,
+/* 0x3B20 - 0x3B7F */
+ ALTCHR, 0xBE68, 0xBE6A, 0xBE70, 0xBE71, 0xBE73, 0xBE74, 0xBE75,
+ 0xBE7B, 0xBE7C, 0xBE7D, 0xBE80, 0xBE84, 0xBE8C, 0xBE8D, 0xBE8F,
+ 0xBE90, 0xBE91, 0xBE98, 0xBE99, 0xBEA8, 0xBED0, 0xBED1, 0xBED4,
+ 0xBED7, 0xBED8, 0xBEE0, 0xBEE3, 0xBEE4, 0xBEE5, 0xBEEC, 0xBF01,
+ 0xBF08, 0xBF09, 0xBF18, 0xBF19, 0xBF1B, 0xBF1C, 0xBF1D, 0xBF40,
+ 0xBF41, 0xBF44, 0xBF48, 0xBF50, 0xBF51, 0xBF55, 0xBF94, 0xBFB0,
+ 0xBFC5, 0xBFCC, 0xBFCD, 0xBFD0, 0xBFD4, 0xBFDC, 0xBFDF, 0xBFE1,
+ 0xC03C, 0xC051, 0xC058, 0xC05C, 0xC060, 0xC068, 0xC069, 0xC090,
+ 0xC091, 0xC094, 0xC098, 0xC0A0, 0xC0A1, 0xC0A3, 0xC0A5, 0xC0AC,
+ 0xC0AD, 0xC0AF, 0xC0B0, 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0BC,
+ 0xC0BD, 0xC0BF, 0xC0C0, 0xC0C1, 0xC0C5, 0xC0C8, 0xC0C9, 0xC0CC,
+ 0xC0D0, 0xC0D8, 0xC0D9, 0xC0DB, 0xC0DC, 0xC0DD, 0xC0E4, ALTCHR,
+/* 0x3C20 - 0x3C7F */
+ ALTCHR, 0xC0E5, 0xC0E8, 0xC0EC, 0xC0F4, 0xC0F5, 0xC0F7, 0xC0F9,
+ 0xC100, 0xC104, 0xC108, 0xC110, 0xC115, 0xC11C, 0xC11D, 0xC11E,
+ 0xC11F, 0xC120, 0xC123, 0xC124, 0xC126, 0xC127, 0xC12C, 0xC12D,
+ 0xC12F, 0xC130, 0xC131, 0xC136, 0xC138, 0xC139, 0xC13C, 0xC140,
+ 0xC148, 0xC149, 0xC14B, 0xC14C, 0xC14D, 0xC154, 0xC155, 0xC158,
+ 0xC15C, 0xC164, 0xC165, 0xC167, 0xC168, 0xC169, 0xC170, 0xC174,
+ 0xC178, 0xC185, 0xC18C, 0xC18D, 0xC18E, 0xC190, 0xC194, 0xC196,
+ 0xC19C, 0xC19D, 0xC19F, 0xC1A1, 0xC1A5, 0xC1A8, 0xC1A9, 0xC1AC,
+ 0xC1B0, 0xC1BD, 0xC1C4, 0xC1C8, 0xC1CC, 0xC1D4, 0xC1D7, 0xC1D8,
+ 0xC1E0, 0xC1E4, 0xC1E8, 0xC1F0, 0xC1F1, 0xC1F3, 0xC1FC, 0xC1FD,
+ 0xC200, 0xC204, 0xC20C, 0xC20D, 0xC20F, 0xC211, 0xC218, 0xC219,
+ 0xC21C, 0xC21F, 0xC220, 0xC228, 0xC229, 0xC22B, 0xC22D, ALTCHR,
+/* 0x3D20 - 0x3D7F */
+ ALTCHR, 0xC22F, 0xC231, 0xC232, 0xC234, 0xC248, 0xC250, 0xC251,
+ 0xC254, 0xC258, 0xC260, 0xC265, 0xC26C, 0xC26D, 0xC270, 0xC274,
+ 0xC27C, 0xC27D, 0xC27F, 0xC281, 0xC288, 0xC289, 0xC290, 0xC298,
+ 0xC29B, 0xC29D, 0xC2A4, 0xC2A5, 0xC2A8, 0xC2AC, 0xC2AD, 0xC2B4,
+ 0xC2B5, 0xC2B7, 0xC2B9, 0xC2DC, 0xC2DD, 0xC2E0, 0xC2E3, 0xC2E4,
+ 0xC2EB, 0xC2EC, 0xC2ED, 0xC2EF, 0xC2F1, 0xC2F6, 0xC2F8, 0xC2F9,
+ 0xC2FB, 0xC2FC, 0xC300, 0xC308, 0xC309, 0xC30C, 0xC30D, 0xC313,
+ 0xC314, 0xC315, 0xC318, 0xC31C, 0xC324, 0xC325, 0xC328, 0xC329,
+ 0xC345, 0xC368, 0xC369, 0xC36C, 0xC370, 0xC372, 0xC378, 0xC379,
+ 0xC37C, 0xC37D, 0xC384, 0xC388, 0xC38C, 0xC3C0, 0xC3D8, 0xC3D9,
+ 0xC3DC, 0xC3DF, 0xC3E0, 0xC3E2, 0xC3E8, 0xC3E9, 0xC3ED, 0xC3F4,
+ 0xC3F5, 0xC3F8, 0xC408, 0xC410, 0xC424, 0xC42C, 0xC430, ALTCHR,
+/* 0x3E20 - 0x3E7F */
+ ALTCHR, 0xC434, 0xC43C, 0xC43D, 0xC448, 0xC464, 0xC465, 0xC468,
+ 0xC46C, 0xC474, 0xC475, 0xC479, 0xC480, 0xC494, 0xC49C, 0xC4B8,
+ 0xC4BC, 0xC4E9, 0xC4F0, 0xC4F1, 0xC4F4, 0xC4F8, 0xC4FA, 0xC4FF,
+ 0xC500, 0xC501, 0xC50C, 0xC510, 0xC514, 0xC51C, 0xC528, 0xC529,
+ 0xC52C, 0xC530, 0xC538, 0xC539, 0xC53B, 0xC53D, 0xC544, 0xC545,
+ 0xC548, 0xC549, 0xC54A, 0xC54C, 0xC54D, 0xC54E, 0xC553, 0xC554,
+ 0xC555, 0xC557, 0xC558, 0xC559, 0xC55D, 0xC55E, 0xC560, 0xC561,
+ 0xC564, 0xC568, 0xC570, 0xC571, 0xC573, 0xC574, 0xC575, 0xC57C,
+ 0xC57D, 0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F, 0xC591,
+ 0xC595, 0xC597, 0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4, 0xC5B5,
+ 0xC5B8, 0xC5B9, 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4, 0xC5C5,
+ 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9, 0xC5CA, 0xC5CC, 0xC5CE, ALTCHR,
+/* 0x3F20 - 0x3F7F */
+ ALTCHR, 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1, 0xC5E3,
+ 0xC5E5, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7,
+ 0xC5FC, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606,
+ 0xC607, 0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C,
+ 0xC624, 0xC625, 0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633,
+ 0xC634, 0xC635, 0xC637, 0xC639, 0xC63B, 0xC640, 0xC641, 0xC644,
+ 0xC648, 0xC650, 0xC651, 0xC653, 0xC654, 0xC655, 0xC65C, 0xC65D,
+ 0xC660, 0xC66C, 0xC66F, 0xC671, 0xC678, 0xC679, 0xC67C, 0xC680,
+ 0xC688, 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695, 0xC698, 0xC69C,
+ 0xC6A4, 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4, 0xC6B8,
+ 0xC6B9, 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD,
+ 0xC6D0, 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, ALTCHR,
+/* 0x4020 - 0x407F */
+ ALTCHR, 0xC6E9, 0xC6EC, 0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704,
+ 0xC705, 0xC708, 0xC70C, 0xC714, 0xC715, 0xC717, 0xC719, 0xC720,
+ 0xC721, 0xC724, 0xC728, 0xC730, 0xC731, 0xC733, 0xC735, 0xC737,
+ 0xC73C, 0xC73D, 0xC740, 0xC744, 0xC74A, 0xC74C, 0xC74D, 0xC74F,
+ 0xC751, 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, 0xC758,
+ 0xC75C, 0xC760, 0xC768, 0xC76B, 0xC774, 0xC775, 0xC778, 0xC77C,
+ 0xC77D, 0xC77E, 0xC783, 0xC784, 0xC785, 0xC787, 0xC788, 0xC789,
+ 0xC78A, 0xC78E, 0xC790, 0xC791, 0xC794, 0xC796, 0xC797, 0xC798,
+ 0xC79A, 0xC7A0, 0xC7A1, 0xC7A3, 0xC7A4, 0xC7A5, 0xC7A6, 0xC7AC,
+ 0xC7AD, 0xC7B0, 0xC7B4, 0xC7BC, 0xC7BD, 0xC7BF, 0xC7C0, 0xC7C1,
+ 0xC7C8, 0xC7C9, 0xC7CC, 0xC7CE, 0xC7D0, 0xC7D8, 0xC7DD, 0xC7E4,
+ 0xC7E8, 0xC7EC, 0xC800, 0xC801, 0xC804, 0xC808, 0xC80A, ALTCHR,
+/* 0x4120 - 0x417F */
+ ALTCHR, 0xC810, 0xC811, 0xC813, 0xC815, 0xC816, 0xC81C, 0xC81D,
+ 0xC820, 0xC824, 0xC82C, 0xC82D, 0xC82F, 0xC831, 0xC838, 0xC83C,
+ 0xC840, 0xC848, 0xC849, 0xC84C, 0xC84D, 0xC854, 0xC870, 0xC871,
+ 0xC874, 0xC878, 0xC87A, 0xC880, 0xC881, 0xC883, 0xC885, 0xC886,
+ 0xC887, 0xC88B, 0xC88C, 0xC88D, 0xC894, 0xC89D, 0xC89F, 0xC8A1,
+ 0xC8A8, 0xC8BC, 0xC8BD, 0xC8C4, 0xC8C8, 0xC8CC, 0xC8D4, 0xC8D5,
+ 0xC8D7, 0xC8D9, 0xC8E0, 0xC8E1, 0xC8E4, 0xC8F5, 0xC8FC, 0xC8FD,
+ 0xC900, 0xC904, 0xC905, 0xC906, 0xC90C, 0xC90D, 0xC90F, 0xC911,
+ 0xC918, 0xC92C, 0xC934, 0xC950, 0xC951, 0xC954, 0xC958, 0xC960,
+ 0xC961, 0xC963, 0xC96C, 0xC970, 0xC974, 0xC97C, 0xC988, 0xC989,
+ 0xC98C, 0xC990, 0xC998, 0xC999, 0xC99B, 0xC99D, 0xC9C0, 0xC9C1,
+ 0xC9C4, 0xC9C7, 0xC9C8, 0xC9CA, 0xC9D0, 0xC9D1, 0xC9D3, ALTCHR,
+/* 0x4220 - 0x427F */
+ ALTCHR, 0xC9D5, 0xC9D6, 0xC9D9, 0xC9DA, 0xC9DC, 0xC9DD, 0xC9E0,
+ 0xC9E2, 0xC9E4, 0xC9E7, 0xC9EC, 0xC9ED, 0xC9EF, 0xC9F0, 0xC9F1,
+ 0xC9F8, 0xC9F9, 0xC9FC, 0xCA00, 0xCA08, 0xCA09, 0xCA0B, 0xCA0C,
+ 0xCA0D, 0xCA14, 0xCA18, 0xCA29, 0xCA4C, 0xCA4D, 0xCA50, 0xCA54,
+ 0xCA5C, 0xCA5D, 0xCA5F, 0xCA60, 0xCA61, 0xCA68, 0xCA7D, 0xCA84,
+ 0xCA98, 0xCABC, 0xCABD, 0xCAC0, 0xCAC4, 0xCACC, 0xCACD, 0xCACF,
+ 0xCAD1, 0xCAD3, 0xCAD8, 0xCAD9, 0xCAE0, 0xCAEC, 0xCAF4, 0xCB08,
+ 0xCB10, 0xCB14, 0xCB18, 0xCB20, 0xCB21, 0xCB41, 0xCB48, 0xCB49,
+ 0xCB4C, 0xCB50, 0xCB58, 0xCB59, 0xCB5D, 0xCB64, 0xCB78, 0xCB79,
+ 0xCB9C, 0xCBB8, 0xCBD4, 0xCBE4, 0xCBE7, 0xCBE9, 0xCC0C, 0xCC0D,
+ 0xCC10, 0xCC14, 0xCC1C, 0xCC1D, 0xCC21, 0xCC22, 0xCC27, 0xCC28,
+ 0xCC29, 0xCC2C, 0xCC2E, 0xCC30, 0xCC38, 0xCC39, 0xCC3B, ALTCHR,
+/* 0x4320 - 0x437F */
+ ALTCHR, 0xCC3C, 0xCC3D, 0xCC3E, 0xCC44, 0xCC45, 0xCC48, 0xCC4C,
+ 0xCC54, 0xCC55, 0xCC57, 0xCC58, 0xCC59, 0xCC60, 0xCC64, 0xCC66,
+ 0xCC68, 0xCC70, 0xCC75, 0xCC98, 0xCC99, 0xCC9C, 0xCCA0, 0xCCA8,
+ 0xCCA9, 0xCCAB, 0xCCAC, 0xCCAD, 0xCCB4, 0xCCB5, 0xCCB8, 0xCCBC,
+ 0xCCC4, 0xCCC5, 0xCCC7, 0xCCC9, 0xCCD0, 0xCCD4, 0xCCE4, 0xCCEC,
+ 0xCCF0, 0xCD01, 0xCD08, 0xCD09, 0xCD0C, 0xCD10, 0xCD18, 0xCD19,
+ 0xCD1B, 0xCD1D, 0xCD24, 0xCD28, 0xCD2C, 0xCD39, 0xCD5C, 0xCD60,
+ 0xCD64, 0xCD6C, 0xCD6D, 0xCD6F, 0xCD71, 0xCD78, 0xCD88, 0xCD94,
+ 0xCD95, 0xCD98, 0xCD9C, 0xCDA4, 0xCDA5, 0xCDA7, 0xCDA9, 0xCDB0,
+ 0xCDC4, 0xCDCC, 0xCDD0, 0xCDE8, 0xCDEC, 0xCDF0, 0xCDF8, 0xCDF9,
+ 0xCDFB, 0xCDFD, 0xCE04, 0xCE08, 0xCE0C, 0xCE14, 0xCE19, 0xCE20,
+ 0xCE21, 0xCE24, 0xCE28, 0xCE30, 0xCE31, 0xCE33, 0xCE35, ALTCHR,
+/* 0x4420 - 0x447F */
+ ALTCHR, 0xCE58, 0xCE59, 0xCE5C, 0xCE5F, 0xCE60, 0xCE61, 0xCE68,
+ 0xCE69, 0xCE6B, 0xCE6D, 0xCE74, 0xCE75, 0xCE78, 0xCE7C, 0xCE84,
+ 0xCE85, 0xCE87, 0xCE89, 0xCE90, 0xCE91, 0xCE94, 0xCE98, 0xCEA0,
+ 0xCEA1, 0xCEA3, 0xCEA4, 0xCEA5, 0xCEAC, 0xCEAD, 0xCEC1, 0xCEE4,
+ 0xCEE5, 0xCEE8, 0xCEEB, 0xCEEC, 0xCEF4, 0xCEF5, 0xCEF7, 0xCEF8,
+ 0xCEF9, 0xCF00, 0xCF01, 0xCF04, 0xCF08, 0xCF10, 0xCF11, 0xCF13,
+ 0xCF15, 0xCF1C, 0xCF20, 0xCF24, 0xCF2C, 0xCF2D, 0xCF2F, 0xCF30,
+ 0xCF31, 0xCF38, 0xCF54, 0xCF55, 0xCF58, 0xCF5C, 0xCF64, 0xCF65,
+ 0xCF67, 0xCF69, 0xCF70, 0xCF71, 0xCF74, 0xCF78, 0xCF80, 0xCF85,
+ 0xCF8C, 0xCFA1, 0xCFA8, 0xCFB0, 0xCFC4, 0xCFE0, 0xCFE1, 0xCFE4,
+ 0xCFE8, 0xCFF0, 0xCFF1, 0xCFF3, 0xCFF5, 0xCFFC, 0xD000, 0xD004,
+ 0xD011, 0xD018, 0xD02D, 0xD034, 0xD035, 0xD038, 0xD03C, ALTCHR,
+/* 0x4520 - 0x457F */
+ ALTCHR, 0xD044, 0xD045, 0xD047, 0xD049, 0xD050, 0xD054, 0xD058,
+ 0xD060, 0xD06C, 0xD06D, 0xD070, 0xD074, 0xD07C, 0xD07D, 0xD081,
+ 0xD0A4, 0xD0A5, 0xD0A8, 0xD0AC, 0xD0B4, 0xD0B5, 0xD0B7, 0xD0B9,
+ 0xD0C0, 0xD0C1, 0xD0C4, 0xD0C8, 0xD0C9, 0xD0D0, 0xD0D1, 0xD0D3,
+ 0xD0D4, 0xD0D5, 0xD0DC, 0xD0DD, 0xD0E0, 0xD0E4, 0xD0EC, 0xD0ED,
+ 0xD0EF, 0xD0F0, 0xD0F1, 0xD0F8, 0xD10D, 0xD130, 0xD131, 0xD134,
+ 0xD138, 0xD13A, 0xD140, 0xD141, 0xD143, 0xD144, 0xD145, 0xD14C,
+ 0xD14D, 0xD150, 0xD154, 0xD15C, 0xD15D, 0xD15F, 0xD161, 0xD168,
+ 0xD16C, 0xD17C, 0xD184, 0xD188, 0xD1A0, 0xD1A1, 0xD1A4, 0xD1A8,
+ 0xD1B0, 0xD1B1, 0xD1B3, 0xD1B5, 0xD1BA, 0xD1BC, 0xD1C0, 0xD1D8,
+ 0xD1F4, 0xD1F8, 0xD207, 0xD209, 0xD210, 0xD22C, 0xD22D, 0xD230,
+ 0xD234, 0xD23C, 0xD23D, 0xD23F, 0xD241, 0xD248, 0xD25C, ALTCHR,
+/* 0x4620 - 0x467F */
+ ALTCHR, 0xD264, 0xD280, 0xD281, 0xD284, 0xD288, 0xD290, 0xD291,
+ 0xD295, 0xD29C, 0xD2A0, 0xD2A4, 0xD2AC, 0xD2B1, 0xD2B8, 0xD2B9,
+ 0xD2BC, 0xD2BF, 0xD2C0, 0xD2C2, 0xD2C8, 0xD2C9, 0xD2CB, 0xD2D4,
+ 0xD2D8, 0xD2DC, 0xD2E4, 0xD2E5, 0xD2F0, 0xD2F1, 0xD2F4, 0xD2F8,
+ 0xD300, 0xD301, 0xD303, 0xD305, 0xD30C, 0xD30D, 0xD30E, 0xD310,
+ 0xD314, 0xD316, 0xD31C, 0xD31D, 0xD31F, 0xD320, 0xD321, 0xD325,
+ 0xD328, 0xD329, 0xD32C, 0xD330, 0xD338, 0xD339, 0xD33B, 0xD33C,
+ 0xD33D, 0xD344, 0xD345, 0xD37C, 0xD37D, 0xD380, 0xD384, 0xD38C,
+ 0xD38D, 0xD38F, 0xD390, 0xD391, 0xD398, 0xD399, 0xD39C, 0xD3A0,
+ 0xD3A8, 0xD3A9, 0xD3AB, 0xD3AD, 0xD3B4, 0xD3B8, 0xD3BC, 0xD3C4,
+ 0xD3C5, 0xD3C8, 0xD3C9, 0xD3D0, 0xD3D8, 0xD3E1, 0xD3E3, 0xD3EC,
+ 0xD3ED, 0xD3F0, 0xD3F4, 0xD3FC, 0xD3FD, 0xD3FF, 0xD401, ALTCHR,
+/* 0x4720 - 0x477F */
+ ALTCHR, 0xD408, 0xD41D, 0xD440, 0xD444, 0xD45C, 0xD460, 0xD464,
+ 0xD46D, 0xD46F, 0xD478, 0xD479, 0xD47C, 0xD47F, 0xD480, 0xD482,
+ 0xD488, 0xD489, 0xD48B, 0xD48D, 0xD494, 0xD4A9, 0xD4CC, 0xD4D0,
+ 0xD4D4, 0xD4DC, 0xD4DF, 0xD4E8, 0xD4EC, 0xD4F0, 0xD4F8, 0xD4FB,
+ 0xD4FD, 0xD504, 0xD508, 0xD50C, 0xD514, 0xD515, 0xD517, 0xD53C,
+ 0xD53D, 0xD540, 0xD544, 0xD54C, 0xD54D, 0xD54F, 0xD551, 0xD558,
+ 0xD559, 0xD55C, 0xD560, 0xD565, 0xD568, 0xD569, 0xD56B, 0xD56D,
+ 0xD574, 0xD575, 0xD578, 0xD57C, 0xD584, 0xD585, 0xD587, 0xD588,
+ 0xD589, 0xD590, 0xD5A5, 0xD5C8, 0xD5C9, 0xD5CC, 0xD5D0, 0xD5D2,
+ 0xD5D8, 0xD5D9, 0xD5DB, 0xD5DD, 0xD5E4, 0xD5E5, 0xD5E8, 0xD5EC,
+ 0xD5F4, 0xD5F5, 0xD5F7, 0xD5F9, 0xD600, 0xD601, 0xD604, 0xD608,
+ 0xD610, 0xD611, 0xD613, 0xD614, 0xD615, 0xD61C, 0xD620, ALTCHR,
+/* 0x4820 - 0x487F */
+ ALTCHR, 0xD624, 0xD62D, 0xD638, 0xD639, 0xD63C, 0xD640, 0xD645,
+ 0xD648, 0xD649, 0xD64B, 0xD64D, 0xD651, 0xD654, 0xD655, 0xD658,
+ 0xD65C, 0xD667, 0xD669, 0xD670, 0xD671, 0xD674, 0xD683, 0xD685,
+ 0xD68C, 0xD68D, 0xD690, 0xD694, 0xD69D, 0xD69F, 0xD6A1, 0xD6A8,
+ 0xD6AC, 0xD6B0, 0xD6B9, 0xD6BB, 0xD6C4, 0xD6C5, 0xD6C8, 0xD6CC,
+ 0xD6D1, 0xD6D4, 0xD6D7, 0xD6D9, 0xD6E0, 0xD6E4, 0xD6E8, 0xD6F0,
+ 0xD6F5, 0xD6FC, 0xD6FD, 0xD700, 0xD704, 0xD711, 0xD718, 0xD719,
+ 0xD71C, 0xD720, 0xD728, 0xD729, 0xD72B, 0xD72D, 0xD734, 0xD735,
+ 0xD738, 0xD73C, 0xD744, 0xD747, 0xD749, 0xD750, 0xD751, 0xD754,
+ 0xD756, 0xD757, 0xD758, 0xD759, 0xD760, 0xD761, 0xD763, 0xD765,
+ 0xD769, 0xD76C, 0xD770, 0xD774, 0xD77C, 0xD77D, 0xD781, 0xD788,
+ 0xD789, 0xD78C, 0xD790, 0xD798, 0xD799, 0xD79B, 0xD79D, ALTCHR,
+/* 0x4920 - 0x497F */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x4A20 - 0x4A7F */
+ ALTCHR, 0x4F3D, 0x4F73, 0x5047, 0x50F9, 0x52A0, 0x53EF, 0x5475,
+ 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687, 0x67B6, 0x67B7, 0x67EF,
+ 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB, 0x8304, 0x8857, 0x8888,
+ 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6, 0x99D5, 0x523B, 0x5374,
+ 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF, 0x811A, 0x89BA, 0x89D2,
+ 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978, 0x59E6, 0x5E72, 0x5E79,
+ 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F, 0x6F97, 0x764E, 0x770B,
+ 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D, 0x826E, 0x8271, 0x8AEB,
+ 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34, 0x78A3, 0x7AED, 0x845B,
+ 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E, 0x582A, 0x5D4C, 0x611F,
+ 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44, 0x6E1B, 0x7518, 0x75B3,
+ 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451, 0x9452, 0x9F95, ALTCHR,
+/* 0x4B20 - 0x4B7F */
+ ALTCHR, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598, 0x525B,
+ 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A, 0x6177,
+ 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C, 0x8154,
+ 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47, 0x4ECB,
+ 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168, 0x6539,
+ 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5, 0x84CB,
+ 0xF900, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0xF901, 0x7CB3,
+ 0x7FB9, 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E,
+ 0x64DA, 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0xF902,
+ 0x907D, 0x9245, 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA,
+ 0x6106, 0x6957, 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E,
+ 0x5091, 0x6770, 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, ALTCHR,
+/* 0x4C20 - 0x4C7F */
+ ALTCHR, 0x77BC, 0x9210, 0x9ED4, 0x52AB, 0x602F, 0x8FF2, 0x5048,
+ 0x61A9, 0x63ED, 0x64CA, 0x683C, 0x6A84, 0x6FC0, 0x8188, 0x89A1,
+ 0x9694, 0x5805, 0x727D, 0x72AC, 0x7504, 0x7D79, 0x7E6D, 0x80A9,
+ 0x898B, 0x8B74, 0x9063, 0x9D51, 0x6289, 0x6C7A, 0x6F54, 0x7D50,
+ 0x7F3A, 0x8A23, 0x517C, 0x614A, 0x7B9D, 0x8B19, 0x9257, 0x938C,
+ 0x4EAC, 0x4FD3, 0x501E, 0x50BE, 0x5106, 0x52C1, 0x52CD, 0x537F,
+ 0x5770, 0x5883, 0x5E9A, 0x5F91, 0x6176, 0x61AC, 0x64CE, 0x656C,
+ 0x666F, 0x66BB, 0x66F4, 0x6897, 0x6D87, 0x7085, 0x70F1, 0x749F,
+ 0x74A5, 0x74CA, 0x75D9, 0x786C, 0x78EC, 0x7ADF, 0x7AF6, 0x7D45,
+ 0x7D93, 0x8015, 0x803F, 0x811B, 0x8396, 0x8B66, 0x8F15, 0x9015,
+ 0x93E1, 0x9803, 0x9838, 0x9A5A, 0x9BE8, 0x4FC2, 0x5553, 0x583A,
+ 0x5951, 0x5B63, 0x5C46, 0x60B8, 0x6212, 0x6842, 0x68B0, ALTCHR,
+/* 0x4D20 - 0x4D7F */
+ ALTCHR, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE, 0x7A3D, 0x7CFB,
+ 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E, 0x9DC4, 0x53E4,
+ 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64, 0x5C3B, 0x5EAB,
+ 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF, 0x69C1, 0x6CBD,
+ 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003, 0x80A1, 0x818F,
+ 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4, 0x8AA5, 0xF903,
+ 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED, 0x659B,
+ 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764, 0x5D11,
+ 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4, 0x6C68,
+ 0xF904, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5,
+ 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3,
+ 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, ALTCHR,
+/* 0x4E20 - 0x4E7F */
+ ALTCHR, 0x79D1, 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B,
+ 0x9846, 0x5ED3, 0x69E8, 0x85FF, 0x90ED, 0xF905, 0x51A0, 0x5B98,
+ 0x5BEC, 0x6163, 0x68FA, 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1,
+ 0x7F50, 0x83C5, 0x89C0, 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D,
+ 0x62EC, 0x9002, 0x4F8A, 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0,
+ 0x6D38, 0x709A, 0x72C2, 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366,
+ 0x639B, 0x7F6B, 0x4E56, 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127,
+ 0x62D0, 0x69D0, 0x9B41, 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4,
+ 0x50D1, 0x54AC, 0x55AC, 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E,
+ 0x6821, 0x6A4B, 0x72E1, 0x768E, 0x77EF, 0x7D5E, 0x7FF9, 0x81A0,
+ 0x854E, 0x86DF, 0x8F03, 0x8F4E, 0x90CA, 0x9903, 0x9A55, 0x9BAB,
+ 0x4E18, 0x4E45, 0x4E5D, 0x4EC7, 0x4FF1, 0x5177, 0x52FE, ALTCHR,
+/* 0x4F20 - 0x4F7F */
+ ALTCHR, 0x5340, 0x53E3, 0x53E5, 0x548E, 0x5614, 0x5775, 0x57A2,
+ 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8, 0x6551, 0x67B8, 0x67E9,
+ 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42, 0x6E9D, 0x7078, 0x72D7,
+ 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76, 0x7D7F, 0x8009, 0x81FC,
+ 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33, 0x8CFC, 0x8EC0, 0x9011,
+ 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45, 0x9CE9, 0x9DD7, 0x9F9C,
+ 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB, 0x9EB4, 0x541B, 0x7A98,
+ 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800, 0x5C48, 0x6398, 0x7A9F,
+ 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E, 0x8EAC, 0x5026, 0x5238,
+ 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372, 0x6B0A, 0x6DC3, 0x7737,
+ 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5, 0x673A, 0x6AC3, 0x6F70,
+ 0x8A6D, 0x8ECC, 0x994B, 0xF906, 0x6677, 0x6B78, 0x8CB4, ALTCHR,
+/* 0x5020 - 0x507F */
+ ALTCHR, 0x9B3C, 0xF907, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB,
+ 0x73EA, 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73,
+ 0x9035, 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E,
+ 0xF908, 0x6A58, 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975,
+ 0x9699, 0x50C5, 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF,
+ 0x747E, 0x7B4B, 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949,
+ 0xF909, 0x4ECA, 0x5997, 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981,
+ 0x79BD, 0x82A9, 0x887E, 0x887F, 0x895F, 0xF90A, 0x9326, 0x4F0B,
+ 0x53CA, 0x6025, 0x6271, 0x6C72, 0x7D1A, 0x7D66, 0x4E98, 0x5162,
+ 0x77DC, 0x80AF, 0x4F01, 0x4F0E, 0x5176, 0x5180, 0x55DC, 0x5668,
+ 0x573B, 0x57FA, 0x57FC, 0x5914, 0x5947, 0x5993, 0x5BC4, 0x5C90,
+ 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC, 0x6280, 0x65D7, 0x65E3, ALTCHR,
+/* 0x5120 - 0x517F */
+ ALTCHR, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4, 0x6A5F, 0x6B3A,
+ 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426, 0x742A, 0x7482,
+ 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941, 0x7947, 0x7948,
+ 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006, 0x802D, 0x808C,
+ 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324, 0x98E2, 0x9951,
+ 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76, 0x5409, 0x62EE,
+ 0x6854, 0x91D1, 0x55AB, 0x513A, 0xF90B, 0xF90C, 0x5A1C, 0x61E6,
+ 0xF90D, 0x62CF, 0x62FF, 0xF90E, 0xF90F, 0xF910, 0xF911, 0xF912,
+ 0xF913, 0x90A3, 0xF914, 0xF915, 0xF916, 0xF917, 0xF918, 0x8AFE,
+ 0xF919, 0xF91A, 0xF91B, 0xF91C, 0x6696, 0xF91D, 0x7156, 0xF91E,
+ 0xF91F, 0x96E3, 0xF920, 0x634F, 0x637A, 0x5357, 0xF921, 0x678F,
+ 0x6960, 0x6E73, 0xF922, 0x7537, 0xF923, 0xF924, 0xF925, ALTCHR,
+/* 0x5220 - 0x527F */
+ ALTCHR, 0x7D0D, 0xF926, 0xF927, 0x8872, 0x56CA, 0x5A18, 0xF928,
+ 0xF929, 0xF92A, 0xF92B, 0xF92C, 0x4E43, 0xF92D, 0x5167, 0x5948,
+ 0x67F0, 0x8010, 0xF92E, 0x5973, 0x5E74, 0x649A, 0x79CA, 0x5FF5,
+ 0x606C, 0x62C8, 0x637B, 0x5BE7, 0x5BD7, 0x52AA, 0xF92F, 0x5974,
+ 0x5F29, 0x6012, 0xF930, 0xF931, 0xF932, 0x7459, 0xF933, 0xF934,
+ 0xF935, 0xF936, 0xF937, 0xF938, 0x99D1, 0xF939, 0xF93A, 0xF93B,
+ 0xF93C, 0xF93D, 0xF93E, 0xF93F, 0xF940, 0xF941, 0xF942, 0xF943,
+ 0x6FC3, 0xF944, 0xF945, 0x81BF, 0x8FB2, 0x60F1, 0xF946, 0xF947,
+ 0x8166, 0xF948, 0xF949, 0x5C3F, 0xF94A, 0xF94B, 0xF94C, 0xF94D,
+ 0xF94E, 0xF94F, 0xF950, 0xF951, 0x5AE9, 0x8A25, 0x677B, 0x7D10,
+ 0xF952, 0xF953, 0xF954, 0xF955, 0xF956, 0xF957, 0x80FD, 0xF958,
+ 0xF959, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A, 0x8336, ALTCHR,
+/* 0x5320 - 0x537F */
+ ALTCHR, 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56,
+ 0x65B7, 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E,
+ 0x7DDE, 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A,
+ 0x75B8, 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1,
+ 0x6E5B, 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983,
+ 0x8AC7, 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D,
+ 0x5510, 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576,
+ 0x7CD6, 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D,
+ 0x5CB1, 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B,
+ 0x8CB8, 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200,
+ 0x5230, 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B,
+ 0x5EA6, 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, ALTCHR,
+/* 0x5420 - 0x547F */
+ ALTCHR, 0x68F9, 0x6AC2, 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE,
+ 0x76DC, 0x7779, 0x79B1, 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3,
+ 0x8E48, 0x9003, 0x9014, 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC,
+ 0x6BD2, 0x7006, 0x7258, 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4,
+ 0x7E9B, 0x8B80, 0x58A9, 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C,
+ 0x711E, 0x71C9, 0x8C5A, 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC,
+ 0x51CD, 0x52D5, 0x540C, 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E,
+ 0x6F7C, 0x75BC, 0x77B3, 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C,
+ 0x6597, 0x675C, 0x6793, 0x75D8, 0x7AC7, 0x8373, 0xF95A, 0x8C46,
+ 0x9017, 0x982D, 0x5C6F, 0x81C0, 0x829A, 0x9041, 0x906F, 0x920D,
+ 0x5F97, 0x5D9D, 0x6A59, 0x71C8, 0x767B, 0x7B49, 0x85E4, 0x8B04,
+ 0x9127, 0x9A30, 0x5587, 0x61F6, 0xF95B, 0x7669, 0x7F85, ALTCHR,
+/* 0x5520 - 0x557F */
+ ALTCHR, 0x863F, 0x87BA, 0x88F8, 0x908F, 0xF95C, 0x6D1B, 0x70D9,
+ 0x73DE, 0x7D61, 0x843D, 0xF95D, 0x916A, 0x99F1, 0xF95E, 0x4E82,
+ 0x5375, 0x6B04, 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C,
+ 0x8FA3, 0x5D50, 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C,
+ 0x85CD, 0x8964, 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
+ 0x6D6A, 0x72FC, 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D,
+ 0x5FA0, 0x840A, 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169,
+ 0x51C9, 0x6881, 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2,
+ 0x8F1B, 0x91CF, 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E,
+ 0x623E, 0x65C5, 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD,
+ 0x9A62, 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D,
+ 0x792B, 0x8F62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, ALTCHR,
+/* 0x5620 - 0x567F */
+ ALTCHR, 0x7149, 0x7489, 0x7DF4, 0x806F, 0x84EE, 0x8F26, 0x9023,
+ 0x934A, 0x51BD, 0x5217, 0x52A3, 0x6D0C, 0x70C8, 0x88C2, 0x5EC9,
+ 0x6582, 0x6BAE, 0x6FC2, 0x7C3E, 0x7375, 0x4EE4, 0x4F36, 0x56F9,
+ 0xF95F, 0x5CBA, 0x5DBA, 0x601C, 0x73B2, 0x7B2D, 0x7F9A, 0x7FCE,
+ 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748, 0x9818, 0x9F61, 0x4F8B,
+ 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE, 0xF960, 0x6488, 0x64C4,
+ 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C,
+ 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75, 0x788C, 0x797F,
+ 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6, 0x58DF, 0x5F04,
+ 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121, 0x7028, 0x7262,
+ 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86, 0x50DA, 0x5BEE,
+ 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A, 0x84FC, ALTCHR,
+/* 0x5720 - 0x577F */
+ ALTCHR, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13,
+ 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4,
+ 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F,
+ 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D,
+ 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A,
+ 0x5F8B, 0x6144, 0x6817, 0xF961, 0x9686, 0x52D2, 0x808B, 0x51DC,
+ 0x51CC, 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229,
+ 0x5398, 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C,
+ 0x7281, 0x72F8, 0x7406, 0x7483, 0xF962, 0x75E2, 0x7C6C, 0x7F79,
+ 0x7FB8, 0x8389, 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9,
+ 0x541D, 0x6F7E, 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57,
+ 0x9E9F, 0x6797, 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, ALTCHR,
+/* 0x5820 - 0x587F */
+ ALTCHR, 0x7ACB, 0x7B20, 0x7C92, 0x6469, 0x746A, 0x75F2, 0x78BC,
+ 0x78E8, 0x99AC, 0x9B54, 0x9EBB, 0x5BDE, 0x5E55, 0x6F20, 0x819C,
+ 0x83AB, 0x9088, 0x4E07, 0x534D, 0x5A29, 0x5DD2, 0x5F4E, 0x6162,
+ 0x633D, 0x6669, 0x66FC, 0x6EFF, 0x6F2B, 0x7063, 0x779E, 0x842C,
+ 0x8513, 0x883B, 0x8F13, 0x9945, 0x9C3B, 0x551C, 0x62B9, 0x672B,
+ 0x6CAB, 0x8309, 0x896A, 0x977A, 0x4EA1, 0x5984, 0x5FD8, 0x5FD9,
+ 0x671B, 0x7DB2, 0x7F54, 0x8292, 0x832B, 0x83BD, 0x8F1E, 0x9099,
+ 0x57CB, 0x59B9, 0x5A92, 0x5BD0, 0x6627, 0x679A, 0x6885, 0x6BCF,
+ 0x7164, 0x7F75, 0x8CB7, 0x8CE3, 0x9081, 0x9B45, 0x8108, 0x8C8A,
+ 0x964C, 0x9A40, 0x9EA5, 0x5B5F, 0x6C13, 0x731B, 0x76F2, 0x76DF,
+ 0x840C, 0x51AA, 0x8993, 0x514D, 0x5195, 0x52C9, 0x68C9, 0x6C94,
+ 0x7704, 0x7720, 0x7DBF, 0x7DEC, 0x9762, 0x9EB5, 0x6EC5, ALTCHR,
+/* 0x5920 - 0x597F */
+ ALTCHR, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E, 0x669D, 0x6927,
+ 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F, 0x9169, 0x9298,
+ 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6, 0x5E3D, 0x6155,
+ 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD, 0x6BDB, 0x725F,
+ 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC, 0x8305, 0x8B00,
+ 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE, 0x7766, 0x7A46,
+ 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499, 0x536F, 0x5893,
+ 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A, 0x732B, 0x7AD7,
+ 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB, 0x620A, 0x62C7,
+ 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121, 0x73F7, 0x755D,
+ 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF, 0x9727, 0x9D61,
+ 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F, 0x6587, ALTCHR,
+/* 0x5A20 - 0x5A7F */
+ ALTCHR, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF,
+ 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C,
+ 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73,
+ 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6,
+ 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F,
+ 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A,
+ 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E,
+ 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9,
+ 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500,
+ 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, 0x76E4,
+ 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C, 0x87E0, 0x8FD4,
+ 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24, 0x6F51, ALTCHR,
+/* 0x5B20 - 0x5B7F */
+ ALTCHR, 0x767C, 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023,
+ 0x508D, 0x574A, 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E,
+ 0x65B9, 0x65C1, 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21,
+ 0x80AA, 0x8180, 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17,
+ 0x90A6, 0x9632, 0x9F90, 0x500D, 0x4FF3, 0xF963, 0x57F9, 0x5F98,
+ 0x62DC, 0x6392, 0x676F, 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA,
+ 0x88F4, 0x88F5, 0x8919, 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F,
+ 0x4F70, 0x5E1B, 0x67CF, 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61,
+ 0x6A0A, 0x7169, 0x71D4, 0x756A, 0xF964, 0x7E41, 0x8543, 0x85E9,
+ 0x98DC, 0x4F10, 0x7B4F, 0x7F70, 0x95A5, 0x51E1, 0x5E06, 0x68B5,
+ 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF, 0x7BC4, 0x8303, 0x6CD5, 0x743A,
+ 0x50FB, 0x5288, 0x58C1, 0x64D8, 0x6A97, 0x74A7, 0x7656, ALTCHR,
+/* 0x5C20 - 0x5C7F */
+ ALTCHR, 0x78A7, 0x8617, 0x95E2, 0x9739, 0xF965, 0x535E, 0x5F01,
+ 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49, 0x9F08,
+ 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A, 0x67C4,
+ 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27, 0x9920,
+ 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65, 0x6D11,
+ 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913, 0x8B5C,
+ 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9, 0x670D,
+ 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39, 0x8F3B,
+ 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01, 0x5CEF,
+ 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B, 0x84EC,
+ 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8, 0x4FEF, 0x5085,
+ 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B, 0x5A66, ALTCHR,
+/* 0x5D20 - 0x5D7F */
+ ALTCHR, 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0xF966, 0x6276, 0x6577,
+ 0x65A7, 0x6D6E, 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150,
+ 0x8151, 0x819A, 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6,
+ 0x8CFB, 0x8D74, 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9,
+ 0x9CE7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E,
+ 0x5FFF, 0x61A4, 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89,
+ 0x7CDE, 0x7D1B, 0x82AC, 0x8CC1, 0x96F0, 0xF967, 0x4F5B, 0x5F17,
+ 0x5F7F, 0x62C2, 0x5D29, 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C,
+ 0x4E15, 0x5099, 0x5315, 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87,
+ 0x60B2, 0x618A, 0x6249, 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4,
+ 0x6BD6, 0x6BD7, 0x6BD8, 0x6CB8, 0xF968, 0x7435, 0x75FA, 0x7812,
+ 0x7891, 0x79D5, 0x79D8, 0x7C83, 0x7DCB, 0x7FE1, 0x80A5, ALTCHR,
+/* 0x5E20 - 0x5E7F */
+ ALTCHR, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8, 0x8AB9, 0x8B6C,
+ 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC, 0x5B2A, 0x5F6C,
+ 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015, 0x725D, 0x73AD,
+ 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058, 0x9A01, 0x4E4D,
+ 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F, 0x4FDF, 0x50FF,
+ 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB, 0x5962, 0x5A11,
+ 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99, 0x601D, 0x6368,
+ 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B, 0x6C99, 0x6CD7,
+ 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940, 0x7960, 0x79C1,
+ 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E, 0x84D1, 0x86C7,
+ 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66, 0x8FAD, 0x90AA,
+ 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0xF969, 0x6714, 0xF96A, ALTCHR,
+/* 0x5F20 - 0x5F7F */
+ ALTCHR, 0x5098, 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523,
+ 0x759D, 0x7B97, 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA,
+ 0x715E, 0x85A9, 0x4E09, 0xF96B, 0x6749, 0x68EE, 0x6E17, 0x829F,
+ 0x8518, 0x886B, 0x63F7, 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7,
+ 0x50CF, 0x511F, 0x5546, 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0,
+ 0x5E38, 0x5E8A, 0x5EA0, 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58,
+ 0x723D, 0x7240, 0x72C0, 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3,
+ 0x89F4, 0x8A73, 0x8C61, 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD,
+ 0x55C7, 0xF96C, 0x7A61, 0x7D22, 0x8272, 0x7272, 0x751F, 0x7525,
+ 0xF96D, 0x7B19, 0x5885, 0x58FB, 0x5DBC, 0x5E8F, 0x5EB6, 0x5F90,
+ 0x6055, 0x6292, 0x637F, 0x654D, 0x6691, 0x66D9, 0x66F8, 0x6816,
+ 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E, 0x7DD6, 0x7F72, ALTCHR,
+/* 0x6020 - 0x607F */
+ ALTCHR, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D, 0x92E4,
+ 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614, 0x6673,
+ 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6, 0x91CB,
+ 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3, 0x6247,
+ 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487, 0x74BF,
+ 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3, 0x8239,
+ 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425, 0x994D,
+ 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B, 0x820C,
+ 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261, 0x66B9,
+ 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D, 0x6D89,
+ 0x71EE, 0xF96E, 0x57CE, 0x59D3, 0x5BAC, 0x6027, 0x60FA, 0x6210,
+ 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701, 0x7B6C, ALTCHR,
+/* 0x6120 - 0x617F */
+ ALTCHR, 0x8056, 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2,
+ 0x6B72, 0x6D17, 0x7A05, 0x7B39, 0x7D30, 0xF96F, 0x8CB0, 0x53EC,
+ 0x562F, 0x5851, 0x5BB5, 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383,
+ 0x6414, 0x662D, 0x68B3, 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4,
+ 0x71D2, 0x7526, 0x758F, 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B,
+ 0x7D20, 0x7D39, 0x852C, 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061,
+ 0x90B5, 0x92B7, 0x97F6, 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91,
+ 0x7C9F, 0x7E8C, 0x8B16, 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D,
+ 0x84C0, 0x905C, 0x98E1, 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE,
+ 0x8A1F, 0x8AA6, 0x9001, 0x980C, 0x5237, 0xF970, 0x7051, 0x788E,
+ 0x9396, 0x8870, 0x91D7, 0x4FEE, 0x53D7, 0x55FD, 0x56DA, 0x5782,
+ 0x58FD, 0x5AC2, 0x5B88, 0x5CAB, 0x5CC0, 0x5E25, 0x6101, ALTCHR,
+/* 0x6220 - 0x627F */
+ ALTCHR, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536, 0x6578, 0x6A39,
+ 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9, 0x7378, 0x7407,
+ 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA, 0x7CB9, 0x7D8F,
+ 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490, 0x84DA, 0x85EA,
+ 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083, 0x916C, 0x9296,
+ 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700, 0x9808, 0x9996,
+ 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70, 0x5BBF, 0x6DD1,
+ 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD, 0x5DE1, 0x5F87,
+ 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53, 0x6B89, 0x6D35,
+ 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14, 0x8123, 0x821C,
+ 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187, 0x931E, 0x9806,
+ 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07, 0x5D27, ALTCHR,
+/* 0x6320 - 0x637F */
+ ALTCHR, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2,
+ 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F,
+ 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB,
+ 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD,
+ 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5,
+ 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A,
+ 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C,
+ 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38,
+ 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668,
+ 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA,
+ 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0xF971, 0x8FC5, 0x5931,
+ 0x5BA4, 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, ALTCHR,
+/* 0x6420 - 0x647F */
+ ALTCHR, 0xF972, 0x6DF1, 0x700B, 0x751A, 0x82AF, 0x8AF6, 0x4EC0,
+ 0x5341, 0xF973, 0x96D9, 0x6C0F, 0x4E9E, 0x4FC4, 0x5152, 0x555E,
+ 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD, 0x83AA, 0x86FE, 0x8859,
+ 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09, 0x9D5D, 0x580A, 0x5CB3,
+ 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1, 0x6A02, 0x6E25, 0x9102,
+ 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89, 0x5CB8, 0x6309, 0x664F,
+ 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854, 0x9B9F, 0x65A1, 0x8B01,
+ 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6, 0x5EB5, 0x6697, 0x764C,
+ 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE, 0x9D28, 0x4EF0, 0x592E,
+ 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26, 0x5393, 0x54C0, 0x57C3,
+ 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D, 0x827E, 0x9698, 0x9744,
+ 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A, 0x814B, 0x984D, ALTCHR,
+/* 0x6520 - 0x657F */
+ ALTCHR, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B, 0x51B6,
+ 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0xF974, 0x91CE,
+ 0x5F31, 0xF975, 0xF976, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5,
+ 0x8E8D, 0xF977, 0x4F6F, 0xF978, 0xF979, 0x58E4, 0x5B43, 0x6059,
+ 0x63DA, 0x6518, 0x656D, 0x6698, 0xF97A, 0x694A, 0x6A23, 0x6D0B,
+ 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70, 0xF97B, 0x7F8A,
+ 0xF97C, 0x8944, 0xF97D, 0x8B93, 0x91C0, 0x967D, 0xF97E, 0x990A,
+ 0x5704, 0x5FA1, 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD,
+ 0x9B5A, 0x9F6C, 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043,
+ 0x5830, 0x5F66, 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA,
+ 0x513C, 0x56B4, 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186,
+ 0x4E88, 0x4F59, 0xF97F, 0xF980, 0xF981, 0x5982, 0xF982, ALTCHR,
+/* 0x6620 - 0x667F */
+ ALTCHR, 0xF983, 0x6B5F, 0x6C5D, 0xF984, 0x74B5, 0x7916, 0xF985,
+ 0x8207, 0x8245, 0x8339, 0x8F3F, 0x8F5D, 0xF986, 0x9918, 0xF987,
+ 0xF988, 0xF989, 0x4EA6, 0xF98A, 0x57DF, 0x5F79, 0x6613, 0xF98B,
+ 0xF98C, 0x75AB, 0x7E79, 0x8B6F, 0xF98D, 0x9006, 0x9A5B, 0x56A5,
+ 0x5827, 0x59F8, 0x5A1F, 0x5BB4, 0xF98E, 0x5EF6, 0xF98F, 0xF990,
+ 0x6350, 0x633B, 0xF991, 0x693D, 0x6C87, 0x6CBF, 0x6D8E, 0x6D93,
+ 0x6DF5, 0x6F14, 0xF992, 0x70DF, 0x7136, 0x7159, 0xF993, 0x71C3,
+ 0x71D5, 0xF994, 0x784F, 0x786F, 0xF995, 0x7B75, 0x7DE3, 0xF996,
+ 0x7E2F, 0xF997, 0x884D, 0x8EDF, 0xF998, 0xF999, 0xF99A, 0x925B,
+ 0xF99B, 0x9CF6, 0xF99C, 0xF99D, 0xF99E, 0x6085, 0x6D85, 0xF99F,
+ 0x71B1, 0xF9A0, 0xF9A1, 0x95B1, 0x53AD, 0xF9A2, 0xF9A3, 0xF9A4,
+ 0x67D3, 0xF9A5, 0x708E, 0x7130, 0x7430, 0x8276, 0x82D2, ALTCHR,
+/* 0x6720 - 0x677F */
+ ALTCHR, 0xF9A6, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4, 0xF9A7, 0x71C1,
+ 0x8449, 0xF9A8, 0xF9A9, 0x584B, 0xF9AA, 0xF9AB, 0x5DB8, 0x5F71,
+ 0xF9AC, 0x6620, 0x668E, 0x6979, 0x69AE, 0x6C38, 0x6CF3, 0x6E36,
+ 0x6F41, 0x6FDA, 0x701B, 0x702F, 0x7150, 0x71DF, 0x7370, 0xF9AD,
+ 0x745B, 0xF9AE, 0x74D4, 0x76C8, 0x7A4E, 0x7E93, 0xF9AF, 0xF9B0,
+ 0x82F1, 0x8A60, 0x8FCE, 0xF9B1, 0x9348, 0xF9B2, 0x9719, 0xF9B3,
+ 0xF9B4, 0x4E42, 0x502A, 0xF9B5, 0x5208, 0x53E1, 0x66F3, 0x6C6D,
+ 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE, 0x85DD, 0x8602, 0xF9B6,
+ 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0xF9B7, 0x92B3, 0xF9B8, 0x9713,
+ 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433,
+ 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0xF9B9,
+ 0x61CA, 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, ALTCHR,
+/* 0x6820 - 0x687F */
+ ALTCHR, 0x70CF, 0x71AC, 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32,
+ 0x9F07, 0x5C4B, 0x6C83, 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465,
+ 0x761F, 0x7A69, 0x7E15, 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE,
+ 0x7515, 0x7670, 0x7FC1, 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6,
+ 0x7AA9, 0x7AAA, 0x81E5, 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C,
+ 0x5B9B, 0x68A1, 0x6900, 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897,
+ 0x7DE9, 0x7FEB, 0x8118, 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811,
+ 0x66F0, 0x5F80, 0x65FA, 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03,
+ 0x6B6A, 0x77EE, 0x5916, 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0xF9BA,
+ 0xF9BB, 0x50E5, 0x51F9, 0x582F, 0x592D, 0x5996, 0x59DA, 0x5BE5,
+ 0xF9BC, 0xF9BD, 0x5DA2, 0x62D7, 0x6416, 0x6493, 0x64FE, 0xF9BE,
+ 0x66DC, 0xF9BF, 0x6A48, 0xF9C0, 0x71FF, 0x7464, 0xF9C1, ALTCHR,
+/* 0x6920 - 0x697F */
+ ALTCHR, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E, 0x8000, 0x8170, 0xF9C2,
+ 0x87EF, 0x8981, 0x8B20, 0x9059, 0xF9C3, 0x9080, 0x9952, 0x617E,
+ 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD, 0x5197,
+ 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995, 0x6D8C,
+ 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073, 0x8338,
+ 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0xF9C4, 0x4E8E, 0x4F51, 0x5076,
+ 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A,
+ 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991,
+ 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047,
+ 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED,
+ 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0xF9C5,
+ 0x6A52, 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, ALTCHR,
+/* 0x6A20 - 0x6A7F */
+ ALTCHR, 0x904B, 0x9695, 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90,
+ 0x718A, 0x96C4, 0x5143, 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3,
+ 0x5A9B, 0x5AC4, 0x5BC3, 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39,
+ 0x6E72, 0x6E90, 0x7230, 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45,
+ 0x9060, 0xF9C6, 0x9662, 0x9858, 0x9D1B, 0x6708, 0x8D8A, 0x925E,
+ 0x4F4D, 0x5049, 0x50DE, 0x5371, 0x570D, 0x59D4, 0x5A01, 0x5C09,
+ 0x6170, 0x6690, 0x6E2D, 0x7232, 0x744B, 0x7DEF, 0x80C3, 0x840E,
+ 0x8466, 0x853F, 0x875F, 0x885B, 0x8918, 0x8B02, 0x9055, 0x97CB,
+ 0x9B4F, 0x4E73, 0x4F91, 0x5112, 0x516A, 0xF9C7, 0x552F, 0x55A9,
+ 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE, 0x60A0, 0x60DF, 0x6108,
+ 0x6109, 0x63C4, 0x6538, 0x6709, 0xF9C8, 0x67D4, 0x67DA, 0xF9C9,
+ 0x6961, 0x6962, 0x6CB9, 0x6D27, 0xF9CA, 0x6E38, 0xF9CB, ALTCHR,
+/* 0x6B20 - 0x6B7F */
+ ALTCHR, 0x6FE1, 0x7336, 0x7337, 0xF9CC, 0x745C, 0x7531, 0xF9CD,
+ 0x7652, 0xF9CE, 0xF9CF, 0x7DAD, 0x81FE, 0x8438, 0x88D5, 0x8A98,
+ 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A, 0x9149,
+ 0x91C9, 0x936E, 0xF9D0, 0xF9D1, 0x5809, 0xF9D2, 0x6BD3, 0x8089,
+ 0x80B2, 0xF9D3, 0xF9D4, 0x5141, 0x596B, 0x5C39, 0xF9D5, 0xF9D6,
+ 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0xF9D7, 0x9217, 0x958F, 0xF9D8,
+ 0xF9D9, 0xF9DA, 0xF9DB, 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D,
+ 0xF9DC, 0x57A0, 0x6069, 0x6147, 0x6BB7, 0x8ABE, 0x9280, 0x96B1,
+ 0x4E59, 0x541F, 0x6DEB, 0x852D, 0x9670, 0x97F3, 0x98EE, 0x63D6,
+ 0x6CE3, 0x9091, 0x51DD, 0x61C9, 0x81BA, 0x9DF9, 0x4F9D, 0x501A,
+ 0x5100, 0x5B9C, 0x610F, 0x61FF, 0x64EC, 0x6905, 0x6BC5, 0x7591,
+ 0x77E3, 0x7FA9, 0x8264, 0x858F, 0x87FB, 0x8863, 0x8ABC, ALTCHR,
+/* 0x6C20 - 0x6C7F */
+ ALTCHR, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A, 0xF9DD, 0xF9DE,
+ 0x5937, 0x59E8, 0xF9DF, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0xF9E0,
+ 0xF9E1, 0xF9E2, 0xF9E3, 0x723E, 0x73E5, 0xF9E4, 0x7570, 0x75CD,
+ 0xF9E5, 0x79FB, 0xF9E6, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351,
+ 0xF9E7, 0xF9E8, 0x8CBD, 0x8CB3, 0x9087, 0xF9E9, 0xF9EA, 0x98F4,
+ 0x990C, 0xF9EB, 0xF9EC, 0x7037, 0x76CA, 0x7FCA, 0x7FCC, 0x7FFC,
+ 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0xF9ED, 0x54BD, 0x56E0,
+ 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0xF9EE, 0xF9EF, 0x7D6A,
+ 0x8335, 0xF9F0, 0x8693, 0x8A8D, 0xF9F1, 0x976D, 0x9777, 0xF9F2,
+ 0xF9F3, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9, 0x65E5, 0x6EA2, 0x9038,
+ 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A, 0x59D9, 0x6041, 0xF9F4,
+ 0xF9F5, 0x7A14, 0xF9F6, 0x834F, 0x8CC3, 0x5165, 0x5344, ALTCHR,
+/* 0x6D20 - 0x6D7F */
+ ALTCHR, 0xF9F7, 0xF9F8, 0xF9F9, 0x4ECD, 0x5269, 0x5B55, 0x82BF,
+ 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF, 0x5B50, 0x5B57, 0x5B5C,
+ 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E, 0x7386, 0x74F7, 0x75B5,
+ 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328, 0x8517, 0x85C9, 0x8AEE,
+ 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC, 0x65AB, 0x6628, 0x707C,
+ 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C, 0x96C0, 0x9D72, 0x5B71,
+ 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91, 0x66AB, 0x6F5B, 0x7BB4,
+ 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7, 0x5320, 0x5834, 0x58BB,
+ 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84, 0x5F35, 0x638C, 0x66B2,
+ 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F, 0x7246, 0xF9FA, 0x7350,
+ 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7, 0x838A, 0x846C,
+ 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC, 0x9577, ALTCHR,
+/* 0x6E20 - 0x6E7F */
+ ALTCHR, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750,
+ 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1,
+ 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47,
+ 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E,
+ 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35,
+ 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019,
+ 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458,
+ 0x6575, 0x6EF4, 0x72C4, 0xF9FB, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D,
+ 0x7E3E, 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F,
+ 0x8FEA, 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, 0x5168,
+ 0x5178, 0x524D, 0x526A, 0x5861, 0x587C, 0x5960, 0x5C08, 0x5C55,
+ 0x5EDB, 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08, 0x6FB1, ALTCHR,
+/* 0x6F20 - 0x6F7F */
+ ALTCHR, 0x714E, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C,
+ 0x7B8B, 0x7BAD, 0x7BC6, 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F,
+ 0x9293, 0x9322, 0x942B, 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207,
+ 0x622A, 0x6298, 0x6D59, 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360,
+ 0x5CBE, 0x5E97, 0x6F38, 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE,
+ 0x63A5, 0x647A, 0x8776, 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075,
+ 0x5448, 0x59C3, 0x5B9A, 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5,
+ 0x633A, 0x653F, 0x6574, 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968,
+ 0x6A89, 0x6B63, 0x6C40, 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E,
+ 0x70A1, 0x738E, 0x73FD, 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B,
+ 0x7A7D, 0x7CBE, 0x7D8E, 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D,
+ 0x914A, 0x91D8, 0x9266, 0x92CC, 0x9320, 0x9706, 0x9756, ALTCHR,
+/* 0x7020 - 0x707F */
+ ALTCHR, 0x975C, 0x9802, 0x9F0E, 0x5236, 0x5291, 0x557C, 0x5824,
+ 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF, 0x6FDF, 0x796D, 0x7B2C,
+ 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44, 0x918D, 0x9664, 0x969B,
+ 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146, 0x51CB, 0x52A9, 0x5632,
+ 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9, 0x6641, 0x66FA, 0x66F9,
+ 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15, 0x6F6E, 0x7167, 0x71E5,
+ 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A, 0x79DF, 0x7A20, 0x7A95,
+ 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087, 0x85FB, 0x86A4, 0x8A54,
+ 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D, 0x91E3, 0x963B, 0x96D5,
+ 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3, 0x5B58, 0x5C0A, 0x5352,
+ 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E, 0x60B0, 0x616B, 0x68D5,
+ 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C, 0x7E31, 0x816B, ALTCHR,
+/* 0x7120 - 0x717F */
+ ALTCHR, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750, 0x5DE6,
+ 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A, 0x59DD,
+ 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE, 0x5EDA,
+ 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A, 0x6F8D,
+ 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2, 0x821F,
+ 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031, 0x914E,
+ 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101, 0x51C6,
+ 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96, 0x6FEC,
+ 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB, 0x99FF,
+ 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB, 0x696B,
+ 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD, 0x7511,
+ 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA, ALTCHR,
+/* 0x7220 - 0x727F */
+ ALTCHR, 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F,
+ 0x652F, 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A,
+ 0x6F2C, 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102,
+ 0x81F3, 0x829D, 0x82B7, 0x8718, 0x8A8C, 0xF9FC, 0x8D04, 0x8DBE,
+ 0x9072, 0x76F4, 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4,
+ 0x5875, 0x632F, 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84,
+ 0x6D25, 0x6EB1, 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1,
+ 0x771E, 0x778B, 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897,
+ 0x8A3A, 0x8CD1, 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673,
+ 0x9707, 0x4F84, 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, 0x74C6,
+ 0x75BE, 0x79E9, 0x7A92, 0x81A3, 0x86ED, 0x8CEA, 0x8DCC, 0x8FED,
+ 0x659F, 0x6715, 0xF9FD, 0x57F7, 0x6F57, 0x7DDD, 0x8F2F, ALTCHR,
+/* 0x7320 - 0x737F */
+ ALTCHR, 0x93F6, 0x96C6, 0x5FB5, 0x61F2, 0x6F84, 0x4E14, 0x4F98,
+ 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE, 0x6B21, 0x6B64, 0x78CB,
+ 0x7B9A, 0xF9FE, 0x8E49, 0x8ECA, 0x906E, 0x6349, 0x643E, 0x7740,
+ 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF, 0x71E6, 0x74A8,
+ 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98, 0x8B9A, 0x8D0A,
+ 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6, 0x672D, 0x7D2E,
+ 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA, 0x65AC, 0x7AD9,
+ 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5A3C, 0x5EE0,
+ 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2, 0x69CD, 0x6EC4,
+ 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259, 0x83D6, 0x84BC,
+ 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1, 0x7826, 0x7DB5,
+ 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5, 0x7B56, ALTCHR,
+/* 0x7420 - 0x747F */
+ ALTCHR, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0xF9FF,
+ 0x5254, 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC,
+ 0x7620, 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598,
+ 0x5929, 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B,
+ 0x85A6, 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6,
+ 0x51F8, 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F,
+ 0x8F4D, 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB,
+ 0x7C3D, 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377,
+ 0x7252, 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674,
+ 0x6DF8, 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0xFA00, 0x5243,
+ 0x66FF, 0x6D95, 0x6EEF, 0x7DE0, 0x8AE6, 0x902E, 0x905E, 0x9AD4,
+ 0x521D, 0x527F, 0x54E8, 0x6194, 0x6284, 0x62DB, 0x68A2, ALTCHR,
+/* 0x7520 - 0x757F */
+ ALTCHR, 0x6912, 0x695A, 0x6A35, 0x7092, 0x7126, 0x785D, 0x7901,
+ 0x790E, 0x79D2, 0x7A0D, 0x8096, 0x8278, 0x82D5, 0x8349, 0x8549,
+ 0x8C82, 0x8D85, 0x9162, 0x918B, 0x91AE, 0x4FC3, 0x56D1, 0x71ED,
+ 0x77D7, 0x8700, 0x89F8, 0x5BF8, 0x5FD6, 0x6751, 0x90A8, 0x53E2,
+ 0x585A, 0x5BF5, 0x60A4, 0x6181, 0x6460, 0x7E3D, 0x8070, 0x8525,
+ 0x9283, 0x64AE, 0x50AC, 0x5D14, 0x6700, 0x589C, 0x62BD, 0x63A8,
+ 0x690E, 0x6978, 0x6A1E, 0x6E6B, 0x76BA, 0x79CB, 0x82BB, 0x8429,
+ 0x8ACF, 0x8DA8, 0x8FFD, 0x9112, 0x914B, 0x919C, 0x9310, 0x9318,
+ 0x939A, 0x96DB, 0x9A36, 0x9C0D, 0x4E11, 0x755C, 0x795D, 0x7AFA,
+ 0x7B51, 0x7BC9, 0x7E2E, 0x84C4, 0x8E59, 0x8E74, 0x8EF8, 0x9010,
+ 0x6625, 0x693F, 0x7443, 0x51FA, 0x672E, 0x9EDC, 0x5145, 0x5FE0,
+ 0x6C96, 0x87F2, 0x885D, 0x8877, 0x60B4, 0x81B5, 0x8403, ALTCHR,
+/* 0x7620 - 0x767F */
+ ALTCHR, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36, 0x5C31, 0x708A,
+ 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189, 0x9A5F, 0x9DF2,
+ 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64, 0x4F88, 0x5024,
+ 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB, 0x6DC4, 0x71BE,
+ 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7, 0x7DFB, 0x7F6E,
+ 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52, 0x5247, 0x52C5,
+ 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5, 0x5BE2, 0x6795,
+ 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C, 0x87C4, 0x79E4,
+ 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE, 0x59A5, 0x60F0,
+ 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99B1, 0x99DD,
+ 0x502C, 0x5353, 0x5544, 0x577C, 0xFA01, 0x6258, 0xFA02, 0x64E2,
+ 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438, 0x8A17, ALTCHR,
+/* 0x7720 - 0x777F */
+ ALTCHR, 0x9438, 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E,
+ 0x7058, 0x70AD, 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708,
+ 0x803D, 0x8CAA, 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F,
+ 0xFA03, 0x8569, 0x514C, 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86,
+ 0x6C70, 0x6CF0, 0x7B1E, 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1,
+ 0xFA04, 0x64C7, 0x6FA4, 0x6491, 0x6504, 0x514E, 0x5410, 0x571F,
+ 0x8A0E, 0x615F, 0x6876, 0xFA05, 0x75DB, 0x7B52, 0x7D71, 0x901A,
+ 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000, 0x9839, 0x5078, 0x5957,
+ 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D, 0x7279, 0x95D6, 0x5761,
+ 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA, 0x6777, 0x6CE2, 0x6D3E,
+ 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD, 0x8DDB, 0x9817, 0x5224,
+ 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9, 0x8FA6, 0x9211, ALTCHR,
+/* 0x7820 - 0x787F */
+ ALTCHR, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504, 0x6096,
+ 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987, 0x8C9D,
+ 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F, 0x6241,
+ 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19, 0x8CB6,
+ 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16, 0x5E63,
+ 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B, 0x4F48,
+ 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03, 0x6016,
+ 0x629B, 0x62B1, 0x6355, 0xFA06, 0x6CE1, 0x6D66, 0x75B1, 0x7832,
+ 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B,
+ 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, 0x7206,
+ 0xFA07, 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753, 0x6A19, 0x6F02,
+ 0x74E2, 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4, 0x9A43, ALTCHR,
+/* 0x7920 - 0x797F */
+ ALTCHR, 0x54C1, 0x7A1F, 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE,
+ 0x5F7C, 0x62AB, 0x75B2, 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339,
+ 0x5F3C, 0x5FC5, 0x6CCC, 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE,
+ 0x999D, 0x4E4F, 0x903C, 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8,
+ 0x6630, 0x6CB3, 0x7455, 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E,
+ 0x9C15, 0x58D1, 0x5B78, 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068,
+ 0x608D, 0x65F1, 0x6C57, 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0,
+ 0x9591, 0x9592, 0x9650, 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B,
+ 0x54B8, 0x5563, 0x558A, 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C,
+ 0x9677, 0x9E79, 0x5408, 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4,
+ 0x965C, 0x4EA2, 0x4F09, 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297,
+ 0x676D, 0x6841, 0x6C86, 0x6E2F, 0x7F38, 0x809B, 0x822A, ALTCHR,
+/* 0x7A20 - 0x7A7F */
+ ALTCHR, 0xFA08, 0xFA09, 0x9805, 0x4EA5, 0x5055, 0x54B3, 0x5793,
+ 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023, 0x87F9,
+ 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE, 0x6838,
+ 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411, 0x56AE,
+ 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653, 0x589F,
+ 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47, 0x96AA,
+ 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4, 0x5F26,
+ 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE, 0x7729,
+ 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0xFA0A, 0x8CE2,
+ 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, 0x4FE0,
+ 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9, 0x8105, 0x8107,
+ 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211, 0x578B, ALTCHR,
+/* 0x7B20 - 0x7B7F */
+ ALTCHR, 0x5F62, 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192,
+ 0x73E9, 0x7469, 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3,
+ 0x99A8, 0x516E, 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A,
+ 0x91AF, 0x978B, 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D,
+ 0x5CB5, 0x5F27, 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69,
+ 0x6DCF, 0x6E56, 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0,
+ 0x7425, 0x745A, 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1,
+ 0x82A6, 0x846B, 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A,
+ 0x93AC, 0x9800, 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F,
+ 0x6DF7, 0x6E3E, 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4,
+ 0x5F18, 0x6C5E, 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C,
+ 0x9D3B, 0x5316, 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, ALTCHR,
+/* 0x7C20 - 0x7C7F */
+ ALTCHR, 0x798D, 0x79BE, 0x82B1, 0x83EF, 0x8A71, 0x8B41, 0x8CA8,
+ 0x9774, 0xFA0B, 0x64F4, 0x652B, 0x78BA, 0x78BB, 0x7A6B, 0x4E38,
+ 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3, 0x63DB, 0x6B61, 0x6665,
+ 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08, 0x9084, 0x9A69, 0x9C25,
+ 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA, 0x51F0, 0x5E4C, 0x5FA8,
+ 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643, 0x6644, 0x69A5, 0x6CC1,
+ 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C, 0x7687, 0x7BC1, 0x7C27,
+ 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3, 0x532F, 0x56DE, 0x5EFB,
+ 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666, 0x6703, 0x6A9C, 0x6DEE,
+ 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE, 0x8334, 0x86D4, 0x8AA8,
+ 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B, 0x9404, 0x54EE, 0x5686,
+ 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F, 0x6D8D, 0x6DC6, ALTCHR,
+/* 0x7D20 - 0x7D7F */
+ ALTCHR, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019, 0x539A,
+ 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D, 0x7166,
+ 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104, 0x718F,
+ 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684, 0x714A,
+ 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE, 0x6689,
+ 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB, 0x7566,
+ 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308, 0x6D36,
+ 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403, 0x5C79,
+ 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070, 0x6D3D,
+ 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD, 0x59EC,
+ 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6, 0x7199,
+ 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70, ALTCHR,
+};
+
+CODE_CONV_TWO_OCTET_TO_UCS2(cc_ksc5601_to_ucs2, /* function name */
+ tblKsc5601ToUcs2, /* table name */
+ 0x0021, 0x007D, /* code range (high byte) */
+ 0x0020, 0x007F, /* code range (low byte) */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KSC5601/main.c b/xc/extras/X-TrueType/KSC5601/main.c
new file mode 100644
index 000000000..11ea1553a
--- /dev/null
+++ b/xc/extras/X-TrueType/KSC5601/main.c
@@ -0,0 +1,106 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ KSC5601, KSC5601_EUC
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "ksc5601", NULL, "0", KSC5601, { 0x20, 0x7f, 0x21, 0x7d, 0x2121 } },
+ { "ksc5601", NULL, "1", KSC5601_EUC, { 0xa0, 0xff, 0xa1, 0xfd, 0xa1a1 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_ksc5601_to_ucs2);
+CODECONV_TEMPLATE(cc_ksc5601euc_to_ucs2);
+CODECONV_TEMPLATE(cc_ksc5601_to_wansung);
+CODECONV_TEMPLATE(cc_ksc5601euc_to_wansung);
+static MapIDRelation const mapIDRelations[] = {
+ { KSC5601, EPlfmISO, EEncISO10646,
+ cc_ksc5601_to_ucs2, NULL },
+ { KSC5601, EPlfmUnicode, EEncAny,
+ cc_ksc5601_to_ucs2, NULL },
+ { KSC5601, EPlfmMS, EEncMSUnicode,
+ cc_ksc5601_to_ucs2, NULL },
+ { KSC5601, EPlfmMS, EEncMSWansung,
+ cc_ksc5601_to_wansung, NULL },
+ { KSC5601_EUC, EPlfmISO, EEncISO10646,
+ cc_ksc5601euc_to_ucs2, NULL },
+ { KSC5601_EUC, EPlfmUnicode, EEncAny,
+ cc_ksc5601euc_to_ucs2, NULL },
+ { KSC5601_EUC, EPlfmMS, EEncMSUnicode,
+ cc_ksc5601euc_to_ucs2, NULL },
+ { KSC5601_EUC, EPlfmMS, EEncMSWansung,
+ cc_ksc5601euc_to_wansung, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(KSC5601_entrypoint)
+
+
+/* KSC5601-1 -> KSC5601 */
+ft_char_code_t /* result charCodeDest */
+cc_ksc5601euc_to_ucs2(ft_char_code_t idx)
+{
+ return cc_ksc5601_to_ucs2(idx & 0x7f7f);
+}
+
+/* KSC5601 -> Wansung */
+ft_char_code_t /* result charCodeDest */
+cc_ksc5601_to_wansung(ft_char_code_t idx)
+{
+ /* just set MSB */
+ return idx | 0x8080;
+}
+
+/* KSC5601-1 -> Wansung */
+ft_char_code_t /* result charCodeDest */
+cc_ksc5601euc_to_wansung(ft_char_code_t idx)
+{
+ /* it is same code, in different names */
+ return idx;
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KSCJOHAB/Imakefile b/xc/extras/X-TrueType/KSCJOHAB/Imakefile
new file mode 100644
index 000000000..df3b9957f
--- /dev/null
+++ b/xc/extras/X-TrueType/KSCJOHAB/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: KSCJOHAB */
+
+#define ModuleName KSCJOHAB
+SRCS = KSCJOHABtoUCS2.c main.c
+OBJS = KSCJOHABtoUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KSCJOHAB/KSCJOHABtoUCS2.c b/xc/extras/X-TrueType/KSCJOHAB/KSCJOHABtoUCS2.c
new file mode 100644
index 000000000..17ef876fa
--- /dev/null
+++ b/xc/extras/X-TrueType/KSCJOHAB/KSCJOHABtoUCS2.c
@@ -0,0 +1,3162 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ This table data derived from :
+ http://pantheon.yale.edu/~jshin/faq/JOHAB.TXT.gz
+ by Jungshik Shin.
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x3000
+
+static ucs2_t tblKsc5601JohabToUcs2[] = {
+/* 0x8430 - 0x84FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x3133, ALTCHR, 0x3135, ALTCHR,
+ ALTCHR, ALTCHR, 0x313A, 0x313B, 0x313C, 0x313D, 0x313E, 0x313F,
+ 0x3140, ALTCHR, ALTCHR, ALTCHR, 0x3144, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x314F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3150, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3151, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3152, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3153, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x8530 - 0x85FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3154, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3155, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3156, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3157, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3158, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3159, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x8630 - 0x86FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x315A, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x315B, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x315C, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x315D, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x315E, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x315F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x8730 - 0x87FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3160, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3161, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3162, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3163, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x8830 - 0x88FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3131, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x3136,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xAC00, 0xAC01, 0xAC02, 0xAC03, 0xAC04, 0xAC05, 0xAC06,
+ 0xAC07, 0xAC08, 0xAC09, 0xAC0A, 0xAC0B, 0xAC0C, 0xAC0D, 0xAC0E,
+ 0xAC0F, 0xAC10, ALTCHR, 0xAC11, 0xAC12, 0xAC13, 0xAC14, 0xAC15,
+ 0xAC16, 0xAC17, 0xAC18, 0xAC19, 0xAC1A, 0xAC1B, ALTCHR, ALTCHR,
+ ALTCHR, 0xAC1C, 0xAC1D, 0xAC1E, 0xAC1F, 0xAC20, 0xAC21, 0xAC22,
+ 0xAC23, 0xAC24, 0xAC25, 0xAC26, 0xAC27, 0xAC28, 0xAC29, 0xAC2A,
+ 0xAC2B, 0xAC2C, ALTCHR, 0xAC2D, 0xAC2E, 0xAC2F, 0xAC30, 0xAC31,
+ 0xAC32, 0xAC33, 0xAC34, 0xAC35, 0xAC36, 0xAC37, ALTCHR, ALTCHR,
+ ALTCHR, 0xAC38, 0xAC39, 0xAC3A, 0xAC3B, 0xAC3C, 0xAC3D, 0xAC3E,
+ 0xAC3F, 0xAC40, 0xAC41, 0xAC42, 0xAC43, 0xAC44, 0xAC45, 0xAC46,
+ 0xAC47, 0xAC48, ALTCHR, 0xAC49, 0xAC4A, 0xAC4B, 0xAC4C, 0xAC4D,
+ 0xAC4E, 0xAC4F, 0xAC50, 0xAC51, 0xAC52, 0xAC53, ALTCHR, ALTCHR,
+ ALTCHR, 0xAC54, 0xAC55, 0xAC56, 0xAC57, 0xAC58, 0xAC59, 0xAC5A,
+ 0xAC5B, 0xAC5C, 0xAC5D, 0xAC5E, 0xAC5F, 0xAC60, 0xAC61, 0xAC62,
+ 0xAC63, 0xAC64, ALTCHR, 0xAC65, 0xAC66, 0xAC67, 0xAC68, 0xAC69,
+ 0xAC6A, 0xAC6B, 0xAC6C, 0xAC6D, 0xAC6E, 0xAC6F, ALTCHR, ALTCHR,
+ ALTCHR, 0xAC70, 0xAC71, 0xAC72, 0xAC73, 0xAC74, 0xAC75, 0xAC76,
+ 0xAC77, 0xAC78, 0xAC79, 0xAC7A, 0xAC7B, 0xAC7C, 0xAC7D, 0xAC7E,
+ 0xAC7F, 0xAC80, ALTCHR, 0xAC81, 0xAC82, 0xAC83, 0xAC84, 0xAC85,
+ 0xAC86, 0xAC87, 0xAC88, 0xAC89, 0xAC8A, 0xAC8B, ALTCHR, ALTCHR,
+/* 0x8930 - 0x89FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xAC8C, 0xAC8D, 0xAC8E, 0xAC8F, 0xAC90, 0xAC91, 0xAC92,
+ 0xAC93, 0xAC94, 0xAC95, 0xAC96, 0xAC97, 0xAC98, 0xAC99, 0xAC9A,
+ 0xAC9B, 0xAC9C, ALTCHR, 0xAC9D, 0xAC9E, 0xAC9F, 0xACA0, 0xACA1,
+ 0xACA2, 0xACA3, 0xACA4, 0xACA5, 0xACA6, 0xACA7, ALTCHR, ALTCHR,
+ ALTCHR, 0xACA8, 0xACA9, 0xACAA, 0xACAB, 0xACAC, 0xACAD, 0xACAE,
+ 0xACAF, 0xACB0, 0xACB1, 0xACB2, 0xACB3, 0xACB4, 0xACB5, 0xACB6,
+ 0xACB7, 0xACB8, ALTCHR, 0xACB9, 0xACBA, 0xACBB, 0xACBC, 0xACBD,
+ 0xACBE, 0xACBF, 0xACC0, 0xACC1, 0xACC2, 0xACC3, ALTCHR, ALTCHR,
+ ALTCHR, 0xACC4, 0xACC5, 0xACC6, 0xACC7, 0xACC8, 0xACC9, 0xACCA,
+ 0xACCB, 0xACCC, 0xACCD, 0xACCE, 0xACCF, 0xACD0, 0xACD1, 0xACD2,
+ 0xACD3, 0xACD4, ALTCHR, 0xACD5, 0xACD6, 0xACD7, 0xACD8, 0xACD9,
+ 0xACDA, 0xACDB, 0xACDC, 0xACDD, 0xACDE, 0xACDF, ALTCHR, ALTCHR,
+ ALTCHR, 0xACE0, 0xACE1, 0xACE2, 0xACE3, 0xACE4, 0xACE5, 0xACE6,
+ 0xACE7, 0xACE8, 0xACE9, 0xACEA, 0xACEB, 0xACEC, 0xACED, 0xACEE,
+ 0xACEF, 0xACF0, ALTCHR, 0xACF1, 0xACF2, 0xACF3, 0xACF4, 0xACF5,
+ 0xACF6, 0xACF7, 0xACF8, 0xACF9, 0xACFA, 0xACFB, ALTCHR, ALTCHR,
+ ALTCHR, 0xACFC, 0xACFD, 0xACFE, 0xACFF, 0xAD00, 0xAD01, 0xAD02,
+ 0xAD03, 0xAD04, 0xAD05, 0xAD06, 0xAD07, 0xAD08, 0xAD09, 0xAD0A,
+ 0xAD0B, 0xAD0C, ALTCHR, 0xAD0D, 0xAD0E, 0xAD0F, 0xAD10, 0xAD11,
+ 0xAD12, 0xAD13, 0xAD14, 0xAD15, 0xAD16, 0xAD17, ALTCHR, ALTCHR,
+ ALTCHR, 0xAD18, 0xAD19, 0xAD1A, 0xAD1B, 0xAD1C, 0xAD1D, 0xAD1E,
+ 0xAD1F, 0xAD20, 0xAD21, 0xAD22, 0xAD23, 0xAD24, 0xAD25, 0xAD26,
+ 0xAD27, 0xAD28, ALTCHR, 0xAD29, 0xAD2A, 0xAD2B, 0xAD2C, 0xAD2D,
+ 0xAD2E, 0xAD2F, 0xAD30, 0xAD31, 0xAD32, 0xAD33, ALTCHR, ALTCHR,
+/* 0x8A30 - 0x8AFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xAD34, 0xAD35, 0xAD36, 0xAD37, 0xAD38, 0xAD39, 0xAD3A,
+ 0xAD3B, 0xAD3C, 0xAD3D, 0xAD3E, 0xAD3F, 0xAD40, 0xAD41, 0xAD42,
+ 0xAD43, 0xAD44, ALTCHR, 0xAD45, 0xAD46, 0xAD47, 0xAD48, 0xAD49,
+ 0xAD4A, 0xAD4B, 0xAD4C, 0xAD4D, 0xAD4E, 0xAD4F, ALTCHR, ALTCHR,
+ ALTCHR, 0xAD50, 0xAD51, 0xAD52, 0xAD53, 0xAD54, 0xAD55, 0xAD56,
+ 0xAD57, 0xAD58, 0xAD59, 0xAD5A, 0xAD5B, 0xAD5C, 0xAD5D, 0xAD5E,
+ 0xAD5F, 0xAD60, ALTCHR, 0xAD61, 0xAD62, 0xAD63, 0xAD64, 0xAD65,
+ 0xAD66, 0xAD67, 0xAD68, 0xAD69, 0xAD6A, 0xAD6B, ALTCHR, ALTCHR,
+ ALTCHR, 0xAD6C, 0xAD6D, 0xAD6E, 0xAD6F, 0xAD70, 0xAD71, 0xAD72,
+ 0xAD73, 0xAD74, 0xAD75, 0xAD76, 0xAD77, 0xAD78, 0xAD79, 0xAD7A,
+ 0xAD7B, 0xAD7C, ALTCHR, 0xAD7D, 0xAD7E, 0xAD7F, 0xAD80, 0xAD81,
+ 0xAD82, 0xAD83, 0xAD84, 0xAD85, 0xAD86, 0xAD87, ALTCHR, ALTCHR,
+ ALTCHR, 0xAD88, 0xAD89, 0xAD8A, 0xAD8B, 0xAD8C, 0xAD8D, 0xAD8E,
+ 0xAD8F, 0xAD90, 0xAD91, 0xAD92, 0xAD93, 0xAD94, 0xAD95, 0xAD96,
+ 0xAD97, 0xAD98, ALTCHR, 0xAD99, 0xAD9A, 0xAD9B, 0xAD9C, 0xAD9D,
+ 0xAD9E, 0xAD9F, 0xADA0, 0xADA1, 0xADA2, 0xADA3, ALTCHR, ALTCHR,
+ ALTCHR, 0xADA4, 0xADA5, 0xADA6, 0xADA7, 0xADA8, 0xADA9, 0xADAA,
+ 0xADAB, 0xADAC, 0xADAD, 0xADAE, 0xADAF, 0xADB0, 0xADB1, 0xADB2,
+ 0xADB3, 0xADB4, ALTCHR, 0xADB5, 0xADB6, 0xADB7, 0xADB8, 0xADB9,
+ 0xADBA, 0xADBB, 0xADBC, 0xADBD, 0xADBE, 0xADBF, ALTCHR, ALTCHR,
+ ALTCHR, 0xADC0, 0xADC1, 0xADC2, 0xADC3, 0xADC4, 0xADC5, 0xADC6,
+ 0xADC7, 0xADC8, 0xADC9, 0xADCA, 0xADCB, 0xADCC, 0xADCD, 0xADCE,
+ 0xADCF, 0xADD0, ALTCHR, 0xADD1, 0xADD2, 0xADD3, 0xADD4, 0xADD5,
+ 0xADD6, 0xADD7, 0xADD8, 0xADD9, 0xADDA, 0xADDB, ALTCHR, ALTCHR,
+/* 0x8B30 - 0x8BFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xADDC, 0xADDD, 0xADDE, 0xADDF, 0xADE0, 0xADE1, 0xADE2,
+ 0xADE3, 0xADE4, 0xADE5, 0xADE6, 0xADE7, 0xADE8, 0xADE9, 0xADEA,
+ 0xADEB, 0xADEC, ALTCHR, 0xADED, 0xADEE, 0xADEF, 0xADF0, 0xADF1,
+ 0xADF2, 0xADF3, 0xADF4, 0xADF5, 0xADF6, 0xADF7, ALTCHR, ALTCHR,
+ ALTCHR, 0xADF8, 0xADF9, 0xADFA, 0xADFB, 0xADFC, 0xADFD, 0xADFE,
+ 0xADFF, 0xAE00, 0xAE01, 0xAE02, 0xAE03, 0xAE04, 0xAE05, 0xAE06,
+ 0xAE07, 0xAE08, ALTCHR, 0xAE09, 0xAE0A, 0xAE0B, 0xAE0C, 0xAE0D,
+ 0xAE0E, 0xAE0F, 0xAE10, 0xAE11, 0xAE12, 0xAE13, ALTCHR, ALTCHR,
+ ALTCHR, 0xAE14, 0xAE15, 0xAE16, 0xAE17, 0xAE18, 0xAE19, 0xAE1A,
+ 0xAE1B, 0xAE1C, 0xAE1D, 0xAE1E, 0xAE1F, 0xAE20, 0xAE21, 0xAE22,
+ 0xAE23, 0xAE24, ALTCHR, 0xAE25, 0xAE26, 0xAE27, 0xAE28, 0xAE29,
+ 0xAE2A, 0xAE2B, 0xAE2C, 0xAE2D, 0xAE2E, 0xAE2F, ALTCHR, ALTCHR,
+ ALTCHR, 0xAE30, 0xAE31, 0xAE32, 0xAE33, 0xAE34, 0xAE35, 0xAE36,
+ 0xAE37, 0xAE38, 0xAE39, 0xAE3A, 0xAE3B, 0xAE3C, 0xAE3D, 0xAE3E,
+ 0xAE3F, 0xAE40, ALTCHR, 0xAE41, 0xAE42, 0xAE43, 0xAE44, 0xAE45,
+ 0xAE46, 0xAE47, 0xAE48, 0xAE49, 0xAE4A, 0xAE4B, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x8C30 - 0x8CFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3132, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xAE4C, 0xAE4D, 0xAE4E, 0xAE4F, 0xAE50, 0xAE51, 0xAE52,
+ 0xAE53, 0xAE54, 0xAE55, 0xAE56, 0xAE57, 0xAE58, 0xAE59, 0xAE5A,
+ 0xAE5B, 0xAE5C, ALTCHR, 0xAE5D, 0xAE5E, 0xAE5F, 0xAE60, 0xAE61,
+ 0xAE62, 0xAE63, 0xAE64, 0xAE65, 0xAE66, 0xAE67, ALTCHR, ALTCHR,
+ ALTCHR, 0xAE68, 0xAE69, 0xAE6A, 0xAE6B, 0xAE6C, 0xAE6D, 0xAE6E,
+ 0xAE6F, 0xAE70, 0xAE71, 0xAE72, 0xAE73, 0xAE74, 0xAE75, 0xAE76,
+ 0xAE77, 0xAE78, ALTCHR, 0xAE79, 0xAE7A, 0xAE7B, 0xAE7C, 0xAE7D,
+ 0xAE7E, 0xAE7F, 0xAE80, 0xAE81, 0xAE82, 0xAE83, ALTCHR, ALTCHR,
+ ALTCHR, 0xAE84, 0xAE85, 0xAE86, 0xAE87, 0xAE88, 0xAE89, 0xAE8A,
+ 0xAE8B, 0xAE8C, 0xAE8D, 0xAE8E, 0xAE8F, 0xAE90, 0xAE91, 0xAE92,
+ 0xAE93, 0xAE94, ALTCHR, 0xAE95, 0xAE96, 0xAE97, 0xAE98, 0xAE99,
+ 0xAE9A, 0xAE9B, 0xAE9C, 0xAE9D, 0xAE9E, 0xAE9F, ALTCHR, ALTCHR,
+ ALTCHR, 0xAEA0, 0xAEA1, 0xAEA2, 0xAEA3, 0xAEA4, 0xAEA5, 0xAEA6,
+ 0xAEA7, 0xAEA8, 0xAEA9, 0xAEAA, 0xAEAB, 0xAEAC, 0xAEAD, 0xAEAE,
+ 0xAEAF, 0xAEB0, ALTCHR, 0xAEB1, 0xAEB2, 0xAEB3, 0xAEB4, 0xAEB5,
+ 0xAEB6, 0xAEB7, 0xAEB8, 0xAEB9, 0xAEBA, 0xAEBB, ALTCHR, ALTCHR,
+ ALTCHR, 0xAEBC, 0xAEBD, 0xAEBE, 0xAEBF, 0xAEC0, 0xAEC1, 0xAEC2,
+ 0xAEC3, 0xAEC4, 0xAEC5, 0xAEC6, 0xAEC7, 0xAEC8, 0xAEC9, 0xAECA,
+ 0xAECB, 0xAECC, ALTCHR, 0xAECD, 0xAECE, 0xAECF, 0xAED0, 0xAED1,
+ 0xAED2, 0xAED3, 0xAED4, 0xAED5, 0xAED6, 0xAED7, ALTCHR, ALTCHR,
+/* 0x8D30 - 0x8DFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xAED8, 0xAED9, 0xAEDA, 0xAEDB, 0xAEDC, 0xAEDD, 0xAEDE,
+ 0xAEDF, 0xAEE0, 0xAEE1, 0xAEE2, 0xAEE3, 0xAEE4, 0xAEE5, 0xAEE6,
+ 0xAEE7, 0xAEE8, ALTCHR, 0xAEE9, 0xAEEA, 0xAEEB, 0xAEEC, 0xAEED,
+ 0xAEEE, 0xAEEF, 0xAEF0, 0xAEF1, 0xAEF2, 0xAEF3, ALTCHR, ALTCHR,
+ ALTCHR, 0xAEF4, 0xAEF5, 0xAEF6, 0xAEF7, 0xAEF8, 0xAEF9, 0xAEFA,
+ 0xAEFB, 0xAEFC, 0xAEFD, 0xAEFE, 0xAEFF, 0xAF00, 0xAF01, 0xAF02,
+ 0xAF03, 0xAF04, ALTCHR, 0xAF05, 0xAF06, 0xAF07, 0xAF08, 0xAF09,
+ 0xAF0A, 0xAF0B, 0xAF0C, 0xAF0D, 0xAF0E, 0xAF0F, ALTCHR, ALTCHR,
+ ALTCHR, 0xAF10, 0xAF11, 0xAF12, 0xAF13, 0xAF14, 0xAF15, 0xAF16,
+ 0xAF17, 0xAF18, 0xAF19, 0xAF1A, 0xAF1B, 0xAF1C, 0xAF1D, 0xAF1E,
+ 0xAF1F, 0xAF20, ALTCHR, 0xAF21, 0xAF22, 0xAF23, 0xAF24, 0xAF25,
+ 0xAF26, 0xAF27, 0xAF28, 0xAF29, 0xAF2A, 0xAF2B, ALTCHR, ALTCHR,
+ ALTCHR, 0xAF2C, 0xAF2D, 0xAF2E, 0xAF2F, 0xAF30, 0xAF31, 0xAF32,
+ 0xAF33, 0xAF34, 0xAF35, 0xAF36, 0xAF37, 0xAF38, 0xAF39, 0xAF3A,
+ 0xAF3B, 0xAF3C, ALTCHR, 0xAF3D, 0xAF3E, 0xAF3F, 0xAF40, 0xAF41,
+ 0xAF42, 0xAF43, 0xAF44, 0xAF45, 0xAF46, 0xAF47, ALTCHR, ALTCHR,
+ ALTCHR, 0xAF48, 0xAF49, 0xAF4A, 0xAF4B, 0xAF4C, 0xAF4D, 0xAF4E,
+ 0xAF4F, 0xAF50, 0xAF51, 0xAF52, 0xAF53, 0xAF54, 0xAF55, 0xAF56,
+ 0xAF57, 0xAF58, ALTCHR, 0xAF59, 0xAF5A, 0xAF5B, 0xAF5C, 0xAF5D,
+ 0xAF5E, 0xAF5F, 0xAF60, 0xAF61, 0xAF62, 0xAF63, ALTCHR, ALTCHR,
+ ALTCHR, 0xAF64, 0xAF65, 0xAF66, 0xAF67, 0xAF68, 0xAF69, 0xAF6A,
+ 0xAF6B, 0xAF6C, 0xAF6D, 0xAF6E, 0xAF6F, 0xAF70, 0xAF71, 0xAF72,
+ 0xAF73, 0xAF74, ALTCHR, 0xAF75, 0xAF76, 0xAF77, 0xAF78, 0xAF79,
+ 0xAF7A, 0xAF7B, 0xAF7C, 0xAF7D, 0xAF7E, 0xAF7F, ALTCHR, ALTCHR,
+/* 0x8E30 - 0x8EFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xAF80, 0xAF81, 0xAF82, 0xAF83, 0xAF84, 0xAF85, 0xAF86,
+ 0xAF87, 0xAF88, 0xAF89, 0xAF8A, 0xAF8B, 0xAF8C, 0xAF8D, 0xAF8E,
+ 0xAF8F, 0xAF90, ALTCHR, 0xAF91, 0xAF92, 0xAF93, 0xAF94, 0xAF95,
+ 0xAF96, 0xAF97, 0xAF98, 0xAF99, 0xAF9A, 0xAF9B, ALTCHR, ALTCHR,
+ ALTCHR, 0xAF9C, 0xAF9D, 0xAF9E, 0xAF9F, 0xAFA0, 0xAFA1, 0xAFA2,
+ 0xAFA3, 0xAFA4, 0xAFA5, 0xAFA6, 0xAFA7, 0xAFA8, 0xAFA9, 0xAFAA,
+ 0xAFAB, 0xAFAC, ALTCHR, 0xAFAD, 0xAFAE, 0xAFAF, 0xAFB0, 0xAFB1,
+ 0xAFB2, 0xAFB3, 0xAFB4, 0xAFB5, 0xAFB6, 0xAFB7, ALTCHR, ALTCHR,
+ ALTCHR, 0xAFB8, 0xAFB9, 0xAFBA, 0xAFBB, 0xAFBC, 0xAFBD, 0xAFBE,
+ 0xAFBF, 0xAFC0, 0xAFC1, 0xAFC2, 0xAFC3, 0xAFC4, 0xAFC5, 0xAFC6,
+ 0xAFC7, 0xAFC8, ALTCHR, 0xAFC9, 0xAFCA, 0xAFCB, 0xAFCC, 0xAFCD,
+ 0xAFCE, 0xAFCF, 0xAFD0, 0xAFD1, 0xAFD2, 0xAFD3, ALTCHR, ALTCHR,
+ ALTCHR, 0xAFD4, 0xAFD5, 0xAFD6, 0xAFD7, 0xAFD8, 0xAFD9, 0xAFDA,
+ 0xAFDB, 0xAFDC, 0xAFDD, 0xAFDE, 0xAFDF, 0xAFE0, 0xAFE1, 0xAFE2,
+ 0xAFE3, 0xAFE4, ALTCHR, 0xAFE5, 0xAFE6, 0xAFE7, 0xAFE8, 0xAFE9,
+ 0xAFEA, 0xAFEB, 0xAFEC, 0xAFED, 0xAFEE, 0xAFEF, ALTCHR, ALTCHR,
+ ALTCHR, 0xAFF0, 0xAFF1, 0xAFF2, 0xAFF3, 0xAFF4, 0xAFF5, 0xAFF6,
+ 0xAFF7, 0xAFF8, 0xAFF9, 0xAFFA, 0xAFFB, 0xAFFC, 0xAFFD, 0xAFFE,
+ 0xAFFF, 0xB000, ALTCHR, 0xB001, 0xB002, 0xB003, 0xB004, 0xB005,
+ 0xB006, 0xB007, 0xB008, 0xB009, 0xB00A, 0xB00B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB00C, 0xB00D, 0xB00E, 0xB00F, 0xB010, 0xB011, 0xB012,
+ 0xB013, 0xB014, 0xB015, 0xB016, 0xB017, 0xB018, 0xB019, 0xB01A,
+ 0xB01B, 0xB01C, ALTCHR, 0xB01D, 0xB01E, 0xB01F, 0xB020, 0xB021,
+ 0xB022, 0xB023, 0xB024, 0xB025, 0xB026, 0xB027, ALTCHR, ALTCHR,
+/* 0x8F30 - 0x8FFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB028, 0xB029, 0xB02A, 0xB02B, 0xB02C, 0xB02D, 0xB02E,
+ 0xB02F, 0xB030, 0xB031, 0xB032, 0xB033, 0xB034, 0xB035, 0xB036,
+ 0xB037, 0xB038, ALTCHR, 0xB039, 0xB03A, 0xB03B, 0xB03C, 0xB03D,
+ 0xB03E, 0xB03F, 0xB040, 0xB041, 0xB042, 0xB043, ALTCHR, ALTCHR,
+ ALTCHR, 0xB044, 0xB045, 0xB046, 0xB047, 0xB048, 0xB049, 0xB04A,
+ 0xB04B, 0xB04C, 0xB04D, 0xB04E, 0xB04F, 0xB050, 0xB051, 0xB052,
+ 0xB053, 0xB054, ALTCHR, 0xB055, 0xB056, 0xB057, 0xB058, 0xB059,
+ 0xB05A, 0xB05B, 0xB05C, 0xB05D, 0xB05E, 0xB05F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB060, 0xB061, 0xB062, 0xB063, 0xB064, 0xB065, 0xB066,
+ 0xB067, 0xB068, 0xB069, 0xB06A, 0xB06B, 0xB06C, 0xB06D, 0xB06E,
+ 0xB06F, 0xB070, ALTCHR, 0xB071, 0xB072, 0xB073, 0xB074, 0xB075,
+ 0xB076, 0xB077, 0xB078, 0xB079, 0xB07A, 0xB07B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB07C, 0xB07D, 0xB07E, 0xB07F, 0xB080, 0xB081, 0xB082,
+ 0xB083, 0xB084, 0xB085, 0xB086, 0xB087, 0xB088, 0xB089, 0xB08A,
+ 0xB08B, 0xB08C, ALTCHR, 0xB08D, 0xB08E, 0xB08F, 0xB090, 0xB091,
+ 0xB092, 0xB093, 0xB094, 0xB095, 0xB096, 0xB097, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x9030 - 0x90FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3134, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB098, 0xB099, 0xB09A, 0xB09B, 0xB09C, 0xB09D, 0xB09E,
+ 0xB09F, 0xB0A0, 0xB0A1, 0xB0A2, 0xB0A3, 0xB0A4, 0xB0A5, 0xB0A6,
+ 0xB0A7, 0xB0A8, ALTCHR, 0xB0A9, 0xB0AA, 0xB0AB, 0xB0AC, 0xB0AD,
+ 0xB0AE, 0xB0AF, 0xB0B0, 0xB0B1, 0xB0B2, 0xB0B3, ALTCHR, ALTCHR,
+ ALTCHR, 0xB0B4, 0xB0B5, 0xB0B6, 0xB0B7, 0xB0B8, 0xB0B9, 0xB0BA,
+ 0xB0BB, 0xB0BC, 0xB0BD, 0xB0BE, 0xB0BF, 0xB0C0, 0xB0C1, 0xB0C2,
+ 0xB0C3, 0xB0C4, ALTCHR, 0xB0C5, 0xB0C6, 0xB0C7, 0xB0C8, 0xB0C9,
+ 0xB0CA, 0xB0CB, 0xB0CC, 0xB0CD, 0xB0CE, 0xB0CF, ALTCHR, ALTCHR,
+ ALTCHR, 0xB0D0, 0xB0D1, 0xB0D2, 0xB0D3, 0xB0D4, 0xB0D5, 0xB0D6,
+ 0xB0D7, 0xB0D8, 0xB0D9, 0xB0DA, 0xB0DB, 0xB0DC, 0xB0DD, 0xB0DE,
+ 0xB0DF, 0xB0E0, ALTCHR, 0xB0E1, 0xB0E2, 0xB0E3, 0xB0E4, 0xB0E5,
+ 0xB0E6, 0xB0E7, 0xB0E8, 0xB0E9, 0xB0EA, 0xB0EB, ALTCHR, ALTCHR,
+ ALTCHR, 0xB0EC, 0xB0ED, 0xB0EE, 0xB0EF, 0xB0F0, 0xB0F1, 0xB0F2,
+ 0xB0F3, 0xB0F4, 0xB0F5, 0xB0F6, 0xB0F7, 0xB0F8, 0xB0F9, 0xB0FA,
+ 0xB0FB, 0xB0FC, ALTCHR, 0xB0FD, 0xB0FE, 0xB0FF, 0xB100, 0xB101,
+ 0xB102, 0xB103, 0xB104, 0xB105, 0xB106, 0xB107, ALTCHR, ALTCHR,
+ ALTCHR, 0xB108, 0xB109, 0xB10A, 0xB10B, 0xB10C, 0xB10D, 0xB10E,
+ 0xB10F, 0xB110, 0xB111, 0xB112, 0xB113, 0xB114, 0xB115, 0xB116,
+ 0xB117, 0xB118, ALTCHR, 0xB119, 0xB11A, 0xB11B, 0xB11C, 0xB11D,
+ 0xB11E, 0xB11F, 0xB120, 0xB121, 0xB122, 0xB123, ALTCHR, ALTCHR,
+/* 0x9130 - 0x91FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB124, 0xB125, 0xB126, 0xB127, 0xB128, 0xB129, 0xB12A,
+ 0xB12B, 0xB12C, 0xB12D, 0xB12E, 0xB12F, 0xB130, 0xB131, 0xB132,
+ 0xB133, 0xB134, ALTCHR, 0xB135, 0xB136, 0xB137, 0xB138, 0xB139,
+ 0xB13A, 0xB13B, 0xB13C, 0xB13D, 0xB13E, 0xB13F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB140, 0xB141, 0xB142, 0xB143, 0xB144, 0xB145, 0xB146,
+ 0xB147, 0xB148, 0xB149, 0xB14A, 0xB14B, 0xB14C, 0xB14D, 0xB14E,
+ 0xB14F, 0xB150, ALTCHR, 0xB151, 0xB152, 0xB153, 0xB154, 0xB155,
+ 0xB156, 0xB157, 0xB158, 0xB159, 0xB15A, 0xB15B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB15C, 0xB15D, 0xB15E, 0xB15F, 0xB160, 0xB161, 0xB162,
+ 0xB163, 0xB164, 0xB165, 0xB166, 0xB167, 0xB168, 0xB169, 0xB16A,
+ 0xB16B, 0xB16C, ALTCHR, 0xB16D, 0xB16E, 0xB16F, 0xB170, 0xB171,
+ 0xB172, 0xB173, 0xB174, 0xB175, 0xB176, 0xB177, ALTCHR, ALTCHR,
+ ALTCHR, 0xB178, 0xB179, 0xB17A, 0xB17B, 0xB17C, 0xB17D, 0xB17E,
+ 0xB17F, 0xB180, 0xB181, 0xB182, 0xB183, 0xB184, 0xB185, 0xB186,
+ 0xB187, 0xB188, ALTCHR, 0xB189, 0xB18A, 0xB18B, 0xB18C, 0xB18D,
+ 0xB18E, 0xB18F, 0xB190, 0xB191, 0xB192, 0xB193, ALTCHR, ALTCHR,
+ ALTCHR, 0xB194, 0xB195, 0xB196, 0xB197, 0xB198, 0xB199, 0xB19A,
+ 0xB19B, 0xB19C, 0xB19D, 0xB19E, 0xB19F, 0xB1A0, 0xB1A1, 0xB1A2,
+ 0xB1A3, 0xB1A4, ALTCHR, 0xB1A5, 0xB1A6, 0xB1A7, 0xB1A8, 0xB1A9,
+ 0xB1AA, 0xB1AB, 0xB1AC, 0xB1AD, 0xB1AE, 0xB1AF, ALTCHR, ALTCHR,
+ ALTCHR, 0xB1B0, 0xB1B1, 0xB1B2, 0xB1B3, 0xB1B4, 0xB1B5, 0xB1B6,
+ 0xB1B7, 0xB1B8, 0xB1B9, 0xB1BA, 0xB1BB, 0xB1BC, 0xB1BD, 0xB1BE,
+ 0xB1BF, 0xB1C0, ALTCHR, 0xB1C1, 0xB1C2, 0xB1C3, 0xB1C4, 0xB1C5,
+ 0xB1C6, 0xB1C7, 0xB1C8, 0xB1C9, 0xB1CA, 0xB1CB, ALTCHR, ALTCHR,
+/* 0x9230 - 0x92FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB1CC, 0xB1CD, 0xB1CE, 0xB1CF, 0xB1D0, 0xB1D1, 0xB1D2,
+ 0xB1D3, 0xB1D4, 0xB1D5, 0xB1D6, 0xB1D7, 0xB1D8, 0xB1D9, 0xB1DA,
+ 0xB1DB, 0xB1DC, ALTCHR, 0xB1DD, 0xB1DE, 0xB1DF, 0xB1E0, 0xB1E1,
+ 0xB1E2, 0xB1E3, 0xB1E4, 0xB1E5, 0xB1E6, 0xB1E7, ALTCHR, ALTCHR,
+ ALTCHR, 0xB1E8, 0xB1E9, 0xB1EA, 0xB1EB, 0xB1EC, 0xB1ED, 0xB1EE,
+ 0xB1EF, 0xB1F0, 0xB1F1, 0xB1F2, 0xB1F3, 0xB1F4, 0xB1F5, 0xB1F6,
+ 0xB1F7, 0xB1F8, ALTCHR, 0xB1F9, 0xB1FA, 0xB1FB, 0xB1FC, 0xB1FD,
+ 0xB1FE, 0xB1FF, 0xB200, 0xB201, 0xB202, 0xB203, ALTCHR, ALTCHR,
+ ALTCHR, 0xB204, 0xB205, 0xB206, 0xB207, 0xB208, 0xB209, 0xB20A,
+ 0xB20B, 0xB20C, 0xB20D, 0xB20E, 0xB20F, 0xB210, 0xB211, 0xB212,
+ 0xB213, 0xB214, ALTCHR, 0xB215, 0xB216, 0xB217, 0xB218, 0xB219,
+ 0xB21A, 0xB21B, 0xB21C, 0xB21D, 0xB21E, 0xB21F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB220, 0xB221, 0xB222, 0xB223, 0xB224, 0xB225, 0xB226,
+ 0xB227, 0xB228, 0xB229, 0xB22A, 0xB22B, 0xB22C, 0xB22D, 0xB22E,
+ 0xB22F, 0xB230, ALTCHR, 0xB231, 0xB232, 0xB233, 0xB234, 0xB235,
+ 0xB236, 0xB237, 0xB238, 0xB239, 0xB23A, 0xB23B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB23C, 0xB23D, 0xB23E, 0xB23F, 0xB240, 0xB241, 0xB242,
+ 0xB243, 0xB244, 0xB245, 0xB246, 0xB247, 0xB248, 0xB249, 0xB24A,
+ 0xB24B, 0xB24C, ALTCHR, 0xB24D, 0xB24E, 0xB24F, 0xB250, 0xB251,
+ 0xB252, 0xB253, 0xB254, 0xB255, 0xB256, 0xB257, ALTCHR, ALTCHR,
+ ALTCHR, 0xB258, 0xB259, 0xB25A, 0xB25B, 0xB25C, 0xB25D, 0xB25E,
+ 0xB25F, 0xB260, 0xB261, 0xB262, 0xB263, 0xB264, 0xB265, 0xB266,
+ 0xB267, 0xB268, ALTCHR, 0xB269, 0xB26A, 0xB26B, 0xB26C, 0xB26D,
+ 0xB26E, 0xB26F, 0xB270, 0xB271, 0xB272, 0xB273, ALTCHR, ALTCHR,
+/* 0x9330 - 0x93FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB274, 0xB275, 0xB276, 0xB277, 0xB278, 0xB279, 0xB27A,
+ 0xB27B, 0xB27C, 0xB27D, 0xB27E, 0xB27F, 0xB280, 0xB281, 0xB282,
+ 0xB283, 0xB284, ALTCHR, 0xB285, 0xB286, 0xB287, 0xB288, 0xB289,
+ 0xB28A, 0xB28B, 0xB28C, 0xB28D, 0xB28E, 0xB28F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB290, 0xB291, 0xB292, 0xB293, 0xB294, 0xB295, 0xB296,
+ 0xB297, 0xB298, 0xB299, 0xB29A, 0xB29B, 0xB29C, 0xB29D, 0xB29E,
+ 0xB29F, 0xB2A0, ALTCHR, 0xB2A1, 0xB2A2, 0xB2A3, 0xB2A4, 0xB2A5,
+ 0xB2A6, 0xB2A7, 0xB2A8, 0xB2A9, 0xB2AA, 0xB2AB, ALTCHR, ALTCHR,
+ ALTCHR, 0xB2AC, 0xB2AD, 0xB2AE, 0xB2AF, 0xB2B0, 0xB2B1, 0xB2B2,
+ 0xB2B3, 0xB2B4, 0xB2B5, 0xB2B6, 0xB2B7, 0xB2B8, 0xB2B9, 0xB2BA,
+ 0xB2BB, 0xB2BC, ALTCHR, 0xB2BD, 0xB2BE, 0xB2BF, 0xB2C0, 0xB2C1,
+ 0xB2C2, 0xB2C3, 0xB2C4, 0xB2C5, 0xB2C6, 0xB2C7, ALTCHR, ALTCHR,
+ ALTCHR, 0xB2C8, 0xB2C9, 0xB2CA, 0xB2CB, 0xB2CC, 0xB2CD, 0xB2CE,
+ 0xB2CF, 0xB2D0, 0xB2D1, 0xB2D2, 0xB2D3, 0xB2D4, 0xB2D5, 0xB2D6,
+ 0xB2D7, 0xB2D8, ALTCHR, 0xB2D9, 0xB2DA, 0xB2DB, 0xB2DC, 0xB2DD,
+ 0xB2DE, 0xB2DF, 0xB2E0, 0xB2E1, 0xB2E2, 0xB2E3, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x9430 - 0x94FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3137, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB2E4, 0xB2E5, 0xB2E6, 0xB2E7, 0xB2E8, 0xB2E9, 0xB2EA,
+ 0xB2EB, 0xB2EC, 0xB2ED, 0xB2EE, 0xB2EF, 0xB2F0, 0xB2F1, 0xB2F2,
+ 0xB2F3, 0xB2F4, ALTCHR, 0xB2F5, 0xB2F6, 0xB2F7, 0xB2F8, 0xB2F9,
+ 0xB2FA, 0xB2FB, 0xB2FC, 0xB2FD, 0xB2FE, 0xB2FF, ALTCHR, ALTCHR,
+ ALTCHR, 0xB300, 0xB301, 0xB302, 0xB303, 0xB304, 0xB305, 0xB306,
+ 0xB307, 0xB308, 0xB309, 0xB30A, 0xB30B, 0xB30C, 0xB30D, 0xB30E,
+ 0xB30F, 0xB310, ALTCHR, 0xB311, 0xB312, 0xB313, 0xB314, 0xB315,
+ 0xB316, 0xB317, 0xB318, 0xB319, 0xB31A, 0xB31B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB31C, 0xB31D, 0xB31E, 0xB31F, 0xB320, 0xB321, 0xB322,
+ 0xB323, 0xB324, 0xB325, 0xB326, 0xB327, 0xB328, 0xB329, 0xB32A,
+ 0xB32B, 0xB32C, ALTCHR, 0xB32D, 0xB32E, 0xB32F, 0xB330, 0xB331,
+ 0xB332, 0xB333, 0xB334, 0xB335, 0xB336, 0xB337, ALTCHR, ALTCHR,
+ ALTCHR, 0xB338, 0xB339, 0xB33A, 0xB33B, 0xB33C, 0xB33D, 0xB33E,
+ 0xB33F, 0xB340, 0xB341, 0xB342, 0xB343, 0xB344, 0xB345, 0xB346,
+ 0xB347, 0xB348, ALTCHR, 0xB349, 0xB34A, 0xB34B, 0xB34C, 0xB34D,
+ 0xB34E, 0xB34F, 0xB350, 0xB351, 0xB352, 0xB353, ALTCHR, ALTCHR,
+ ALTCHR, 0xB354, 0xB355, 0xB356, 0xB357, 0xB358, 0xB359, 0xB35A,
+ 0xB35B, 0xB35C, 0xB35D, 0xB35E, 0xB35F, 0xB360, 0xB361, 0xB362,
+ 0xB363, 0xB364, ALTCHR, 0xB365, 0xB366, 0xB367, 0xB368, 0xB369,
+ 0xB36A, 0xB36B, 0xB36C, 0xB36D, 0xB36E, 0xB36F, ALTCHR, ALTCHR,
+/* 0x9530 - 0x95FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB370, 0xB371, 0xB372, 0xB373, 0xB374, 0xB375, 0xB376,
+ 0xB377, 0xB378, 0xB379, 0xB37A, 0xB37B, 0xB37C, 0xB37D, 0xB37E,
+ 0xB37F, 0xB380, ALTCHR, 0xB381, 0xB382, 0xB383, 0xB384, 0xB385,
+ 0xB386, 0xB387, 0xB388, 0xB389, 0xB38A, 0xB38B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB38C, 0xB38D, 0xB38E, 0xB38F, 0xB390, 0xB391, 0xB392,
+ 0xB393, 0xB394, 0xB395, 0xB396, 0xB397, 0xB398, 0xB399, 0xB39A,
+ 0xB39B, 0xB39C, ALTCHR, 0xB39D, 0xB39E, 0xB39F, 0xB3A0, 0xB3A1,
+ 0xB3A2, 0xB3A3, 0xB3A4, 0xB3A5, 0xB3A6, 0xB3A7, ALTCHR, ALTCHR,
+ ALTCHR, 0xB3A8, 0xB3A9, 0xB3AA, 0xB3AB, 0xB3AC, 0xB3AD, 0xB3AE,
+ 0xB3AF, 0xB3B0, 0xB3B1, 0xB3B2, 0xB3B3, 0xB3B4, 0xB3B5, 0xB3B6,
+ 0xB3B7, 0xB3B8, ALTCHR, 0xB3B9, 0xB3BA, 0xB3BB, 0xB3BC, 0xB3BD,
+ 0xB3BE, 0xB3BF, 0xB3C0, 0xB3C1, 0xB3C2, 0xB3C3, ALTCHR, ALTCHR,
+ ALTCHR, 0xB3C4, 0xB3C5, 0xB3C6, 0xB3C7, 0xB3C8, 0xB3C9, 0xB3CA,
+ 0xB3CB, 0xB3CC, 0xB3CD, 0xB3CE, 0xB3CF, 0xB3D0, 0xB3D1, 0xB3D2,
+ 0xB3D3, 0xB3D4, ALTCHR, 0xB3D5, 0xB3D6, 0xB3D7, 0xB3D8, 0xB3D9,
+ 0xB3DA, 0xB3DB, 0xB3DC, 0xB3DD, 0xB3DE, 0xB3DF, ALTCHR, ALTCHR,
+ ALTCHR, 0xB3E0, 0xB3E1, 0xB3E2, 0xB3E3, 0xB3E4, 0xB3E5, 0xB3E6,
+ 0xB3E7, 0xB3E8, 0xB3E9, 0xB3EA, 0xB3EB, 0xB3EC, 0xB3ED, 0xB3EE,
+ 0xB3EF, 0xB3F0, ALTCHR, 0xB3F1, 0xB3F2, 0xB3F3, 0xB3F4, 0xB3F5,
+ 0xB3F6, 0xB3F7, 0xB3F8, 0xB3F9, 0xB3FA, 0xB3FB, ALTCHR, ALTCHR,
+ ALTCHR, 0xB3FC, 0xB3FD, 0xB3FE, 0xB3FF, 0xB400, 0xB401, 0xB402,
+ 0xB403, 0xB404, 0xB405, 0xB406, 0xB407, 0xB408, 0xB409, 0xB40A,
+ 0xB40B, 0xB40C, ALTCHR, 0xB40D, 0xB40E, 0xB40F, 0xB410, 0xB411,
+ 0xB412, 0xB413, 0xB414, 0xB415, 0xB416, 0xB417, ALTCHR, ALTCHR,
+/* 0x9630 - 0x96FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB418, 0xB419, 0xB41A, 0xB41B, 0xB41C, 0xB41D, 0xB41E,
+ 0xB41F, 0xB420, 0xB421, 0xB422, 0xB423, 0xB424, 0xB425, 0xB426,
+ 0xB427, 0xB428, ALTCHR, 0xB429, 0xB42A, 0xB42B, 0xB42C, 0xB42D,
+ 0xB42E, 0xB42F, 0xB430, 0xB431, 0xB432, 0xB433, ALTCHR, ALTCHR,
+ ALTCHR, 0xB434, 0xB435, 0xB436, 0xB437, 0xB438, 0xB439, 0xB43A,
+ 0xB43B, 0xB43C, 0xB43D, 0xB43E, 0xB43F, 0xB440, 0xB441, 0xB442,
+ 0xB443, 0xB444, ALTCHR, 0xB445, 0xB446, 0xB447, 0xB448, 0xB449,
+ 0xB44A, 0xB44B, 0xB44C, 0xB44D, 0xB44E, 0xB44F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB450, 0xB451, 0xB452, 0xB453, 0xB454, 0xB455, 0xB456,
+ 0xB457, 0xB458, 0xB459, 0xB45A, 0xB45B, 0xB45C, 0xB45D, 0xB45E,
+ 0xB45F, 0xB460, ALTCHR, 0xB461, 0xB462, 0xB463, 0xB464, 0xB465,
+ 0xB466, 0xB467, 0xB468, 0xB469, 0xB46A, 0xB46B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB46C, 0xB46D, 0xB46E, 0xB46F, 0xB470, 0xB471, 0xB472,
+ 0xB473, 0xB474, 0xB475, 0xB476, 0xB477, 0xB478, 0xB479, 0xB47A,
+ 0xB47B, 0xB47C, ALTCHR, 0xB47D, 0xB47E, 0xB47F, 0xB480, 0xB481,
+ 0xB482, 0xB483, 0xB484, 0xB485, 0xB486, 0xB487, ALTCHR, ALTCHR,
+ ALTCHR, 0xB488, 0xB489, 0xB48A, 0xB48B, 0xB48C, 0xB48D, 0xB48E,
+ 0xB48F, 0xB490, 0xB491, 0xB492, 0xB493, 0xB494, 0xB495, 0xB496,
+ 0xB497, 0xB498, ALTCHR, 0xB499, 0xB49A, 0xB49B, 0xB49C, 0xB49D,
+ 0xB49E, 0xB49F, 0xB4A0, 0xB4A1, 0xB4A2, 0xB4A3, ALTCHR, ALTCHR,
+ ALTCHR, 0xB4A4, 0xB4A5, 0xB4A6, 0xB4A7, 0xB4A8, 0xB4A9, 0xB4AA,
+ 0xB4AB, 0xB4AC, 0xB4AD, 0xB4AE, 0xB4AF, 0xB4B0, 0xB4B1, 0xB4B2,
+ 0xB4B3, 0xB4B4, ALTCHR, 0xB4B5, 0xB4B6, 0xB4B7, 0xB4B8, 0xB4B9,
+ 0xB4BA, 0xB4BB, 0xB4BC, 0xB4BD, 0xB4BE, 0xB4BF, ALTCHR, ALTCHR,
+/* 0x9730 - 0x97FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB4C0, 0xB4C1, 0xB4C2, 0xB4C3, 0xB4C4, 0xB4C5, 0xB4C6,
+ 0xB4C7, 0xB4C8, 0xB4C9, 0xB4CA, 0xB4CB, 0xB4CC, 0xB4CD, 0xB4CE,
+ 0xB4CF, 0xB4D0, ALTCHR, 0xB4D1, 0xB4D2, 0xB4D3, 0xB4D4, 0xB4D5,
+ 0xB4D6, 0xB4D7, 0xB4D8, 0xB4D9, 0xB4DA, 0xB4DB, ALTCHR, ALTCHR,
+ ALTCHR, 0xB4DC, 0xB4DD, 0xB4DE, 0xB4DF, 0xB4E0, 0xB4E1, 0xB4E2,
+ 0xB4E3, 0xB4E4, 0xB4E5, 0xB4E6, 0xB4E7, 0xB4E8, 0xB4E9, 0xB4EA,
+ 0xB4EB, 0xB4EC, ALTCHR, 0xB4ED, 0xB4EE, 0xB4EF, 0xB4F0, 0xB4F1,
+ 0xB4F2, 0xB4F3, 0xB4F4, 0xB4F5, 0xB4F6, 0xB4F7, ALTCHR, ALTCHR,
+ ALTCHR, 0xB4F8, 0xB4F9, 0xB4FA, 0xB4FB, 0xB4FC, 0xB4FD, 0xB4FE,
+ 0xB4FF, 0xB500, 0xB501, 0xB502, 0xB503, 0xB504, 0xB505, 0xB506,
+ 0xB507, 0xB508, ALTCHR, 0xB509, 0xB50A, 0xB50B, 0xB50C, 0xB50D,
+ 0xB50E, 0xB50F, 0xB510, 0xB511, 0xB512, 0xB513, ALTCHR, ALTCHR,
+ ALTCHR, 0xB514, 0xB515, 0xB516, 0xB517, 0xB518, 0xB519, 0xB51A,
+ 0xB51B, 0xB51C, 0xB51D, 0xB51E, 0xB51F, 0xB520, 0xB521, 0xB522,
+ 0xB523, 0xB524, ALTCHR, 0xB525, 0xB526, 0xB527, 0xB528, 0xB529,
+ 0xB52A, 0xB52B, 0xB52C, 0xB52D, 0xB52E, 0xB52F, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x9830 - 0x98FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3138, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB530, 0xB531, 0xB532, 0xB533, 0xB534, 0xB535, 0xB536,
+ 0xB537, 0xB538, 0xB539, 0xB53A, 0xB53B, 0xB53C, 0xB53D, 0xB53E,
+ 0xB53F, 0xB540, ALTCHR, 0xB541, 0xB542, 0xB543, 0xB544, 0xB545,
+ 0xB546, 0xB547, 0xB548, 0xB549, 0xB54A, 0xB54B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB54C, 0xB54D, 0xB54E, 0xB54F, 0xB550, 0xB551, 0xB552,
+ 0xB553, 0xB554, 0xB555, 0xB556, 0xB557, 0xB558, 0xB559, 0xB55A,
+ 0xB55B, 0xB55C, ALTCHR, 0xB55D, 0xB55E, 0xB55F, 0xB560, 0xB561,
+ 0xB562, 0xB563, 0xB564, 0xB565, 0xB566, 0xB567, ALTCHR, ALTCHR,
+ ALTCHR, 0xB568, 0xB569, 0xB56A, 0xB56B, 0xB56C, 0xB56D, 0xB56E,
+ 0xB56F, 0xB570, 0xB571, 0xB572, 0xB573, 0xB574, 0xB575, 0xB576,
+ 0xB577, 0xB578, ALTCHR, 0xB579, 0xB57A, 0xB57B, 0xB57C, 0xB57D,
+ 0xB57E, 0xB57F, 0xB580, 0xB581, 0xB582, 0xB583, ALTCHR, ALTCHR,
+ ALTCHR, 0xB584, 0xB585, 0xB586, 0xB587, 0xB588, 0xB589, 0xB58A,
+ 0xB58B, 0xB58C, 0xB58D, 0xB58E, 0xB58F, 0xB590, 0xB591, 0xB592,
+ 0xB593, 0xB594, ALTCHR, 0xB595, 0xB596, 0xB597, 0xB598, 0xB599,
+ 0xB59A, 0xB59B, 0xB59C, 0xB59D, 0xB59E, 0xB59F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB5A0, 0xB5A1, 0xB5A2, 0xB5A3, 0xB5A4, 0xB5A5, 0xB5A6,
+ 0xB5A7, 0xB5A8, 0xB5A9, 0xB5AA, 0xB5AB, 0xB5AC, 0xB5AD, 0xB5AE,
+ 0xB5AF, 0xB5B0, ALTCHR, 0xB5B1, 0xB5B2, 0xB5B3, 0xB5B4, 0xB5B5,
+ 0xB5B6, 0xB5B7, 0xB5B8, 0xB5B9, 0xB5BA, 0xB5BB, ALTCHR, ALTCHR,
+/* 0x9930 - 0x99FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB5BC, 0xB5BD, 0xB5BE, 0xB5BF, 0xB5C0, 0xB5C1, 0xB5C2,
+ 0xB5C3, 0xB5C4, 0xB5C5, 0xB5C6, 0xB5C7, 0xB5C8, 0xB5C9, 0xB5CA,
+ 0xB5CB, 0xB5CC, ALTCHR, 0xB5CD, 0xB5CE, 0xB5CF, 0xB5D0, 0xB5D1,
+ 0xB5D2, 0xB5D3, 0xB5D4, 0xB5D5, 0xB5D6, 0xB5D7, ALTCHR, ALTCHR,
+ ALTCHR, 0xB5D8, 0xB5D9, 0xB5DA, 0xB5DB, 0xB5DC, 0xB5DD, 0xB5DE,
+ 0xB5DF, 0xB5E0, 0xB5E1, 0xB5E2, 0xB5E3, 0xB5E4, 0xB5E5, 0xB5E6,
+ 0xB5E7, 0xB5E8, ALTCHR, 0xB5E9, 0xB5EA, 0xB5EB, 0xB5EC, 0xB5ED,
+ 0xB5EE, 0xB5EF, 0xB5F0, 0xB5F1, 0xB5F2, 0xB5F3, ALTCHR, ALTCHR,
+ ALTCHR, 0xB5F4, 0xB5F5, 0xB5F6, 0xB5F7, 0xB5F8, 0xB5F9, 0xB5FA,
+ 0xB5FB, 0xB5FC, 0xB5FD, 0xB5FE, 0xB5FF, 0xB600, 0xB601, 0xB602,
+ 0xB603, 0xB604, ALTCHR, 0xB605, 0xB606, 0xB607, 0xB608, 0xB609,
+ 0xB60A, 0xB60B, 0xB60C, 0xB60D, 0xB60E, 0xB60F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB610, 0xB611, 0xB612, 0xB613, 0xB614, 0xB615, 0xB616,
+ 0xB617, 0xB618, 0xB619, 0xB61A, 0xB61B, 0xB61C, 0xB61D, 0xB61E,
+ 0xB61F, 0xB620, ALTCHR, 0xB621, 0xB622, 0xB623, 0xB624, 0xB625,
+ 0xB626, 0xB627, 0xB628, 0xB629, 0xB62A, 0xB62B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB62C, 0xB62D, 0xB62E, 0xB62F, 0xB630, 0xB631, 0xB632,
+ 0xB633, 0xB634, 0xB635, 0xB636, 0xB637, 0xB638, 0xB639, 0xB63A,
+ 0xB63B, 0xB63C, ALTCHR, 0xB63D, 0xB63E, 0xB63F, 0xB640, 0xB641,
+ 0xB642, 0xB643, 0xB644, 0xB645, 0xB646, 0xB647, ALTCHR, ALTCHR,
+ ALTCHR, 0xB648, 0xB649, 0xB64A, 0xB64B, 0xB64C, 0xB64D, 0xB64E,
+ 0xB64F, 0xB650, 0xB651, 0xB652, 0xB653, 0xB654, 0xB655, 0xB656,
+ 0xB657, 0xB658, ALTCHR, 0xB659, 0xB65A, 0xB65B, 0xB65C, 0xB65D,
+ 0xB65E, 0xB65F, 0xB660, 0xB661, 0xB662, 0xB663, ALTCHR, ALTCHR,
+/* 0x9A30 - 0x9AFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB664, 0xB665, 0xB666, 0xB667, 0xB668, 0xB669, 0xB66A,
+ 0xB66B, 0xB66C, 0xB66D, 0xB66E, 0xB66F, 0xB670, 0xB671, 0xB672,
+ 0xB673, 0xB674, ALTCHR, 0xB675, 0xB676, 0xB677, 0xB678, 0xB679,
+ 0xB67A, 0xB67B, 0xB67C, 0xB67D, 0xB67E, 0xB67F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB680, 0xB681, 0xB682, 0xB683, 0xB684, 0xB685, 0xB686,
+ 0xB687, 0xB688, 0xB689, 0xB68A, 0xB68B, 0xB68C, 0xB68D, 0xB68E,
+ 0xB68F, 0xB690, ALTCHR, 0xB691, 0xB692, 0xB693, 0xB694, 0xB695,
+ 0xB696, 0xB697, 0xB698, 0xB699, 0xB69A, 0xB69B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB69C, 0xB69D, 0xB69E, 0xB69F, 0xB6A0, 0xB6A1, 0xB6A2,
+ 0xB6A3, 0xB6A4, 0xB6A5, 0xB6A6, 0xB6A7, 0xB6A8, 0xB6A9, 0xB6AA,
+ 0xB6AB, 0xB6AC, ALTCHR, 0xB6AD, 0xB6AE, 0xB6AF, 0xB6B0, 0xB6B1,
+ 0xB6B2, 0xB6B3, 0xB6B4, 0xB6B5, 0xB6B6, 0xB6B7, ALTCHR, ALTCHR,
+ ALTCHR, 0xB6B8, 0xB6B9, 0xB6BA, 0xB6BB, 0xB6BC, 0xB6BD, 0xB6BE,
+ 0xB6BF, 0xB6C0, 0xB6C1, 0xB6C2, 0xB6C3, 0xB6C4, 0xB6C5, 0xB6C6,
+ 0xB6C7, 0xB6C8, ALTCHR, 0xB6C9, 0xB6CA, 0xB6CB, 0xB6CC, 0xB6CD,
+ 0xB6CE, 0xB6CF, 0xB6D0, 0xB6D1, 0xB6D2, 0xB6D3, ALTCHR, ALTCHR,
+ ALTCHR, 0xB6D4, 0xB6D5, 0xB6D6, 0xB6D7, 0xB6D8, 0xB6D9, 0xB6DA,
+ 0xB6DB, 0xB6DC, 0xB6DD, 0xB6DE, 0xB6DF, 0xB6E0, 0xB6E1, 0xB6E2,
+ 0xB6E3, 0xB6E4, ALTCHR, 0xB6E5, 0xB6E6, 0xB6E7, 0xB6E8, 0xB6E9,
+ 0xB6EA, 0xB6EB, 0xB6EC, 0xB6ED, 0xB6EE, 0xB6EF, ALTCHR, ALTCHR,
+ ALTCHR, 0xB6F0, 0xB6F1, 0xB6F2, 0xB6F3, 0xB6F4, 0xB6F5, 0xB6F6,
+ 0xB6F7, 0xB6F8, 0xB6F9, 0xB6FA, 0xB6FB, 0xB6FC, 0xB6FD, 0xB6FE,
+ 0xB6FF, 0xB700, ALTCHR, 0xB701, 0xB702, 0xB703, 0xB704, 0xB705,
+ 0xB706, 0xB707, 0xB708, 0xB709, 0xB70A, 0xB70B, ALTCHR, ALTCHR,
+/* 0x9B30 - 0x9BFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB70C, 0xB70D, 0xB70E, 0xB70F, 0xB710, 0xB711, 0xB712,
+ 0xB713, 0xB714, 0xB715, 0xB716, 0xB717, 0xB718, 0xB719, 0xB71A,
+ 0xB71B, 0xB71C, ALTCHR, 0xB71D, 0xB71E, 0xB71F, 0xB720, 0xB721,
+ 0xB722, 0xB723, 0xB724, 0xB725, 0xB726, 0xB727, ALTCHR, ALTCHR,
+ ALTCHR, 0xB728, 0xB729, 0xB72A, 0xB72B, 0xB72C, 0xB72D, 0xB72E,
+ 0xB72F, 0xB730, 0xB731, 0xB732, 0xB733, 0xB734, 0xB735, 0xB736,
+ 0xB737, 0xB738, ALTCHR, 0xB739, 0xB73A, 0xB73B, 0xB73C, 0xB73D,
+ 0xB73E, 0xB73F, 0xB740, 0xB741, 0xB742, 0xB743, ALTCHR, ALTCHR,
+ ALTCHR, 0xB744, 0xB745, 0xB746, 0xB747, 0xB748, 0xB749, 0xB74A,
+ 0xB74B, 0xB74C, 0xB74D, 0xB74E, 0xB74F, 0xB750, 0xB751, 0xB752,
+ 0xB753, 0xB754, ALTCHR, 0xB755, 0xB756, 0xB757, 0xB758, 0xB759,
+ 0xB75A, 0xB75B, 0xB75C, 0xB75D, 0xB75E, 0xB75F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB760, 0xB761, 0xB762, 0xB763, 0xB764, 0xB765, 0xB766,
+ 0xB767, 0xB768, 0xB769, 0xB76A, 0xB76B, 0xB76C, 0xB76D, 0xB76E,
+ 0xB76F, 0xB770, ALTCHR, 0xB771, 0xB772, 0xB773, 0xB774, 0xB775,
+ 0xB776, 0xB777, 0xB778, 0xB779, 0xB77A, 0xB77B, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x9C30 - 0x9CFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3139, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB77C, 0xB77D, 0xB77E, 0xB77F, 0xB780, 0xB781, 0xB782,
+ 0xB783, 0xB784, 0xB785, 0xB786, 0xB787, 0xB788, 0xB789, 0xB78A,
+ 0xB78B, 0xB78C, ALTCHR, 0xB78D, 0xB78E, 0xB78F, 0xB790, 0xB791,
+ 0xB792, 0xB793, 0xB794, 0xB795, 0xB796, 0xB797, ALTCHR, ALTCHR,
+ ALTCHR, 0xB798, 0xB799, 0xB79A, 0xB79B, 0xB79C, 0xB79D, 0xB79E,
+ 0xB79F, 0xB7A0, 0xB7A1, 0xB7A2, 0xB7A3, 0xB7A4, 0xB7A5, 0xB7A6,
+ 0xB7A7, 0xB7A8, ALTCHR, 0xB7A9, 0xB7AA, 0xB7AB, 0xB7AC, 0xB7AD,
+ 0xB7AE, 0xB7AF, 0xB7B0, 0xB7B1, 0xB7B2, 0xB7B3, ALTCHR, ALTCHR,
+ ALTCHR, 0xB7B4, 0xB7B5, 0xB7B6, 0xB7B7, 0xB7B8, 0xB7B9, 0xB7BA,
+ 0xB7BB, 0xB7BC, 0xB7BD, 0xB7BE, 0xB7BF, 0xB7C0, 0xB7C1, 0xB7C2,
+ 0xB7C3, 0xB7C4, ALTCHR, 0xB7C5, 0xB7C6, 0xB7C7, 0xB7C8, 0xB7C9,
+ 0xB7CA, 0xB7CB, 0xB7CC, 0xB7CD, 0xB7CE, 0xB7CF, ALTCHR, ALTCHR,
+ ALTCHR, 0xB7D0, 0xB7D1, 0xB7D2, 0xB7D3, 0xB7D4, 0xB7D5, 0xB7D6,
+ 0xB7D7, 0xB7D8, 0xB7D9, 0xB7DA, 0xB7DB, 0xB7DC, 0xB7DD, 0xB7DE,
+ 0xB7DF, 0xB7E0, ALTCHR, 0xB7E1, 0xB7E2, 0xB7E3, 0xB7E4, 0xB7E5,
+ 0xB7E6, 0xB7E7, 0xB7E8, 0xB7E9, 0xB7EA, 0xB7EB, ALTCHR, ALTCHR,
+ ALTCHR, 0xB7EC, 0xB7ED, 0xB7EE, 0xB7EF, 0xB7F0, 0xB7F1, 0xB7F2,
+ 0xB7F3, 0xB7F4, 0xB7F5, 0xB7F6, 0xB7F7, 0xB7F8, 0xB7F9, 0xB7FA,
+ 0xB7FB, 0xB7FC, ALTCHR, 0xB7FD, 0xB7FE, 0xB7FF, 0xB800, 0xB801,
+ 0xB802, 0xB803, 0xB804, 0xB805, 0xB806, 0xB807, ALTCHR, ALTCHR,
+/* 0x9D30 - 0x9DFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB808, 0xB809, 0xB80A, 0xB80B, 0xB80C, 0xB80D, 0xB80E,
+ 0xB80F, 0xB810, 0xB811, 0xB812, 0xB813, 0xB814, 0xB815, 0xB816,
+ 0xB817, 0xB818, ALTCHR, 0xB819, 0xB81A, 0xB81B, 0xB81C, 0xB81D,
+ 0xB81E, 0xB81F, 0xB820, 0xB821, 0xB822, 0xB823, ALTCHR, ALTCHR,
+ ALTCHR, 0xB824, 0xB825, 0xB826, 0xB827, 0xB828, 0xB829, 0xB82A,
+ 0xB82B, 0xB82C, 0xB82D, 0xB82E, 0xB82F, 0xB830, 0xB831, 0xB832,
+ 0xB833, 0xB834, ALTCHR, 0xB835, 0xB836, 0xB837, 0xB838, 0xB839,
+ 0xB83A, 0xB83B, 0xB83C, 0xB83D, 0xB83E, 0xB83F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB840, 0xB841, 0xB842, 0xB843, 0xB844, 0xB845, 0xB846,
+ 0xB847, 0xB848, 0xB849, 0xB84A, 0xB84B, 0xB84C, 0xB84D, 0xB84E,
+ 0xB84F, 0xB850, ALTCHR, 0xB851, 0xB852, 0xB853, 0xB854, 0xB855,
+ 0xB856, 0xB857, 0xB858, 0xB859, 0xB85A, 0xB85B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB85C, 0xB85D, 0xB85E, 0xB85F, 0xB860, 0xB861, 0xB862,
+ 0xB863, 0xB864, 0xB865, 0xB866, 0xB867, 0xB868, 0xB869, 0xB86A,
+ 0xB86B, 0xB86C, ALTCHR, 0xB86D, 0xB86E, 0xB86F, 0xB870, 0xB871,
+ 0xB872, 0xB873, 0xB874, 0xB875, 0xB876, 0xB877, ALTCHR, ALTCHR,
+ ALTCHR, 0xB878, 0xB879, 0xB87A, 0xB87B, 0xB87C, 0xB87D, 0xB87E,
+ 0xB87F, 0xB880, 0xB881, 0xB882, 0xB883, 0xB884, 0xB885, 0xB886,
+ 0xB887, 0xB888, ALTCHR, 0xB889, 0xB88A, 0xB88B, 0xB88C, 0xB88D,
+ 0xB88E, 0xB88F, 0xB890, 0xB891, 0xB892, 0xB893, ALTCHR, ALTCHR,
+ ALTCHR, 0xB894, 0xB895, 0xB896, 0xB897, 0xB898, 0xB899, 0xB89A,
+ 0xB89B, 0xB89C, 0xB89D, 0xB89E, 0xB89F, 0xB8A0, 0xB8A1, 0xB8A2,
+ 0xB8A3, 0xB8A4, ALTCHR, 0xB8A5, 0xB8A6, 0xB8A7, 0xB8A8, 0xB8A9,
+ 0xB8AA, 0xB8AB, 0xB8AC, 0xB8AD, 0xB8AE, 0xB8AF, ALTCHR, ALTCHR,
+/* 0x9E30 - 0x9EFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB8B0, 0xB8B1, 0xB8B2, 0xB8B3, 0xB8B4, 0xB8B5, 0xB8B6,
+ 0xB8B7, 0xB8B8, 0xB8B9, 0xB8BA, 0xB8BB, 0xB8BC, 0xB8BD, 0xB8BE,
+ 0xB8BF, 0xB8C0, ALTCHR, 0xB8C1, 0xB8C2, 0xB8C3, 0xB8C4, 0xB8C5,
+ 0xB8C6, 0xB8C7, 0xB8C8, 0xB8C9, 0xB8CA, 0xB8CB, ALTCHR, ALTCHR,
+ ALTCHR, 0xB8CC, 0xB8CD, 0xB8CE, 0xB8CF, 0xB8D0, 0xB8D1, 0xB8D2,
+ 0xB8D3, 0xB8D4, 0xB8D5, 0xB8D6, 0xB8D7, 0xB8D8, 0xB8D9, 0xB8DA,
+ 0xB8DB, 0xB8DC, ALTCHR, 0xB8DD, 0xB8DE, 0xB8DF, 0xB8E0, 0xB8E1,
+ 0xB8E2, 0xB8E3, 0xB8E4, 0xB8E5, 0xB8E6, 0xB8E7, ALTCHR, ALTCHR,
+ ALTCHR, 0xB8E8, 0xB8E9, 0xB8EA, 0xB8EB, 0xB8EC, 0xB8ED, 0xB8EE,
+ 0xB8EF, 0xB8F0, 0xB8F1, 0xB8F2, 0xB8F3, 0xB8F4, 0xB8F5, 0xB8F6,
+ 0xB8F7, 0xB8F8, ALTCHR, 0xB8F9, 0xB8FA, 0xB8FB, 0xB8FC, 0xB8FD,
+ 0xB8FE, 0xB8FF, 0xB900, 0xB901, 0xB902, 0xB903, ALTCHR, ALTCHR,
+ ALTCHR, 0xB904, 0xB905, 0xB906, 0xB907, 0xB908, 0xB909, 0xB90A,
+ 0xB90B, 0xB90C, 0xB90D, 0xB90E, 0xB90F, 0xB910, 0xB911, 0xB912,
+ 0xB913, 0xB914, ALTCHR, 0xB915, 0xB916, 0xB917, 0xB918, 0xB919,
+ 0xB91A, 0xB91B, 0xB91C, 0xB91D, 0xB91E, 0xB91F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB920, 0xB921, 0xB922, 0xB923, 0xB924, 0xB925, 0xB926,
+ 0xB927, 0xB928, 0xB929, 0xB92A, 0xB92B, 0xB92C, 0xB92D, 0xB92E,
+ 0xB92F, 0xB930, ALTCHR, 0xB931, 0xB932, 0xB933, 0xB934, 0xB935,
+ 0xB936, 0xB937, 0xB938, 0xB939, 0xB93A, 0xB93B, ALTCHR, ALTCHR,
+ ALTCHR, 0xB93C, 0xB93D, 0xB93E, 0xB93F, 0xB940, 0xB941, 0xB942,
+ 0xB943, 0xB944, 0xB945, 0xB946, 0xB947, 0xB948, 0xB949, 0xB94A,
+ 0xB94B, 0xB94C, ALTCHR, 0xB94D, 0xB94E, 0xB94F, 0xB950, 0xB951,
+ 0xB952, 0xB953, 0xB954, 0xB955, 0xB956, 0xB957, ALTCHR, ALTCHR,
+/* 0x9F30 - 0x9FFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB958, 0xB959, 0xB95A, 0xB95B, 0xB95C, 0xB95D, 0xB95E,
+ 0xB95F, 0xB960, 0xB961, 0xB962, 0xB963, 0xB964, 0xB965, 0xB966,
+ 0xB967, 0xB968, ALTCHR, 0xB969, 0xB96A, 0xB96B, 0xB96C, 0xB96D,
+ 0xB96E, 0xB96F, 0xB970, 0xB971, 0xB972, 0xB973, ALTCHR, ALTCHR,
+ ALTCHR, 0xB974, 0xB975, 0xB976, 0xB977, 0xB978, 0xB979, 0xB97A,
+ 0xB97B, 0xB97C, 0xB97D, 0xB97E, 0xB97F, 0xB980, 0xB981, 0xB982,
+ 0xB983, 0xB984, ALTCHR, 0xB985, 0xB986, 0xB987, 0xB988, 0xB989,
+ 0xB98A, 0xB98B, 0xB98C, 0xB98D, 0xB98E, 0xB98F, ALTCHR, ALTCHR,
+ ALTCHR, 0xB990, 0xB991, 0xB992, 0xB993, 0xB994, 0xB995, 0xB996,
+ 0xB997, 0xB998, 0xB999, 0xB99A, 0xB99B, 0xB99C, 0xB99D, 0xB99E,
+ 0xB99F, 0xB9A0, ALTCHR, 0xB9A1, 0xB9A2, 0xB9A3, 0xB9A4, 0xB9A5,
+ 0xB9A6, 0xB9A7, 0xB9A8, 0xB9A9, 0xB9AA, 0xB9AB, ALTCHR, ALTCHR,
+ ALTCHR, 0xB9AC, 0xB9AD, 0xB9AE, 0xB9AF, 0xB9B0, 0xB9B1, 0xB9B2,
+ 0xB9B3, 0xB9B4, 0xB9B5, 0xB9B6, 0xB9B7, 0xB9B8, 0xB9B9, 0xB9BA,
+ 0xB9BB, 0xB9BC, ALTCHR, 0xB9BD, 0xB9BE, 0xB9BF, 0xB9C0, 0xB9C1,
+ 0xB9C2, 0xB9C3, 0xB9C4, 0xB9C5, 0xB9C6, 0xB9C7, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xA030 - 0xA0FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3141, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xB9C8, 0xB9C9, 0xB9CA, 0xB9CB, 0xB9CC, 0xB9CD, 0xB9CE,
+ 0xB9CF, 0xB9D0, 0xB9D1, 0xB9D2, 0xB9D3, 0xB9D4, 0xB9D5, 0xB9D6,
+ 0xB9D7, 0xB9D8, ALTCHR, 0xB9D9, 0xB9DA, 0xB9DB, 0xB9DC, 0xB9DD,
+ 0xB9DE, 0xB9DF, 0xB9E0, 0xB9E1, 0xB9E2, 0xB9E3, ALTCHR, ALTCHR,
+ ALTCHR, 0xB9E4, 0xB9E5, 0xB9E6, 0xB9E7, 0xB9E8, 0xB9E9, 0xB9EA,
+ 0xB9EB, 0xB9EC, 0xB9ED, 0xB9EE, 0xB9EF, 0xB9F0, 0xB9F1, 0xB9F2,
+ 0xB9F3, 0xB9F4, ALTCHR, 0xB9F5, 0xB9F6, 0xB9F7, 0xB9F8, 0xB9F9,
+ 0xB9FA, 0xB9FB, 0xB9FC, 0xB9FD, 0xB9FE, 0xB9FF, ALTCHR, ALTCHR,
+ ALTCHR, 0xBA00, 0xBA01, 0xBA02, 0xBA03, 0xBA04, 0xBA05, 0xBA06,
+ 0xBA07, 0xBA08, 0xBA09, 0xBA0A, 0xBA0B, 0xBA0C, 0xBA0D, 0xBA0E,
+ 0xBA0F, 0xBA10, ALTCHR, 0xBA11, 0xBA12, 0xBA13, 0xBA14, 0xBA15,
+ 0xBA16, 0xBA17, 0xBA18, 0xBA19, 0xBA1A, 0xBA1B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBA1C, 0xBA1D, 0xBA1E, 0xBA1F, 0xBA20, 0xBA21, 0xBA22,
+ 0xBA23, 0xBA24, 0xBA25, 0xBA26, 0xBA27, 0xBA28, 0xBA29, 0xBA2A,
+ 0xBA2B, 0xBA2C, ALTCHR, 0xBA2D, 0xBA2E, 0xBA2F, 0xBA30, 0xBA31,
+ 0xBA32, 0xBA33, 0xBA34, 0xBA35, 0xBA36, 0xBA37, ALTCHR, ALTCHR,
+ ALTCHR, 0xBA38, 0xBA39, 0xBA3A, 0xBA3B, 0xBA3C, 0xBA3D, 0xBA3E,
+ 0xBA3F, 0xBA40, 0xBA41, 0xBA42, 0xBA43, 0xBA44, 0xBA45, 0xBA46,
+ 0xBA47, 0xBA48, ALTCHR, 0xBA49, 0xBA4A, 0xBA4B, 0xBA4C, 0xBA4D,
+ 0xBA4E, 0xBA4F, 0xBA50, 0xBA51, 0xBA52, 0xBA53, ALTCHR, ALTCHR,
+/* 0xA130 - 0xA1FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBA54, 0xBA55, 0xBA56, 0xBA57, 0xBA58, 0xBA59, 0xBA5A,
+ 0xBA5B, 0xBA5C, 0xBA5D, 0xBA5E, 0xBA5F, 0xBA60, 0xBA61, 0xBA62,
+ 0xBA63, 0xBA64, ALTCHR, 0xBA65, 0xBA66, 0xBA67, 0xBA68, 0xBA69,
+ 0xBA6A, 0xBA6B, 0xBA6C, 0xBA6D, 0xBA6E, 0xBA6F, ALTCHR, ALTCHR,
+ ALTCHR, 0xBA70, 0xBA71, 0xBA72, 0xBA73, 0xBA74, 0xBA75, 0xBA76,
+ 0xBA77, 0xBA78, 0xBA79, 0xBA7A, 0xBA7B, 0xBA7C, 0xBA7D, 0xBA7E,
+ 0xBA7F, 0xBA80, ALTCHR, 0xBA81, 0xBA82, 0xBA83, 0xBA84, 0xBA85,
+ 0xBA86, 0xBA87, 0xBA88, 0xBA89, 0xBA8A, 0xBA8B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBA8C, 0xBA8D, 0xBA8E, 0xBA8F, 0xBA90, 0xBA91, 0xBA92,
+ 0xBA93, 0xBA94, 0xBA95, 0xBA96, 0xBA97, 0xBA98, 0xBA99, 0xBA9A,
+ 0xBA9B, 0xBA9C, ALTCHR, 0xBA9D, 0xBA9E, 0xBA9F, 0xBAA0, 0xBAA1,
+ 0xBAA2, 0xBAA3, 0xBAA4, 0xBAA5, 0xBAA6, 0xBAA7, ALTCHR, ALTCHR,
+ ALTCHR, 0xBAA8, 0xBAA9, 0xBAAA, 0xBAAB, 0xBAAC, 0xBAAD, 0xBAAE,
+ 0xBAAF, 0xBAB0, 0xBAB1, 0xBAB2, 0xBAB3, 0xBAB4, 0xBAB5, 0xBAB6,
+ 0xBAB7, 0xBAB8, ALTCHR, 0xBAB9, 0xBABA, 0xBABB, 0xBABC, 0xBABD,
+ 0xBABE, 0xBABF, 0xBAC0, 0xBAC1, 0xBAC2, 0xBAC3, ALTCHR, ALTCHR,
+ ALTCHR, 0xBAC4, 0xBAC5, 0xBAC6, 0xBAC7, 0xBAC8, 0xBAC9, 0xBACA,
+ 0xBACB, 0xBACC, 0xBACD, 0xBACE, 0xBACF, 0xBAD0, 0xBAD1, 0xBAD2,
+ 0xBAD3, 0xBAD4, ALTCHR, 0xBAD5, 0xBAD6, 0xBAD7, 0xBAD8, 0xBAD9,
+ 0xBADA, 0xBADB, 0xBADC, 0xBADD, 0xBADE, 0xBADF, ALTCHR, ALTCHR,
+ ALTCHR, 0xBAE0, 0xBAE1, 0xBAE2, 0xBAE3, 0xBAE4, 0xBAE5, 0xBAE6,
+ 0xBAE7, 0xBAE8, 0xBAE9, 0xBAEA, 0xBAEB, 0xBAEC, 0xBAED, 0xBAEE,
+ 0xBAEF, 0xBAF0, ALTCHR, 0xBAF1, 0xBAF2, 0xBAF3, 0xBAF4, 0xBAF5,
+ 0xBAF6, 0xBAF7, 0xBAF8, 0xBAF9, 0xBAFA, 0xBAFB, ALTCHR, ALTCHR,
+/* 0xA230 - 0xA2FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBAFC, 0xBAFD, 0xBAFE, 0xBAFF, 0xBB00, 0xBB01, 0xBB02,
+ 0xBB03, 0xBB04, 0xBB05, 0xBB06, 0xBB07, 0xBB08, 0xBB09, 0xBB0A,
+ 0xBB0B, 0xBB0C, ALTCHR, 0xBB0D, 0xBB0E, 0xBB0F, 0xBB10, 0xBB11,
+ 0xBB12, 0xBB13, 0xBB14, 0xBB15, 0xBB16, 0xBB17, ALTCHR, ALTCHR,
+ ALTCHR, 0xBB18, 0xBB19, 0xBB1A, 0xBB1B, 0xBB1C, 0xBB1D, 0xBB1E,
+ 0xBB1F, 0xBB20, 0xBB21, 0xBB22, 0xBB23, 0xBB24, 0xBB25, 0xBB26,
+ 0xBB27, 0xBB28, ALTCHR, 0xBB29, 0xBB2A, 0xBB2B, 0xBB2C, 0xBB2D,
+ 0xBB2E, 0xBB2F, 0xBB30, 0xBB31, 0xBB32, 0xBB33, ALTCHR, ALTCHR,
+ ALTCHR, 0xBB34, 0xBB35, 0xBB36, 0xBB37, 0xBB38, 0xBB39, 0xBB3A,
+ 0xBB3B, 0xBB3C, 0xBB3D, 0xBB3E, 0xBB3F, 0xBB40, 0xBB41, 0xBB42,
+ 0xBB43, 0xBB44, ALTCHR, 0xBB45, 0xBB46, 0xBB47, 0xBB48, 0xBB49,
+ 0xBB4A, 0xBB4B, 0xBB4C, 0xBB4D, 0xBB4E, 0xBB4F, ALTCHR, ALTCHR,
+ ALTCHR, 0xBB50, 0xBB51, 0xBB52, 0xBB53, 0xBB54, 0xBB55, 0xBB56,
+ 0xBB57, 0xBB58, 0xBB59, 0xBB5A, 0xBB5B, 0xBB5C, 0xBB5D, 0xBB5E,
+ 0xBB5F, 0xBB60, ALTCHR, 0xBB61, 0xBB62, 0xBB63, 0xBB64, 0xBB65,
+ 0xBB66, 0xBB67, 0xBB68, 0xBB69, 0xBB6A, 0xBB6B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBB6C, 0xBB6D, 0xBB6E, 0xBB6F, 0xBB70, 0xBB71, 0xBB72,
+ 0xBB73, 0xBB74, 0xBB75, 0xBB76, 0xBB77, 0xBB78, 0xBB79, 0xBB7A,
+ 0xBB7B, 0xBB7C, ALTCHR, 0xBB7D, 0xBB7E, 0xBB7F, 0xBB80, 0xBB81,
+ 0xBB82, 0xBB83, 0xBB84, 0xBB85, 0xBB86, 0xBB87, ALTCHR, ALTCHR,
+ ALTCHR, 0xBB88, 0xBB89, 0xBB8A, 0xBB8B, 0xBB8C, 0xBB8D, 0xBB8E,
+ 0xBB8F, 0xBB90, 0xBB91, 0xBB92, 0xBB93, 0xBB94, 0xBB95, 0xBB96,
+ 0xBB97, 0xBB98, ALTCHR, 0xBB99, 0xBB9A, 0xBB9B, 0xBB9C, 0xBB9D,
+ 0xBB9E, 0xBB9F, 0xBBA0, 0xBBA1, 0xBBA2, 0xBBA3, ALTCHR, ALTCHR,
+/* 0xA330 - 0xA3FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBBA4, 0xBBA5, 0xBBA6, 0xBBA7, 0xBBA8, 0xBBA9, 0xBBAA,
+ 0xBBAB, 0xBBAC, 0xBBAD, 0xBBAE, 0xBBAF, 0xBBB0, 0xBBB1, 0xBBB2,
+ 0xBBB3, 0xBBB4, ALTCHR, 0xBBB5, 0xBBB6, 0xBBB7, 0xBBB8, 0xBBB9,
+ 0xBBBA, 0xBBBB, 0xBBBC, 0xBBBD, 0xBBBE, 0xBBBF, ALTCHR, ALTCHR,
+ ALTCHR, 0xBBC0, 0xBBC1, 0xBBC2, 0xBBC3, 0xBBC4, 0xBBC5, 0xBBC6,
+ 0xBBC7, 0xBBC8, 0xBBC9, 0xBBCA, 0xBBCB, 0xBBCC, 0xBBCD, 0xBBCE,
+ 0xBBCF, 0xBBD0, ALTCHR, 0xBBD1, 0xBBD2, 0xBBD3, 0xBBD4, 0xBBD5,
+ 0xBBD6, 0xBBD7, 0xBBD8, 0xBBD9, 0xBBDA, 0xBBDB, ALTCHR, ALTCHR,
+ ALTCHR, 0xBBDC, 0xBBDD, 0xBBDE, 0xBBDF, 0xBBE0, 0xBBE1, 0xBBE2,
+ 0xBBE3, 0xBBE4, 0xBBE5, 0xBBE6, 0xBBE7, 0xBBE8, 0xBBE9, 0xBBEA,
+ 0xBBEB, 0xBBEC, ALTCHR, 0xBBED, 0xBBEE, 0xBBEF, 0xBBF0, 0xBBF1,
+ 0xBBF2, 0xBBF3, 0xBBF4, 0xBBF5, 0xBBF6, 0xBBF7, ALTCHR, ALTCHR,
+ ALTCHR, 0xBBF8, 0xBBF9, 0xBBFA, 0xBBFB, 0xBBFC, 0xBBFD, 0xBBFE,
+ 0xBBFF, 0xBC00, 0xBC01, 0xBC02, 0xBC03, 0xBC04, 0xBC05, 0xBC06,
+ 0xBC07, 0xBC08, ALTCHR, 0xBC09, 0xBC0A, 0xBC0B, 0xBC0C, 0xBC0D,
+ 0xBC0E, 0xBC0F, 0xBC10, 0xBC11, 0xBC12, 0xBC13, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xA430 - 0xA4FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3142, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBC14, 0xBC15, 0xBC16, 0xBC17, 0xBC18, 0xBC19, 0xBC1A,
+ 0xBC1B, 0xBC1C, 0xBC1D, 0xBC1E, 0xBC1F, 0xBC20, 0xBC21, 0xBC22,
+ 0xBC23, 0xBC24, ALTCHR, 0xBC25, 0xBC26, 0xBC27, 0xBC28, 0xBC29,
+ 0xBC2A, 0xBC2B, 0xBC2C, 0xBC2D, 0xBC2E, 0xBC2F, ALTCHR, ALTCHR,
+ ALTCHR, 0xBC30, 0xBC31, 0xBC32, 0xBC33, 0xBC34, 0xBC35, 0xBC36,
+ 0xBC37, 0xBC38, 0xBC39, 0xBC3A, 0xBC3B, 0xBC3C, 0xBC3D, 0xBC3E,
+ 0xBC3F, 0xBC40, ALTCHR, 0xBC41, 0xBC42, 0xBC43, 0xBC44, 0xBC45,
+ 0xBC46, 0xBC47, 0xBC48, 0xBC49, 0xBC4A, 0xBC4B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBC4C, 0xBC4D, 0xBC4E, 0xBC4F, 0xBC50, 0xBC51, 0xBC52,
+ 0xBC53, 0xBC54, 0xBC55, 0xBC56, 0xBC57, 0xBC58, 0xBC59, 0xBC5A,
+ 0xBC5B, 0xBC5C, ALTCHR, 0xBC5D, 0xBC5E, 0xBC5F, 0xBC60, 0xBC61,
+ 0xBC62, 0xBC63, 0xBC64, 0xBC65, 0xBC66, 0xBC67, ALTCHR, ALTCHR,
+ ALTCHR, 0xBC68, 0xBC69, 0xBC6A, 0xBC6B, 0xBC6C, 0xBC6D, 0xBC6E,
+ 0xBC6F, 0xBC70, 0xBC71, 0xBC72, 0xBC73, 0xBC74, 0xBC75, 0xBC76,
+ 0xBC77, 0xBC78, ALTCHR, 0xBC79, 0xBC7A, 0xBC7B, 0xBC7C, 0xBC7D,
+ 0xBC7E, 0xBC7F, 0xBC80, 0xBC81, 0xBC82, 0xBC83, ALTCHR, ALTCHR,
+ ALTCHR, 0xBC84, 0xBC85, 0xBC86, 0xBC87, 0xBC88, 0xBC89, 0xBC8A,
+ 0xBC8B, 0xBC8C, 0xBC8D, 0xBC8E, 0xBC8F, 0xBC90, 0xBC91, 0xBC92,
+ 0xBC93, 0xBC94, ALTCHR, 0xBC95, 0xBC96, 0xBC97, 0xBC98, 0xBC99,
+ 0xBC9A, 0xBC9B, 0xBC9C, 0xBC9D, 0xBC9E, 0xBC9F, ALTCHR, ALTCHR,
+/* 0xA530 - 0xA5FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBCA0, 0xBCA1, 0xBCA2, 0xBCA3, 0xBCA4, 0xBCA5, 0xBCA6,
+ 0xBCA7, 0xBCA8, 0xBCA9, 0xBCAA, 0xBCAB, 0xBCAC, 0xBCAD, 0xBCAE,
+ 0xBCAF, 0xBCB0, ALTCHR, 0xBCB1, 0xBCB2, 0xBCB3, 0xBCB4, 0xBCB5,
+ 0xBCB6, 0xBCB7, 0xBCB8, 0xBCB9, 0xBCBA, 0xBCBB, ALTCHR, ALTCHR,
+ ALTCHR, 0xBCBC, 0xBCBD, 0xBCBE, 0xBCBF, 0xBCC0, 0xBCC1, 0xBCC2,
+ 0xBCC3, 0xBCC4, 0xBCC5, 0xBCC6, 0xBCC7, 0xBCC8, 0xBCC9, 0xBCCA,
+ 0xBCCB, 0xBCCC, ALTCHR, 0xBCCD, 0xBCCE, 0xBCCF, 0xBCD0, 0xBCD1,
+ 0xBCD2, 0xBCD3, 0xBCD4, 0xBCD5, 0xBCD6, 0xBCD7, ALTCHR, ALTCHR,
+ ALTCHR, 0xBCD8, 0xBCD9, 0xBCDA, 0xBCDB, 0xBCDC, 0xBCDD, 0xBCDE,
+ 0xBCDF, 0xBCE0, 0xBCE1, 0xBCE2, 0xBCE3, 0xBCE4, 0xBCE5, 0xBCE6,
+ 0xBCE7, 0xBCE8, ALTCHR, 0xBCE9, 0xBCEA, 0xBCEB, 0xBCEC, 0xBCED,
+ 0xBCEE, 0xBCEF, 0xBCF0, 0xBCF1, 0xBCF2, 0xBCF3, ALTCHR, ALTCHR,
+ ALTCHR, 0xBCF4, 0xBCF5, 0xBCF6, 0xBCF7, 0xBCF8, 0xBCF9, 0xBCFA,
+ 0xBCFB, 0xBCFC, 0xBCFD, 0xBCFE, 0xBCFF, 0xBD00, 0xBD01, 0xBD02,
+ 0xBD03, 0xBD04, ALTCHR, 0xBD05, 0xBD06, 0xBD07, 0xBD08, 0xBD09,
+ 0xBD0A, 0xBD0B, 0xBD0C, 0xBD0D, 0xBD0E, 0xBD0F, ALTCHR, ALTCHR,
+ ALTCHR, 0xBD10, 0xBD11, 0xBD12, 0xBD13, 0xBD14, 0xBD15, 0xBD16,
+ 0xBD17, 0xBD18, 0xBD19, 0xBD1A, 0xBD1B, 0xBD1C, 0xBD1D, 0xBD1E,
+ 0xBD1F, 0xBD20, ALTCHR, 0xBD21, 0xBD22, 0xBD23, 0xBD24, 0xBD25,
+ 0xBD26, 0xBD27, 0xBD28, 0xBD29, 0xBD2A, 0xBD2B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBD2C, 0xBD2D, 0xBD2E, 0xBD2F, 0xBD30, 0xBD31, 0xBD32,
+ 0xBD33, 0xBD34, 0xBD35, 0xBD36, 0xBD37, 0xBD38, 0xBD39, 0xBD3A,
+ 0xBD3B, 0xBD3C, ALTCHR, 0xBD3D, 0xBD3E, 0xBD3F, 0xBD40, 0xBD41,
+ 0xBD42, 0xBD43, 0xBD44, 0xBD45, 0xBD46, 0xBD47, ALTCHR, ALTCHR,
+/* 0xA630 - 0xA6FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBD48, 0xBD49, 0xBD4A, 0xBD4B, 0xBD4C, 0xBD4D, 0xBD4E,
+ 0xBD4F, 0xBD50, 0xBD51, 0xBD52, 0xBD53, 0xBD54, 0xBD55, 0xBD56,
+ 0xBD57, 0xBD58, ALTCHR, 0xBD59, 0xBD5A, 0xBD5B, 0xBD5C, 0xBD5D,
+ 0xBD5E, 0xBD5F, 0xBD60, 0xBD61, 0xBD62, 0xBD63, ALTCHR, ALTCHR,
+ ALTCHR, 0xBD64, 0xBD65, 0xBD66, 0xBD67, 0xBD68, 0xBD69, 0xBD6A,
+ 0xBD6B, 0xBD6C, 0xBD6D, 0xBD6E, 0xBD6F, 0xBD70, 0xBD71, 0xBD72,
+ 0xBD73, 0xBD74, ALTCHR, 0xBD75, 0xBD76, 0xBD77, 0xBD78, 0xBD79,
+ 0xBD7A, 0xBD7B, 0xBD7C, 0xBD7D, 0xBD7E, 0xBD7F, ALTCHR, ALTCHR,
+ ALTCHR, 0xBD80, 0xBD81, 0xBD82, 0xBD83, 0xBD84, 0xBD85, 0xBD86,
+ 0xBD87, 0xBD88, 0xBD89, 0xBD8A, 0xBD8B, 0xBD8C, 0xBD8D, 0xBD8E,
+ 0xBD8F, 0xBD90, ALTCHR, 0xBD91, 0xBD92, 0xBD93, 0xBD94, 0xBD95,
+ 0xBD96, 0xBD97, 0xBD98, 0xBD99, 0xBD9A, 0xBD9B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBD9C, 0xBD9D, 0xBD9E, 0xBD9F, 0xBDA0, 0xBDA1, 0xBDA2,
+ 0xBDA3, 0xBDA4, 0xBDA5, 0xBDA6, 0xBDA7, 0xBDA8, 0xBDA9, 0xBDAA,
+ 0xBDAB, 0xBDAC, ALTCHR, 0xBDAD, 0xBDAE, 0xBDAF, 0xBDB0, 0xBDB1,
+ 0xBDB2, 0xBDB3, 0xBDB4, 0xBDB5, 0xBDB6, 0xBDB7, ALTCHR, ALTCHR,
+ ALTCHR, 0xBDB8, 0xBDB9, 0xBDBA, 0xBDBB, 0xBDBC, 0xBDBD, 0xBDBE,
+ 0xBDBF, 0xBDC0, 0xBDC1, 0xBDC2, 0xBDC3, 0xBDC4, 0xBDC5, 0xBDC6,
+ 0xBDC7, 0xBDC8, ALTCHR, 0xBDC9, 0xBDCA, 0xBDCB, 0xBDCC, 0xBDCD,
+ 0xBDCE, 0xBDCF, 0xBDD0, 0xBDD1, 0xBDD2, 0xBDD3, ALTCHR, ALTCHR,
+ ALTCHR, 0xBDD4, 0xBDD5, 0xBDD6, 0xBDD7, 0xBDD8, 0xBDD9, 0xBDDA,
+ 0xBDDB, 0xBDDC, 0xBDDD, 0xBDDE, 0xBDDF, 0xBDE0, 0xBDE1, 0xBDE2,
+ 0xBDE3, 0xBDE4, ALTCHR, 0xBDE5, 0xBDE6, 0xBDE7, 0xBDE8, 0xBDE9,
+ 0xBDEA, 0xBDEB, 0xBDEC, 0xBDED, 0xBDEE, 0xBDEF, ALTCHR, ALTCHR,
+/* 0xA730 - 0xA7FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBDF0, 0xBDF1, 0xBDF2, 0xBDF3, 0xBDF4, 0xBDF5, 0xBDF6,
+ 0xBDF7, 0xBDF8, 0xBDF9, 0xBDFA, 0xBDFB, 0xBDFC, 0xBDFD, 0xBDFE,
+ 0xBDFF, 0xBE00, ALTCHR, 0xBE01, 0xBE02, 0xBE03, 0xBE04, 0xBE05,
+ 0xBE06, 0xBE07, 0xBE08, 0xBE09, 0xBE0A, 0xBE0B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBE0C, 0xBE0D, 0xBE0E, 0xBE0F, 0xBE10, 0xBE11, 0xBE12,
+ 0xBE13, 0xBE14, 0xBE15, 0xBE16, 0xBE17, 0xBE18, 0xBE19, 0xBE1A,
+ 0xBE1B, 0xBE1C, ALTCHR, 0xBE1D, 0xBE1E, 0xBE1F, 0xBE20, 0xBE21,
+ 0xBE22, 0xBE23, 0xBE24, 0xBE25, 0xBE26, 0xBE27, ALTCHR, ALTCHR,
+ ALTCHR, 0xBE28, 0xBE29, 0xBE2A, 0xBE2B, 0xBE2C, 0xBE2D, 0xBE2E,
+ 0xBE2F, 0xBE30, 0xBE31, 0xBE32, 0xBE33, 0xBE34, 0xBE35, 0xBE36,
+ 0xBE37, 0xBE38, ALTCHR, 0xBE39, 0xBE3A, 0xBE3B, 0xBE3C, 0xBE3D,
+ 0xBE3E, 0xBE3F, 0xBE40, 0xBE41, 0xBE42, 0xBE43, ALTCHR, ALTCHR,
+ ALTCHR, 0xBE44, 0xBE45, 0xBE46, 0xBE47, 0xBE48, 0xBE49, 0xBE4A,
+ 0xBE4B, 0xBE4C, 0xBE4D, 0xBE4E, 0xBE4F, 0xBE50, 0xBE51, 0xBE52,
+ 0xBE53, 0xBE54, ALTCHR, 0xBE55, 0xBE56, 0xBE57, 0xBE58, 0xBE59,
+ 0xBE5A, 0xBE5B, 0xBE5C, 0xBE5D, 0xBE5E, 0xBE5F, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xA830 - 0xA8FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3143, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBE60, 0xBE61, 0xBE62, 0xBE63, 0xBE64, 0xBE65, 0xBE66,
+ 0xBE67, 0xBE68, 0xBE69, 0xBE6A, 0xBE6B, 0xBE6C, 0xBE6D, 0xBE6E,
+ 0xBE6F, 0xBE70, ALTCHR, 0xBE71, 0xBE72, 0xBE73, 0xBE74, 0xBE75,
+ 0xBE76, 0xBE77, 0xBE78, 0xBE79, 0xBE7A, 0xBE7B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBE7C, 0xBE7D, 0xBE7E, 0xBE7F, 0xBE80, 0xBE81, 0xBE82,
+ 0xBE83, 0xBE84, 0xBE85, 0xBE86, 0xBE87, 0xBE88, 0xBE89, 0xBE8A,
+ 0xBE8B, 0xBE8C, ALTCHR, 0xBE8D, 0xBE8E, 0xBE8F, 0xBE90, 0xBE91,
+ 0xBE92, 0xBE93, 0xBE94, 0xBE95, 0xBE96, 0xBE97, ALTCHR, ALTCHR,
+ ALTCHR, 0xBE98, 0xBE99, 0xBE9A, 0xBE9B, 0xBE9C, 0xBE9D, 0xBE9E,
+ 0xBE9F, 0xBEA0, 0xBEA1, 0xBEA2, 0xBEA3, 0xBEA4, 0xBEA5, 0xBEA6,
+ 0xBEA7, 0xBEA8, ALTCHR, 0xBEA9, 0xBEAA, 0xBEAB, 0xBEAC, 0xBEAD,
+ 0xBEAE, 0xBEAF, 0xBEB0, 0xBEB1, 0xBEB2, 0xBEB3, ALTCHR, ALTCHR,
+ ALTCHR, 0xBEB4, 0xBEB5, 0xBEB6, 0xBEB7, 0xBEB8, 0xBEB9, 0xBEBA,
+ 0xBEBB, 0xBEBC, 0xBEBD, 0xBEBE, 0xBEBF, 0xBEC0, 0xBEC1, 0xBEC2,
+ 0xBEC3, 0xBEC4, ALTCHR, 0xBEC5, 0xBEC6, 0xBEC7, 0xBEC8, 0xBEC9,
+ 0xBECA, 0xBECB, 0xBECC, 0xBECD, 0xBECE, 0xBECF, ALTCHR, ALTCHR,
+ ALTCHR, 0xBED0, 0xBED1, 0xBED2, 0xBED3, 0xBED4, 0xBED5, 0xBED6,
+ 0xBED7, 0xBED8, 0xBED9, 0xBEDA, 0xBEDB, 0xBEDC, 0xBEDD, 0xBEDE,
+ 0xBEDF, 0xBEE0, ALTCHR, 0xBEE1, 0xBEE2, 0xBEE3, 0xBEE4, 0xBEE5,
+ 0xBEE6, 0xBEE7, 0xBEE8, 0xBEE9, 0xBEEA, 0xBEEB, ALTCHR, ALTCHR,
+/* 0xA930 - 0xA9FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBEEC, 0xBEED, 0xBEEE, 0xBEEF, 0xBEF0, 0xBEF1, 0xBEF2,
+ 0xBEF3, 0xBEF4, 0xBEF5, 0xBEF6, 0xBEF7, 0xBEF8, 0xBEF9, 0xBEFA,
+ 0xBEFB, 0xBEFC, ALTCHR, 0xBEFD, 0xBEFE, 0xBEFF, 0xBF00, 0xBF01,
+ 0xBF02, 0xBF03, 0xBF04, 0xBF05, 0xBF06, 0xBF07, ALTCHR, ALTCHR,
+ ALTCHR, 0xBF08, 0xBF09, 0xBF0A, 0xBF0B, 0xBF0C, 0xBF0D, 0xBF0E,
+ 0xBF0F, 0xBF10, 0xBF11, 0xBF12, 0xBF13, 0xBF14, 0xBF15, 0xBF16,
+ 0xBF17, 0xBF18, ALTCHR, 0xBF19, 0xBF1A, 0xBF1B, 0xBF1C, 0xBF1D,
+ 0xBF1E, 0xBF1F, 0xBF20, 0xBF21, 0xBF22, 0xBF23, ALTCHR, ALTCHR,
+ ALTCHR, 0xBF24, 0xBF25, 0xBF26, 0xBF27, 0xBF28, 0xBF29, 0xBF2A,
+ 0xBF2B, 0xBF2C, 0xBF2D, 0xBF2E, 0xBF2F, 0xBF30, 0xBF31, 0xBF32,
+ 0xBF33, 0xBF34, ALTCHR, 0xBF35, 0xBF36, 0xBF37, 0xBF38, 0xBF39,
+ 0xBF3A, 0xBF3B, 0xBF3C, 0xBF3D, 0xBF3E, 0xBF3F, ALTCHR, ALTCHR,
+ ALTCHR, 0xBF40, 0xBF41, 0xBF42, 0xBF43, 0xBF44, 0xBF45, 0xBF46,
+ 0xBF47, 0xBF48, 0xBF49, 0xBF4A, 0xBF4B, 0xBF4C, 0xBF4D, 0xBF4E,
+ 0xBF4F, 0xBF50, ALTCHR, 0xBF51, 0xBF52, 0xBF53, 0xBF54, 0xBF55,
+ 0xBF56, 0xBF57, 0xBF58, 0xBF59, 0xBF5A, 0xBF5B, ALTCHR, ALTCHR,
+ ALTCHR, 0xBF5C, 0xBF5D, 0xBF5E, 0xBF5F, 0xBF60, 0xBF61, 0xBF62,
+ 0xBF63, 0xBF64, 0xBF65, 0xBF66, 0xBF67, 0xBF68, 0xBF69, 0xBF6A,
+ 0xBF6B, 0xBF6C, ALTCHR, 0xBF6D, 0xBF6E, 0xBF6F, 0xBF70, 0xBF71,
+ 0xBF72, 0xBF73, 0xBF74, 0xBF75, 0xBF76, 0xBF77, ALTCHR, ALTCHR,
+ ALTCHR, 0xBF78, 0xBF79, 0xBF7A, 0xBF7B, 0xBF7C, 0xBF7D, 0xBF7E,
+ 0xBF7F, 0xBF80, 0xBF81, 0xBF82, 0xBF83, 0xBF84, 0xBF85, 0xBF86,
+ 0xBF87, 0xBF88, ALTCHR, 0xBF89, 0xBF8A, 0xBF8B, 0xBF8C, 0xBF8D,
+ 0xBF8E, 0xBF8F, 0xBF90, 0xBF91, 0xBF92, 0xBF93, ALTCHR, ALTCHR,
+/* 0xAA30 - 0xAAFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xBF94, 0xBF95, 0xBF96, 0xBF97, 0xBF98, 0xBF99, 0xBF9A,
+ 0xBF9B, 0xBF9C, 0xBF9D, 0xBF9E, 0xBF9F, 0xBFA0, 0xBFA1, 0xBFA2,
+ 0xBFA3, 0xBFA4, ALTCHR, 0xBFA5, 0xBFA6, 0xBFA7, 0xBFA8, 0xBFA9,
+ 0xBFAA, 0xBFAB, 0xBFAC, 0xBFAD, 0xBFAE, 0xBFAF, ALTCHR, ALTCHR,
+ ALTCHR, 0xBFB0, 0xBFB1, 0xBFB2, 0xBFB3, 0xBFB4, 0xBFB5, 0xBFB6,
+ 0xBFB7, 0xBFB8, 0xBFB9, 0xBFBA, 0xBFBB, 0xBFBC, 0xBFBD, 0xBFBE,
+ 0xBFBF, 0xBFC0, ALTCHR, 0xBFC1, 0xBFC2, 0xBFC3, 0xBFC4, 0xBFC5,
+ 0xBFC6, 0xBFC7, 0xBFC8, 0xBFC9, 0xBFCA, 0xBFCB, ALTCHR, ALTCHR,
+ ALTCHR, 0xBFCC, 0xBFCD, 0xBFCE, 0xBFCF, 0xBFD0, 0xBFD1, 0xBFD2,
+ 0xBFD3, 0xBFD4, 0xBFD5, 0xBFD6, 0xBFD7, 0xBFD8, 0xBFD9, 0xBFDA,
+ 0xBFDB, 0xBFDC, ALTCHR, 0xBFDD, 0xBFDE, 0xBFDF, 0xBFE0, 0xBFE1,
+ 0xBFE2, 0xBFE3, 0xBFE4, 0xBFE5, 0xBFE6, 0xBFE7, ALTCHR, ALTCHR,
+ ALTCHR, 0xBFE8, 0xBFE9, 0xBFEA, 0xBFEB, 0xBFEC, 0xBFED, 0xBFEE,
+ 0xBFEF, 0xBFF0, 0xBFF1, 0xBFF2, 0xBFF3, 0xBFF4, 0xBFF5, 0xBFF6,
+ 0xBFF7, 0xBFF8, ALTCHR, 0xBFF9, 0xBFFA, 0xBFFB, 0xBFFC, 0xBFFD,
+ 0xBFFE, 0xBFFF, 0xC000, 0xC001, 0xC002, 0xC003, ALTCHR, ALTCHR,
+ ALTCHR, 0xC004, 0xC005, 0xC006, 0xC007, 0xC008, 0xC009, 0xC00A,
+ 0xC00B, 0xC00C, 0xC00D, 0xC00E, 0xC00F, 0xC010, 0xC011, 0xC012,
+ 0xC013, 0xC014, ALTCHR, 0xC015, 0xC016, 0xC017, 0xC018, 0xC019,
+ 0xC01A, 0xC01B, 0xC01C, 0xC01D, 0xC01E, 0xC01F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC020, 0xC021, 0xC022, 0xC023, 0xC024, 0xC025, 0xC026,
+ 0xC027, 0xC028, 0xC029, 0xC02A, 0xC02B, 0xC02C, 0xC02D, 0xC02E,
+ 0xC02F, 0xC030, ALTCHR, 0xC031, 0xC032, 0xC033, 0xC034, 0xC035,
+ 0xC036, 0xC037, 0xC038, 0xC039, 0xC03A, 0xC03B, ALTCHR, ALTCHR,
+/* 0xAB30 - 0xABFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC03C, 0xC03D, 0xC03E, 0xC03F, 0xC040, 0xC041, 0xC042,
+ 0xC043, 0xC044, 0xC045, 0xC046, 0xC047, 0xC048, 0xC049, 0xC04A,
+ 0xC04B, 0xC04C, ALTCHR, 0xC04D, 0xC04E, 0xC04F, 0xC050, 0xC051,
+ 0xC052, 0xC053, 0xC054, 0xC055, 0xC056, 0xC057, ALTCHR, ALTCHR,
+ ALTCHR, 0xC058, 0xC059, 0xC05A, 0xC05B, 0xC05C, 0xC05D, 0xC05E,
+ 0xC05F, 0xC060, 0xC061, 0xC062, 0xC063, 0xC064, 0xC065, 0xC066,
+ 0xC067, 0xC068, ALTCHR, 0xC069, 0xC06A, 0xC06B, 0xC06C, 0xC06D,
+ 0xC06E, 0xC06F, 0xC070, 0xC071, 0xC072, 0xC073, ALTCHR, ALTCHR,
+ ALTCHR, 0xC074, 0xC075, 0xC076, 0xC077, 0xC078, 0xC079, 0xC07A,
+ 0xC07B, 0xC07C, 0xC07D, 0xC07E, 0xC07F, 0xC080, 0xC081, 0xC082,
+ 0xC083, 0xC084, ALTCHR, 0xC085, 0xC086, 0xC087, 0xC088, 0xC089,
+ 0xC08A, 0xC08B, 0xC08C, 0xC08D, 0xC08E, 0xC08F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC090, 0xC091, 0xC092, 0xC093, 0xC094, 0xC095, 0xC096,
+ 0xC097, 0xC098, 0xC099, 0xC09A, 0xC09B, 0xC09C, 0xC09D, 0xC09E,
+ 0xC09F, 0xC0A0, ALTCHR, 0xC0A1, 0xC0A2, 0xC0A3, 0xC0A4, 0xC0A5,
+ 0xC0A6, 0xC0A7, 0xC0A8, 0xC0A9, 0xC0AA, 0xC0AB, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xAC30 - 0xACFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3145, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC0AC, 0xC0AD, 0xC0AE, 0xC0AF, 0xC0B0, 0xC0B1, 0xC0B2,
+ 0xC0B3, 0xC0B4, 0xC0B5, 0xC0B6, 0xC0B7, 0xC0B8, 0xC0B9, 0xC0BA,
+ 0xC0BB, 0xC0BC, ALTCHR, 0xC0BD, 0xC0BE, 0xC0BF, 0xC0C0, 0xC0C1,
+ 0xC0C2, 0xC0C3, 0xC0C4, 0xC0C5, 0xC0C6, 0xC0C7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC0C8, 0xC0C9, 0xC0CA, 0xC0CB, 0xC0CC, 0xC0CD, 0xC0CE,
+ 0xC0CF, 0xC0D0, 0xC0D1, 0xC0D2, 0xC0D3, 0xC0D4, 0xC0D5, 0xC0D6,
+ 0xC0D7, 0xC0D8, ALTCHR, 0xC0D9, 0xC0DA, 0xC0DB, 0xC0DC, 0xC0DD,
+ 0xC0DE, 0xC0DF, 0xC0E0, 0xC0E1, 0xC0E2, 0xC0E3, ALTCHR, ALTCHR,
+ ALTCHR, 0xC0E4, 0xC0E5, 0xC0E6, 0xC0E7, 0xC0E8, 0xC0E9, 0xC0EA,
+ 0xC0EB, 0xC0EC, 0xC0ED, 0xC0EE, 0xC0EF, 0xC0F0, 0xC0F1, 0xC0F2,
+ 0xC0F3, 0xC0F4, ALTCHR, 0xC0F5, 0xC0F6, 0xC0F7, 0xC0F8, 0xC0F9,
+ 0xC0FA, 0xC0FB, 0xC0FC, 0xC0FD, 0xC0FE, 0xC0FF, ALTCHR, ALTCHR,
+ ALTCHR, 0xC100, 0xC101, 0xC102, 0xC103, 0xC104, 0xC105, 0xC106,
+ 0xC107, 0xC108, 0xC109, 0xC10A, 0xC10B, 0xC10C, 0xC10D, 0xC10E,
+ 0xC10F, 0xC110, ALTCHR, 0xC111, 0xC112, 0xC113, 0xC114, 0xC115,
+ 0xC116, 0xC117, 0xC118, 0xC119, 0xC11A, 0xC11B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC11C, 0xC11D, 0xC11E, 0xC11F, 0xC120, 0xC121, 0xC122,
+ 0xC123, 0xC124, 0xC125, 0xC126, 0xC127, 0xC128, 0xC129, 0xC12A,
+ 0xC12B, 0xC12C, ALTCHR, 0xC12D, 0xC12E, 0xC12F, 0xC130, 0xC131,
+ 0xC132, 0xC133, 0xC134, 0xC135, 0xC136, 0xC137, ALTCHR, ALTCHR,
+/* 0xAD30 - 0xADFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC138, 0xC139, 0xC13A, 0xC13B, 0xC13C, 0xC13D, 0xC13E,
+ 0xC13F, 0xC140, 0xC141, 0xC142, 0xC143, 0xC144, 0xC145, 0xC146,
+ 0xC147, 0xC148, ALTCHR, 0xC149, 0xC14A, 0xC14B, 0xC14C, 0xC14D,
+ 0xC14E, 0xC14F, 0xC150, 0xC151, 0xC152, 0xC153, ALTCHR, ALTCHR,
+ ALTCHR, 0xC154, 0xC155, 0xC156, 0xC157, 0xC158, 0xC159, 0xC15A,
+ 0xC15B, 0xC15C, 0xC15D, 0xC15E, 0xC15F, 0xC160, 0xC161, 0xC162,
+ 0xC163, 0xC164, ALTCHR, 0xC165, 0xC166, 0xC167, 0xC168, 0xC169,
+ 0xC16A, 0xC16B, 0xC16C, 0xC16D, 0xC16E, 0xC16F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC170, 0xC171, 0xC172, 0xC173, 0xC174, 0xC175, 0xC176,
+ 0xC177, 0xC178, 0xC179, 0xC17A, 0xC17B, 0xC17C, 0xC17D, 0xC17E,
+ 0xC17F, 0xC180, ALTCHR, 0xC181, 0xC182, 0xC183, 0xC184, 0xC185,
+ 0xC186, 0xC187, 0xC188, 0xC189, 0xC18A, 0xC18B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC18C, 0xC18D, 0xC18E, 0xC18F, 0xC190, 0xC191, 0xC192,
+ 0xC193, 0xC194, 0xC195, 0xC196, 0xC197, 0xC198, 0xC199, 0xC19A,
+ 0xC19B, 0xC19C, ALTCHR, 0xC19D, 0xC19E, 0xC19F, 0xC1A0, 0xC1A1,
+ 0xC1A2, 0xC1A3, 0xC1A4, 0xC1A5, 0xC1A6, 0xC1A7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC1A8, 0xC1A9, 0xC1AA, 0xC1AB, 0xC1AC, 0xC1AD, 0xC1AE,
+ 0xC1AF, 0xC1B0, 0xC1B1, 0xC1B2, 0xC1B3, 0xC1B4, 0xC1B5, 0xC1B6,
+ 0xC1B7, 0xC1B8, ALTCHR, 0xC1B9, 0xC1BA, 0xC1BB, 0xC1BC, 0xC1BD,
+ 0xC1BE, 0xC1BF, 0xC1C0, 0xC1C1, 0xC1C2, 0xC1C3, ALTCHR, ALTCHR,
+ ALTCHR, 0xC1C4, 0xC1C5, 0xC1C6, 0xC1C7, 0xC1C8, 0xC1C9, 0xC1CA,
+ 0xC1CB, 0xC1CC, 0xC1CD, 0xC1CE, 0xC1CF, 0xC1D0, 0xC1D1, 0xC1D2,
+ 0xC1D3, 0xC1D4, ALTCHR, 0xC1D5, 0xC1D6, 0xC1D7, 0xC1D8, 0xC1D9,
+ 0xC1DA, 0xC1DB, 0xC1DC, 0xC1DD, 0xC1DE, 0xC1DF, ALTCHR, ALTCHR,
+/* 0xAE30 - 0xAEFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC1E0, 0xC1E1, 0xC1E2, 0xC1E3, 0xC1E4, 0xC1E5, 0xC1E6,
+ 0xC1E7, 0xC1E8, 0xC1E9, 0xC1EA, 0xC1EB, 0xC1EC, 0xC1ED, 0xC1EE,
+ 0xC1EF, 0xC1F0, ALTCHR, 0xC1F1, 0xC1F2, 0xC1F3, 0xC1F4, 0xC1F5,
+ 0xC1F6, 0xC1F7, 0xC1F8, 0xC1F9, 0xC1FA, 0xC1FB, ALTCHR, ALTCHR,
+ ALTCHR, 0xC1FC, 0xC1FD, 0xC1FE, 0xC1FF, 0xC200, 0xC201, 0xC202,
+ 0xC203, 0xC204, 0xC205, 0xC206, 0xC207, 0xC208, 0xC209, 0xC20A,
+ 0xC20B, 0xC20C, ALTCHR, 0xC20D, 0xC20E, 0xC20F, 0xC210, 0xC211,
+ 0xC212, 0xC213, 0xC214, 0xC215, 0xC216, 0xC217, ALTCHR, ALTCHR,
+ ALTCHR, 0xC218, 0xC219, 0xC21A, 0xC21B, 0xC21C, 0xC21D, 0xC21E,
+ 0xC21F, 0xC220, 0xC221, 0xC222, 0xC223, 0xC224, 0xC225, 0xC226,
+ 0xC227, 0xC228, ALTCHR, 0xC229, 0xC22A, 0xC22B, 0xC22C, 0xC22D,
+ 0xC22E, 0xC22F, 0xC230, 0xC231, 0xC232, 0xC233, ALTCHR, ALTCHR,
+ ALTCHR, 0xC234, 0xC235, 0xC236, 0xC237, 0xC238, 0xC239, 0xC23A,
+ 0xC23B, 0xC23C, 0xC23D, 0xC23E, 0xC23F, 0xC240, 0xC241, 0xC242,
+ 0xC243, 0xC244, ALTCHR, 0xC245, 0xC246, 0xC247, 0xC248, 0xC249,
+ 0xC24A, 0xC24B, 0xC24C, 0xC24D, 0xC24E, 0xC24F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC250, 0xC251, 0xC252, 0xC253, 0xC254, 0xC255, 0xC256,
+ 0xC257, 0xC258, 0xC259, 0xC25A, 0xC25B, 0xC25C, 0xC25D, 0xC25E,
+ 0xC25F, 0xC260, ALTCHR, 0xC261, 0xC262, 0xC263, 0xC264, 0xC265,
+ 0xC266, 0xC267, 0xC268, 0xC269, 0xC26A, 0xC26B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC26C, 0xC26D, 0xC26E, 0xC26F, 0xC270, 0xC271, 0xC272,
+ 0xC273, 0xC274, 0xC275, 0xC276, 0xC277, 0xC278, 0xC279, 0xC27A,
+ 0xC27B, 0xC27C, ALTCHR, 0xC27D, 0xC27E, 0xC27F, 0xC280, 0xC281,
+ 0xC282, 0xC283, 0xC284, 0xC285, 0xC286, 0xC287, ALTCHR, ALTCHR,
+/* 0xAF30 - 0xAFFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC288, 0xC289, 0xC28A, 0xC28B, 0xC28C, 0xC28D, 0xC28E,
+ 0xC28F, 0xC290, 0xC291, 0xC292, 0xC293, 0xC294, 0xC295, 0xC296,
+ 0xC297, 0xC298, ALTCHR, 0xC299, 0xC29A, 0xC29B, 0xC29C, 0xC29D,
+ 0xC29E, 0xC29F, 0xC2A0, 0xC2A1, 0xC2A2, 0xC2A3, ALTCHR, ALTCHR,
+ ALTCHR, 0xC2A4, 0xC2A5, 0xC2A6, 0xC2A7, 0xC2A8, 0xC2A9, 0xC2AA,
+ 0xC2AB, 0xC2AC, 0xC2AD, 0xC2AE, 0xC2AF, 0xC2B0, 0xC2B1, 0xC2B2,
+ 0xC2B3, 0xC2B4, ALTCHR, 0xC2B5, 0xC2B6, 0xC2B7, 0xC2B8, 0xC2B9,
+ 0xC2BA, 0xC2BB, 0xC2BC, 0xC2BD, 0xC2BE, 0xC2BF, ALTCHR, ALTCHR,
+ ALTCHR, 0xC2C0, 0xC2C1, 0xC2C2, 0xC2C3, 0xC2C4, 0xC2C5, 0xC2C6,
+ 0xC2C7, 0xC2C8, 0xC2C9, 0xC2CA, 0xC2CB, 0xC2CC, 0xC2CD, 0xC2CE,
+ 0xC2CF, 0xC2D0, ALTCHR, 0xC2D1, 0xC2D2, 0xC2D3, 0xC2D4, 0xC2D5,
+ 0xC2D6, 0xC2D7, 0xC2D8, 0xC2D9, 0xC2DA, 0xC2DB, ALTCHR, ALTCHR,
+ ALTCHR, 0xC2DC, 0xC2DD, 0xC2DE, 0xC2DF, 0xC2E0, 0xC2E1, 0xC2E2,
+ 0xC2E3, 0xC2E4, 0xC2E5, 0xC2E6, 0xC2E7, 0xC2E8, 0xC2E9, 0xC2EA,
+ 0xC2EB, 0xC2EC, ALTCHR, 0xC2ED, 0xC2EE, 0xC2EF, 0xC2F0, 0xC2F1,
+ 0xC2F2, 0xC2F3, 0xC2F4, 0xC2F5, 0xC2F6, 0xC2F7, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xB030 - 0xB0FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3146, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC2F8, 0xC2F9, 0xC2FA, 0xC2FB, 0xC2FC, 0xC2FD, 0xC2FE,
+ 0xC2FF, 0xC300, 0xC301, 0xC302, 0xC303, 0xC304, 0xC305, 0xC306,
+ 0xC307, 0xC308, ALTCHR, 0xC309, 0xC30A, 0xC30B, 0xC30C, 0xC30D,
+ 0xC30E, 0xC30F, 0xC310, 0xC311, 0xC312, 0xC313, ALTCHR, ALTCHR,
+ ALTCHR, 0xC314, 0xC315, 0xC316, 0xC317, 0xC318, 0xC319, 0xC31A,
+ 0xC31B, 0xC31C, 0xC31D, 0xC31E, 0xC31F, 0xC320, 0xC321, 0xC322,
+ 0xC323, 0xC324, ALTCHR, 0xC325, 0xC326, 0xC327, 0xC328, 0xC329,
+ 0xC32A, 0xC32B, 0xC32C, 0xC32D, 0xC32E, 0xC32F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC330, 0xC331, 0xC332, 0xC333, 0xC334, 0xC335, 0xC336,
+ 0xC337, 0xC338, 0xC339, 0xC33A, 0xC33B, 0xC33C, 0xC33D, 0xC33E,
+ 0xC33F, 0xC340, ALTCHR, 0xC341, 0xC342, 0xC343, 0xC344, 0xC345,
+ 0xC346, 0xC347, 0xC348, 0xC349, 0xC34A, 0xC34B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC34C, 0xC34D, 0xC34E, 0xC34F, 0xC350, 0xC351, 0xC352,
+ 0xC353, 0xC354, 0xC355, 0xC356, 0xC357, 0xC358, 0xC359, 0xC35A,
+ 0xC35B, 0xC35C, ALTCHR, 0xC35D, 0xC35E, 0xC35F, 0xC360, 0xC361,
+ 0xC362, 0xC363, 0xC364, 0xC365, 0xC366, 0xC367, ALTCHR, ALTCHR,
+ ALTCHR, 0xC368, 0xC369, 0xC36A, 0xC36B, 0xC36C, 0xC36D, 0xC36E,
+ 0xC36F, 0xC370, 0xC371, 0xC372, 0xC373, 0xC374, 0xC375, 0xC376,
+ 0xC377, 0xC378, ALTCHR, 0xC379, 0xC37A, 0xC37B, 0xC37C, 0xC37D,
+ 0xC37E, 0xC37F, 0xC380, 0xC381, 0xC382, 0xC383, ALTCHR, ALTCHR,
+/* 0xB130 - 0xB1FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC384, 0xC385, 0xC386, 0xC387, 0xC388, 0xC389, 0xC38A,
+ 0xC38B, 0xC38C, 0xC38D, 0xC38E, 0xC38F, 0xC390, 0xC391, 0xC392,
+ 0xC393, 0xC394, ALTCHR, 0xC395, 0xC396, 0xC397, 0xC398, 0xC399,
+ 0xC39A, 0xC39B, 0xC39C, 0xC39D, 0xC39E, 0xC39F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC3A0, 0xC3A1, 0xC3A2, 0xC3A3, 0xC3A4, 0xC3A5, 0xC3A6,
+ 0xC3A7, 0xC3A8, 0xC3A9, 0xC3AA, 0xC3AB, 0xC3AC, 0xC3AD, 0xC3AE,
+ 0xC3AF, 0xC3B0, ALTCHR, 0xC3B1, 0xC3B2, 0xC3B3, 0xC3B4, 0xC3B5,
+ 0xC3B6, 0xC3B7, 0xC3B8, 0xC3B9, 0xC3BA, 0xC3BB, ALTCHR, ALTCHR,
+ ALTCHR, 0xC3BC, 0xC3BD, 0xC3BE, 0xC3BF, 0xC3C0, 0xC3C1, 0xC3C2,
+ 0xC3C3, 0xC3C4, 0xC3C5, 0xC3C6, 0xC3C7, 0xC3C8, 0xC3C9, 0xC3CA,
+ 0xC3CB, 0xC3CC, ALTCHR, 0xC3CD, 0xC3CE, 0xC3CF, 0xC3D0, 0xC3D1,
+ 0xC3D2, 0xC3D3, 0xC3D4, 0xC3D5, 0xC3D6, 0xC3D7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC3D8, 0xC3D9, 0xC3DA, 0xC3DB, 0xC3DC, 0xC3DD, 0xC3DE,
+ 0xC3DF, 0xC3E0, 0xC3E1, 0xC3E2, 0xC3E3, 0xC3E4, 0xC3E5, 0xC3E6,
+ 0xC3E7, 0xC3E8, ALTCHR, 0xC3E9, 0xC3EA, 0xC3EB, 0xC3EC, 0xC3ED,
+ 0xC3EE, 0xC3EF, 0xC3F0, 0xC3F1, 0xC3F2, 0xC3F3, ALTCHR, ALTCHR,
+ ALTCHR, 0xC3F4, 0xC3F5, 0xC3F6, 0xC3F7, 0xC3F8, 0xC3F9, 0xC3FA,
+ 0xC3FB, 0xC3FC, 0xC3FD, 0xC3FE, 0xC3FF, 0xC400, 0xC401, 0xC402,
+ 0xC403, 0xC404, ALTCHR, 0xC405, 0xC406, 0xC407, 0xC408, 0xC409,
+ 0xC40A, 0xC40B, 0xC40C, 0xC40D, 0xC40E, 0xC40F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC410, 0xC411, 0xC412, 0xC413, 0xC414, 0xC415, 0xC416,
+ 0xC417, 0xC418, 0xC419, 0xC41A, 0xC41B, 0xC41C, 0xC41D, 0xC41E,
+ 0xC41F, 0xC420, ALTCHR, 0xC421, 0xC422, 0xC423, 0xC424, 0xC425,
+ 0xC426, 0xC427, 0xC428, 0xC429, 0xC42A, 0xC42B, ALTCHR, ALTCHR,
+/* 0xB230 - 0xB2FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC42C, 0xC42D, 0xC42E, 0xC42F, 0xC430, 0xC431, 0xC432,
+ 0xC433, 0xC434, 0xC435, 0xC436, 0xC437, 0xC438, 0xC439, 0xC43A,
+ 0xC43B, 0xC43C, ALTCHR, 0xC43D, 0xC43E, 0xC43F, 0xC440, 0xC441,
+ 0xC442, 0xC443, 0xC444, 0xC445, 0xC446, 0xC447, ALTCHR, ALTCHR,
+ ALTCHR, 0xC448, 0xC449, 0xC44A, 0xC44B, 0xC44C, 0xC44D, 0xC44E,
+ 0xC44F, 0xC450, 0xC451, 0xC452, 0xC453, 0xC454, 0xC455, 0xC456,
+ 0xC457, 0xC458, ALTCHR, 0xC459, 0xC45A, 0xC45B, 0xC45C, 0xC45D,
+ 0xC45E, 0xC45F, 0xC460, 0xC461, 0xC462, 0xC463, ALTCHR, ALTCHR,
+ ALTCHR, 0xC464, 0xC465, 0xC466, 0xC467, 0xC468, 0xC469, 0xC46A,
+ 0xC46B, 0xC46C, 0xC46D, 0xC46E, 0xC46F, 0xC470, 0xC471, 0xC472,
+ 0xC473, 0xC474, ALTCHR, 0xC475, 0xC476, 0xC477, 0xC478, 0xC479,
+ 0xC47A, 0xC47B, 0xC47C, 0xC47D, 0xC47E, 0xC47F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC480, 0xC481, 0xC482, 0xC483, 0xC484, 0xC485, 0xC486,
+ 0xC487, 0xC488, 0xC489, 0xC48A, 0xC48B, 0xC48C, 0xC48D, 0xC48E,
+ 0xC48F, 0xC490, ALTCHR, 0xC491, 0xC492, 0xC493, 0xC494, 0xC495,
+ 0xC496, 0xC497, 0xC498, 0xC499, 0xC49A, 0xC49B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC49C, 0xC49D, 0xC49E, 0xC49F, 0xC4A0, 0xC4A1, 0xC4A2,
+ 0xC4A3, 0xC4A4, 0xC4A5, 0xC4A6, 0xC4A7, 0xC4A8, 0xC4A9, 0xC4AA,
+ 0xC4AB, 0xC4AC, ALTCHR, 0xC4AD, 0xC4AE, 0xC4AF, 0xC4B0, 0xC4B1,
+ 0xC4B2, 0xC4B3, 0xC4B4, 0xC4B5, 0xC4B6, 0xC4B7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC4B8, 0xC4B9, 0xC4BA, 0xC4BB, 0xC4BC, 0xC4BD, 0xC4BE,
+ 0xC4BF, 0xC4C0, 0xC4C1, 0xC4C2, 0xC4C3, 0xC4C4, 0xC4C5, 0xC4C6,
+ 0xC4C7, 0xC4C8, ALTCHR, 0xC4C9, 0xC4CA, 0xC4CB, 0xC4CC, 0xC4CD,
+ 0xC4CE, 0xC4CF, 0xC4D0, 0xC4D1, 0xC4D2, 0xC4D3, ALTCHR, ALTCHR,
+/* 0xB330 - 0xB3FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC4D4, 0xC4D5, 0xC4D6, 0xC4D7, 0xC4D8, 0xC4D9, 0xC4DA,
+ 0xC4DB, 0xC4DC, 0xC4DD, 0xC4DE, 0xC4DF, 0xC4E0, 0xC4E1, 0xC4E2,
+ 0xC4E3, 0xC4E4, ALTCHR, 0xC4E5, 0xC4E6, 0xC4E7, 0xC4E8, 0xC4E9,
+ 0xC4EA, 0xC4EB, 0xC4EC, 0xC4ED, 0xC4EE, 0xC4EF, ALTCHR, ALTCHR,
+ ALTCHR, 0xC4F0, 0xC4F1, 0xC4F2, 0xC4F3, 0xC4F4, 0xC4F5, 0xC4F6,
+ 0xC4F7, 0xC4F8, 0xC4F9, 0xC4FA, 0xC4FB, 0xC4FC, 0xC4FD, 0xC4FE,
+ 0xC4FF, 0xC500, ALTCHR, 0xC501, 0xC502, 0xC503, 0xC504, 0xC505,
+ 0xC506, 0xC507, 0xC508, 0xC509, 0xC50A, 0xC50B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC50C, 0xC50D, 0xC50E, 0xC50F, 0xC510, 0xC511, 0xC512,
+ 0xC513, 0xC514, 0xC515, 0xC516, 0xC517, 0xC518, 0xC519, 0xC51A,
+ 0xC51B, 0xC51C, ALTCHR, 0xC51D, 0xC51E, 0xC51F, 0xC520, 0xC521,
+ 0xC522, 0xC523, 0xC524, 0xC525, 0xC526, 0xC527, ALTCHR, ALTCHR,
+ ALTCHR, 0xC528, 0xC529, 0xC52A, 0xC52B, 0xC52C, 0xC52D, 0xC52E,
+ 0xC52F, 0xC530, 0xC531, 0xC532, 0xC533, 0xC534, 0xC535, 0xC536,
+ 0xC537, 0xC538, ALTCHR, 0xC539, 0xC53A, 0xC53B, 0xC53C, 0xC53D,
+ 0xC53E, 0xC53F, 0xC540, 0xC541, 0xC542, 0xC543, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xB430 - 0xB4FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3147, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC544, 0xC545, 0xC546, 0xC547, 0xC548, 0xC549, 0xC54A,
+ 0xC54B, 0xC54C, 0xC54D, 0xC54E, 0xC54F, 0xC550, 0xC551, 0xC552,
+ 0xC553, 0xC554, ALTCHR, 0xC555, 0xC556, 0xC557, 0xC558, 0xC559,
+ 0xC55A, 0xC55B, 0xC55C, 0xC55D, 0xC55E, 0xC55F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC560, 0xC561, 0xC562, 0xC563, 0xC564, 0xC565, 0xC566,
+ 0xC567, 0xC568, 0xC569, 0xC56A, 0xC56B, 0xC56C, 0xC56D, 0xC56E,
+ 0xC56F, 0xC570, ALTCHR, 0xC571, 0xC572, 0xC573, 0xC574, 0xC575,
+ 0xC576, 0xC577, 0xC578, 0xC579, 0xC57A, 0xC57B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC57C, 0xC57D, 0xC57E, 0xC57F, 0xC580, 0xC581, 0xC582,
+ 0xC583, 0xC584, 0xC585, 0xC586, 0xC587, 0xC588, 0xC589, 0xC58A,
+ 0xC58B, 0xC58C, ALTCHR, 0xC58D, 0xC58E, 0xC58F, 0xC590, 0xC591,
+ 0xC592, 0xC593, 0xC594, 0xC595, 0xC596, 0xC597, ALTCHR, ALTCHR,
+ ALTCHR, 0xC598, 0xC599, 0xC59A, 0xC59B, 0xC59C, 0xC59D, 0xC59E,
+ 0xC59F, 0xC5A0, 0xC5A1, 0xC5A2, 0xC5A3, 0xC5A4, 0xC5A5, 0xC5A6,
+ 0xC5A7, 0xC5A8, ALTCHR, 0xC5A9, 0xC5AA, 0xC5AB, 0xC5AC, 0xC5AD,
+ 0xC5AE, 0xC5AF, 0xC5B0, 0xC5B1, 0xC5B2, 0xC5B3, ALTCHR, ALTCHR,
+ ALTCHR, 0xC5B4, 0xC5B5, 0xC5B6, 0xC5B7, 0xC5B8, 0xC5B9, 0xC5BA,
+ 0xC5BB, 0xC5BC, 0xC5BD, 0xC5BE, 0xC5BF, 0xC5C0, 0xC5C1, 0xC5C2,
+ 0xC5C3, 0xC5C4, ALTCHR, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9,
+ 0xC5CA, 0xC5CB, 0xC5CC, 0xC5CD, 0xC5CE, 0xC5CF, ALTCHR, ALTCHR,
+/* 0xB530 - 0xB5FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC5D0, 0xC5D1, 0xC5D2, 0xC5D3, 0xC5D4, 0xC5D5, 0xC5D6,
+ 0xC5D7, 0xC5D8, 0xC5D9, 0xC5DA, 0xC5DB, 0xC5DC, 0xC5DD, 0xC5DE,
+ 0xC5DF, 0xC5E0, ALTCHR, 0xC5E1, 0xC5E2, 0xC5E3, 0xC5E4, 0xC5E5,
+ 0xC5E6, 0xC5E7, 0xC5E8, 0xC5E9, 0xC5EA, 0xC5EB, ALTCHR, ALTCHR,
+ ALTCHR, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5EF, 0xC5F0, 0xC5F1, 0xC5F2,
+ 0xC5F3, 0xC5F4, 0xC5F5, 0xC5F6, 0xC5F7, 0xC5F8, 0xC5F9, 0xC5FA,
+ 0xC5FB, 0xC5FC, ALTCHR, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601,
+ 0xC602, 0xC603, 0xC604, 0xC605, 0xC606, 0xC607, ALTCHR, ALTCHR,
+ ALTCHR, 0xC608, 0xC609, 0xC60A, 0xC60B, 0xC60C, 0xC60D, 0xC60E,
+ 0xC60F, 0xC610, 0xC611, 0xC612, 0xC613, 0xC614, 0xC615, 0xC616,
+ 0xC617, 0xC618, ALTCHR, 0xC619, 0xC61A, 0xC61B, 0xC61C, 0xC61D,
+ 0xC61E, 0xC61F, 0xC620, 0xC621, 0xC622, 0xC623, ALTCHR, ALTCHR,
+ ALTCHR, 0xC624, 0xC625, 0xC626, 0xC627, 0xC628, 0xC629, 0xC62A,
+ 0xC62B, 0xC62C, 0xC62D, 0xC62E, 0xC62F, 0xC630, 0xC631, 0xC632,
+ 0xC633, 0xC634, ALTCHR, 0xC635, 0xC636, 0xC637, 0xC638, 0xC639,
+ 0xC63A, 0xC63B, 0xC63C, 0xC63D, 0xC63E, 0xC63F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC640, 0xC641, 0xC642, 0xC643, 0xC644, 0xC645, 0xC646,
+ 0xC647, 0xC648, 0xC649, 0xC64A, 0xC64B, 0xC64C, 0xC64D, 0xC64E,
+ 0xC64F, 0xC650, ALTCHR, 0xC651, 0xC652, 0xC653, 0xC654, 0xC655,
+ 0xC656, 0xC657, 0xC658, 0xC659, 0xC65A, 0xC65B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC65C, 0xC65D, 0xC65E, 0xC65F, 0xC660, 0xC661, 0xC662,
+ 0xC663, 0xC664, 0xC665, 0xC666, 0xC667, 0xC668, 0xC669, 0xC66A,
+ 0xC66B, 0xC66C, ALTCHR, 0xC66D, 0xC66E, 0xC66F, 0xC670, 0xC671,
+ 0xC672, 0xC673, 0xC674, 0xC675, 0xC676, 0xC677, ALTCHR, ALTCHR,
+/* 0xB630 - 0xB6FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC678, 0xC679, 0xC67A, 0xC67B, 0xC67C, 0xC67D, 0xC67E,
+ 0xC67F, 0xC680, 0xC681, 0xC682, 0xC683, 0xC684, 0xC685, 0xC686,
+ 0xC687, 0xC688, ALTCHR, 0xC689, 0xC68A, 0xC68B, 0xC68C, 0xC68D,
+ 0xC68E, 0xC68F, 0xC690, 0xC691, 0xC692, 0xC693, ALTCHR, ALTCHR,
+ ALTCHR, 0xC694, 0xC695, 0xC696, 0xC697, 0xC698, 0xC699, 0xC69A,
+ 0xC69B, 0xC69C, 0xC69D, 0xC69E, 0xC69F, 0xC6A0, 0xC6A1, 0xC6A2,
+ 0xC6A3, 0xC6A4, ALTCHR, 0xC6A5, 0xC6A6, 0xC6A7, 0xC6A8, 0xC6A9,
+ 0xC6AA, 0xC6AB, 0xC6AC, 0xC6AD, 0xC6AE, 0xC6AF, ALTCHR, ALTCHR,
+ ALTCHR, 0xC6B0, 0xC6B1, 0xC6B2, 0xC6B3, 0xC6B4, 0xC6B5, 0xC6B6,
+ 0xC6B7, 0xC6B8, 0xC6B9, 0xC6BA, 0xC6BB, 0xC6BC, 0xC6BD, 0xC6BE,
+ 0xC6BF, 0xC6C0, ALTCHR, 0xC6C1, 0xC6C2, 0xC6C3, 0xC6C4, 0xC6C5,
+ 0xC6C6, 0xC6C7, 0xC6C8, 0xC6C9, 0xC6CA, 0xC6CB, ALTCHR, ALTCHR,
+ ALTCHR, 0xC6CC, 0xC6CD, 0xC6CE, 0xC6CF, 0xC6D0, 0xC6D1, 0xC6D2,
+ 0xC6D3, 0xC6D4, 0xC6D5, 0xC6D6, 0xC6D7, 0xC6D8, 0xC6D9, 0xC6DA,
+ 0xC6DB, 0xC6DC, ALTCHR, 0xC6DD, 0xC6DE, 0xC6DF, 0xC6E0, 0xC6E1,
+ 0xC6E2, 0xC6E3, 0xC6E4, 0xC6E5, 0xC6E6, 0xC6E7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC6E8, 0xC6E9, 0xC6EA, 0xC6EB, 0xC6EC, 0xC6ED, 0xC6EE,
+ 0xC6EF, 0xC6F0, 0xC6F1, 0xC6F2, 0xC6F3, 0xC6F4, 0xC6F5, 0xC6F6,
+ 0xC6F7, 0xC6F8, ALTCHR, 0xC6F9, 0xC6FA, 0xC6FB, 0xC6FC, 0xC6FD,
+ 0xC6FE, 0xC6FF, 0xC700, 0xC701, 0xC702, 0xC703, ALTCHR, ALTCHR,
+ ALTCHR, 0xC704, 0xC705, 0xC706, 0xC707, 0xC708, 0xC709, 0xC70A,
+ 0xC70B, 0xC70C, 0xC70D, 0xC70E, 0xC70F, 0xC710, 0xC711, 0xC712,
+ 0xC713, 0xC714, ALTCHR, 0xC715, 0xC716, 0xC717, 0xC718, 0xC719,
+ 0xC71A, 0xC71B, 0xC71C, 0xC71D, 0xC71E, 0xC71F, ALTCHR, ALTCHR,
+/* 0xB730 - 0xB7FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC720, 0xC721, 0xC722, 0xC723, 0xC724, 0xC725, 0xC726,
+ 0xC727, 0xC728, 0xC729, 0xC72A, 0xC72B, 0xC72C, 0xC72D, 0xC72E,
+ 0xC72F, 0xC730, ALTCHR, 0xC731, 0xC732, 0xC733, 0xC734, 0xC735,
+ 0xC736, 0xC737, 0xC738, 0xC739, 0xC73A, 0xC73B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC73C, 0xC73D, 0xC73E, 0xC73F, 0xC740, 0xC741, 0xC742,
+ 0xC743, 0xC744, 0xC745, 0xC746, 0xC747, 0xC748, 0xC749, 0xC74A,
+ 0xC74B, 0xC74C, ALTCHR, 0xC74D, 0xC74E, 0xC74F, 0xC750, 0xC751,
+ 0xC752, 0xC753, 0xC754, 0xC755, 0xC756, 0xC757, ALTCHR, ALTCHR,
+ ALTCHR, 0xC758, 0xC759, 0xC75A, 0xC75B, 0xC75C, 0xC75D, 0xC75E,
+ 0xC75F, 0xC760, 0xC761, 0xC762, 0xC763, 0xC764, 0xC765, 0xC766,
+ 0xC767, 0xC768, ALTCHR, 0xC769, 0xC76A, 0xC76B, 0xC76C, 0xC76D,
+ 0xC76E, 0xC76F, 0xC770, 0xC771, 0xC772, 0xC773, ALTCHR, ALTCHR,
+ ALTCHR, 0xC774, 0xC775, 0xC776, 0xC777, 0xC778, 0xC779, 0xC77A,
+ 0xC77B, 0xC77C, 0xC77D, 0xC77E, 0xC77F, 0xC780, 0xC781, 0xC782,
+ 0xC783, 0xC784, ALTCHR, 0xC785, 0xC786, 0xC787, 0xC788, 0xC789,
+ 0xC78A, 0xC78B, 0xC78C, 0xC78D, 0xC78E, 0xC78F, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xB830 - 0xB8FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3148, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC790, 0xC791, 0xC792, 0xC793, 0xC794, 0xC795, 0xC796,
+ 0xC797, 0xC798, 0xC799, 0xC79A, 0xC79B, 0xC79C, 0xC79D, 0xC79E,
+ 0xC79F, 0xC7A0, ALTCHR, 0xC7A1, 0xC7A2, 0xC7A3, 0xC7A4, 0xC7A5,
+ 0xC7A6, 0xC7A7, 0xC7A8, 0xC7A9, 0xC7AA, 0xC7AB, ALTCHR, ALTCHR,
+ ALTCHR, 0xC7AC, 0xC7AD, 0xC7AE, 0xC7AF, 0xC7B0, 0xC7B1, 0xC7B2,
+ 0xC7B3, 0xC7B4, 0xC7B5, 0xC7B6, 0xC7B7, 0xC7B8, 0xC7B9, 0xC7BA,
+ 0xC7BB, 0xC7BC, ALTCHR, 0xC7BD, 0xC7BE, 0xC7BF, 0xC7C0, 0xC7C1,
+ 0xC7C2, 0xC7C3, 0xC7C4, 0xC7C5, 0xC7C6, 0xC7C7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC7C8, 0xC7C9, 0xC7CA, 0xC7CB, 0xC7CC, 0xC7CD, 0xC7CE,
+ 0xC7CF, 0xC7D0, 0xC7D1, 0xC7D2, 0xC7D3, 0xC7D4, 0xC7D5, 0xC7D6,
+ 0xC7D7, 0xC7D8, ALTCHR, 0xC7D9, 0xC7DA, 0xC7DB, 0xC7DC, 0xC7DD,
+ 0xC7DE, 0xC7DF, 0xC7E0, 0xC7E1, 0xC7E2, 0xC7E3, ALTCHR, ALTCHR,
+ ALTCHR, 0xC7E4, 0xC7E5, 0xC7E6, 0xC7E7, 0xC7E8, 0xC7E9, 0xC7EA,
+ 0xC7EB, 0xC7EC, 0xC7ED, 0xC7EE, 0xC7EF, 0xC7F0, 0xC7F1, 0xC7F2,
+ 0xC7F3, 0xC7F4, ALTCHR, 0xC7F5, 0xC7F6, 0xC7F7, 0xC7F8, 0xC7F9,
+ 0xC7FA, 0xC7FB, 0xC7FC, 0xC7FD, 0xC7FE, 0xC7FF, ALTCHR, ALTCHR,
+ ALTCHR, 0xC800, 0xC801, 0xC802, 0xC803, 0xC804, 0xC805, 0xC806,
+ 0xC807, 0xC808, 0xC809, 0xC80A, 0xC80B, 0xC80C, 0xC80D, 0xC80E,
+ 0xC80F, 0xC810, ALTCHR, 0xC811, 0xC812, 0xC813, 0xC814, 0xC815,
+ 0xC816, 0xC817, 0xC818, 0xC819, 0xC81A, 0xC81B, ALTCHR, ALTCHR,
+/* 0xB930 - 0xB9FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC81C, 0xC81D, 0xC81E, 0xC81F, 0xC820, 0xC821, 0xC822,
+ 0xC823, 0xC824, 0xC825, 0xC826, 0xC827, 0xC828, 0xC829, 0xC82A,
+ 0xC82B, 0xC82C, ALTCHR, 0xC82D, 0xC82E, 0xC82F, 0xC830, 0xC831,
+ 0xC832, 0xC833, 0xC834, 0xC835, 0xC836, 0xC837, ALTCHR, ALTCHR,
+ ALTCHR, 0xC838, 0xC839, 0xC83A, 0xC83B, 0xC83C, 0xC83D, 0xC83E,
+ 0xC83F, 0xC840, 0xC841, 0xC842, 0xC843, 0xC844, 0xC845, 0xC846,
+ 0xC847, 0xC848, ALTCHR, 0xC849, 0xC84A, 0xC84B, 0xC84C, 0xC84D,
+ 0xC84E, 0xC84F, 0xC850, 0xC851, 0xC852, 0xC853, ALTCHR, ALTCHR,
+ ALTCHR, 0xC854, 0xC855, 0xC856, 0xC857, 0xC858, 0xC859, 0xC85A,
+ 0xC85B, 0xC85C, 0xC85D, 0xC85E, 0xC85F, 0xC860, 0xC861, 0xC862,
+ 0xC863, 0xC864, ALTCHR, 0xC865, 0xC866, 0xC867, 0xC868, 0xC869,
+ 0xC86A, 0xC86B, 0xC86C, 0xC86D, 0xC86E, 0xC86F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC870, 0xC871, 0xC872, 0xC873, 0xC874, 0xC875, 0xC876,
+ 0xC877, 0xC878, 0xC879, 0xC87A, 0xC87B, 0xC87C, 0xC87D, 0xC87E,
+ 0xC87F, 0xC880, ALTCHR, 0xC881, 0xC882, 0xC883, 0xC884, 0xC885,
+ 0xC886, 0xC887, 0xC888, 0xC889, 0xC88A, 0xC88B, ALTCHR, ALTCHR,
+ ALTCHR, 0xC88C, 0xC88D, 0xC88E, 0xC88F, 0xC890, 0xC891, 0xC892,
+ 0xC893, 0xC894, 0xC895, 0xC896, 0xC897, 0xC898, 0xC899, 0xC89A,
+ 0xC89B, 0xC89C, ALTCHR, 0xC89D, 0xC89E, 0xC89F, 0xC8A0, 0xC8A1,
+ 0xC8A2, 0xC8A3, 0xC8A4, 0xC8A5, 0xC8A6, 0xC8A7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC8A8, 0xC8A9, 0xC8AA, 0xC8AB, 0xC8AC, 0xC8AD, 0xC8AE,
+ 0xC8AF, 0xC8B0, 0xC8B1, 0xC8B2, 0xC8B3, 0xC8B4, 0xC8B5, 0xC8B6,
+ 0xC8B7, 0xC8B8, ALTCHR, 0xC8B9, 0xC8BA, 0xC8BB, 0xC8BC, 0xC8BD,
+ 0xC8BE, 0xC8BF, 0xC8C0, 0xC8C1, 0xC8C2, 0xC8C3, ALTCHR, ALTCHR,
+/* 0xBA30 - 0xBAFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC8C4, 0xC8C5, 0xC8C6, 0xC8C7, 0xC8C8, 0xC8C9, 0xC8CA,
+ 0xC8CB, 0xC8CC, 0xC8CD, 0xC8CE, 0xC8CF, 0xC8D0, 0xC8D1, 0xC8D2,
+ 0xC8D3, 0xC8D4, ALTCHR, 0xC8D5, 0xC8D6, 0xC8D7, 0xC8D8, 0xC8D9,
+ 0xC8DA, 0xC8DB, 0xC8DC, 0xC8DD, 0xC8DE, 0xC8DF, ALTCHR, ALTCHR,
+ ALTCHR, 0xC8E0, 0xC8E1, 0xC8E2, 0xC8E3, 0xC8E4, 0xC8E5, 0xC8E6,
+ 0xC8E7, 0xC8E8, 0xC8E9, 0xC8EA, 0xC8EB, 0xC8EC, 0xC8ED, 0xC8EE,
+ 0xC8EF, 0xC8F0, ALTCHR, 0xC8F1, 0xC8F2, 0xC8F3, 0xC8F4, 0xC8F5,
+ 0xC8F6, 0xC8F7, 0xC8F8, 0xC8F9, 0xC8FA, 0xC8FB, ALTCHR, ALTCHR,
+ ALTCHR, 0xC8FC, 0xC8FD, 0xC8FE, 0xC8FF, 0xC900, 0xC901, 0xC902,
+ 0xC903, 0xC904, 0xC905, 0xC906, 0xC907, 0xC908, 0xC909, 0xC90A,
+ 0xC90B, 0xC90C, ALTCHR, 0xC90D, 0xC90E, 0xC90F, 0xC910, 0xC911,
+ 0xC912, 0xC913, 0xC914, 0xC915, 0xC916, 0xC917, ALTCHR, ALTCHR,
+ ALTCHR, 0xC918, 0xC919, 0xC91A, 0xC91B, 0xC91C, 0xC91D, 0xC91E,
+ 0xC91F, 0xC920, 0xC921, 0xC922, 0xC923, 0xC924, 0xC925, 0xC926,
+ 0xC927, 0xC928, ALTCHR, 0xC929, 0xC92A, 0xC92B, 0xC92C, 0xC92D,
+ 0xC92E, 0xC92F, 0xC930, 0xC931, 0xC932, 0xC933, ALTCHR, ALTCHR,
+ ALTCHR, 0xC934, 0xC935, 0xC936, 0xC937, 0xC938, 0xC939, 0xC93A,
+ 0xC93B, 0xC93C, 0xC93D, 0xC93E, 0xC93F, 0xC940, 0xC941, 0xC942,
+ 0xC943, 0xC944, ALTCHR, 0xC945, 0xC946, 0xC947, 0xC948, 0xC949,
+ 0xC94A, 0xC94B, 0xC94C, 0xC94D, 0xC94E, 0xC94F, ALTCHR, ALTCHR,
+ ALTCHR, 0xC950, 0xC951, 0xC952, 0xC953, 0xC954, 0xC955, 0xC956,
+ 0xC957, 0xC958, 0xC959, 0xC95A, 0xC95B, 0xC95C, 0xC95D, 0xC95E,
+ 0xC95F, 0xC960, ALTCHR, 0xC961, 0xC962, 0xC963, 0xC964, 0xC965,
+ 0xC966, 0xC967, 0xC968, 0xC969, 0xC96A, 0xC96B, ALTCHR, ALTCHR,
+/* 0xBB30 - 0xBBFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC96C, 0xC96D, 0xC96E, 0xC96F, 0xC970, 0xC971, 0xC972,
+ 0xC973, 0xC974, 0xC975, 0xC976, 0xC977, 0xC978, 0xC979, 0xC97A,
+ 0xC97B, 0xC97C, ALTCHR, 0xC97D, 0xC97E, 0xC97F, 0xC980, 0xC981,
+ 0xC982, 0xC983, 0xC984, 0xC985, 0xC986, 0xC987, ALTCHR, ALTCHR,
+ ALTCHR, 0xC988, 0xC989, 0xC98A, 0xC98B, 0xC98C, 0xC98D, 0xC98E,
+ 0xC98F, 0xC990, 0xC991, 0xC992, 0xC993, 0xC994, 0xC995, 0xC996,
+ 0xC997, 0xC998, ALTCHR, 0xC999, 0xC99A, 0xC99B, 0xC99C, 0xC99D,
+ 0xC99E, 0xC99F, 0xC9A0, 0xC9A1, 0xC9A2, 0xC9A3, ALTCHR, ALTCHR,
+ ALTCHR, 0xC9A4, 0xC9A5, 0xC9A6, 0xC9A7, 0xC9A8, 0xC9A9, 0xC9AA,
+ 0xC9AB, 0xC9AC, 0xC9AD, 0xC9AE, 0xC9AF, 0xC9B0, 0xC9B1, 0xC9B2,
+ 0xC9B3, 0xC9B4, ALTCHR, 0xC9B5, 0xC9B6, 0xC9B7, 0xC9B8, 0xC9B9,
+ 0xC9BA, 0xC9BB, 0xC9BC, 0xC9BD, 0xC9BE, 0xC9BF, ALTCHR, ALTCHR,
+ ALTCHR, 0xC9C0, 0xC9C1, 0xC9C2, 0xC9C3, 0xC9C4, 0xC9C5, 0xC9C6,
+ 0xC9C7, 0xC9C8, 0xC9C9, 0xC9CA, 0xC9CB, 0xC9CC, 0xC9CD, 0xC9CE,
+ 0xC9CF, 0xC9D0, ALTCHR, 0xC9D1, 0xC9D2, 0xC9D3, 0xC9D4, 0xC9D5,
+ 0xC9D6, 0xC9D7, 0xC9D8, 0xC9D9, 0xC9DA, 0xC9DB, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xBC30 - 0xBCFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x3149, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xC9DC, 0xC9DD, 0xC9DE, 0xC9DF, 0xC9E0, 0xC9E1, 0xC9E2,
+ 0xC9E3, 0xC9E4, 0xC9E5, 0xC9E6, 0xC9E7, 0xC9E8, 0xC9E9, 0xC9EA,
+ 0xC9EB, 0xC9EC, ALTCHR, 0xC9ED, 0xC9EE, 0xC9EF, 0xC9F0, 0xC9F1,
+ 0xC9F2, 0xC9F3, 0xC9F4, 0xC9F5, 0xC9F6, 0xC9F7, ALTCHR, ALTCHR,
+ ALTCHR, 0xC9F8, 0xC9F9, 0xC9FA, 0xC9FB, 0xC9FC, 0xC9FD, 0xC9FE,
+ 0xC9FF, 0xCA00, 0xCA01, 0xCA02, 0xCA03, 0xCA04, 0xCA05, 0xCA06,
+ 0xCA07, 0xCA08, ALTCHR, 0xCA09, 0xCA0A, 0xCA0B, 0xCA0C, 0xCA0D,
+ 0xCA0E, 0xCA0F, 0xCA10, 0xCA11, 0xCA12, 0xCA13, ALTCHR, ALTCHR,
+ ALTCHR, 0xCA14, 0xCA15, 0xCA16, 0xCA17, 0xCA18, 0xCA19, 0xCA1A,
+ 0xCA1B, 0xCA1C, 0xCA1D, 0xCA1E, 0xCA1F, 0xCA20, 0xCA21, 0xCA22,
+ 0xCA23, 0xCA24, ALTCHR, 0xCA25, 0xCA26, 0xCA27, 0xCA28, 0xCA29,
+ 0xCA2A, 0xCA2B, 0xCA2C, 0xCA2D, 0xCA2E, 0xCA2F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCA30, 0xCA31, 0xCA32, 0xCA33, 0xCA34, 0xCA35, 0xCA36,
+ 0xCA37, 0xCA38, 0xCA39, 0xCA3A, 0xCA3B, 0xCA3C, 0xCA3D, 0xCA3E,
+ 0xCA3F, 0xCA40, ALTCHR, 0xCA41, 0xCA42, 0xCA43, 0xCA44, 0xCA45,
+ 0xCA46, 0xCA47, 0xCA48, 0xCA49, 0xCA4A, 0xCA4B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCA4C, 0xCA4D, 0xCA4E, 0xCA4F, 0xCA50, 0xCA51, 0xCA52,
+ 0xCA53, 0xCA54, 0xCA55, 0xCA56, 0xCA57, 0xCA58, 0xCA59, 0xCA5A,
+ 0xCA5B, 0xCA5C, ALTCHR, 0xCA5D, 0xCA5E, 0xCA5F, 0xCA60, 0xCA61,
+ 0xCA62, 0xCA63, 0xCA64, 0xCA65, 0xCA66, 0xCA67, ALTCHR, ALTCHR,
+/* 0xBD30 - 0xBDFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCA68, 0xCA69, 0xCA6A, 0xCA6B, 0xCA6C, 0xCA6D, 0xCA6E,
+ 0xCA6F, 0xCA70, 0xCA71, 0xCA72, 0xCA73, 0xCA74, 0xCA75, 0xCA76,
+ 0xCA77, 0xCA78, ALTCHR, 0xCA79, 0xCA7A, 0xCA7B, 0xCA7C, 0xCA7D,
+ 0xCA7E, 0xCA7F, 0xCA80, 0xCA81, 0xCA82, 0xCA83, ALTCHR, ALTCHR,
+ ALTCHR, 0xCA84, 0xCA85, 0xCA86, 0xCA87, 0xCA88, 0xCA89, 0xCA8A,
+ 0xCA8B, 0xCA8C, 0xCA8D, 0xCA8E, 0xCA8F, 0xCA90, 0xCA91, 0xCA92,
+ 0xCA93, 0xCA94, ALTCHR, 0xCA95, 0xCA96, 0xCA97, 0xCA98, 0xCA99,
+ 0xCA9A, 0xCA9B, 0xCA9C, 0xCA9D, 0xCA9E, 0xCA9F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCAA0, 0xCAA1, 0xCAA2, 0xCAA3, 0xCAA4, 0xCAA5, 0xCAA6,
+ 0xCAA7, 0xCAA8, 0xCAA9, 0xCAAA, 0xCAAB, 0xCAAC, 0xCAAD, 0xCAAE,
+ 0xCAAF, 0xCAB0, ALTCHR, 0xCAB1, 0xCAB2, 0xCAB3, 0xCAB4, 0xCAB5,
+ 0xCAB6, 0xCAB7, 0xCAB8, 0xCAB9, 0xCABA, 0xCABB, ALTCHR, ALTCHR,
+ ALTCHR, 0xCABC, 0xCABD, 0xCABE, 0xCABF, 0xCAC0, 0xCAC1, 0xCAC2,
+ 0xCAC3, 0xCAC4, 0xCAC5, 0xCAC6, 0xCAC7, 0xCAC8, 0xCAC9, 0xCACA,
+ 0xCACB, 0xCACC, ALTCHR, 0xCACD, 0xCACE, 0xCACF, 0xCAD0, 0xCAD1,
+ 0xCAD2, 0xCAD3, 0xCAD4, 0xCAD5, 0xCAD6, 0xCAD7, ALTCHR, ALTCHR,
+ ALTCHR, 0xCAD8, 0xCAD9, 0xCADA, 0xCADB, 0xCADC, 0xCADD, 0xCADE,
+ 0xCADF, 0xCAE0, 0xCAE1, 0xCAE2, 0xCAE3, 0xCAE4, 0xCAE5, 0xCAE6,
+ 0xCAE7, 0xCAE8, ALTCHR, 0xCAE9, 0xCAEA, 0xCAEB, 0xCAEC, 0xCAED,
+ 0xCAEE, 0xCAEF, 0xCAF0, 0xCAF1, 0xCAF2, 0xCAF3, ALTCHR, ALTCHR,
+ ALTCHR, 0xCAF4, 0xCAF5, 0xCAF6, 0xCAF7, 0xCAF8, 0xCAF9, 0xCAFA,
+ 0xCAFB, 0xCAFC, 0xCAFD, 0xCAFE, 0xCAFF, 0xCB00, 0xCB01, 0xCB02,
+ 0xCB03, 0xCB04, ALTCHR, 0xCB05, 0xCB06, 0xCB07, 0xCB08, 0xCB09,
+ 0xCB0A, 0xCB0B, 0xCB0C, 0xCB0D, 0xCB0E, 0xCB0F, ALTCHR, ALTCHR,
+/* 0xBE30 - 0xBEFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCB10, 0xCB11, 0xCB12, 0xCB13, 0xCB14, 0xCB15, 0xCB16,
+ 0xCB17, 0xCB18, 0xCB19, 0xCB1A, 0xCB1B, 0xCB1C, 0xCB1D, 0xCB1E,
+ 0xCB1F, 0xCB20, ALTCHR, 0xCB21, 0xCB22, 0xCB23, 0xCB24, 0xCB25,
+ 0xCB26, 0xCB27, 0xCB28, 0xCB29, 0xCB2A, 0xCB2B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCB2C, 0xCB2D, 0xCB2E, 0xCB2F, 0xCB30, 0xCB31, 0xCB32,
+ 0xCB33, 0xCB34, 0xCB35, 0xCB36, 0xCB37, 0xCB38, 0xCB39, 0xCB3A,
+ 0xCB3B, 0xCB3C, ALTCHR, 0xCB3D, 0xCB3E, 0xCB3F, 0xCB40, 0xCB41,
+ 0xCB42, 0xCB43, 0xCB44, 0xCB45, 0xCB46, 0xCB47, ALTCHR, ALTCHR,
+ ALTCHR, 0xCB48, 0xCB49, 0xCB4A, 0xCB4B, 0xCB4C, 0xCB4D, 0xCB4E,
+ 0xCB4F, 0xCB50, 0xCB51, 0xCB52, 0xCB53, 0xCB54, 0xCB55, 0xCB56,
+ 0xCB57, 0xCB58, ALTCHR, 0xCB59, 0xCB5A, 0xCB5B, 0xCB5C, 0xCB5D,
+ 0xCB5E, 0xCB5F, 0xCB60, 0xCB61, 0xCB62, 0xCB63, ALTCHR, ALTCHR,
+ ALTCHR, 0xCB64, 0xCB65, 0xCB66, 0xCB67, 0xCB68, 0xCB69, 0xCB6A,
+ 0xCB6B, 0xCB6C, 0xCB6D, 0xCB6E, 0xCB6F, 0xCB70, 0xCB71, 0xCB72,
+ 0xCB73, 0xCB74, ALTCHR, 0xCB75, 0xCB76, 0xCB77, 0xCB78, 0xCB79,
+ 0xCB7A, 0xCB7B, 0xCB7C, 0xCB7D, 0xCB7E, 0xCB7F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCB80, 0xCB81, 0xCB82, 0xCB83, 0xCB84, 0xCB85, 0xCB86,
+ 0xCB87, 0xCB88, 0xCB89, 0xCB8A, 0xCB8B, 0xCB8C, 0xCB8D, 0xCB8E,
+ 0xCB8F, 0xCB90, ALTCHR, 0xCB91, 0xCB92, 0xCB93, 0xCB94, 0xCB95,
+ 0xCB96, 0xCB97, 0xCB98, 0xCB99, 0xCB9A, 0xCB9B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCB9C, 0xCB9D, 0xCB9E, 0xCB9F, 0xCBA0, 0xCBA1, 0xCBA2,
+ 0xCBA3, 0xCBA4, 0xCBA5, 0xCBA6, 0xCBA7, 0xCBA8, 0xCBA9, 0xCBAA,
+ 0xCBAB, 0xCBAC, ALTCHR, 0xCBAD, 0xCBAE, 0xCBAF, 0xCBB0, 0xCBB1,
+ 0xCBB2, 0xCBB3, 0xCBB4, 0xCBB5, 0xCBB6, 0xCBB7, ALTCHR, ALTCHR,
+/* 0xBF30 - 0xBFFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCBB8, 0xCBB9, 0xCBBA, 0xCBBB, 0xCBBC, 0xCBBD, 0xCBBE,
+ 0xCBBF, 0xCBC0, 0xCBC1, 0xCBC2, 0xCBC3, 0xCBC4, 0xCBC5, 0xCBC6,
+ 0xCBC7, 0xCBC8, ALTCHR, 0xCBC9, 0xCBCA, 0xCBCB, 0xCBCC, 0xCBCD,
+ 0xCBCE, 0xCBCF, 0xCBD0, 0xCBD1, 0xCBD2, 0xCBD3, ALTCHR, ALTCHR,
+ ALTCHR, 0xCBD4, 0xCBD5, 0xCBD6, 0xCBD7, 0xCBD8, 0xCBD9, 0xCBDA,
+ 0xCBDB, 0xCBDC, 0xCBDD, 0xCBDE, 0xCBDF, 0xCBE0, 0xCBE1, 0xCBE2,
+ 0xCBE3, 0xCBE4, ALTCHR, 0xCBE5, 0xCBE6, 0xCBE7, 0xCBE8, 0xCBE9,
+ 0xCBEA, 0xCBEB, 0xCBEC, 0xCBED, 0xCBEE, 0xCBEF, ALTCHR, ALTCHR,
+ ALTCHR, 0xCBF0, 0xCBF1, 0xCBF2, 0xCBF3, 0xCBF4, 0xCBF5, 0xCBF6,
+ 0xCBF7, 0xCBF8, 0xCBF9, 0xCBFA, 0xCBFB, 0xCBFC, 0xCBFD, 0xCBFE,
+ 0xCBFF, 0xCC00, ALTCHR, 0xCC01, 0xCC02, 0xCC03, 0xCC04, 0xCC05,
+ 0xCC06, 0xCC07, 0xCC08, 0xCC09, 0xCC0A, 0xCC0B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCC0C, 0xCC0D, 0xCC0E, 0xCC0F, 0xCC10, 0xCC11, 0xCC12,
+ 0xCC13, 0xCC14, 0xCC15, 0xCC16, 0xCC17, 0xCC18, 0xCC19, 0xCC1A,
+ 0xCC1B, 0xCC1C, ALTCHR, 0xCC1D, 0xCC1E, 0xCC1F, 0xCC20, 0xCC21,
+ 0xCC22, 0xCC23, 0xCC24, 0xCC25, 0xCC26, 0xCC27, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xC030 - 0xC0FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x314A, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCC28, 0xCC29, 0xCC2A, 0xCC2B, 0xCC2C, 0xCC2D, 0xCC2E,
+ 0xCC2F, 0xCC30, 0xCC31, 0xCC32, 0xCC33, 0xCC34, 0xCC35, 0xCC36,
+ 0xCC37, 0xCC38, ALTCHR, 0xCC39, 0xCC3A, 0xCC3B, 0xCC3C, 0xCC3D,
+ 0xCC3E, 0xCC3F, 0xCC40, 0xCC41, 0xCC42, 0xCC43, ALTCHR, ALTCHR,
+ ALTCHR, 0xCC44, 0xCC45, 0xCC46, 0xCC47, 0xCC48, 0xCC49, 0xCC4A,
+ 0xCC4B, 0xCC4C, 0xCC4D, 0xCC4E, 0xCC4F, 0xCC50, 0xCC51, 0xCC52,
+ 0xCC53, 0xCC54, ALTCHR, 0xCC55, 0xCC56, 0xCC57, 0xCC58, 0xCC59,
+ 0xCC5A, 0xCC5B, 0xCC5C, 0xCC5D, 0xCC5E, 0xCC5F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCC60, 0xCC61, 0xCC62, 0xCC63, 0xCC64, 0xCC65, 0xCC66,
+ 0xCC67, 0xCC68, 0xCC69, 0xCC6A, 0xCC6B, 0xCC6C, 0xCC6D, 0xCC6E,
+ 0xCC6F, 0xCC70, ALTCHR, 0xCC71, 0xCC72, 0xCC73, 0xCC74, 0xCC75,
+ 0xCC76, 0xCC77, 0xCC78, 0xCC79, 0xCC7A, 0xCC7B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCC7C, 0xCC7D, 0xCC7E, 0xCC7F, 0xCC80, 0xCC81, 0xCC82,
+ 0xCC83, 0xCC84, 0xCC85, 0xCC86, 0xCC87, 0xCC88, 0xCC89, 0xCC8A,
+ 0xCC8B, 0xCC8C, ALTCHR, 0xCC8D, 0xCC8E, 0xCC8F, 0xCC90, 0xCC91,
+ 0xCC92, 0xCC93, 0xCC94, 0xCC95, 0xCC96, 0xCC97, ALTCHR, ALTCHR,
+ ALTCHR, 0xCC98, 0xCC99, 0xCC9A, 0xCC9B, 0xCC9C, 0xCC9D, 0xCC9E,
+ 0xCC9F, 0xCCA0, 0xCCA1, 0xCCA2, 0xCCA3, 0xCCA4, 0xCCA5, 0xCCA6,
+ 0xCCA7, 0xCCA8, ALTCHR, 0xCCA9, 0xCCAA, 0xCCAB, 0xCCAC, 0xCCAD,
+ 0xCCAE, 0xCCAF, 0xCCB0, 0xCCB1, 0xCCB2, 0xCCB3, ALTCHR, ALTCHR,
+/* 0xC130 - 0xC1FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCCB4, 0xCCB5, 0xCCB6, 0xCCB7, 0xCCB8, 0xCCB9, 0xCCBA,
+ 0xCCBB, 0xCCBC, 0xCCBD, 0xCCBE, 0xCCBF, 0xCCC0, 0xCCC1, 0xCCC2,
+ 0xCCC3, 0xCCC4, ALTCHR, 0xCCC5, 0xCCC6, 0xCCC7, 0xCCC8, 0xCCC9,
+ 0xCCCA, 0xCCCB, 0xCCCC, 0xCCCD, 0xCCCE, 0xCCCF, ALTCHR, ALTCHR,
+ ALTCHR, 0xCCD0, 0xCCD1, 0xCCD2, 0xCCD3, 0xCCD4, 0xCCD5, 0xCCD6,
+ 0xCCD7, 0xCCD8, 0xCCD9, 0xCCDA, 0xCCDB, 0xCCDC, 0xCCDD, 0xCCDE,
+ 0xCCDF, 0xCCE0, ALTCHR, 0xCCE1, 0xCCE2, 0xCCE3, 0xCCE4, 0xCCE5,
+ 0xCCE6, 0xCCE7, 0xCCE8, 0xCCE9, 0xCCEA, 0xCCEB, ALTCHR, ALTCHR,
+ ALTCHR, 0xCCEC, 0xCCED, 0xCCEE, 0xCCEF, 0xCCF0, 0xCCF1, 0xCCF2,
+ 0xCCF3, 0xCCF4, 0xCCF5, 0xCCF6, 0xCCF7, 0xCCF8, 0xCCF9, 0xCCFA,
+ 0xCCFB, 0xCCFC, ALTCHR, 0xCCFD, 0xCCFE, 0xCCFF, 0xCD00, 0xCD01,
+ 0xCD02, 0xCD03, 0xCD04, 0xCD05, 0xCD06, 0xCD07, ALTCHR, ALTCHR,
+ ALTCHR, 0xCD08, 0xCD09, 0xCD0A, 0xCD0B, 0xCD0C, 0xCD0D, 0xCD0E,
+ 0xCD0F, 0xCD10, 0xCD11, 0xCD12, 0xCD13, 0xCD14, 0xCD15, 0xCD16,
+ 0xCD17, 0xCD18, ALTCHR, 0xCD19, 0xCD1A, 0xCD1B, 0xCD1C, 0xCD1D,
+ 0xCD1E, 0xCD1F, 0xCD20, 0xCD21, 0xCD22, 0xCD23, ALTCHR, ALTCHR,
+ ALTCHR, 0xCD24, 0xCD25, 0xCD26, 0xCD27, 0xCD28, 0xCD29, 0xCD2A,
+ 0xCD2B, 0xCD2C, 0xCD2D, 0xCD2E, 0xCD2F, 0xCD30, 0xCD31, 0xCD32,
+ 0xCD33, 0xCD34, ALTCHR, 0xCD35, 0xCD36, 0xCD37, 0xCD38, 0xCD39,
+ 0xCD3A, 0xCD3B, 0xCD3C, 0xCD3D, 0xCD3E, 0xCD3F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCD40, 0xCD41, 0xCD42, 0xCD43, 0xCD44, 0xCD45, 0xCD46,
+ 0xCD47, 0xCD48, 0xCD49, 0xCD4A, 0xCD4B, 0xCD4C, 0xCD4D, 0xCD4E,
+ 0xCD4F, 0xCD50, ALTCHR, 0xCD51, 0xCD52, 0xCD53, 0xCD54, 0xCD55,
+ 0xCD56, 0xCD57, 0xCD58, 0xCD59, 0xCD5A, 0xCD5B, ALTCHR, ALTCHR,
+/* 0xC230 - 0xC2FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCD5C, 0xCD5D, 0xCD5E, 0xCD5F, 0xCD60, 0xCD61, 0xCD62,
+ 0xCD63, 0xCD64, 0xCD65, 0xCD66, 0xCD67, 0xCD68, 0xCD69, 0xCD6A,
+ 0xCD6B, 0xCD6C, ALTCHR, 0xCD6D, 0xCD6E, 0xCD6F, 0xCD70, 0xCD71,
+ 0xCD72, 0xCD73, 0xCD74, 0xCD75, 0xCD76, 0xCD77, ALTCHR, ALTCHR,
+ ALTCHR, 0xCD78, 0xCD79, 0xCD7A, 0xCD7B, 0xCD7C, 0xCD7D, 0xCD7E,
+ 0xCD7F, 0xCD80, 0xCD81, 0xCD82, 0xCD83, 0xCD84, 0xCD85, 0xCD86,
+ 0xCD87, 0xCD88, ALTCHR, 0xCD89, 0xCD8A, 0xCD8B, 0xCD8C, 0xCD8D,
+ 0xCD8E, 0xCD8F, 0xCD90, 0xCD91, 0xCD92, 0xCD93, ALTCHR, ALTCHR,
+ ALTCHR, 0xCD94, 0xCD95, 0xCD96, 0xCD97, 0xCD98, 0xCD99, 0xCD9A,
+ 0xCD9B, 0xCD9C, 0xCD9D, 0xCD9E, 0xCD9F, 0xCDA0, 0xCDA1, 0xCDA2,
+ 0xCDA3, 0xCDA4, ALTCHR, 0xCDA5, 0xCDA6, 0xCDA7, 0xCDA8, 0xCDA9,
+ 0xCDAA, 0xCDAB, 0xCDAC, 0xCDAD, 0xCDAE, 0xCDAF, ALTCHR, ALTCHR,
+ ALTCHR, 0xCDB0, 0xCDB1, 0xCDB2, 0xCDB3, 0xCDB4, 0xCDB5, 0xCDB6,
+ 0xCDB7, 0xCDB8, 0xCDB9, 0xCDBA, 0xCDBB, 0xCDBC, 0xCDBD, 0xCDBE,
+ 0xCDBF, 0xCDC0, ALTCHR, 0xCDC1, 0xCDC2, 0xCDC3, 0xCDC4, 0xCDC5,
+ 0xCDC6, 0xCDC7, 0xCDC8, 0xCDC9, 0xCDCA, 0xCDCB, ALTCHR, ALTCHR,
+ ALTCHR, 0xCDCC, 0xCDCD, 0xCDCE, 0xCDCF, 0xCDD0, 0xCDD1, 0xCDD2,
+ 0xCDD3, 0xCDD4, 0xCDD5, 0xCDD6, 0xCDD7, 0xCDD8, 0xCDD9, 0xCDDA,
+ 0xCDDB, 0xCDDC, ALTCHR, 0xCDDD, 0xCDDE, 0xCDDF, 0xCDE0, 0xCDE1,
+ 0xCDE2, 0xCDE3, 0xCDE4, 0xCDE5, 0xCDE6, 0xCDE7, ALTCHR, ALTCHR,
+ ALTCHR, 0xCDE8, 0xCDE9, 0xCDEA, 0xCDEB, 0xCDEC, 0xCDED, 0xCDEE,
+ 0xCDEF, 0xCDF0, 0xCDF1, 0xCDF2, 0xCDF3, 0xCDF4, 0xCDF5, 0xCDF6,
+ 0xCDF7, 0xCDF8, ALTCHR, 0xCDF9, 0xCDFA, 0xCDFB, 0xCDFC, 0xCDFD,
+ 0xCDFE, 0xCDFF, 0xCE00, 0xCE01, 0xCE02, 0xCE03, ALTCHR, ALTCHR,
+/* 0xC330 - 0xC3FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCE04, 0xCE05, 0xCE06, 0xCE07, 0xCE08, 0xCE09, 0xCE0A,
+ 0xCE0B, 0xCE0C, 0xCE0D, 0xCE0E, 0xCE0F, 0xCE10, 0xCE11, 0xCE12,
+ 0xCE13, 0xCE14, ALTCHR, 0xCE15, 0xCE16, 0xCE17, 0xCE18, 0xCE19,
+ 0xCE1A, 0xCE1B, 0xCE1C, 0xCE1D, 0xCE1E, 0xCE1F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCE20, 0xCE21, 0xCE22, 0xCE23, 0xCE24, 0xCE25, 0xCE26,
+ 0xCE27, 0xCE28, 0xCE29, 0xCE2A, 0xCE2B, 0xCE2C, 0xCE2D, 0xCE2E,
+ 0xCE2F, 0xCE30, ALTCHR, 0xCE31, 0xCE32, 0xCE33, 0xCE34, 0xCE35,
+ 0xCE36, 0xCE37, 0xCE38, 0xCE39, 0xCE3A, 0xCE3B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCE3C, 0xCE3D, 0xCE3E, 0xCE3F, 0xCE40, 0xCE41, 0xCE42,
+ 0xCE43, 0xCE44, 0xCE45, 0xCE46, 0xCE47, 0xCE48, 0xCE49, 0xCE4A,
+ 0xCE4B, 0xCE4C, ALTCHR, 0xCE4D, 0xCE4E, 0xCE4F, 0xCE50, 0xCE51,
+ 0xCE52, 0xCE53, 0xCE54, 0xCE55, 0xCE56, 0xCE57, ALTCHR, ALTCHR,
+ ALTCHR, 0xCE58, 0xCE59, 0xCE5A, 0xCE5B, 0xCE5C, 0xCE5D, 0xCE5E,
+ 0xCE5F, 0xCE60, 0xCE61, 0xCE62, 0xCE63, 0xCE64, 0xCE65, 0xCE66,
+ 0xCE67, 0xCE68, ALTCHR, 0xCE69, 0xCE6A, 0xCE6B, 0xCE6C, 0xCE6D,
+ 0xCE6E, 0xCE6F, 0xCE70, 0xCE71, 0xCE72, 0xCE73, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xC430 - 0xC4FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x314B, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCE74, 0xCE75, 0xCE76, 0xCE77, 0xCE78, 0xCE79, 0xCE7A,
+ 0xCE7B, 0xCE7C, 0xCE7D, 0xCE7E, 0xCE7F, 0xCE80, 0xCE81, 0xCE82,
+ 0xCE83, 0xCE84, ALTCHR, 0xCE85, 0xCE86, 0xCE87, 0xCE88, 0xCE89,
+ 0xCE8A, 0xCE8B, 0xCE8C, 0xCE8D, 0xCE8E, 0xCE8F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCE90, 0xCE91, 0xCE92, 0xCE93, 0xCE94, 0xCE95, 0xCE96,
+ 0xCE97, 0xCE98, 0xCE99, 0xCE9A, 0xCE9B, 0xCE9C, 0xCE9D, 0xCE9E,
+ 0xCE9F, 0xCEA0, ALTCHR, 0xCEA1, 0xCEA2, 0xCEA3, 0xCEA4, 0xCEA5,
+ 0xCEA6, 0xCEA7, 0xCEA8, 0xCEA9, 0xCEAA, 0xCEAB, ALTCHR, ALTCHR,
+ ALTCHR, 0xCEAC, 0xCEAD, 0xCEAE, 0xCEAF, 0xCEB0, 0xCEB1, 0xCEB2,
+ 0xCEB3, 0xCEB4, 0xCEB5, 0xCEB6, 0xCEB7, 0xCEB8, 0xCEB9, 0xCEBA,
+ 0xCEBB, 0xCEBC, ALTCHR, 0xCEBD, 0xCEBE, 0xCEBF, 0xCEC0, 0xCEC1,
+ 0xCEC2, 0xCEC3, 0xCEC4, 0xCEC5, 0xCEC6, 0xCEC7, ALTCHR, ALTCHR,
+ ALTCHR, 0xCEC8, 0xCEC9, 0xCECA, 0xCECB, 0xCECC, 0xCECD, 0xCECE,
+ 0xCECF, 0xCED0, 0xCED1, 0xCED2, 0xCED3, 0xCED4, 0xCED5, 0xCED6,
+ 0xCED7, 0xCED8, ALTCHR, 0xCED9, 0xCEDA, 0xCEDB, 0xCEDC, 0xCEDD,
+ 0xCEDE, 0xCEDF, 0xCEE0, 0xCEE1, 0xCEE2, 0xCEE3, ALTCHR, ALTCHR,
+ ALTCHR, 0xCEE4, 0xCEE5, 0xCEE6, 0xCEE7, 0xCEE8, 0xCEE9, 0xCEEA,
+ 0xCEEB, 0xCEEC, 0xCEED, 0xCEEE, 0xCEEF, 0xCEF0, 0xCEF1, 0xCEF2,
+ 0xCEF3, 0xCEF4, ALTCHR, 0xCEF5, 0xCEF6, 0xCEF7, 0xCEF8, 0xCEF9,
+ 0xCEFA, 0xCEFB, 0xCEFC, 0xCEFD, 0xCEFE, 0xCEFF, ALTCHR, ALTCHR,
+/* 0xC530 - 0xC5FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCF00, 0xCF01, 0xCF02, 0xCF03, 0xCF04, 0xCF05, 0xCF06,
+ 0xCF07, 0xCF08, 0xCF09, 0xCF0A, 0xCF0B, 0xCF0C, 0xCF0D, 0xCF0E,
+ 0xCF0F, 0xCF10, ALTCHR, 0xCF11, 0xCF12, 0xCF13, 0xCF14, 0xCF15,
+ 0xCF16, 0xCF17, 0xCF18, 0xCF19, 0xCF1A, 0xCF1B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCF1C, 0xCF1D, 0xCF1E, 0xCF1F, 0xCF20, 0xCF21, 0xCF22,
+ 0xCF23, 0xCF24, 0xCF25, 0xCF26, 0xCF27, 0xCF28, 0xCF29, 0xCF2A,
+ 0xCF2B, 0xCF2C, ALTCHR, 0xCF2D, 0xCF2E, 0xCF2F, 0xCF30, 0xCF31,
+ 0xCF32, 0xCF33, 0xCF34, 0xCF35, 0xCF36, 0xCF37, ALTCHR, ALTCHR,
+ ALTCHR, 0xCF38, 0xCF39, 0xCF3A, 0xCF3B, 0xCF3C, 0xCF3D, 0xCF3E,
+ 0xCF3F, 0xCF40, 0xCF41, 0xCF42, 0xCF43, 0xCF44, 0xCF45, 0xCF46,
+ 0xCF47, 0xCF48, ALTCHR, 0xCF49, 0xCF4A, 0xCF4B, 0xCF4C, 0xCF4D,
+ 0xCF4E, 0xCF4F, 0xCF50, 0xCF51, 0xCF52, 0xCF53, ALTCHR, ALTCHR,
+ ALTCHR, 0xCF54, 0xCF55, 0xCF56, 0xCF57, 0xCF58, 0xCF59, 0xCF5A,
+ 0xCF5B, 0xCF5C, 0xCF5D, 0xCF5E, 0xCF5F, 0xCF60, 0xCF61, 0xCF62,
+ 0xCF63, 0xCF64, ALTCHR, 0xCF65, 0xCF66, 0xCF67, 0xCF68, 0xCF69,
+ 0xCF6A, 0xCF6B, 0xCF6C, 0xCF6D, 0xCF6E, 0xCF6F, ALTCHR, ALTCHR,
+ ALTCHR, 0xCF70, 0xCF71, 0xCF72, 0xCF73, 0xCF74, 0xCF75, 0xCF76,
+ 0xCF77, 0xCF78, 0xCF79, 0xCF7A, 0xCF7B, 0xCF7C, 0xCF7D, 0xCF7E,
+ 0xCF7F, 0xCF80, ALTCHR, 0xCF81, 0xCF82, 0xCF83, 0xCF84, 0xCF85,
+ 0xCF86, 0xCF87, 0xCF88, 0xCF89, 0xCF8A, 0xCF8B, ALTCHR, ALTCHR,
+ ALTCHR, 0xCF8C, 0xCF8D, 0xCF8E, 0xCF8F, 0xCF90, 0xCF91, 0xCF92,
+ 0xCF93, 0xCF94, 0xCF95, 0xCF96, 0xCF97, 0xCF98, 0xCF99, 0xCF9A,
+ 0xCF9B, 0xCF9C, ALTCHR, 0xCF9D, 0xCF9E, 0xCF9F, 0xCFA0, 0xCFA1,
+ 0xCFA2, 0xCFA3, 0xCFA4, 0xCFA5, 0xCFA6, 0xCFA7, ALTCHR, ALTCHR,
+/* 0xC630 - 0xC6FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xCFA8, 0xCFA9, 0xCFAA, 0xCFAB, 0xCFAC, 0xCFAD, 0xCFAE,
+ 0xCFAF, 0xCFB0, 0xCFB1, 0xCFB2, 0xCFB3, 0xCFB4, 0xCFB5, 0xCFB6,
+ 0xCFB7, 0xCFB8, ALTCHR, 0xCFB9, 0xCFBA, 0xCFBB, 0xCFBC, 0xCFBD,
+ 0xCFBE, 0xCFBF, 0xCFC0, 0xCFC1, 0xCFC2, 0xCFC3, ALTCHR, ALTCHR,
+ ALTCHR, 0xCFC4, 0xCFC5, 0xCFC6, 0xCFC7, 0xCFC8, 0xCFC9, 0xCFCA,
+ 0xCFCB, 0xCFCC, 0xCFCD, 0xCFCE, 0xCFCF, 0xCFD0, 0xCFD1, 0xCFD2,
+ 0xCFD3, 0xCFD4, ALTCHR, 0xCFD5, 0xCFD6, 0xCFD7, 0xCFD8, 0xCFD9,
+ 0xCFDA, 0xCFDB, 0xCFDC, 0xCFDD, 0xCFDE, 0xCFDF, ALTCHR, ALTCHR,
+ ALTCHR, 0xCFE0, 0xCFE1, 0xCFE2, 0xCFE3, 0xCFE4, 0xCFE5, 0xCFE6,
+ 0xCFE7, 0xCFE8, 0xCFE9, 0xCFEA, 0xCFEB, 0xCFEC, 0xCFED, 0xCFEE,
+ 0xCFEF, 0xCFF0, ALTCHR, 0xCFF1, 0xCFF2, 0xCFF3, 0xCFF4, 0xCFF5,
+ 0xCFF6, 0xCFF7, 0xCFF8, 0xCFF9, 0xCFFA, 0xCFFB, ALTCHR, ALTCHR,
+ ALTCHR, 0xCFFC, 0xCFFD, 0xCFFE, 0xCFFF, 0xD000, 0xD001, 0xD002,
+ 0xD003, 0xD004, 0xD005, 0xD006, 0xD007, 0xD008, 0xD009, 0xD00A,
+ 0xD00B, 0xD00C, ALTCHR, 0xD00D, 0xD00E, 0xD00F, 0xD010, 0xD011,
+ 0xD012, 0xD013, 0xD014, 0xD015, 0xD016, 0xD017, ALTCHR, ALTCHR,
+ ALTCHR, 0xD018, 0xD019, 0xD01A, 0xD01B, 0xD01C, 0xD01D, 0xD01E,
+ 0xD01F, 0xD020, 0xD021, 0xD022, 0xD023, 0xD024, 0xD025, 0xD026,
+ 0xD027, 0xD028, ALTCHR, 0xD029, 0xD02A, 0xD02B, 0xD02C, 0xD02D,
+ 0xD02E, 0xD02F, 0xD030, 0xD031, 0xD032, 0xD033, ALTCHR, ALTCHR,
+ ALTCHR, 0xD034, 0xD035, 0xD036, 0xD037, 0xD038, 0xD039, 0xD03A,
+ 0xD03B, 0xD03C, 0xD03D, 0xD03E, 0xD03F, 0xD040, 0xD041, 0xD042,
+ 0xD043, 0xD044, ALTCHR, 0xD045, 0xD046, 0xD047, 0xD048, 0xD049,
+ 0xD04A, 0xD04B, 0xD04C, 0xD04D, 0xD04E, 0xD04F, ALTCHR, ALTCHR,
+/* 0xC730 - 0xC7FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD050, 0xD051, 0xD052, 0xD053, 0xD054, 0xD055, 0xD056,
+ 0xD057, 0xD058, 0xD059, 0xD05A, 0xD05B, 0xD05C, 0xD05D, 0xD05E,
+ 0xD05F, 0xD060, ALTCHR, 0xD061, 0xD062, 0xD063, 0xD064, 0xD065,
+ 0xD066, 0xD067, 0xD068, 0xD069, 0xD06A, 0xD06B, ALTCHR, ALTCHR,
+ ALTCHR, 0xD06C, 0xD06D, 0xD06E, 0xD06F, 0xD070, 0xD071, 0xD072,
+ 0xD073, 0xD074, 0xD075, 0xD076, 0xD077, 0xD078, 0xD079, 0xD07A,
+ 0xD07B, 0xD07C, ALTCHR, 0xD07D, 0xD07E, 0xD07F, 0xD080, 0xD081,
+ 0xD082, 0xD083, 0xD084, 0xD085, 0xD086, 0xD087, ALTCHR, ALTCHR,
+ ALTCHR, 0xD088, 0xD089, 0xD08A, 0xD08B, 0xD08C, 0xD08D, 0xD08E,
+ 0xD08F, 0xD090, 0xD091, 0xD092, 0xD093, 0xD094, 0xD095, 0xD096,
+ 0xD097, 0xD098, ALTCHR, 0xD099, 0xD09A, 0xD09B, 0xD09C, 0xD09D,
+ 0xD09E, 0xD09F, 0xD0A0, 0xD0A1, 0xD0A2, 0xD0A3, ALTCHR, ALTCHR,
+ ALTCHR, 0xD0A4, 0xD0A5, 0xD0A6, 0xD0A7, 0xD0A8, 0xD0A9, 0xD0AA,
+ 0xD0AB, 0xD0AC, 0xD0AD, 0xD0AE, 0xD0AF, 0xD0B0, 0xD0B1, 0xD0B2,
+ 0xD0B3, 0xD0B4, ALTCHR, 0xD0B5, 0xD0B6, 0xD0B7, 0xD0B8, 0xD0B9,
+ 0xD0BA, 0xD0BB, 0xD0BC, 0xD0BD, 0xD0BE, 0xD0BF, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xC830 - 0xC8FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x314C, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD0C0, 0xD0C1, 0xD0C2, 0xD0C3, 0xD0C4, 0xD0C5, 0xD0C6,
+ 0xD0C7, 0xD0C8, 0xD0C9, 0xD0CA, 0xD0CB, 0xD0CC, 0xD0CD, 0xD0CE,
+ 0xD0CF, 0xD0D0, ALTCHR, 0xD0D1, 0xD0D2, 0xD0D3, 0xD0D4, 0xD0D5,
+ 0xD0D6, 0xD0D7, 0xD0D8, 0xD0D9, 0xD0DA, 0xD0DB, ALTCHR, ALTCHR,
+ ALTCHR, 0xD0DC, 0xD0DD, 0xD0DE, 0xD0DF, 0xD0E0, 0xD0E1, 0xD0E2,
+ 0xD0E3, 0xD0E4, 0xD0E5, 0xD0E6, 0xD0E7, 0xD0E8, 0xD0E9, 0xD0EA,
+ 0xD0EB, 0xD0EC, ALTCHR, 0xD0ED, 0xD0EE, 0xD0EF, 0xD0F0, 0xD0F1,
+ 0xD0F2, 0xD0F3, 0xD0F4, 0xD0F5, 0xD0F6, 0xD0F7, ALTCHR, ALTCHR,
+ ALTCHR, 0xD0F8, 0xD0F9, 0xD0FA, 0xD0FB, 0xD0FC, 0xD0FD, 0xD0FE,
+ 0xD0FF, 0xD100, 0xD101, 0xD102, 0xD103, 0xD104, 0xD105, 0xD106,
+ 0xD107, 0xD108, ALTCHR, 0xD109, 0xD10A, 0xD10B, 0xD10C, 0xD10D,
+ 0xD10E, 0xD10F, 0xD110, 0xD111, 0xD112, 0xD113, ALTCHR, ALTCHR,
+ ALTCHR, 0xD114, 0xD115, 0xD116, 0xD117, 0xD118, 0xD119, 0xD11A,
+ 0xD11B, 0xD11C, 0xD11D, 0xD11E, 0xD11F, 0xD120, 0xD121, 0xD122,
+ 0xD123, 0xD124, ALTCHR, 0xD125, 0xD126, 0xD127, 0xD128, 0xD129,
+ 0xD12A, 0xD12B, 0xD12C, 0xD12D, 0xD12E, 0xD12F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD130, 0xD131, 0xD132, 0xD133, 0xD134, 0xD135, 0xD136,
+ 0xD137, 0xD138, 0xD139, 0xD13A, 0xD13B, 0xD13C, 0xD13D, 0xD13E,
+ 0xD13F, 0xD140, ALTCHR, 0xD141, 0xD142, 0xD143, 0xD144, 0xD145,
+ 0xD146, 0xD147, 0xD148, 0xD149, 0xD14A, 0xD14B, ALTCHR, ALTCHR,
+/* 0xC930 - 0xC9FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD14C, 0xD14D, 0xD14E, 0xD14F, 0xD150, 0xD151, 0xD152,
+ 0xD153, 0xD154, 0xD155, 0xD156, 0xD157, 0xD158, 0xD159, 0xD15A,
+ 0xD15B, 0xD15C, ALTCHR, 0xD15D, 0xD15E, 0xD15F, 0xD160, 0xD161,
+ 0xD162, 0xD163, 0xD164, 0xD165, 0xD166, 0xD167, ALTCHR, ALTCHR,
+ ALTCHR, 0xD168, 0xD169, 0xD16A, 0xD16B, 0xD16C, 0xD16D, 0xD16E,
+ 0xD16F, 0xD170, 0xD171, 0xD172, 0xD173, 0xD174, 0xD175, 0xD176,
+ 0xD177, 0xD178, ALTCHR, 0xD179, 0xD17A, 0xD17B, 0xD17C, 0xD17D,
+ 0xD17E, 0xD17F, 0xD180, 0xD181, 0xD182, 0xD183, ALTCHR, ALTCHR,
+ ALTCHR, 0xD184, 0xD185, 0xD186, 0xD187, 0xD188, 0xD189, 0xD18A,
+ 0xD18B, 0xD18C, 0xD18D, 0xD18E, 0xD18F, 0xD190, 0xD191, 0xD192,
+ 0xD193, 0xD194, ALTCHR, 0xD195, 0xD196, 0xD197, 0xD198, 0xD199,
+ 0xD19A, 0xD19B, 0xD19C, 0xD19D, 0xD19E, 0xD19F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD1A0, 0xD1A1, 0xD1A2, 0xD1A3, 0xD1A4, 0xD1A5, 0xD1A6,
+ 0xD1A7, 0xD1A8, 0xD1A9, 0xD1AA, 0xD1AB, 0xD1AC, 0xD1AD, 0xD1AE,
+ 0xD1AF, 0xD1B0, ALTCHR, 0xD1B1, 0xD1B2, 0xD1B3, 0xD1B4, 0xD1B5,
+ 0xD1B6, 0xD1B7, 0xD1B8, 0xD1B9, 0xD1BA, 0xD1BB, ALTCHR, ALTCHR,
+ ALTCHR, 0xD1BC, 0xD1BD, 0xD1BE, 0xD1BF, 0xD1C0, 0xD1C1, 0xD1C2,
+ 0xD1C3, 0xD1C4, 0xD1C5, 0xD1C6, 0xD1C7, 0xD1C8, 0xD1C9, 0xD1CA,
+ 0xD1CB, 0xD1CC, ALTCHR, 0xD1CD, 0xD1CE, 0xD1CF, 0xD1D0, 0xD1D1,
+ 0xD1D2, 0xD1D3, 0xD1D4, 0xD1D5, 0xD1D6, 0xD1D7, ALTCHR, ALTCHR,
+ ALTCHR, 0xD1D8, 0xD1D9, 0xD1DA, 0xD1DB, 0xD1DC, 0xD1DD, 0xD1DE,
+ 0xD1DF, 0xD1E0, 0xD1E1, 0xD1E2, 0xD1E3, 0xD1E4, 0xD1E5, 0xD1E6,
+ 0xD1E7, 0xD1E8, ALTCHR, 0xD1E9, 0xD1EA, 0xD1EB, 0xD1EC, 0xD1ED,
+ 0xD1EE, 0xD1EF, 0xD1F0, 0xD1F1, 0xD1F2, 0xD1F3, ALTCHR, ALTCHR,
+/* 0xCA30 - 0xCAFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD1F4, 0xD1F5, 0xD1F6, 0xD1F7, 0xD1F8, 0xD1F9, 0xD1FA,
+ 0xD1FB, 0xD1FC, 0xD1FD, 0xD1FE, 0xD1FF, 0xD200, 0xD201, 0xD202,
+ 0xD203, 0xD204, ALTCHR, 0xD205, 0xD206, 0xD207, 0xD208, 0xD209,
+ 0xD20A, 0xD20B, 0xD20C, 0xD20D, 0xD20E, 0xD20F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD210, 0xD211, 0xD212, 0xD213, 0xD214, 0xD215, 0xD216,
+ 0xD217, 0xD218, 0xD219, 0xD21A, 0xD21B, 0xD21C, 0xD21D, 0xD21E,
+ 0xD21F, 0xD220, ALTCHR, 0xD221, 0xD222, 0xD223, 0xD224, 0xD225,
+ 0xD226, 0xD227, 0xD228, 0xD229, 0xD22A, 0xD22B, ALTCHR, ALTCHR,
+ ALTCHR, 0xD22C, 0xD22D, 0xD22E, 0xD22F, 0xD230, 0xD231, 0xD232,
+ 0xD233, 0xD234, 0xD235, 0xD236, 0xD237, 0xD238, 0xD239, 0xD23A,
+ 0xD23B, 0xD23C, ALTCHR, 0xD23D, 0xD23E, 0xD23F, 0xD240, 0xD241,
+ 0xD242, 0xD243, 0xD244, 0xD245, 0xD246, 0xD247, ALTCHR, ALTCHR,
+ ALTCHR, 0xD248, 0xD249, 0xD24A, 0xD24B, 0xD24C, 0xD24D, 0xD24E,
+ 0xD24F, 0xD250, 0xD251, 0xD252, 0xD253, 0xD254, 0xD255, 0xD256,
+ 0xD257, 0xD258, ALTCHR, 0xD259, 0xD25A, 0xD25B, 0xD25C, 0xD25D,
+ 0xD25E, 0xD25F, 0xD260, 0xD261, 0xD262, 0xD263, ALTCHR, ALTCHR,
+ ALTCHR, 0xD264, 0xD265, 0xD266, 0xD267, 0xD268, 0xD269, 0xD26A,
+ 0xD26B, 0xD26C, 0xD26D, 0xD26E, 0xD26F, 0xD270, 0xD271, 0xD272,
+ 0xD273, 0xD274, ALTCHR, 0xD275, 0xD276, 0xD277, 0xD278, 0xD279,
+ 0xD27A, 0xD27B, 0xD27C, 0xD27D, 0xD27E, 0xD27F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD280, 0xD281, 0xD282, 0xD283, 0xD284, 0xD285, 0xD286,
+ 0xD287, 0xD288, 0xD289, 0xD28A, 0xD28B, 0xD28C, 0xD28D, 0xD28E,
+ 0xD28F, 0xD290, ALTCHR, 0xD291, 0xD292, 0xD293, 0xD294, 0xD295,
+ 0xD296, 0xD297, 0xD298, 0xD299, 0xD29A, 0xD29B, ALTCHR, ALTCHR,
+/* 0xCB30 - 0xCBFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD29C, 0xD29D, 0xD29E, 0xD29F, 0xD2A0, 0xD2A1, 0xD2A2,
+ 0xD2A3, 0xD2A4, 0xD2A5, 0xD2A6, 0xD2A7, 0xD2A8, 0xD2A9, 0xD2AA,
+ 0xD2AB, 0xD2AC, ALTCHR, 0xD2AD, 0xD2AE, 0xD2AF, 0xD2B0, 0xD2B1,
+ 0xD2B2, 0xD2B3, 0xD2B4, 0xD2B5, 0xD2B6, 0xD2B7, ALTCHR, ALTCHR,
+ ALTCHR, 0xD2B8, 0xD2B9, 0xD2BA, 0xD2BB, 0xD2BC, 0xD2BD, 0xD2BE,
+ 0xD2BF, 0xD2C0, 0xD2C1, 0xD2C2, 0xD2C3, 0xD2C4, 0xD2C5, 0xD2C6,
+ 0xD2C7, 0xD2C8, ALTCHR, 0xD2C9, 0xD2CA, 0xD2CB, 0xD2CC, 0xD2CD,
+ 0xD2CE, 0xD2CF, 0xD2D0, 0xD2D1, 0xD2D2, 0xD2D3, ALTCHR, ALTCHR,
+ ALTCHR, 0xD2D4, 0xD2D5, 0xD2D6, 0xD2D7, 0xD2D8, 0xD2D9, 0xD2DA,
+ 0xD2DB, 0xD2DC, 0xD2DD, 0xD2DE, 0xD2DF, 0xD2E0, 0xD2E1, 0xD2E2,
+ 0xD2E3, 0xD2E4, ALTCHR, 0xD2E5, 0xD2E6, 0xD2E7, 0xD2E8, 0xD2E9,
+ 0xD2EA, 0xD2EB, 0xD2EC, 0xD2ED, 0xD2EE, 0xD2EF, ALTCHR, ALTCHR,
+ ALTCHR, 0xD2F0, 0xD2F1, 0xD2F2, 0xD2F3, 0xD2F4, 0xD2F5, 0xD2F6,
+ 0xD2F7, 0xD2F8, 0xD2F9, 0xD2FA, 0xD2FB, 0xD2FC, 0xD2FD, 0xD2FE,
+ 0xD2FF, 0xD300, ALTCHR, 0xD301, 0xD302, 0xD303, 0xD304, 0xD305,
+ 0xD306, 0xD307, 0xD308, 0xD309, 0xD30A, 0xD30B, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xCC30 - 0xCCFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x314D, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD30C, 0xD30D, 0xD30E, 0xD30F, 0xD310, 0xD311, 0xD312,
+ 0xD313, 0xD314, 0xD315, 0xD316, 0xD317, 0xD318, 0xD319, 0xD31A,
+ 0xD31B, 0xD31C, ALTCHR, 0xD31D, 0xD31E, 0xD31F, 0xD320, 0xD321,
+ 0xD322, 0xD323, 0xD324, 0xD325, 0xD326, 0xD327, ALTCHR, ALTCHR,
+ ALTCHR, 0xD328, 0xD329, 0xD32A, 0xD32B, 0xD32C, 0xD32D, 0xD32E,
+ 0xD32F, 0xD330, 0xD331, 0xD332, 0xD333, 0xD334, 0xD335, 0xD336,
+ 0xD337, 0xD338, ALTCHR, 0xD339, 0xD33A, 0xD33B, 0xD33C, 0xD33D,
+ 0xD33E, 0xD33F, 0xD340, 0xD341, 0xD342, 0xD343, ALTCHR, ALTCHR,
+ ALTCHR, 0xD344, 0xD345, 0xD346, 0xD347, 0xD348, 0xD349, 0xD34A,
+ 0xD34B, 0xD34C, 0xD34D, 0xD34E, 0xD34F, 0xD350, 0xD351, 0xD352,
+ 0xD353, 0xD354, ALTCHR, 0xD355, 0xD356, 0xD357, 0xD358, 0xD359,
+ 0xD35A, 0xD35B, 0xD35C, 0xD35D, 0xD35E, 0xD35F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD360, 0xD361, 0xD362, 0xD363, 0xD364, 0xD365, 0xD366,
+ 0xD367, 0xD368, 0xD369, 0xD36A, 0xD36B, 0xD36C, 0xD36D, 0xD36E,
+ 0xD36F, 0xD370, ALTCHR, 0xD371, 0xD372, 0xD373, 0xD374, 0xD375,
+ 0xD376, 0xD377, 0xD378, 0xD379, 0xD37A, 0xD37B, ALTCHR, ALTCHR,
+ ALTCHR, 0xD37C, 0xD37D, 0xD37E, 0xD37F, 0xD380, 0xD381, 0xD382,
+ 0xD383, 0xD384, 0xD385, 0xD386, 0xD387, 0xD388, 0xD389, 0xD38A,
+ 0xD38B, 0xD38C, ALTCHR, 0xD38D, 0xD38E, 0xD38F, 0xD390, 0xD391,
+ 0xD392, 0xD393, 0xD394, 0xD395, 0xD396, 0xD397, ALTCHR, ALTCHR,
+/* 0xCD30 - 0xCDFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD398, 0xD399, 0xD39A, 0xD39B, 0xD39C, 0xD39D, 0xD39E,
+ 0xD39F, 0xD3A0, 0xD3A1, 0xD3A2, 0xD3A3, 0xD3A4, 0xD3A5, 0xD3A6,
+ 0xD3A7, 0xD3A8, ALTCHR, 0xD3A9, 0xD3AA, 0xD3AB, 0xD3AC, 0xD3AD,
+ 0xD3AE, 0xD3AF, 0xD3B0, 0xD3B1, 0xD3B2, 0xD3B3, ALTCHR, ALTCHR,
+ ALTCHR, 0xD3B4, 0xD3B5, 0xD3B6, 0xD3B7, 0xD3B8, 0xD3B9, 0xD3BA,
+ 0xD3BB, 0xD3BC, 0xD3BD, 0xD3BE, 0xD3BF, 0xD3C0, 0xD3C1, 0xD3C2,
+ 0xD3C3, 0xD3C4, ALTCHR, 0xD3C5, 0xD3C6, 0xD3C7, 0xD3C8, 0xD3C9,
+ 0xD3CA, 0xD3CB, 0xD3CC, 0xD3CD, 0xD3CE, 0xD3CF, ALTCHR, ALTCHR,
+ ALTCHR, 0xD3D0, 0xD3D1, 0xD3D2, 0xD3D3, 0xD3D4, 0xD3D5, 0xD3D6,
+ 0xD3D7, 0xD3D8, 0xD3D9, 0xD3DA, 0xD3DB, 0xD3DC, 0xD3DD, 0xD3DE,
+ 0xD3DF, 0xD3E0, ALTCHR, 0xD3E1, 0xD3E2, 0xD3E3, 0xD3E4, 0xD3E5,
+ 0xD3E6, 0xD3E7, 0xD3E8, 0xD3E9, 0xD3EA, 0xD3EB, ALTCHR, ALTCHR,
+ ALTCHR, 0xD3EC, 0xD3ED, 0xD3EE, 0xD3EF, 0xD3F0, 0xD3F1, 0xD3F2,
+ 0xD3F3, 0xD3F4, 0xD3F5, 0xD3F6, 0xD3F7, 0xD3F8, 0xD3F9, 0xD3FA,
+ 0xD3FB, 0xD3FC, ALTCHR, 0xD3FD, 0xD3FE, 0xD3FF, 0xD400, 0xD401,
+ 0xD402, 0xD403, 0xD404, 0xD405, 0xD406, 0xD407, ALTCHR, ALTCHR,
+ ALTCHR, 0xD408, 0xD409, 0xD40A, 0xD40B, 0xD40C, 0xD40D, 0xD40E,
+ 0xD40F, 0xD410, 0xD411, 0xD412, 0xD413, 0xD414, 0xD415, 0xD416,
+ 0xD417, 0xD418, ALTCHR, 0xD419, 0xD41A, 0xD41B, 0xD41C, 0xD41D,
+ 0xD41E, 0xD41F, 0xD420, 0xD421, 0xD422, 0xD423, ALTCHR, ALTCHR,
+ ALTCHR, 0xD424, 0xD425, 0xD426, 0xD427, 0xD428, 0xD429, 0xD42A,
+ 0xD42B, 0xD42C, 0xD42D, 0xD42E, 0xD42F, 0xD430, 0xD431, 0xD432,
+ 0xD433, 0xD434, ALTCHR, 0xD435, 0xD436, 0xD437, 0xD438, 0xD439,
+ 0xD43A, 0xD43B, 0xD43C, 0xD43D, 0xD43E, 0xD43F, ALTCHR, ALTCHR,
+/* 0xCE30 - 0xCEFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD440, 0xD441, 0xD442, 0xD443, 0xD444, 0xD445, 0xD446,
+ 0xD447, 0xD448, 0xD449, 0xD44A, 0xD44B, 0xD44C, 0xD44D, 0xD44E,
+ 0xD44F, 0xD450, ALTCHR, 0xD451, 0xD452, 0xD453, 0xD454, 0xD455,
+ 0xD456, 0xD457, 0xD458, 0xD459, 0xD45A, 0xD45B, ALTCHR, ALTCHR,
+ ALTCHR, 0xD45C, 0xD45D, 0xD45E, 0xD45F, 0xD460, 0xD461, 0xD462,
+ 0xD463, 0xD464, 0xD465, 0xD466, 0xD467, 0xD468, 0xD469, 0xD46A,
+ 0xD46B, 0xD46C, ALTCHR, 0xD46D, 0xD46E, 0xD46F, 0xD470, 0xD471,
+ 0xD472, 0xD473, 0xD474, 0xD475, 0xD476, 0xD477, ALTCHR, ALTCHR,
+ ALTCHR, 0xD478, 0xD479, 0xD47A, 0xD47B, 0xD47C, 0xD47D, 0xD47E,
+ 0xD47F, 0xD480, 0xD481, 0xD482, 0xD483, 0xD484, 0xD485, 0xD486,
+ 0xD487, 0xD488, ALTCHR, 0xD489, 0xD48A, 0xD48B, 0xD48C, 0xD48D,
+ 0xD48E, 0xD48F, 0xD490, 0xD491, 0xD492, 0xD493, ALTCHR, ALTCHR,
+ ALTCHR, 0xD494, 0xD495, 0xD496, 0xD497, 0xD498, 0xD499, 0xD49A,
+ 0xD49B, 0xD49C, 0xD49D, 0xD49E, 0xD49F, 0xD4A0, 0xD4A1, 0xD4A2,
+ 0xD4A3, 0xD4A4, ALTCHR, 0xD4A5, 0xD4A6, 0xD4A7, 0xD4A8, 0xD4A9,
+ 0xD4AA, 0xD4AB, 0xD4AC, 0xD4AD, 0xD4AE, 0xD4AF, ALTCHR, ALTCHR,
+ ALTCHR, 0xD4B0, 0xD4B1, 0xD4B2, 0xD4B3, 0xD4B4, 0xD4B5, 0xD4B6,
+ 0xD4B7, 0xD4B8, 0xD4B9, 0xD4BA, 0xD4BB, 0xD4BC, 0xD4BD, 0xD4BE,
+ 0xD4BF, 0xD4C0, ALTCHR, 0xD4C1, 0xD4C2, 0xD4C3, 0xD4C4, 0xD4C5,
+ 0xD4C6, 0xD4C7, 0xD4C8, 0xD4C9, 0xD4CA, 0xD4CB, ALTCHR, ALTCHR,
+ ALTCHR, 0xD4CC, 0xD4CD, 0xD4CE, 0xD4CF, 0xD4D0, 0xD4D1, 0xD4D2,
+ 0xD4D3, 0xD4D4, 0xD4D5, 0xD4D6, 0xD4D7, 0xD4D8, 0xD4D9, 0xD4DA,
+ 0xD4DB, 0xD4DC, ALTCHR, 0xD4DD, 0xD4DE, 0xD4DF, 0xD4E0, 0xD4E1,
+ 0xD4E2, 0xD4E3, 0xD4E4, 0xD4E5, 0xD4E6, 0xD4E7, ALTCHR, ALTCHR,
+/* 0xCF30 - 0xCFFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD4E8, 0xD4E9, 0xD4EA, 0xD4EB, 0xD4EC, 0xD4ED, 0xD4EE,
+ 0xD4EF, 0xD4F0, 0xD4F1, 0xD4F2, 0xD4F3, 0xD4F4, 0xD4F5, 0xD4F6,
+ 0xD4F7, 0xD4F8, ALTCHR, 0xD4F9, 0xD4FA, 0xD4FB, 0xD4FC, 0xD4FD,
+ 0xD4FE, 0xD4FF, 0xD500, 0xD501, 0xD502, 0xD503, ALTCHR, ALTCHR,
+ ALTCHR, 0xD504, 0xD505, 0xD506, 0xD507, 0xD508, 0xD509, 0xD50A,
+ 0xD50B, 0xD50C, 0xD50D, 0xD50E, 0xD50F, 0xD510, 0xD511, 0xD512,
+ 0xD513, 0xD514, ALTCHR, 0xD515, 0xD516, 0xD517, 0xD518, 0xD519,
+ 0xD51A, 0xD51B, 0xD51C, 0xD51D, 0xD51E, 0xD51F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD520, 0xD521, 0xD522, 0xD523, 0xD524, 0xD525, 0xD526,
+ 0xD527, 0xD528, 0xD529, 0xD52A, 0xD52B, 0xD52C, 0xD52D, 0xD52E,
+ 0xD52F, 0xD530, ALTCHR, 0xD531, 0xD532, 0xD533, 0xD534, 0xD535,
+ 0xD536, 0xD537, 0xD538, 0xD539, 0xD53A, 0xD53B, ALTCHR, ALTCHR,
+ ALTCHR, 0xD53C, 0xD53D, 0xD53E, 0xD53F, 0xD540, 0xD541, 0xD542,
+ 0xD543, 0xD544, 0xD545, 0xD546, 0xD547, 0xD548, 0xD549, 0xD54A,
+ 0xD54B, 0xD54C, ALTCHR, 0xD54D, 0xD54E, 0xD54F, 0xD550, 0xD551,
+ 0xD552, 0xD553, 0xD554, 0xD555, 0xD556, 0xD557, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xD030 - 0xD0FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x314E, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD558, 0xD559, 0xD55A, 0xD55B, 0xD55C, 0xD55D, 0xD55E,
+ 0xD55F, 0xD560, 0xD561, 0xD562, 0xD563, 0xD564, 0xD565, 0xD566,
+ 0xD567, 0xD568, ALTCHR, 0xD569, 0xD56A, 0xD56B, 0xD56C, 0xD56D,
+ 0xD56E, 0xD56F, 0xD570, 0xD571, 0xD572, 0xD573, ALTCHR, ALTCHR,
+ ALTCHR, 0xD574, 0xD575, 0xD576, 0xD577, 0xD578, 0xD579, 0xD57A,
+ 0xD57B, 0xD57C, 0xD57D, 0xD57E, 0xD57F, 0xD580, 0xD581, 0xD582,
+ 0xD583, 0xD584, ALTCHR, 0xD585, 0xD586, 0xD587, 0xD588, 0xD589,
+ 0xD58A, 0xD58B, 0xD58C, 0xD58D, 0xD58E, 0xD58F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD590, 0xD591, 0xD592, 0xD593, 0xD594, 0xD595, 0xD596,
+ 0xD597, 0xD598, 0xD599, 0xD59A, 0xD59B, 0xD59C, 0xD59D, 0xD59E,
+ 0xD59F, 0xD5A0, ALTCHR, 0xD5A1, 0xD5A2, 0xD5A3, 0xD5A4, 0xD5A5,
+ 0xD5A6, 0xD5A7, 0xD5A8, 0xD5A9, 0xD5AA, 0xD5AB, ALTCHR, ALTCHR,
+ ALTCHR, 0xD5AC, 0xD5AD, 0xD5AE, 0xD5AF, 0xD5B0, 0xD5B1, 0xD5B2,
+ 0xD5B3, 0xD5B4, 0xD5B5, 0xD5B6, 0xD5B7, 0xD5B8, 0xD5B9, 0xD5BA,
+ 0xD5BB, 0xD5BC, ALTCHR, 0xD5BD, 0xD5BE, 0xD5BF, 0xD5C0, 0xD5C1,
+ 0xD5C2, 0xD5C3, 0xD5C4, 0xD5C5, 0xD5C6, 0xD5C7, ALTCHR, ALTCHR,
+ ALTCHR, 0xD5C8, 0xD5C9, 0xD5CA, 0xD5CB, 0xD5CC, 0xD5CD, 0xD5CE,
+ 0xD5CF, 0xD5D0, 0xD5D1, 0xD5D2, 0xD5D3, 0xD5D4, 0xD5D5, 0xD5D6,
+ 0xD5D7, 0xD5D8, ALTCHR, 0xD5D9, 0xD5DA, 0xD5DB, 0xD5DC, 0xD5DD,
+ 0xD5DE, 0xD5DF, 0xD5E0, 0xD5E1, 0xD5E2, 0xD5E3, ALTCHR, ALTCHR,
+/* 0xD130 - 0xD1FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD5E4, 0xD5E5, 0xD5E6, 0xD5E7, 0xD5E8, 0xD5E9, 0xD5EA,
+ 0xD5EB, 0xD5EC, 0xD5ED, 0xD5EE, 0xD5EF, 0xD5F0, 0xD5F1, 0xD5F2,
+ 0xD5F3, 0xD5F4, ALTCHR, 0xD5F5, 0xD5F6, 0xD5F7, 0xD5F8, 0xD5F9,
+ 0xD5FA, 0xD5FB, 0xD5FC, 0xD5FD, 0xD5FE, 0xD5FF, ALTCHR, ALTCHR,
+ ALTCHR, 0xD600, 0xD601, 0xD602, 0xD603, 0xD604, 0xD605, 0xD606,
+ 0xD607, 0xD608, 0xD609, 0xD60A, 0xD60B, 0xD60C, 0xD60D, 0xD60E,
+ 0xD60F, 0xD610, ALTCHR, 0xD611, 0xD612, 0xD613, 0xD614, 0xD615,
+ 0xD616, 0xD617, 0xD618, 0xD619, 0xD61A, 0xD61B, ALTCHR, ALTCHR,
+ ALTCHR, 0xD61C, 0xD61D, 0xD61E, 0xD61F, 0xD620, 0xD621, 0xD622,
+ 0xD623, 0xD624, 0xD625, 0xD626, 0xD627, 0xD628, 0xD629, 0xD62A,
+ 0xD62B, 0xD62C, ALTCHR, 0xD62D, 0xD62E, 0xD62F, 0xD630, 0xD631,
+ 0xD632, 0xD633, 0xD634, 0xD635, 0xD636, 0xD637, ALTCHR, ALTCHR,
+ ALTCHR, 0xD638, 0xD639, 0xD63A, 0xD63B, 0xD63C, 0xD63D, 0xD63E,
+ 0xD63F, 0xD640, 0xD641, 0xD642, 0xD643, 0xD644, 0xD645, 0xD646,
+ 0xD647, 0xD648, ALTCHR, 0xD649, 0xD64A, 0xD64B, 0xD64C, 0xD64D,
+ 0xD64E, 0xD64F, 0xD650, 0xD651, 0xD652, 0xD653, ALTCHR, ALTCHR,
+ ALTCHR, 0xD654, 0xD655, 0xD656, 0xD657, 0xD658, 0xD659, 0xD65A,
+ 0xD65B, 0xD65C, 0xD65D, 0xD65E, 0xD65F, 0xD660, 0xD661, 0xD662,
+ 0xD663, 0xD664, ALTCHR, 0xD665, 0xD666, 0xD667, 0xD668, 0xD669,
+ 0xD66A, 0xD66B, 0xD66C, 0xD66D, 0xD66E, 0xD66F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD670, 0xD671, 0xD672, 0xD673, 0xD674, 0xD675, 0xD676,
+ 0xD677, 0xD678, 0xD679, 0xD67A, 0xD67B, 0xD67C, 0xD67D, 0xD67E,
+ 0xD67F, 0xD680, ALTCHR, 0xD681, 0xD682, 0xD683, 0xD684, 0xD685,
+ 0xD686, 0xD687, 0xD688, 0xD689, 0xD68A, 0xD68B, ALTCHR, ALTCHR,
+/* 0xD230 - 0xD2FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD68C, 0xD68D, 0xD68E, 0xD68F, 0xD690, 0xD691, 0xD692,
+ 0xD693, 0xD694, 0xD695, 0xD696, 0xD697, 0xD698, 0xD699, 0xD69A,
+ 0xD69B, 0xD69C, ALTCHR, 0xD69D, 0xD69E, 0xD69F, 0xD6A0, 0xD6A1,
+ 0xD6A2, 0xD6A3, 0xD6A4, 0xD6A5, 0xD6A6, 0xD6A7, ALTCHR, ALTCHR,
+ ALTCHR, 0xD6A8, 0xD6A9, 0xD6AA, 0xD6AB, 0xD6AC, 0xD6AD, 0xD6AE,
+ 0xD6AF, 0xD6B0, 0xD6B1, 0xD6B2, 0xD6B3, 0xD6B4, 0xD6B5, 0xD6B6,
+ 0xD6B7, 0xD6B8, ALTCHR, 0xD6B9, 0xD6BA, 0xD6BB, 0xD6BC, 0xD6BD,
+ 0xD6BE, 0xD6BF, 0xD6C0, 0xD6C1, 0xD6C2, 0xD6C3, ALTCHR, ALTCHR,
+ ALTCHR, 0xD6C4, 0xD6C5, 0xD6C6, 0xD6C7, 0xD6C8, 0xD6C9, 0xD6CA,
+ 0xD6CB, 0xD6CC, 0xD6CD, 0xD6CE, 0xD6CF, 0xD6D0, 0xD6D1, 0xD6D2,
+ 0xD6D3, 0xD6D4, ALTCHR, 0xD6D5, 0xD6D6, 0xD6D7, 0xD6D8, 0xD6D9,
+ 0xD6DA, 0xD6DB, 0xD6DC, 0xD6DD, 0xD6DE, 0xD6DF, ALTCHR, ALTCHR,
+ ALTCHR, 0xD6E0, 0xD6E1, 0xD6E2, 0xD6E3, 0xD6E4, 0xD6E5, 0xD6E6,
+ 0xD6E7, 0xD6E8, 0xD6E9, 0xD6EA, 0xD6EB, 0xD6EC, 0xD6ED, 0xD6EE,
+ 0xD6EF, 0xD6F0, ALTCHR, 0xD6F1, 0xD6F2, 0xD6F3, 0xD6F4, 0xD6F5,
+ 0xD6F6, 0xD6F7, 0xD6F8, 0xD6F9, 0xD6FA, 0xD6FB, ALTCHR, ALTCHR,
+ ALTCHR, 0xD6FC, 0xD6FD, 0xD6FE, 0xD6FF, 0xD700, 0xD701, 0xD702,
+ 0xD703, 0xD704, 0xD705, 0xD706, 0xD707, 0xD708, 0xD709, 0xD70A,
+ 0xD70B, 0xD70C, ALTCHR, 0xD70D, 0xD70E, 0xD70F, 0xD710, 0xD711,
+ 0xD712, 0xD713, 0xD714, 0xD715, 0xD716, 0xD717, ALTCHR, ALTCHR,
+ ALTCHR, 0xD718, 0xD719, 0xD71A, 0xD71B, 0xD71C, 0xD71D, 0xD71E,
+ 0xD71F, 0xD720, 0xD721, 0xD722, 0xD723, 0xD724, 0xD725, 0xD726,
+ 0xD727, 0xD728, ALTCHR, 0xD729, 0xD72A, 0xD72B, 0xD72C, 0xD72D,
+ 0xD72E, 0xD72F, 0xD730, 0xD731, 0xD732, 0xD733, ALTCHR, ALTCHR,
+/* 0xD330 - 0xD3FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xD734, 0xD735, 0xD736, 0xD737, 0xD738, 0xD739, 0xD73A,
+ 0xD73B, 0xD73C, 0xD73D, 0xD73E, 0xD73F, 0xD740, 0xD741, 0xD742,
+ 0xD743, 0xD744, ALTCHR, 0xD745, 0xD746, 0xD747, 0xD748, 0xD749,
+ 0xD74A, 0xD74B, 0xD74C, 0xD74D, 0xD74E, 0xD74F, ALTCHR, ALTCHR,
+ ALTCHR, 0xD750, 0xD751, 0xD752, 0xD753, 0xD754, 0xD755, 0xD756,
+ 0xD757, 0xD758, 0xD759, 0xD75A, 0xD75B, 0xD75C, 0xD75D, 0xD75E,
+ 0xD75F, 0xD760, ALTCHR, 0xD761, 0xD762, 0xD763, 0xD764, 0xD765,
+ 0xD766, 0xD767, 0xD768, 0xD769, 0xD76A, 0xD76B, ALTCHR, ALTCHR,
+ ALTCHR, 0xD76C, 0xD76D, 0xD76E, 0xD76F, 0xD770, 0xD771, 0xD772,
+ 0xD773, 0xD774, 0xD775, 0xD776, 0xD777, 0xD778, 0xD779, 0xD77A,
+ 0xD77B, 0xD77C, ALTCHR, 0xD77D, 0xD77E, 0xD77F, 0xD780, 0xD781,
+ 0xD782, 0xD783, 0xD784, 0xD785, 0xD786, 0xD787, ALTCHR, ALTCHR,
+ ALTCHR, 0xD788, 0xD789, 0xD78A, 0xD78B, 0xD78C, 0xD78D, 0xD78E,
+ 0xD78F, 0xD790, 0xD791, 0xD792, 0xD793, 0xD794, 0xD795, 0xD796,
+ 0xD797, 0xD798, ALTCHR, 0xD799, 0xD79A, 0xD79B, 0xD79C, 0xD79D,
+ 0xD79E, 0xD79F, 0xD7A0, 0xD7A1, 0xD7A2, 0xD7A3, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xD430 - 0xD4FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xD530 - 0xD5FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xD630 - 0xD6FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xD730 - 0xD7FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xD830 - 0xD8FF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xD930 - 0xD9FF */
+ ALTCHR, 0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8,
+ 0x3003, 0x00AD, 0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019,
+ 0x201C, 0x201D, 0x3014, 0x3015, 0x3008, 0x3009, 0x300A, 0x300B,
+ 0x300C, 0x300D, 0x300E, 0x300F, 0x3010, 0x3011, 0x00B1, 0x00D7,
+ 0x00F7, 0x2260, 0x2264, 0x2265, 0x221E, 0x2234, 0x00B0, 0x2032,
+ 0x2033, 0x2103, 0x212B, 0xFFE0, 0xFFE1, 0xFFE5, 0x2642, 0x2640,
+ 0x2220, 0x22A5, 0x2312, 0x2202, 0x2207, 0x2261, 0x2252, 0x00A7,
+ 0x203B, 0x2606, 0x2605, 0x25CB, 0x25CF, 0x25CE, 0x25C7, 0x25C6,
+ 0x25A1, 0x25A0, 0x25B3, 0x25B2, 0x25BD, 0x25BC, 0x2192, 0x2190,
+ 0x2191, 0x2193, 0x2194, 0x3013, 0x226A, 0x226B, 0x221A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x223D, 0x221D, 0x2235, 0x222B, 0x222C, 0x2208, 0x220B,
+ 0x2286, 0x2287, 0x2282, 0x2283, 0x222A, 0x2229, 0x2227, 0x2228,
+ 0xFFE2, 0x21D2, 0x21D4, 0x2200, 0x2203, 0x00B4, 0xFF5E, 0x02C7,
+ 0x02D8, 0x02DD, 0x02DA, 0x02D9, 0x00B8, 0x02DB, 0x00A1, 0x00BF,
+ 0x02D0, 0x222E, 0x2211, 0x220F, 0x00A4, 0x2109, 0x2030, 0x25C1,
+ 0x25C0, 0x25B7, 0x25B6, 0x2664, 0x2660, 0x2661, 0x2665, 0x2667,
+ 0x2663, 0x2299, 0x25C8, 0x25A3, 0x25D0, 0x25D1, 0x2592, 0x25A4,
+ 0x25A5, 0x25A8, 0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E,
+ 0x261C, 0x261E, 0x00B6, 0x2020, 0x2021, 0x2195, 0x2197, 0x2199,
+ 0x2196, 0x2198, 0x266D, 0x2669, 0x266A, 0x266C, 0x327F, 0x321C,
+ 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8, 0x2121, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xDA30 - 0xDAFF */
+ ALTCHR, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07,
+ 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F,
+ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17,
+ 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F,
+ 0xFF20, 0xFF21, 0xFF22, 0xFF23, 0xFF24, 0xFF25, 0xFF26, 0xFF27,
+ 0xFF28, 0xFF29, 0xFF2A, 0xFF2B, 0xFF2C, 0xFF2D, 0xFF2E, 0xFF2F,
+ 0xFF30, 0xFF31, 0xFF32, 0xFF33, 0xFF34, 0xFF35, 0xFF36, 0xFF37,
+ 0xFF38, 0xFF39, 0xFF3A, 0xFF3B, 0xFFE6, 0xFF3D, 0xFF3E, 0xFF3F,
+ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47,
+ 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xFF4F, 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55,
+ 0xFF56, 0xFF57, 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D,
+ 0xFFE3, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x3164, 0x3165, 0x3166, 0x3167,
+ 0x3168, 0x3169, 0x316A, 0x316B, 0x316C, 0x316D, 0x316E, 0x316F,
+ 0x3170, 0x3171, 0x3172, 0x3173, 0x3174, 0x3175, 0x3176, 0x3177,
+ 0x3178, 0x3179, 0x317A, 0x317B, 0x317C, 0x317D, 0x317E, 0x317F,
+ 0x3180, 0x3181, 0x3182, 0x3183, 0x3184, 0x3185, 0x3186, 0x3187,
+ 0x3188, 0x3189, 0x318A, 0x318B, 0x318C, 0x318D, 0x318E, ALTCHR,
+/* 0xDB30 - 0xDBFF */
+ ALTCHR, 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176,
+ 0x2177, 0x2178, 0x2179, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167,
+ 0x2168, 0x2169, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
+ 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
+ 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8,
+ 0x03A9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
+ 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C4, 0x03C5, 0x03C6,
+ 0x03C7, 0x03C8, 0x03C9, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x2500, 0x2502, 0x250C, 0x2510, 0x2518, 0x2514, 0x251C,
+ 0x252C, 0x2524, 0x2534, 0x253C, 0x2501, 0x2503, 0x250F, 0x2513,
+ 0x251B, 0x2517, 0x2523, 0x2533, 0x252B, 0x253B, 0x254B, 0x2520,
+ 0x252F, 0x2528, 0x2537, 0x253F, 0x251D, 0x2530, 0x2525, 0x2538,
+ 0x2542, 0x2512, 0x2511, 0x251A, 0x2519, 0x2516, 0x2515, 0x250E,
+ 0x250D, 0x251E, 0x251F, 0x2521, 0x2522, 0x2526, 0x2527, 0x2529,
+ 0x252A, 0x252D, 0x252E, 0x2531, 0x2532, 0x2535, 0x2536, 0x2539,
+ 0x253A, 0x253D, 0x253E, 0x2540, 0x2541, 0x2543, 0x2544, 0x2545,
+ 0x2546, 0x2547, 0x2548, 0x2549, 0x254A, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xDC30 - 0xDCFF */
+ ALTCHR, 0x3395, 0x3396, 0x3397, 0x2113, 0x3398, 0x33C4, 0x33A3,
+ 0x33A4, 0x33A5, 0x33A6, 0x3399, 0x339A, 0x339B, 0x339C, 0x339D,
+ 0x339E, 0x339F, 0x33A0, 0x33A1, 0x33A2, 0x33CA, 0x338D, 0x338E,
+ 0x338F, 0x33CF, 0x3388, 0x3389, 0x33C8, 0x33A7, 0x33A8, 0x33B0,
+ 0x33B1, 0x33B2, 0x33B3, 0x33B4, 0x33B5, 0x33B6, 0x33B7, 0x33B8,
+ 0x33B9, 0x3380, 0x3381, 0x3382, 0x3383, 0x3384, 0x33BA, 0x33BB,
+ 0x33BC, 0x33BD, 0x33BE, 0x33BF, 0x3390, 0x3391, 0x3392, 0x3393,
+ 0x3394, 0x2126, 0x33C0, 0x33C1, 0x338A, 0x338B, 0x338C, 0x33D6,
+ 0x33C5, 0x33AD, 0x33AE, 0x33AF, 0x33DB, 0x33A9, 0x33AA, 0x33AB,
+ 0x33AC, 0x33DD, 0x33D0, 0x33D3, 0x33C3, 0x33C9, 0x33DC, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x33C6, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x00C6, 0x00D0, 0x00AA, 0x0126, ALTCHR, 0x0132, ALTCHR,
+ 0x013F, 0x0141, 0x00D8, 0x0152, 0x00BA, 0x00DE, 0x0166, 0x014A,
+ ALTCHR, 0x3260, 0x3261, 0x3262, 0x3263, 0x3264, 0x3265, 0x3266,
+ 0x3267, 0x3268, 0x3269, 0x326A, 0x326B, 0x326C, 0x326D, 0x326E,
+ 0x326F, 0x3270, 0x3271, 0x3272, 0x3273, 0x3274, 0x3275, 0x3276,
+ 0x3277, 0x3278, 0x3279, 0x327A, 0x327B, 0x24D0, 0x24D1, 0x24D2,
+ 0x24D3, 0x24D4, 0x24D5, 0x24D6, 0x24D7, 0x24D8, 0x24D9, 0x24DA,
+ 0x24DB, 0x24DC, 0x24DD, 0x24DE, 0x24DF, 0x24E0, 0x24E1, 0x24E2,
+ 0x24E3, 0x24E4, 0x24E5, 0x24E6, 0x24E7, 0x24E8, 0x24E9, 0x2460,
+ 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467, 0x2468,
+ 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x00BD, 0x2153,
+ 0x2154, 0x00BC, 0x00BE, 0x215B, 0x215C, 0x215D, 0x215E, ALTCHR,
+/* 0xDD30 - 0xDDFF */
+ ALTCHR, 0x00E6, 0x0111, 0x00F0, 0x0127, 0x0131, 0x0133, 0x0138,
+ 0x0140, 0x0142, 0x00F8, 0x0153, 0x00DF, 0x00FE, 0x0167, 0x014B,
+ 0x0149, 0x3200, 0x3201, 0x3202, 0x3203, 0x3204, 0x3205, 0x3206,
+ 0x3207, 0x3208, 0x3209, 0x320A, 0x320B, 0x320C, 0x320D, 0x320E,
+ 0x320F, 0x3210, 0x3211, 0x3212, 0x3213, 0x3214, 0x3215, 0x3216,
+ 0x3217, 0x3218, 0x3219, 0x321A, 0x321B, 0x249C, 0x249D, 0x249E,
+ 0x249F, 0x24A0, 0x24A1, 0x24A2, 0x24A3, 0x24A4, 0x24A5, 0x24A6,
+ 0x24A7, 0x24A8, 0x24A9, 0x24AA, 0x24AB, 0x24AC, 0x24AD, 0x24AE,
+ 0x24AF, 0x24B0, 0x24B1, 0x24B2, 0x24B3, 0x24B4, 0x24B5, 0x2474,
+ 0x2475, 0x2476, 0x2477, 0x2478, 0x2479, 0x247A, 0x247B, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x247C, 0x247D, 0x247E, 0x247F, 0x2480, 0x2481, 0x2482,
+ 0x00B9, 0x00B2, 0x00B3, 0x2074, 0x207F, 0x2081, 0x2082, 0x2083,
+ 0x2084, 0x3041, 0x3042, 0x3043, 0x3044, 0x3045, 0x3046, 0x3047,
+ 0x3048, 0x3049, 0x304A, 0x304B, 0x304C, 0x304D, 0x304E, 0x304F,
+ 0x3050, 0x3051, 0x3052, 0x3053, 0x3054, 0x3055, 0x3056, 0x3057,
+ 0x3058, 0x3059, 0x305A, 0x305B, 0x305C, 0x305D, 0x305E, 0x305F,
+ 0x3060, 0x3061, 0x3062, 0x3063, 0x3064, 0x3065, 0x3066, 0x3067,
+ 0x3068, 0x3069, 0x306A, 0x306B, 0x306C, 0x306D, 0x306E, 0x306F,
+ 0x3070, 0x3071, 0x3072, 0x3073, 0x3074, 0x3075, 0x3076, 0x3077,
+ 0x3078, 0x3079, 0x307A, 0x307B, 0x307C, 0x307D, 0x307E, 0x307F,
+ 0x3080, 0x3081, 0x3082, 0x3083, 0x3084, 0x3085, 0x3086, 0x3087,
+ 0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308E, 0x308F,
+ 0x3090, 0x3091, 0x3092, 0x3093, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xDE30 - 0xDEFF */
+ ALTCHR, 0x30A1, 0x30A2, 0x30A3, 0x30A4, 0x30A5, 0x30A6, 0x30A7,
+ 0x30A8, 0x30A9, 0x30AA, 0x30AB, 0x30AC, 0x30AD, 0x30AE, 0x30AF,
+ 0x30B0, 0x30B1, 0x30B2, 0x30B3, 0x30B4, 0x30B5, 0x30B6, 0x30B7,
+ 0x30B8, 0x30B9, 0x30BA, 0x30BB, 0x30BC, 0x30BD, 0x30BE, 0x30BF,
+ 0x30C0, 0x30C1, 0x30C2, 0x30C3, 0x30C4, 0x30C5, 0x30C6, 0x30C7,
+ 0x30C8, 0x30C9, 0x30CA, 0x30CB, 0x30CC, 0x30CD, 0x30CE, 0x30CF,
+ 0x30D0, 0x30D1, 0x30D2, 0x30D3, 0x30D4, 0x30D5, 0x30D6, 0x30D7,
+ 0x30D8, 0x30D9, 0x30DA, 0x30DB, 0x30DC, 0x30DD, 0x30DE, 0x30DF,
+ 0x30E0, 0x30E1, 0x30E2, 0x30E3, 0x30E4, 0x30E5, 0x30E6, 0x30E7,
+ 0x30E8, 0x30E9, 0x30EA, 0x30EB, 0x30EC, 0x30ED, 0x30EE, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x30EF, 0x30F0, 0x30F1, 0x30F2, 0x30F3, 0x30F4, 0x30F5,
+ 0x30F6, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0401,
+ 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D,
+ 0x041E, 0x041F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425,
+ 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D,
+ 0x042E, 0x042F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0451,
+ 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D,
+ 0x043E, 0x043F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445,
+ 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D,
+ 0x044E, 0x044F, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xDF30 - 0xDFFF */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0xE030 - 0xE0FF */
+ ALTCHR, 0x4F3D, 0x4F73, 0x5047, 0x50F9, 0x52A0, 0x53EF, 0x5475,
+ 0x54E5, 0x5609, 0x5AC1, 0x5BB6, 0x6687, 0x67B6, 0x67B7, 0x67EF,
+ 0x6B4C, 0x73C2, 0x75C2, 0x7A3C, 0x82DB, 0x8304, 0x8857, 0x8888,
+ 0x8A36, 0x8CC8, 0x8DCF, 0x8EFB, 0x8FE6, 0x99D5, 0x523B, 0x5374,
+ 0x5404, 0x606A, 0x6164, 0x6BBC, 0x73CF, 0x811A, 0x89BA, 0x89D2,
+ 0x95A3, 0x4F83, 0x520A, 0x58BE, 0x5978, 0x59E6, 0x5E72, 0x5E79,
+ 0x61C7, 0x63C0, 0x6746, 0x67EC, 0x687F, 0x6F97, 0x764E, 0x770B,
+ 0x78F5, 0x7A08, 0x7AFF, 0x7C21, 0x809D, 0x826E, 0x8271, 0x8AEB,
+ 0x9593, 0x4E6B, 0x559D, 0x66F7, 0x6E34, 0x78A3, 0x7AED, 0x845B,
+ 0x8910, 0x874E, 0x97A8, 0x52D8, 0x574E, 0x582A, 0x5D4C, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x611F, 0x61BE, 0x6221, 0x6562, 0x67D1, 0x6A44, 0x6E1B,
+ 0x7518, 0x75B3, 0x76E3, 0x77B0, 0x7D3A, 0x90AF, 0x9451, 0x9452,
+ 0x9F95, 0x5323, 0x5CAC, 0x7532, 0x80DB, 0x9240, 0x9598, 0x525B,
+ 0x5808, 0x59DC, 0x5CA1, 0x5D17, 0x5EB7, 0x5F3A, 0x5F4A, 0x6177,
+ 0x6C5F, 0x757A, 0x7586, 0x7CE0, 0x7D73, 0x7DB1, 0x7F8C, 0x8154,
+ 0x8221, 0x8591, 0x8941, 0x8B1B, 0x92FC, 0x964D, 0x9C47, 0x4ECB,
+ 0x4EF7, 0x500B, 0x51F1, 0x584F, 0x6137, 0x613E, 0x6168, 0x6539,
+ 0x69EA, 0x6F11, 0x75A5, 0x7686, 0x76D6, 0x7B87, 0x82A5, 0x84CB,
+ 0xF900, 0x93A7, 0x958B, 0x5580, 0x5BA2, 0x5751, 0xF901, 0x7CB3,
+ 0x7FB9, 0x91B5, 0x5028, 0x53BB, 0x5C45, 0x5DE8, 0x62D2, 0x636E,
+ 0x64DA, 0x64E7, 0x6E20, 0x70AC, 0x795B, 0x8DDD, 0x8E1E, 0xF902,
+ 0x907D, 0x9245, 0x92F8, 0x4E7E, 0x4EF6, 0x5065, 0x5DFE, 0x5EFA,
+ 0x6106, 0x6957, 0x8171, 0x8654, 0x8E47, 0x9375, 0x9A2B, 0x4E5E,
+ 0x5091, 0x6770, 0x6840, 0x5109, 0x528D, 0x5292, 0x6AA2, ALTCHR,
+/* 0xE130 - 0xE1FF */
+ ALTCHR, 0x77BC, 0x9210, 0x9ED4, 0x52AB, 0x602F, 0x8FF2, 0x5048,
+ 0x61A9, 0x63ED, 0x64CA, 0x683C, 0x6A84, 0x6FC0, 0x8188, 0x89A1,
+ 0x9694, 0x5805, 0x727D, 0x72AC, 0x7504, 0x7D79, 0x7E6D, 0x80A9,
+ 0x898B, 0x8B74, 0x9063, 0x9D51, 0x6289, 0x6C7A, 0x6F54, 0x7D50,
+ 0x7F3A, 0x8A23, 0x517C, 0x614A, 0x7B9D, 0x8B19, 0x9257, 0x938C,
+ 0x4EAC, 0x4FD3, 0x501E, 0x50BE, 0x5106, 0x52C1, 0x52CD, 0x537F,
+ 0x5770, 0x5883, 0x5E9A, 0x5F91, 0x6176, 0x61AC, 0x64CE, 0x656C,
+ 0x666F, 0x66BB, 0x66F4, 0x6897, 0x6D87, 0x7085, 0x70F1, 0x749F,
+ 0x74A5, 0x74CA, 0x75D9, 0x786C, 0x78EC, 0x7ADF, 0x7AF6, 0x7D45,
+ 0x7D93, 0x8015, 0x803F, 0x811B, 0x8396, 0x8B66, 0x8F15, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9015, 0x93E1, 0x9803, 0x9838, 0x9A5A, 0x9BE8, 0x4FC2,
+ 0x5553, 0x583A, 0x5951, 0x5B63, 0x5C46, 0x60B8, 0x6212, 0x6842,
+ 0x68B0, 0x68E8, 0x6EAA, 0x754C, 0x7678, 0x78CE, 0x7A3D, 0x7CFB,
+ 0x7E6B, 0x7E7C, 0x8A08, 0x8AA1, 0x8C3F, 0x968E, 0x9DC4, 0x53E4,
+ 0x53E9, 0x544A, 0x5471, 0x56FA, 0x59D1, 0x5B64, 0x5C3B, 0x5EAB,
+ 0x62F7, 0x6537, 0x6545, 0x6572, 0x66A0, 0x67AF, 0x69C1, 0x6CBD,
+ 0x75FC, 0x7690, 0x777E, 0x7A3F, 0x7F94, 0x8003, 0x80A1, 0x818F,
+ 0x82E6, 0x82FD, 0x83F0, 0x85C1, 0x8831, 0x88B4, 0x8AA5, 0xF903,
+ 0x8F9C, 0x932E, 0x96C7, 0x9867, 0x9AD8, 0x9F13, 0x54ED, 0x659B,
+ 0x66F2, 0x688F, 0x7A40, 0x8C37, 0x9D60, 0x56F0, 0x5764, 0x5D11,
+ 0x6606, 0x68B1, 0x68CD, 0x6EFE, 0x7428, 0x889E, 0x9BE4, 0x6C68,
+ 0xF904, 0x9AA8, 0x4F9B, 0x516C, 0x5171, 0x529F, 0x5B54, 0x5DE5,
+ 0x6050, 0x606D, 0x62F1, 0x63A7, 0x653B, 0x73D9, 0x7A7A, 0x86A3,
+ 0x8CA2, 0x978F, 0x4E32, 0x5BE1, 0x6208, 0x679C, 0x74DC, ALTCHR,
+/* 0xE230 - 0xE2FF */
+ ALTCHR, 0x79D1, 0x83D3, 0x8A87, 0x8AB2, 0x8DE8, 0x904E, 0x934B,
+ 0x9846, 0x5ED3, 0x69E8, 0x85FF, 0x90ED, 0xF905, 0x51A0, 0x5B98,
+ 0x5BEC, 0x6163, 0x68FA, 0x6B3E, 0x704C, 0x742F, 0x74D8, 0x7BA1,
+ 0x7F50, 0x83C5, 0x89C0, 0x8CAB, 0x95DC, 0x9928, 0x522E, 0x605D,
+ 0x62EC, 0x9002, 0x4F8A, 0x5149, 0x5321, 0x58D9, 0x5EE3, 0x66E0,
+ 0x6D38, 0x709A, 0x72C2, 0x73D6, 0x7B50, 0x80F1, 0x945B, 0x5366,
+ 0x639B, 0x7F6B, 0x4E56, 0x5080, 0x584A, 0x58DE, 0x602A, 0x6127,
+ 0x62D0, 0x69D0, 0x9B41, 0x5B8F, 0x7D18, 0x80B1, 0x8F5F, 0x4EA4,
+ 0x50D1, 0x54AC, 0x55AC, 0x5B0C, 0x5DA0, 0x5DE7, 0x652A, 0x654E,
+ 0x6821, 0x6A4B, 0x72E1, 0x768E, 0x77EF, 0x7D5E, 0x7FF9, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x81A0, 0x854E, 0x86DF, 0x8F03, 0x8F4E, 0x90CA, 0x9903,
+ 0x9A55, 0x9BAB, 0x4E18, 0x4E45, 0x4E5D, 0x4EC7, 0x4FF1, 0x5177,
+ 0x52FE, 0x5340, 0x53E3, 0x53E5, 0x548E, 0x5614, 0x5775, 0x57A2,
+ 0x5BC7, 0x5D87, 0x5ED0, 0x61FC, 0x62D8, 0x6551, 0x67B8, 0x67E9,
+ 0x69CB, 0x6B50, 0x6BC6, 0x6BEC, 0x6C42, 0x6E9D, 0x7078, 0x72D7,
+ 0x7396, 0x7403, 0x77BF, 0x77E9, 0x7A76, 0x7D7F, 0x8009, 0x81FC,
+ 0x8205, 0x820A, 0x82DF, 0x8862, 0x8B33, 0x8CFC, 0x8EC0, 0x9011,
+ 0x90B1, 0x9264, 0x92B6, 0x99D2, 0x9A45, 0x9CE9, 0x9DD7, 0x9F9C,
+ 0x570B, 0x5C40, 0x83CA, 0x97A0, 0x97AB, 0x9EB4, 0x541B, 0x7A98,
+ 0x7FA4, 0x88D9, 0x8ECD, 0x90E1, 0x5800, 0x5C48, 0x6398, 0x7A9F,
+ 0x5BAE, 0x5F13, 0x7A79, 0x7AAE, 0x828E, 0x8EAC, 0x5026, 0x5238,
+ 0x52F8, 0x5377, 0x5708, 0x62F3, 0x6372, 0x6B0A, 0x6DC3, 0x7737,
+ 0x53A5, 0x7357, 0x8568, 0x8E76, 0x95D5, 0x673A, 0x6AC3, 0x6F70,
+ 0x8A6D, 0x8ECC, 0x994B, 0xF906, 0x6677, 0x6B78, 0x8CB4, ALTCHR,
+/* 0xE330 - 0xE3FF */
+ ALTCHR, 0x9B3C, 0xF907, 0x53EB, 0x572D, 0x594E, 0x63C6, 0x69FB,
+ 0x73EA, 0x7845, 0x7ABA, 0x7AC5, 0x7CFE, 0x8475, 0x898F, 0x8D73,
+ 0x9035, 0x95A8, 0x52FB, 0x5747, 0x7547, 0x7B60, 0x83CC, 0x921E,
+ 0xF908, 0x6A58, 0x514B, 0x524B, 0x5287, 0x621F, 0x68D8, 0x6975,
+ 0x9699, 0x50C5, 0x52A4, 0x52E4, 0x61C3, 0x65A4, 0x6839, 0x69FF,
+ 0x747E, 0x7B4B, 0x82B9, 0x83EB, 0x89B2, 0x8B39, 0x8FD1, 0x9949,
+ 0xF909, 0x4ECA, 0x5997, 0x64D2, 0x6611, 0x6A8E, 0x7434, 0x7981,
+ 0x79BD, 0x82A9, 0x887E, 0x887F, 0x895F, 0xF90A, 0x9326, 0x4F0B,
+ 0x53CA, 0x6025, 0x6271, 0x6C72, 0x7D1A, 0x7D66, 0x4E98, 0x5162,
+ 0x77DC, 0x80AF, 0x4F01, 0x4F0E, 0x5176, 0x5180, 0x55DC, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5668, 0x573B, 0x57FA, 0x57FC, 0x5914, 0x5947, 0x5993,
+ 0x5BC4, 0x5C90, 0x5D0E, 0x5DF1, 0x5E7E, 0x5FCC, 0x6280, 0x65D7,
+ 0x65E3, 0x671E, 0x671F, 0x675E, 0x68CB, 0x68C4, 0x6A5F, 0x6B3A,
+ 0x6C23, 0x6C7D, 0x6C82, 0x6DC7, 0x7398, 0x7426, 0x742A, 0x7482,
+ 0x74A3, 0x7578, 0x757F, 0x7881, 0x78EF, 0x7941, 0x7947, 0x7948,
+ 0x797A, 0x7B95, 0x7D00, 0x7DBA, 0x7F88, 0x8006, 0x802D, 0x808C,
+ 0x8A18, 0x8B4F, 0x8C48, 0x8D77, 0x9321, 0x9324, 0x98E2, 0x9951,
+ 0x9A0E, 0x9A0F, 0x9A65, 0x9E92, 0x7DCA, 0x4F76, 0x5409, 0x62EE,
+ 0x6854, 0x91D1, 0x55AB, 0x513A, 0xF90B, 0xF90C, 0x5A1C, 0x61E6,
+ 0xF90D, 0x62CF, 0x62FF, 0xF90E, 0xF90F, 0xF910, 0xF911, 0xF912,
+ 0xF913, 0x90A3, 0xF914, 0xF915, 0xF916, 0xF917, 0xF918, 0x8AFE,
+ 0xF919, 0xF91A, 0xF91B, 0xF91C, 0x6696, 0xF91D, 0x7156, 0xF91E,
+ 0xF91F, 0x96E3, 0xF920, 0x634F, 0x637A, 0x5357, 0xF921, 0x678F,
+ 0x6960, 0x6E73, 0xF922, 0x7537, 0xF923, 0xF924, 0xF925, ALTCHR,
+/* 0xE430 - 0xE4FF */
+ ALTCHR, 0x7D0D, 0xF926, 0xF927, 0x8872, 0x56CA, 0x5A18, 0xF928,
+ 0xF929, 0xF92A, 0xF92B, 0xF92C, 0x4E43, 0xF92D, 0x5167, 0x5948,
+ 0x67F0, 0x8010, 0xF92E, 0x5973, 0x5E74, 0x649A, 0x79CA, 0x5FF5,
+ 0x606C, 0x62C8, 0x637B, 0x5BE7, 0x5BD7, 0x52AA, 0xF92F, 0x5974,
+ 0x5F29, 0x6012, 0xF930, 0xF931, 0xF932, 0x7459, 0xF933, 0xF934,
+ 0xF935, 0xF936, 0xF937, 0xF938, 0x99D1, 0xF939, 0xF93A, 0xF93B,
+ 0xF93C, 0xF93D, 0xF93E, 0xF93F, 0xF940, 0xF941, 0xF942, 0xF943,
+ 0x6FC3, 0xF944, 0xF945, 0x81BF, 0x8FB2, 0x60F1, 0xF946, 0xF947,
+ 0x8166, 0xF948, 0xF949, 0x5C3F, 0xF94A, 0xF94B, 0xF94C, 0xF94D,
+ 0xF94E, 0xF94F, 0xF950, 0xF951, 0x5AE9, 0x8A25, 0x677B, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7D10, 0xF952, 0xF953, 0xF954, 0xF955, 0xF956, 0xF957,
+ 0x80FD, 0xF958, 0xF959, 0x5C3C, 0x6CE5, 0x533F, 0x6EBA, 0x591A,
+ 0x8336, 0x4E39, 0x4EB6, 0x4F46, 0x55AE, 0x5718, 0x58C7, 0x5F56,
+ 0x65B7, 0x65E6, 0x6A80, 0x6BB5, 0x6E4D, 0x77ED, 0x7AEF, 0x7C1E,
+ 0x7DDE, 0x86CB, 0x8892, 0x9132, 0x935B, 0x64BB, 0x6FBE, 0x737A,
+ 0x75B8, 0x9054, 0x5556, 0x574D, 0x61BA, 0x64D4, 0x66C7, 0x6DE1,
+ 0x6E5B, 0x6F6D, 0x6FB9, 0x75F0, 0x8043, 0x81BD, 0x8541, 0x8983,
+ 0x8AC7, 0x8B5A, 0x931F, 0x6C93, 0x7553, 0x7B54, 0x8E0F, 0x905D,
+ 0x5510, 0x5802, 0x5858, 0x5E62, 0x6207, 0x649E, 0x68E0, 0x7576,
+ 0x7CD6, 0x87B3, 0x9EE8, 0x4EE3, 0x5788, 0x576E, 0x5927, 0x5C0D,
+ 0x5CB1, 0x5E36, 0x5F85, 0x6234, 0x64E1, 0x73B3, 0x81FA, 0x888B,
+ 0x8CB8, 0x968A, 0x9EDB, 0x5B85, 0x5FB7, 0x60B3, 0x5012, 0x5200,
+ 0x5230, 0x5716, 0x5835, 0x5857, 0x5C0E, 0x5C60, 0x5CF6, 0x5D8B,
+ 0x5EA6, 0x5F92, 0x60BC, 0x6311, 0x6389, 0x6417, 0x6843, ALTCHR,
+/* 0xE530 - 0xE5FF */
+ ALTCHR, 0x68F9, 0x6AC2, 0x6DD8, 0x6E21, 0x6ED4, 0x6FE4, 0x71FE,
+ 0x76DC, 0x7779, 0x79B1, 0x7A3B, 0x8404, 0x89A9, 0x8CED, 0x8DF3,
+ 0x8E48, 0x9003, 0x9014, 0x9053, 0x90FD, 0x934D, 0x9676, 0x97DC,
+ 0x6BD2, 0x7006, 0x7258, 0x72A2, 0x7368, 0x7763, 0x79BF, 0x7BE4,
+ 0x7E9B, 0x8B80, 0x58A9, 0x60C7, 0x6566, 0x65FD, 0x66BE, 0x6C8C,
+ 0x711E, 0x71C9, 0x8C5A, 0x9813, 0x4E6D, 0x7A81, 0x4EDD, 0x51AC,
+ 0x51CD, 0x52D5, 0x540C, 0x61A7, 0x6771, 0x6850, 0x68DF, 0x6D1E,
+ 0x6F7C, 0x75BC, 0x77B3, 0x7AE5, 0x80F4, 0x8463, 0x9285, 0x515C,
+ 0x6597, 0x675C, 0x6793, 0x75D8, 0x7AC7, 0x8373, 0xF95A, 0x8C46,
+ 0x9017, 0x982D, 0x5C6F, 0x81C0, 0x829A, 0x9041, 0x906F, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x920D, 0x5F97, 0x5D9D, 0x6A59, 0x71C8, 0x767B, 0x7B49,
+ 0x85E4, 0x8B04, 0x9127, 0x9A30, 0x5587, 0x61F6, 0xF95B, 0x7669,
+ 0x7F85, 0x863F, 0x87BA, 0x88F8, 0x908F, 0xF95C, 0x6D1B, 0x70D9,
+ 0x73DE, 0x7D61, 0x843D, 0xF95D, 0x916A, 0x99F1, 0xF95E, 0x4E82,
+ 0x5375, 0x6B04, 0x6B12, 0x703E, 0x721B, 0x862D, 0x9E1E, 0x524C,
+ 0x8FA3, 0x5D50, 0x64E5, 0x652C, 0x6B16, 0x6FEB, 0x7C43, 0x7E9C,
+ 0x85CD, 0x8964, 0x89BD, 0x62C9, 0x81D8, 0x881F, 0x5ECA, 0x6717,
+ 0x6D6A, 0x72FC, 0x7405, 0x746F, 0x8782, 0x90DE, 0x4F86, 0x5D0D,
+ 0x5FA0, 0x840A, 0x51B7, 0x63A0, 0x7565, 0x4EAE, 0x5006, 0x5169,
+ 0x51C9, 0x6881, 0x6A11, 0x7CAE, 0x7CB1, 0x7CE7, 0x826F, 0x8AD2,
+ 0x8F1B, 0x91CF, 0x4FB6, 0x5137, 0x52F5, 0x5442, 0x5EEC, 0x616E,
+ 0x623E, 0x65C5, 0x6ADA, 0x6FFE, 0x792A, 0x85DC, 0x8823, 0x95AD,
+ 0x9A62, 0x9A6A, 0x9E97, 0x9ECE, 0x529B, 0x66C6, 0x6B77, 0x701D,
+ 0x792B, 0x8F62, 0x9742, 0x6190, 0x6200, 0x6523, 0x6F23, ALTCHR,
+/* 0xE630 - 0xE6FF */
+ ALTCHR, 0x7149, 0x7489, 0x7DF4, 0x806F, 0x84EE, 0x8F26, 0x9023,
+ 0x934A, 0x51BD, 0x5217, 0x52A3, 0x6D0C, 0x70C8, 0x88C2, 0x5EC9,
+ 0x6582, 0x6BAE, 0x6FC2, 0x7C3E, 0x7375, 0x4EE4, 0x4F36, 0x56F9,
+ 0xF95F, 0x5CBA, 0x5DBA, 0x601C, 0x73B2, 0x7B2D, 0x7F9A, 0x7FCE,
+ 0x8046, 0x901E, 0x9234, 0x96F6, 0x9748, 0x9818, 0x9F61, 0x4F8B,
+ 0x6FA7, 0x79AE, 0x91B4, 0x96B7, 0x52DE, 0xF960, 0x6488, 0x64C4,
+ 0x6AD3, 0x6F5E, 0x7018, 0x7210, 0x76E7, 0x8001, 0x8606, 0x865C,
+ 0x8DEF, 0x8F05, 0x9732, 0x9B6F, 0x9DFA, 0x9E75, 0x788C, 0x797F,
+ 0x7DA0, 0x83C9, 0x9304, 0x9E7F, 0x9E93, 0x8AD6, 0x58DF, 0x5F04,
+ 0x6727, 0x7027, 0x74CF, 0x7C60, 0x807E, 0x5121, 0x7028, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7262, 0x78CA, 0x8CC2, 0x8CDA, 0x8CF4, 0x96F7, 0x4E86,
+ 0x50DA, 0x5BEE, 0x5ED6, 0x6599, 0x71CE, 0x7642, 0x77AD, 0x804A,
+ 0x84FC, 0x907C, 0x9B27, 0x9F8D, 0x58D8, 0x5A41, 0x5C62, 0x6A13,
+ 0x6DDA, 0x6F0F, 0x763B, 0x7D2F, 0x7E37, 0x851E, 0x8938, 0x93E4,
+ 0x964B, 0x5289, 0x65D2, 0x67F3, 0x69B4, 0x6D41, 0x6E9C, 0x700F,
+ 0x7409, 0x7460, 0x7559, 0x7624, 0x786B, 0x8B2C, 0x985E, 0x516D,
+ 0x622E, 0x9678, 0x4F96, 0x502B, 0x5D19, 0x6DEA, 0x7DB8, 0x8F2A,
+ 0x5F8B, 0x6144, 0x6817, 0xF961, 0x9686, 0x52D2, 0x808B, 0x51DC,
+ 0x51CC, 0x695E, 0x7A1C, 0x7DBE, 0x83F1, 0x9675, 0x4FDA, 0x5229,
+ 0x5398, 0x540F, 0x550E, 0x5C65, 0x60A7, 0x674E, 0x68A8, 0x6D6C,
+ 0x7281, 0x72F8, 0x7406, 0x7483, 0xF962, 0x75E2, 0x7C6C, 0x7F79,
+ 0x7FB8, 0x8389, 0x88CF, 0x88E1, 0x91CC, 0x91D0, 0x96E2, 0x9BC9,
+ 0x541D, 0x6F7E, 0x71D0, 0x7498, 0x85FA, 0x8EAA, 0x96A3, 0x9C57,
+ 0x9E9F, 0x6797, 0x6DCB, 0x7433, 0x81E8, 0x9716, 0x782C, ALTCHR,
+/* 0xE730 - 0xE7FF */
+ ALTCHR, 0x7ACB, 0x7B20, 0x7C92, 0x6469, 0x746A, 0x75F2, 0x78BC,
+ 0x78E8, 0x99AC, 0x9B54, 0x9EBB, 0x5BDE, 0x5E55, 0x6F20, 0x819C,
+ 0x83AB, 0x9088, 0x4E07, 0x534D, 0x5A29, 0x5DD2, 0x5F4E, 0x6162,
+ 0x633D, 0x6669, 0x66FC, 0x6EFF, 0x6F2B, 0x7063, 0x779E, 0x842C,
+ 0x8513, 0x883B, 0x8F13, 0x9945, 0x9C3B, 0x551C, 0x62B9, 0x672B,
+ 0x6CAB, 0x8309, 0x896A, 0x977A, 0x4EA1, 0x5984, 0x5FD8, 0x5FD9,
+ 0x671B, 0x7DB2, 0x7F54, 0x8292, 0x832B, 0x83BD, 0x8F1E, 0x9099,
+ 0x57CB, 0x59B9, 0x5A92, 0x5BD0, 0x6627, 0x679A, 0x6885, 0x6BCF,
+ 0x7164, 0x7F75, 0x8CB7, 0x8CE3, 0x9081, 0x9B45, 0x8108, 0x8C8A,
+ 0x964C, 0x9A40, 0x9EA5, 0x5B5F, 0x6C13, 0x731B, 0x76F2, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x76DF, 0x840C, 0x51AA, 0x8993, 0x514D, 0x5195, 0x52C9,
+ 0x68C9, 0x6C94, 0x7704, 0x7720, 0x7DBF, 0x7DEC, 0x9762, 0x9EB5,
+ 0x6EC5, 0x8511, 0x51A5, 0x540D, 0x547D, 0x660E, 0x669D, 0x6927,
+ 0x6E9F, 0x76BF, 0x7791, 0x8317, 0x84C2, 0x879F, 0x9169, 0x9298,
+ 0x9CF4, 0x8882, 0x4FAE, 0x5192, 0x52DF, 0x59C6, 0x5E3D, 0x6155,
+ 0x6478, 0x6479, 0x66AE, 0x67D0, 0x6A21, 0x6BCD, 0x6BDB, 0x725F,
+ 0x7261, 0x7441, 0x7738, 0x77DB, 0x8017, 0x82BC, 0x8305, 0x8B00,
+ 0x8B28, 0x8C8C, 0x6728, 0x6C90, 0x7267, 0x76EE, 0x7766, 0x7A46,
+ 0x9DA9, 0x6B7F, 0x6C92, 0x5922, 0x6726, 0x8499, 0x536F, 0x5893,
+ 0x5999, 0x5EDF, 0x63CF, 0x6634, 0x6773, 0x6E3A, 0x732B, 0x7AD7,
+ 0x82D7, 0x9328, 0x52D9, 0x5DEB, 0x61AE, 0x61CB, 0x620A, 0x62C7,
+ 0x64AB, 0x65E0, 0x6959, 0x6B66, 0x6BCB, 0x7121, 0x73F7, 0x755D,
+ 0x7E46, 0x821E, 0x8302, 0x856A, 0x8AA3, 0x8CBF, 0x9727, 0x9D61,
+ 0x58A8, 0x9ED8, 0x5011, 0x520E, 0x543B, 0x554F, 0x6587, ALTCHR,
+/* 0xE830 - 0xE8FF */
+ ALTCHR, 0x6C76, 0x7D0A, 0x7D0B, 0x805E, 0x868A, 0x9580, 0x96EF,
+ 0x52FF, 0x6C95, 0x7269, 0x5473, 0x5A9A, 0x5C3E, 0x5D4B, 0x5F4C,
+ 0x5FAE, 0x672A, 0x68B6, 0x6963, 0x6E3C, 0x6E44, 0x7709, 0x7C73,
+ 0x7F8E, 0x8587, 0x8B0E, 0x8FF7, 0x9761, 0x9EF4, 0x5CB7, 0x60B6,
+ 0x610D, 0x61AB, 0x654F, 0x65FB, 0x65FC, 0x6C11, 0x6CEF, 0x739F,
+ 0x73C9, 0x7DE1, 0x9594, 0x5BC6, 0x871C, 0x8B10, 0x525D, 0x535A,
+ 0x62CD, 0x640F, 0x64B2, 0x6734, 0x6A38, 0x6CCA, 0x73C0, 0x749E,
+ 0x7B94, 0x7C95, 0x7E1B, 0x818A, 0x8236, 0x8584, 0x8FEB, 0x96F9,
+ 0x99C1, 0x4F34, 0x534A, 0x53CD, 0x53DB, 0x62CC, 0x642C, 0x6500,
+ 0x6591, 0x69C3, 0x6CEE, 0x6F58, 0x73ED, 0x7554, 0x7622, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x76E4, 0x76FC, 0x78D0, 0x78FB, 0x792C, 0x7D46, 0x822C,
+ 0x87E0, 0x8FD4, 0x9812, 0x98EF, 0x52C3, 0x62D4, 0x64A5, 0x6E24,
+ 0x6F51, 0x767C, 0x8DCB, 0x91B1, 0x9262, 0x9AEE, 0x9B43, 0x5023,
+ 0x508D, 0x574A, 0x59A8, 0x5C28, 0x5E47, 0x5F77, 0x623F, 0x653E,
+ 0x65B9, 0x65C1, 0x6609, 0x678B, 0x699C, 0x6EC2, 0x78C5, 0x7D21,
+ 0x80AA, 0x8180, 0x822B, 0x82B3, 0x84A1, 0x868C, 0x8A2A, 0x8B17,
+ 0x90A6, 0x9632, 0x9F90, 0x500D, 0x4FF3, 0xF963, 0x57F9, 0x5F98,
+ 0x62DC, 0x6392, 0x676F, 0x6E43, 0x7119, 0x76C3, 0x80CC, 0x80DA,
+ 0x88F4, 0x88F5, 0x8919, 0x8CE0, 0x8F29, 0x914D, 0x966A, 0x4F2F,
+ 0x4F70, 0x5E1B, 0x67CF, 0x6822, 0x767D, 0x767E, 0x9B44, 0x5E61,
+ 0x6A0A, 0x7169, 0x71D4, 0x756A, 0xF964, 0x7E41, 0x8543, 0x85E9,
+ 0x98DC, 0x4F10, 0x7B4F, 0x7F70, 0x95A5, 0x51E1, 0x5E06, 0x68B5,
+ 0x6C3E, 0x6C4E, 0x6CDB, 0x72AF, 0x7BC4, 0x8303, 0x6CD5, 0x743A,
+ 0x50FB, 0x5288, 0x58C1, 0x64D8, 0x6A97, 0x74A7, 0x7656, ALTCHR,
+/* 0xE930 - 0xE9FF */
+ ALTCHR, 0x78A7, 0x8617, 0x95E2, 0x9739, 0xF965, 0x535E, 0x5F01,
+ 0x8B8A, 0x8FA8, 0x8FAF, 0x908A, 0x5225, 0x77A5, 0x9C49, 0x9F08,
+ 0x4E19, 0x5002, 0x5175, 0x5C5B, 0x5E77, 0x661E, 0x663A, 0x67C4,
+ 0x68C5, 0x70B3, 0x7501, 0x75C5, 0x79C9, 0x7ADD, 0x8F27, 0x9920,
+ 0x9A08, 0x4FDD, 0x5821, 0x5831, 0x5BF6, 0x666E, 0x6B65, 0x6D11,
+ 0x6E7A, 0x6F7D, 0x73E4, 0x752B, 0x83E9, 0x88DC, 0x8913, 0x8B5C,
+ 0x8F14, 0x4F0F, 0x50D5, 0x5310, 0x535C, 0x5B93, 0x5FA9, 0x670D,
+ 0x798F, 0x8179, 0x832F, 0x8514, 0x8907, 0x8986, 0x8F39, 0x8F3B,
+ 0x99A5, 0x9C12, 0x672C, 0x4E76, 0x4FF8, 0x5949, 0x5C01, 0x5CEF,
+ 0x5CF0, 0x6367, 0x68D2, 0x70FD, 0x71A2, 0x742B, 0x7E2B, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x84EC, 0x8702, 0x9022, 0x92D2, 0x9CF3, 0x4E0D, 0x4ED8,
+ 0x4FEF, 0x5085, 0x5256, 0x526F, 0x5426, 0x5490, 0x57E0, 0x592B,
+ 0x5A66, 0x5B5A, 0x5B75, 0x5BCC, 0x5E9C, 0xF966, 0x6276, 0x6577,
+ 0x65A7, 0x6D6E, 0x6EA5, 0x7236, 0x7B26, 0x7C3F, 0x7F36, 0x8150,
+ 0x8151, 0x819A, 0x8240, 0x8299, 0x83A9, 0x8A03, 0x8CA0, 0x8CE6,
+ 0x8CFB, 0x8D74, 0x8DBA, 0x90E8, 0x91DC, 0x961C, 0x9644, 0x99D9,
+ 0x9CE7, 0x5317, 0x5206, 0x5429, 0x5674, 0x58B3, 0x5954, 0x596E,
+ 0x5FFF, 0x61A4, 0x626E, 0x6610, 0x6C7E, 0x711A, 0x76C6, 0x7C89,
+ 0x7CDE, 0x7D1B, 0x82AC, 0x8CC1, 0x96F0, 0xF967, 0x4F5B, 0x5F17,
+ 0x5F7F, 0x62C2, 0x5D29, 0x670B, 0x68DA, 0x787C, 0x7E43, 0x9D6C,
+ 0x4E15, 0x5099, 0x5315, 0x532A, 0x5351, 0x5983, 0x5A62, 0x5E87,
+ 0x60B2, 0x618A, 0x6249, 0x6279, 0x6590, 0x6787, 0x69A7, 0x6BD4,
+ 0x6BD6, 0x6BD7, 0x6BD8, 0x6CB8, 0xF968, 0x7435, 0x75FA, 0x7812,
+ 0x7891, 0x79D5, 0x79D8, 0x7C83, 0x7DCB, 0x7FE1, 0x80A5, ALTCHR,
+/* 0xEA30 - 0xEAFF */
+ ALTCHR, 0x813E, 0x81C2, 0x83F2, 0x871A, 0x88E8, 0x8AB9, 0x8B6C,
+ 0x8CBB, 0x9119, 0x975E, 0x98DB, 0x9F3B, 0x56AC, 0x5B2A, 0x5F6C,
+ 0x658C, 0x6AB3, 0x6BAF, 0x6D5C, 0x6FF1, 0x7015, 0x725D, 0x73AD,
+ 0x8CA7, 0x8CD3, 0x983B, 0x6191, 0x6C37, 0x8058, 0x9A01, 0x4E4D,
+ 0x4E8B, 0x4E9B, 0x4ED5, 0x4F3A, 0x4F3C, 0x4F7F, 0x4FDF, 0x50FF,
+ 0x53F2, 0x53F8, 0x5506, 0x55E3, 0x56DB, 0x58EB, 0x5962, 0x5A11,
+ 0x5BEB, 0x5BFA, 0x5C04, 0x5DF3, 0x5E2B, 0x5F99, 0x601D, 0x6368,
+ 0x659C, 0x65AF, 0x67F6, 0x67FB, 0x68AD, 0x6B7B, 0x6C99, 0x6CD7,
+ 0x6E23, 0x7009, 0x7345, 0x7802, 0x793E, 0x7940, 0x7960, 0x79C1,
+ 0x7BE9, 0x7D17, 0x7D72, 0x8086, 0x820D, 0x838E, 0x84D1, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x86C7, 0x88DF, 0x8A50, 0x8A5E, 0x8B1D, 0x8CDC, 0x8D66,
+ 0x8FAD, 0x90AA, 0x98FC, 0x99DF, 0x9E9D, 0x524A, 0xF969, 0x6714,
+ 0xF96A, 0x5098, 0x522A, 0x5C71, 0x6563, 0x6C55, 0x73CA, 0x7523,
+ 0x759D, 0x7B97, 0x849C, 0x9178, 0x9730, 0x4E77, 0x6492, 0x6BBA,
+ 0x715E, 0x85A9, 0x4E09, 0xF96B, 0x6749, 0x68EE, 0x6E17, 0x829F,
+ 0x8518, 0x886B, 0x63F7, 0x6F81, 0x9212, 0x98AF, 0x4E0A, 0x50B7,
+ 0x50CF, 0x511F, 0x5546, 0x55AA, 0x5617, 0x5B40, 0x5C19, 0x5CE0,
+ 0x5E38, 0x5E8A, 0x5EA0, 0x5EC2, 0x60F3, 0x6851, 0x6A61, 0x6E58,
+ 0x723D, 0x7240, 0x72C0, 0x76F8, 0x7965, 0x7BB1, 0x7FD4, 0x88F3,
+ 0x89F4, 0x8A73, 0x8C61, 0x8CDE, 0x971C, 0x585E, 0x74BD, 0x8CFD,
+ 0x55C7, 0xF96C, 0x7A61, 0x7D22, 0x8272, 0x7272, 0x751F, 0x7525,
+ 0xF96D, 0x7B19, 0x5885, 0x58FB, 0x5DBC, 0x5E8F, 0x5EB6, 0x5F90,
+ 0x6055, 0x6292, 0x637F, 0x654D, 0x6691, 0x66D9, 0x66F8, 0x6816,
+ 0x68F2, 0x7280, 0x745E, 0x7B6E, 0x7D6E, 0x7DD6, 0x7F72, ALTCHR,
+/* 0xEB30 - 0xEBFF */
+ ALTCHR, 0x80E5, 0x8212, 0x85AF, 0x897F, 0x8A93, 0x901D, 0x92E4,
+ 0x9ECD, 0x9F20, 0x5915, 0x596D, 0x5E2D, 0x60DC, 0x6614, 0x6673,
+ 0x6790, 0x6C50, 0x6DC5, 0x6F5F, 0x77F3, 0x78A9, 0x84C6, 0x91CB,
+ 0x932B, 0x4ED9, 0x50CA, 0x5148, 0x5584, 0x5B0B, 0x5BA3, 0x6247,
+ 0x657E, 0x65CB, 0x6E32, 0x717D, 0x7401, 0x7444, 0x7487, 0x74BF,
+ 0x766C, 0x79AA, 0x7DDA, 0x7E55, 0x7FA8, 0x817A, 0x81B3, 0x8239,
+ 0x861A, 0x87EC, 0x8A75, 0x8DE3, 0x9078, 0x9291, 0x9425, 0x994D,
+ 0x9BAE, 0x5368, 0x5C51, 0x6954, 0x6CC4, 0x6D29, 0x6E2B, 0x820C,
+ 0x859B, 0x893B, 0x8A2D, 0x8AAA, 0x96EA, 0x9F67, 0x5261, 0x66B9,
+ 0x6BB2, 0x7E96, 0x87FE, 0x8D0D, 0x9583, 0x965D, 0x651D, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6D89, 0x71EE, 0xF96E, 0x57CE, 0x59D3, 0x5BAC, 0x6027,
+ 0x60FA, 0x6210, 0x661F, 0x665F, 0x7329, 0x73F9, 0x76DB, 0x7701,
+ 0x7B6C, 0x8056, 0x8072, 0x8165, 0x8AA0, 0x9192, 0x4E16, 0x52E2,
+ 0x6B72, 0x6D17, 0x7A05, 0x7B39, 0x7D30, 0xF96F, 0x8CB0, 0x53EC,
+ 0x562F, 0x5851, 0x5BB5, 0x5C0F, 0x5C11, 0x5DE2, 0x6240, 0x6383,
+ 0x6414, 0x662D, 0x68B3, 0x6CBC, 0x6D88, 0x6EAF, 0x701F, 0x70A4,
+ 0x71D2, 0x7526, 0x758F, 0x758E, 0x7619, 0x7B11, 0x7BE0, 0x7C2B,
+ 0x7D20, 0x7D39, 0x852C, 0x856D, 0x8607, 0x8A34, 0x900D, 0x9061,
+ 0x90B5, 0x92B7, 0x97F6, 0x9A37, 0x4FD7, 0x5C6C, 0x675F, 0x6D91,
+ 0x7C9F, 0x7E8C, 0x8B16, 0x8D16, 0x901F, 0x5B6B, 0x5DFD, 0x640D,
+ 0x84C0, 0x905C, 0x98E1, 0x7387, 0x5B8B, 0x609A, 0x677E, 0x6DDE,
+ 0x8A1F, 0x8AA6, 0x9001, 0x980C, 0x5237, 0xF970, 0x7051, 0x788E,
+ 0x9396, 0x8870, 0x91D7, 0x4FEE, 0x53D7, 0x55FD, 0x56DA, 0x5782,
+ 0x58FD, 0x5AC2, 0x5B88, 0x5CAB, 0x5CC0, 0x5E25, 0x6101, ALTCHR,
+/* 0xEC30 - 0xECFF */
+ ALTCHR, 0x620D, 0x624B, 0x6388, 0x641C, 0x6536, 0x6578, 0x6A39,
+ 0x6B8A, 0x6C34, 0x6D19, 0x6F31, 0x71E7, 0x72E9, 0x7378, 0x7407,
+ 0x74B2, 0x7626, 0x7761, 0x79C0, 0x7A57, 0x7AEA, 0x7CB9, 0x7D8F,
+ 0x7DAC, 0x7E61, 0x7F9E, 0x8129, 0x8331, 0x8490, 0x84DA, 0x85EA,
+ 0x8896, 0x8AB0, 0x8B90, 0x8F38, 0x9042, 0x9083, 0x916C, 0x9296,
+ 0x92B9, 0x968B, 0x96A7, 0x96A8, 0x96D6, 0x9700, 0x9808, 0x9996,
+ 0x9AD3, 0x9B1A, 0x53D4, 0x587E, 0x5919, 0x5B70, 0x5BBF, 0x6DD1,
+ 0x6F5A, 0x719F, 0x7421, 0x74B9, 0x8085, 0x83FD, 0x5DE1, 0x5F87,
+ 0x5FAA, 0x6042, 0x65EC, 0x6812, 0x696F, 0x6A53, 0x6B89, 0x6D35,
+ 0x6DF3, 0x73E3, 0x76FE, 0x77AC, 0x7B4D, 0x7D14, 0x8123, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x821C, 0x8340, 0x84F4, 0x8563, 0x8A62, 0x8AC4, 0x9187,
+ 0x931E, 0x9806, 0x99B4, 0x620C, 0x8853, 0x8FF0, 0x9265, 0x5D07,
+ 0x5D27, 0x5D69, 0x745F, 0x819D, 0x8768, 0x6FD5, 0x62FE, 0x7FD2,
+ 0x8936, 0x8972, 0x4E1E, 0x4E58, 0x50E7, 0x52DD, 0x5347, 0x627F,
+ 0x6607, 0x7E69, 0x8805, 0x965E, 0x4F8D, 0x5319, 0x5636, 0x59CB,
+ 0x5AA4, 0x5C38, 0x5C4E, 0x5C4D, 0x5E02, 0x5F11, 0x6043, 0x65BD,
+ 0x662F, 0x6642, 0x67BE, 0x67F4, 0x731C, 0x77E2, 0x793A, 0x7FC5,
+ 0x8494, 0x84CD, 0x8996, 0x8A66, 0x8A69, 0x8AE1, 0x8C55, 0x8C7A,
+ 0x57F4, 0x5BD4, 0x5F0F, 0x606F, 0x62ED, 0x690D, 0x6B96, 0x6E5C,
+ 0x7184, 0x7BD2, 0x8755, 0x8B58, 0x8EFE, 0x98DF, 0x98FE, 0x4F38,
+ 0x4F81, 0x4FE1, 0x547B, 0x5A20, 0x5BB8, 0x613C, 0x65B0, 0x6668,
+ 0x71FC, 0x7533, 0x795E, 0x7D33, 0x814E, 0x81E3, 0x8398, 0x85AA,
+ 0x85CE, 0x8703, 0x8A0A, 0x8EAB, 0x8F9B, 0xF971, 0x8FC5, 0x5931,
+ 0x5BA4, 0x5BE6, 0x6089, 0x5BE9, 0x5C0B, 0x5FC3, 0x6C81, ALTCHR,
+/* 0xED30 - 0xEDFF */
+ ALTCHR, 0xF972, 0x6DF1, 0x700B, 0x751A, 0x82AF, 0x8AF6, 0x4EC0,
+ 0x5341, 0xF973, 0x96D9, 0x6C0F, 0x4E9E, 0x4FC4, 0x5152, 0x555E,
+ 0x5A25, 0x5CE8, 0x6211, 0x7259, 0x82BD, 0x83AA, 0x86FE, 0x8859,
+ 0x8A1D, 0x963F, 0x96C5, 0x9913, 0x9D09, 0x9D5D, 0x580A, 0x5CB3,
+ 0x5DBD, 0x5E44, 0x60E1, 0x6115, 0x63E1, 0x6A02, 0x6E25, 0x9102,
+ 0x9354, 0x984E, 0x9C10, 0x9F77, 0x5B89, 0x5CB8, 0x6309, 0x664F,
+ 0x6848, 0x773C, 0x96C1, 0x978D, 0x9854, 0x9B9F, 0x65A1, 0x8B01,
+ 0x8ECB, 0x95BC, 0x5535, 0x5CA9, 0x5DD6, 0x5EB5, 0x6697, 0x764C,
+ 0x83F4, 0x95C7, 0x58D3, 0x62BC, 0x72CE, 0x9D28, 0x4EF0, 0x592E,
+ 0x600F, 0x663B, 0x6B83, 0x79E7, 0x9D26, 0x5393, 0x54C0, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x57C3, 0x5D16, 0x611B, 0x66D6, 0x6DAF, 0x788D, 0x827E,
+ 0x9698, 0x9744, 0x5384, 0x627C, 0x6396, 0x6DB2, 0x7E0A, 0x814B,
+ 0x984D, 0x6AFB, 0x7F4C, 0x9DAF, 0x9E1A, 0x4E5F, 0x503B, 0x51B6,
+ 0x591C, 0x60F9, 0x63F6, 0x6930, 0x723A, 0x8036, 0xF974, 0x91CE,
+ 0x5F31, 0xF975, 0xF976, 0x7D04, 0x82E5, 0x846F, 0x84BB, 0x85E5,
+ 0x8E8D, 0xF977, 0x4F6F, 0xF978, 0xF979, 0x58E4, 0x5B43, 0x6059,
+ 0x63DA, 0x6518, 0x656D, 0x6698, 0xF97A, 0x694A, 0x6A23, 0x6D0B,
+ 0x7001, 0x716C, 0x75D2, 0x760D, 0x79B3, 0x7A70, 0xF97B, 0x7F8A,
+ 0xF97C, 0x8944, 0xF97D, 0x8B93, 0x91C0, 0x967D, 0xF97E, 0x990A,
+ 0x5704, 0x5FA1, 0x65BC, 0x6F01, 0x7600, 0x79A6, 0x8A9E, 0x99AD,
+ 0x9B5A, 0x9F6C, 0x5104, 0x61B6, 0x6291, 0x6A8D, 0x81C6, 0x5043,
+ 0x5830, 0x5F66, 0x7109, 0x8A00, 0x8AFA, 0x5B7C, 0x8616, 0x4FFA,
+ 0x513C, 0x56B4, 0x5944, 0x63A9, 0x6DF9, 0x5DAA, 0x696D, 0x5186,
+ 0x4E88, 0x4F59, 0xF97F, 0xF980, 0xF981, 0x5982, 0xF982, ALTCHR,
+/* 0xEE30 - 0xEEFF */
+ ALTCHR, 0xF983, 0x6B5F, 0x6C5D, 0xF984, 0x74B5, 0x7916, 0xF985,
+ 0x8207, 0x8245, 0x8339, 0x8F3F, 0x8F5D, 0xF986, 0x9918, 0xF987,
+ 0xF988, 0xF989, 0x4EA6, 0xF98A, 0x57DF, 0x5F79, 0x6613, 0xF98B,
+ 0xF98C, 0x75AB, 0x7E79, 0x8B6F, 0xF98D, 0x9006, 0x9A5B, 0x56A5,
+ 0x5827, 0x59F8, 0x5A1F, 0x5BB4, 0xF98E, 0x5EF6, 0xF98F, 0xF990,
+ 0x6350, 0x633B, 0xF991, 0x693D, 0x6C87, 0x6CBF, 0x6D8E, 0x6D93,
+ 0x6DF5, 0x6F14, 0xF992, 0x70DF, 0x7136, 0x7159, 0xF993, 0x71C3,
+ 0x71D5, 0xF994, 0x784F, 0x786F, 0xF995, 0x7B75, 0x7DE3, 0xF996,
+ 0x7E2F, 0xF997, 0x884D, 0x8EDF, 0xF998, 0xF999, 0xF99A, 0x925B,
+ 0xF99B, 0x9CF6, 0xF99C, 0xF99D, 0xF99E, 0x6085, 0x6D85, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0xF99F, 0x71B1, 0xF9A0, 0xF9A1, 0x95B1, 0x53AD, 0xF9A2,
+ 0xF9A3, 0xF9A4, 0x67D3, 0xF9A5, 0x708E, 0x7130, 0x7430, 0x8276,
+ 0x82D2, 0xF9A6, 0x95BB, 0x9AE5, 0x9E7D, 0x66C4, 0xF9A7, 0x71C1,
+ 0x8449, 0xF9A8, 0xF9A9, 0x584B, 0xF9AA, 0xF9AB, 0x5DB8, 0x5F71,
+ 0xF9AC, 0x6620, 0x668E, 0x6979, 0x69AE, 0x6C38, 0x6CF3, 0x6E36,
+ 0x6F41, 0x6FDA, 0x701B, 0x702F, 0x7150, 0x71DF, 0x7370, 0xF9AD,
+ 0x745B, 0xF9AE, 0x74D4, 0x76C8, 0x7A4E, 0x7E93, 0xF9AF, 0xF9B0,
+ 0x82F1, 0x8A60, 0x8FCE, 0xF9B1, 0x9348, 0xF9B2, 0x9719, 0xF9B3,
+ 0xF9B4, 0x4E42, 0x502A, 0xF9B5, 0x5208, 0x53E1, 0x66F3, 0x6C6D,
+ 0x6FCA, 0x730A, 0x777F, 0x7A62, 0x82AE, 0x85DD, 0x8602, 0xF9B6,
+ 0x88D4, 0x8A63, 0x8B7D, 0x8C6B, 0xF9B7, 0x92B3, 0xF9B8, 0x9713,
+ 0x9810, 0x4E94, 0x4F0D, 0x4FC9, 0x50B2, 0x5348, 0x543E, 0x5433,
+ 0x55DA, 0x5862, 0x58BA, 0x5967, 0x5A1B, 0x5BE4, 0x609F, 0xF9B9,
+ 0x61CA, 0x6556, 0x65FF, 0x6664, 0x68A7, 0x6C5A, 0x6FB3, ALTCHR,
+/* 0xEF30 - 0xEFFF */
+ ALTCHR, 0x70CF, 0x71AC, 0x7352, 0x7B7D, 0x8708, 0x8AA4, 0x9C32,
+ 0x9F07, 0x5C4B, 0x6C83, 0x7344, 0x7389, 0x923A, 0x6EAB, 0x7465,
+ 0x761F, 0x7A69, 0x7E15, 0x860A, 0x5140, 0x58C5, 0x64C1, 0x74EE,
+ 0x7515, 0x7670, 0x7FC1, 0x9095, 0x96CD, 0x9954, 0x6E26, 0x74E6,
+ 0x7AA9, 0x7AAA, 0x81E5, 0x86D9, 0x8778, 0x8A1B, 0x5A49, 0x5B8C,
+ 0x5B9B, 0x68A1, 0x6900, 0x6D63, 0x73A9, 0x7413, 0x742C, 0x7897,
+ 0x7DE9, 0x7FEB, 0x8118, 0x8155, 0x839E, 0x8C4C, 0x962E, 0x9811,
+ 0x66F0, 0x5F80, 0x65FA, 0x6789, 0x6C6A, 0x738B, 0x502D, 0x5A03,
+ 0x6B6A, 0x77EE, 0x5916, 0x5D6C, 0x5DCD, 0x7325, 0x754F, 0xF9BA,
+ 0xF9BB, 0x50E5, 0x51F9, 0x582F, 0x592D, 0x5996, 0x59DA, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5BE5, 0xF9BC, 0xF9BD, 0x5DA2, 0x62D7, 0x6416, 0x6493,
+ 0x64FE, 0xF9BE, 0x66DC, 0xF9BF, 0x6A48, 0xF9C0, 0x71FF, 0x7464,
+ 0xF9C1, 0x7A88, 0x7AAF, 0x7E47, 0x7E5E, 0x8000, 0x8170, 0xF9C2,
+ 0x87EF, 0x8981, 0x8B20, 0x9059, 0xF9C3, 0x9080, 0x9952, 0x617E,
+ 0x6B32, 0x6D74, 0x7E1F, 0x8925, 0x8FB1, 0x4FD1, 0x50AD, 0x5197,
+ 0x52C7, 0x57C7, 0x5889, 0x5BB9, 0x5EB8, 0x6142, 0x6995, 0x6D8C,
+ 0x6E67, 0x6EB6, 0x7194, 0x7462, 0x7528, 0x752C, 0x8073, 0x8338,
+ 0x84C9, 0x8E0A, 0x9394, 0x93DE, 0xF9C4, 0x4E8E, 0x4F51, 0x5076,
+ 0x512A, 0x53C8, 0x53CB, 0x53F3, 0x5B87, 0x5BD3, 0x5C24, 0x611A,
+ 0x6182, 0x65F4, 0x725B, 0x7397, 0x7440, 0x76C2, 0x7950, 0x7991,
+ 0x79B9, 0x7D06, 0x7FBD, 0x828B, 0x85D5, 0x865E, 0x8FC2, 0x9047,
+ 0x90F5, 0x91EA, 0x9685, 0x96E8, 0x96E9, 0x52D6, 0x5F67, 0x65ED,
+ 0x6631, 0x682F, 0x715C, 0x7A36, 0x90C1, 0x980A, 0x4E91, 0xF9C5,
+ 0x6A52, 0x6B9E, 0x6F90, 0x7189, 0x8018, 0x82B8, 0x8553, ALTCHR,
+/* 0xF030 - 0xF0FF */
+ ALTCHR, 0x904B, 0x9695, 0x96F2, 0x97FB, 0x851A, 0x9B31, 0x4E90,
+ 0x718A, 0x96C4, 0x5143, 0x539F, 0x54E1, 0x5713, 0x5712, 0x57A3,
+ 0x5A9B, 0x5AC4, 0x5BC3, 0x6028, 0x613F, 0x63F4, 0x6C85, 0x6D39,
+ 0x6E72, 0x6E90, 0x7230, 0x733F, 0x7457, 0x82D1, 0x8881, 0x8F45,
+ 0x9060, 0xF9C6, 0x9662, 0x9858, 0x9D1B, 0x6708, 0x8D8A, 0x925E,
+ 0x4F4D, 0x5049, 0x50DE, 0x5371, 0x570D, 0x59D4, 0x5A01, 0x5C09,
+ 0x6170, 0x6690, 0x6E2D, 0x7232, 0x744B, 0x7DEF, 0x80C3, 0x840E,
+ 0x8466, 0x853F, 0x875F, 0x885B, 0x8918, 0x8B02, 0x9055, 0x97CB,
+ 0x9B4F, 0x4E73, 0x4F91, 0x5112, 0x516A, 0xF9C7, 0x552F, 0x55A9,
+ 0x5B7A, 0x5BA5, 0x5E7C, 0x5E7D, 0x5EBE, 0x60A0, 0x60DF, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x6108, 0x6109, 0x63C4, 0x6538, 0x6709, 0xF9C8, 0x67D4,
+ 0x67DA, 0xF9C9, 0x6961, 0x6962, 0x6CB9, 0x6D27, 0xF9CA, 0x6E38,
+ 0xF9CB, 0x6FE1, 0x7336, 0x7337, 0xF9CC, 0x745C, 0x7531, 0xF9CD,
+ 0x7652, 0xF9CE, 0xF9CF, 0x7DAD, 0x81FE, 0x8438, 0x88D5, 0x8A98,
+ 0x8ADB, 0x8AED, 0x8E30, 0x8E42, 0x904A, 0x903E, 0x907A, 0x9149,
+ 0x91C9, 0x936E, 0xF9D0, 0xF9D1, 0x5809, 0xF9D2, 0x6BD3, 0x8089,
+ 0x80B2, 0xF9D3, 0xF9D4, 0x5141, 0x596B, 0x5C39, 0xF9D5, 0xF9D6,
+ 0x6F64, 0x73A7, 0x80E4, 0x8D07, 0xF9D7, 0x9217, 0x958F, 0xF9D8,
+ 0xF9D9, 0xF9DA, 0xF9DB, 0x807F, 0x620E, 0x701C, 0x7D68, 0x878D,
+ 0xF9DC, 0x57A0, 0x6069, 0x6147, 0x6BB7, 0x8ABE, 0x9280, 0x96B1,
+ 0x4E59, 0x541F, 0x6DEB, 0x852D, 0x9670, 0x97F3, 0x98EE, 0x63D6,
+ 0x6CE3, 0x9091, 0x51DD, 0x61C9, 0x81BA, 0x9DF9, 0x4F9D, 0x501A,
+ 0x5100, 0x5B9C, 0x610F, 0x61FF, 0x64EC, 0x6905, 0x6BC5, 0x7591,
+ 0x77E3, 0x7FA9, 0x8264, 0x858F, 0x87FB, 0x8863, 0x8ABC, ALTCHR,
+/* 0xF130 - 0xF1FF */
+ ALTCHR, 0x8B70, 0x91AB, 0x4E8C, 0x4EE5, 0x4F0A, 0xF9DD, 0xF9DE,
+ 0x5937, 0x59E8, 0xF9DF, 0x5DF2, 0x5F1B, 0x5F5B, 0x6021, 0xF9E0,
+ 0xF9E1, 0xF9E2, 0xF9E3, 0x723E, 0x73E5, 0xF9E4, 0x7570, 0x75CD,
+ 0xF9E5, 0x79FB, 0xF9E6, 0x800C, 0x8033, 0x8084, 0x82E1, 0x8351,
+ 0xF9E7, 0xF9E8, 0x8CBD, 0x8CB3, 0x9087, 0xF9E9, 0xF9EA, 0x98F4,
+ 0x990C, 0xF9EB, 0xF9EC, 0x7037, 0x76CA, 0x7FCA, 0x7FCC, 0x7FFC,
+ 0x8B1A, 0x4EBA, 0x4EC1, 0x5203, 0x5370, 0xF9ED, 0x54BD, 0x56E0,
+ 0x59FB, 0x5BC5, 0x5F15, 0x5FCD, 0x6E6E, 0xF9EE, 0xF9EF, 0x7D6A,
+ 0x8335, 0xF9F0, 0x8693, 0x8A8D, 0xF9F1, 0x976D, 0x9777, 0xF9F2,
+ 0xF9F3, 0x4E00, 0x4F5A, 0x4F7E, 0x58F9, 0x65E5, 0x6EA2, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x9038, 0x93B0, 0x99B9, 0x4EFB, 0x58EC, 0x598A, 0x59D9,
+ 0x6041, 0xF9F4, 0xF9F5, 0x7A14, 0xF9F6, 0x834F, 0x8CC3, 0x5165,
+ 0x5344, 0xF9F7, 0xF9F8, 0xF9F9, 0x4ECD, 0x5269, 0x5B55, 0x82BF,
+ 0x4ED4, 0x523A, 0x54A8, 0x59C9, 0x59FF, 0x5B50, 0x5B57, 0x5B5C,
+ 0x6063, 0x6148, 0x6ECB, 0x7099, 0x716E, 0x7386, 0x74F7, 0x75B5,
+ 0x78C1, 0x7D2B, 0x8005, 0x81EA, 0x8328, 0x8517, 0x85C9, 0x8AEE,
+ 0x8CC7, 0x96CC, 0x4F5C, 0x52FA, 0x56BC, 0x65AB, 0x6628, 0x707C,
+ 0x70B8, 0x7235, 0x7DBD, 0x828D, 0x914C, 0x96C0, 0x9D72, 0x5B71,
+ 0x68E7, 0x6B98, 0x6F7A, 0x76DE, 0x5C91, 0x66AB, 0x6F5B, 0x7BB4,
+ 0x7C2A, 0x8836, 0x96DC, 0x4E08, 0x4ED7, 0x5320, 0x5834, 0x58BB,
+ 0x58EF, 0x596C, 0x5C07, 0x5E33, 0x5E84, 0x5F35, 0x638C, 0x66B2,
+ 0x6756, 0x6A1F, 0x6AA3, 0x6B0C, 0x6F3F, 0x7246, 0xF9FA, 0x7350,
+ 0x748B, 0x7AE0, 0x7CA7, 0x8178, 0x81DF, 0x81E7, 0x838A, 0x846C,
+ 0x8523, 0x8594, 0x85CF, 0x88DD, 0x8D13, 0x91AC, 0x9577, ALTCHR,
+/* 0xF230 - 0xF2FF */
+ ALTCHR, 0x969C, 0x518D, 0x54C9, 0x5728, 0x5BB0, 0x624D, 0x6750,
+ 0x683D, 0x6893, 0x6E3D, 0x6ED3, 0x707D, 0x7E21, 0x88C1, 0x8CA1,
+ 0x8F09, 0x9F4B, 0x9F4E, 0x722D, 0x7B8F, 0x8ACD, 0x931A, 0x4F47,
+ 0x4F4E, 0x5132, 0x5480, 0x59D0, 0x5E95, 0x62B5, 0x6775, 0x696E,
+ 0x6A17, 0x6CAE, 0x6E1A, 0x72D9, 0x732A, 0x75BD, 0x7BB8, 0x7D35,
+ 0x82E7, 0x83F9, 0x8457, 0x85F7, 0x8A5B, 0x8CAF, 0x8E87, 0x9019,
+ 0x90B8, 0x96CE, 0x9F5F, 0x52E3, 0x540A, 0x5AE1, 0x5BC2, 0x6458,
+ 0x6575, 0x6EF4, 0x72C4, 0xF9FB, 0x7684, 0x7A4D, 0x7B1B, 0x7C4D,
+ 0x7E3E, 0x7FDF, 0x837B, 0x8B2B, 0x8CCA, 0x8D64, 0x8DE1, 0x8E5F,
+ 0x8FEA, 0x8FF9, 0x9069, 0x93D1, 0x4F43, 0x4F7A, 0x50B3, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5168, 0x5178, 0x524D, 0x526A, 0x5861, 0x587C, 0x5960,
+ 0x5C08, 0x5C55, 0x5EDB, 0x609B, 0x6230, 0x6813, 0x6BBF, 0x6C08,
+ 0x6FB1, 0x714E, 0x7420, 0x7530, 0x7538, 0x7551, 0x7672, 0x7B4C,
+ 0x7B8B, 0x7BAD, 0x7BC6, 0x7E8F, 0x8A6E, 0x8F3E, 0x8F49, 0x923F,
+ 0x9293, 0x9322, 0x942B, 0x96FB, 0x985A, 0x986B, 0x991E, 0x5207,
+ 0x622A, 0x6298, 0x6D59, 0x7664, 0x7ACA, 0x7BC0, 0x7D76, 0x5360,
+ 0x5CBE, 0x5E97, 0x6F38, 0x70B9, 0x7C98, 0x9711, 0x9B8E, 0x9EDE,
+ 0x63A5, 0x647A, 0x8776, 0x4E01, 0x4E95, 0x4EAD, 0x505C, 0x5075,
+ 0x5448, 0x59C3, 0x5B9A, 0x5E40, 0x5EAD, 0x5EF7, 0x5F81, 0x60C5,
+ 0x633A, 0x653F, 0x6574, 0x65CC, 0x6676, 0x6678, 0x67FE, 0x6968,
+ 0x6A89, 0x6B63, 0x6C40, 0x6DC0, 0x6DE8, 0x6E1F, 0x6E5E, 0x701E,
+ 0x70A1, 0x738E, 0x73FD, 0x753A, 0x775B, 0x7887, 0x798E, 0x7A0B,
+ 0x7A7D, 0x7CBE, 0x7D8E, 0x8247, 0x8A02, 0x8AEA, 0x8C9E, 0x912D,
+ 0x914A, 0x91D8, 0x9266, 0x92CC, 0x9320, 0x9706, 0x9756, ALTCHR,
+/* 0xF330 - 0xF3FF */
+ ALTCHR, 0x975C, 0x9802, 0x9F0E, 0x5236, 0x5291, 0x557C, 0x5824,
+ 0x5E1D, 0x5F1F, 0x608C, 0x63D0, 0x68AF, 0x6FDF, 0x796D, 0x7B2C,
+ 0x81CD, 0x85BA, 0x88FD, 0x8AF8, 0x8E44, 0x918D, 0x9664, 0x969B,
+ 0x973D, 0x984C, 0x9F4A, 0x4FCE, 0x5146, 0x51CB, 0x52A9, 0x5632,
+ 0x5F14, 0x5F6B, 0x63AA, 0x64CD, 0x65E9, 0x6641, 0x66FA, 0x66F9,
+ 0x671D, 0x689D, 0x68D7, 0x69FD, 0x6F15, 0x6F6E, 0x7167, 0x71E5,
+ 0x722A, 0x74AA, 0x773A, 0x7956, 0x795A, 0x79DF, 0x7A20, 0x7A95,
+ 0x7C97, 0x7CDF, 0x7D44, 0x7E70, 0x8087, 0x85FB, 0x86A4, 0x8A54,
+ 0x8ABF, 0x8D99, 0x8E81, 0x9020, 0x906D, 0x91E3, 0x963B, 0x96D5,
+ 0x9CE5, 0x65CF, 0x7C07, 0x8DB3, 0x93C3, 0x5B58, 0x5C0A, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5352, 0x62D9, 0x731D, 0x5027, 0x5B97, 0x5F9E, 0x60B0,
+ 0x616B, 0x68D5, 0x6DD9, 0x742E, 0x7A2E, 0x7D42, 0x7D9C, 0x7E31,
+ 0x816B, 0x8E2A, 0x8E35, 0x937E, 0x9418, 0x4F50, 0x5750, 0x5DE6,
+ 0x5EA7, 0x632B, 0x7F6A, 0x4E3B, 0x4F4F, 0x4F8F, 0x505A, 0x59DD,
+ 0x80C4, 0x546A, 0x5468, 0x55FE, 0x594F, 0x5B99, 0x5DDE, 0x5EDA,
+ 0x665D, 0x6731, 0x67F1, 0x682A, 0x6CE8, 0x6D32, 0x6E4A, 0x6F8D,
+ 0x70B7, 0x73E0, 0x7587, 0x7C4C, 0x7D02, 0x7D2C, 0x7DA2, 0x821F,
+ 0x86DB, 0x8A3B, 0x8A85, 0x8D70, 0x8E8A, 0x8F33, 0x9031, 0x914E,
+ 0x9152, 0x9444, 0x99D0, 0x7AF9, 0x7CA5, 0x4FCA, 0x5101, 0x51C6,
+ 0x57C8, 0x5BEF, 0x5CFB, 0x6659, 0x6A3D, 0x6D5A, 0x6E96, 0x6FEC,
+ 0x710C, 0x756F, 0x7AE3, 0x8822, 0x9021, 0x9075, 0x96CB, 0x99FF,
+ 0x8301, 0x4E2D, 0x4EF2, 0x8846, 0x91CD, 0x537D, 0x6ADB, 0x696B,
+ 0x6C41, 0x847A, 0x589E, 0x618E, 0x66FE, 0x62EF, 0x70DD, 0x7511,
+ 0x75C7, 0x7E52, 0x84B8, 0x8B49, 0x8D08, 0x4E4B, 0x53EA, ALTCHR,
+/* 0xF430 - 0xF4FF */
+ ALTCHR, 0x54AB, 0x5730, 0x5740, 0x5FD7, 0x6301, 0x6307, 0x646F,
+ 0x652F, 0x65E8, 0x667A, 0x679D, 0x67B3, 0x6B62, 0x6C60, 0x6C9A,
+ 0x6F2C, 0x77E5, 0x7825, 0x7949, 0x7957, 0x7D19, 0x80A2, 0x8102,
+ 0x81F3, 0x829D, 0x82B7, 0x8718, 0x8A8C, 0xF9FC, 0x8D04, 0x8DBE,
+ 0x9072, 0x76F4, 0x7A19, 0x7A37, 0x7E54, 0x8077, 0x5507, 0x55D4,
+ 0x5875, 0x632F, 0x6422, 0x6649, 0x664B, 0x686D, 0x699B, 0x6B84,
+ 0x6D25, 0x6EB1, 0x73CD, 0x7468, 0x74A1, 0x755B, 0x75B9, 0x76E1,
+ 0x771E, 0x778B, 0x79E6, 0x7E09, 0x7E1D, 0x81FB, 0x852F, 0x8897,
+ 0x8A3A, 0x8CD1, 0x8EEB, 0x8FB0, 0x9032, 0x93AD, 0x9663, 0x9673,
+ 0x9707, 0x4F84, 0x53F1, 0x59EA, 0x5AC9, 0x5E19, 0x684E, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x74C6, 0x75BE, 0x79E9, 0x7A92, 0x81A3, 0x86ED, 0x8CEA,
+ 0x8DCC, 0x8FED, 0x659F, 0x6715, 0xF9FD, 0x57F7, 0x6F57, 0x7DDD,
+ 0x8F2F, 0x93F6, 0x96C6, 0x5FB5, 0x61F2, 0x6F84, 0x4E14, 0x4F98,
+ 0x501F, 0x53C9, 0x55DF, 0x5D6F, 0x5DEE, 0x6B21, 0x6B64, 0x78CB,
+ 0x7B9A, 0xF9FE, 0x8E49, 0x8ECA, 0x906E, 0x6349, 0x643E, 0x7740,
+ 0x7A84, 0x932F, 0x947F, 0x9F6A, 0x64B0, 0x6FAF, 0x71E6, 0x74A8,
+ 0x74DA, 0x7AC4, 0x7C12, 0x7E82, 0x7CB2, 0x7E98, 0x8B9A, 0x8D0A,
+ 0x947D, 0x9910, 0x994C, 0x5239, 0x5BDF, 0x64E6, 0x672D, 0x7D2E,
+ 0x50ED, 0x53C3, 0x5879, 0x6158, 0x6159, 0x61FA, 0x65AC, 0x7AD9,
+ 0x8B92, 0x8B96, 0x5009, 0x5021, 0x5275, 0x5531, 0x5A3C, 0x5EE0,
+ 0x5F70, 0x6134, 0x655E, 0x660C, 0x6636, 0x66A2, 0x69CD, 0x6EC4,
+ 0x6F32, 0x7316, 0x7621, 0x7A93, 0x8139, 0x8259, 0x83D6, 0x84BC,
+ 0x50B5, 0x57F0, 0x5BC0, 0x5BE8, 0x5F69, 0x63A1, 0x7826, 0x7DB5,
+ 0x83DC, 0x8521, 0x91C7, 0x91F5, 0x518A, 0x67F5, 0x7B56, ALTCHR,
+/* 0xF530 - 0xF5FF */
+ ALTCHR, 0x8CAC, 0x51C4, 0x59BB, 0x60BD, 0x8655, 0x501C, 0xF9FF,
+ 0x5254, 0x5C3A, 0x617D, 0x621A, 0x62D3, 0x64F2, 0x65A5, 0x6ECC,
+ 0x7620, 0x810A, 0x8E60, 0x965F, 0x96BB, 0x4EDF, 0x5343, 0x5598,
+ 0x5929, 0x5DDD, 0x64C5, 0x6CC9, 0x6DFA, 0x7394, 0x7A7F, 0x821B,
+ 0x85A6, 0x8CE4, 0x8E10, 0x9077, 0x91E7, 0x95E1, 0x9621, 0x97C6,
+ 0x51F8, 0x54F2, 0x5586, 0x5FB9, 0x64A4, 0x6F88, 0x7DB4, 0x8F1F,
+ 0x8F4D, 0x9435, 0x50C9, 0x5C16, 0x6CBE, 0x6DFB, 0x751B, 0x77BB,
+ 0x7C3D, 0x7C64, 0x8A79, 0x8AC2, 0x581E, 0x59BE, 0x5E16, 0x6377,
+ 0x7252, 0x758A, 0x776B, 0x8ADC, 0x8CBC, 0x8F12, 0x5EF3, 0x6674,
+ 0x6DF8, 0x807D, 0x83C1, 0x8ACB, 0x9751, 0x9BD6, 0xFA00, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x5243, 0x66FF, 0x6D95, 0x6EEF, 0x7DE0, 0x8AE6, 0x902E,
+ 0x905E, 0x9AD4, 0x521D, 0x527F, 0x54E8, 0x6194, 0x6284, 0x62DB,
+ 0x68A2, 0x6912, 0x695A, 0x6A35, 0x7092, 0x7126, 0x785D, 0x7901,
+ 0x790E, 0x79D2, 0x7A0D, 0x8096, 0x8278, 0x82D5, 0x8349, 0x8549,
+ 0x8C82, 0x8D85, 0x9162, 0x918B, 0x91AE, 0x4FC3, 0x56D1, 0x71ED,
+ 0x77D7, 0x8700, 0x89F8, 0x5BF8, 0x5FD6, 0x6751, 0x90A8, 0x53E2,
+ 0x585A, 0x5BF5, 0x60A4, 0x6181, 0x6460, 0x7E3D, 0x8070, 0x8525,
+ 0x9283, 0x64AE, 0x50AC, 0x5D14, 0x6700, 0x589C, 0x62BD, 0x63A8,
+ 0x690E, 0x6978, 0x6A1E, 0x6E6B, 0x76BA, 0x79CB, 0x82BB, 0x8429,
+ 0x8ACF, 0x8DA8, 0x8FFD, 0x9112, 0x914B, 0x919C, 0x9310, 0x9318,
+ 0x939A, 0x96DB, 0x9A36, 0x9C0D, 0x4E11, 0x755C, 0x795D, 0x7AFA,
+ 0x7B51, 0x7BC9, 0x7E2E, 0x84C4, 0x8E59, 0x8E74, 0x8EF8, 0x9010,
+ 0x6625, 0x693F, 0x7443, 0x51FA, 0x672E, 0x9EDC, 0x5145, 0x5FE0,
+ 0x6C96, 0x87F2, 0x885D, 0x8877, 0x60B4, 0x81B5, 0x8403, ALTCHR,
+/* 0xF630 - 0xF6FF */
+ ALTCHR, 0x8D05, 0x53D6, 0x5439, 0x5634, 0x5A36, 0x5C31, 0x708A,
+ 0x7FE0, 0x805A, 0x8106, 0x81ED, 0x8DA3, 0x9189, 0x9A5F, 0x9DF2,
+ 0x5074, 0x4EC4, 0x53A0, 0x60FB, 0x6E2C, 0x5C64, 0x4F88, 0x5024,
+ 0x55E4, 0x5CD9, 0x5E5F, 0x6065, 0x6894, 0x6CBB, 0x6DC4, 0x71BE,
+ 0x75D4, 0x75F4, 0x7661, 0x7A1A, 0x7A49, 0x7DC7, 0x7DFB, 0x7F6E,
+ 0x81F4, 0x86A9, 0x8F1C, 0x96C9, 0x99B3, 0x9F52, 0x5247, 0x52C5,
+ 0x98ED, 0x89AA, 0x4E03, 0x67D2, 0x6F06, 0x4FB5, 0x5BE2, 0x6795,
+ 0x6C88, 0x6D78, 0x741B, 0x7827, 0x91DD, 0x937C, 0x87C4, 0x79E4,
+ 0x7A31, 0x5FEB, 0x4ED6, 0x54A4, 0x553E, 0x58AE, 0x59A5, 0x60F0,
+ 0x6253, 0x62D6, 0x6736, 0x6955, 0x8235, 0x9640, 0x99B1, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x99DD, 0x502C, 0x5353, 0x5544, 0x577C, 0xFA01, 0x6258,
+ 0xFA02, 0x64E2, 0x666B, 0x67DD, 0x6FC1, 0x6FEF, 0x7422, 0x7438,
+ 0x8A17, 0x9438, 0x5451, 0x5606, 0x5766, 0x5F48, 0x619A, 0x6B4E,
+ 0x7058, 0x70AD, 0x7DBB, 0x8A95, 0x596A, 0x812B, 0x63A2, 0x7708,
+ 0x803D, 0x8CAA, 0x5854, 0x642D, 0x69BB, 0x5B95, 0x5E11, 0x6E6F,
+ 0xFA03, 0x8569, 0x514C, 0x53F0, 0x592A, 0x6020, 0x614B, 0x6B86,
+ 0x6C70, 0x6CF0, 0x7B1E, 0x80CE, 0x82D4, 0x8DC6, 0x90B0, 0x98B1,
+ 0xFA04, 0x64C7, 0x6FA4, 0x6491, 0x6504, 0x514E, 0x5410, 0x571F,
+ 0x8A0E, 0x615F, 0x6876, 0xFA05, 0x75DB, 0x7B52, 0x7D71, 0x901A,
+ 0x5806, 0x69CC, 0x817F, 0x892A, 0x9000, 0x9839, 0x5078, 0x5957,
+ 0x59AC, 0x6295, 0x900F, 0x9B2A, 0x615D, 0x7279, 0x95D6, 0x5761,
+ 0x5A46, 0x5DF4, 0x628A, 0x64AD, 0x64FA, 0x6777, 0x6CE2, 0x6D3E,
+ 0x722C, 0x7436, 0x7834, 0x7F77, 0x82AD, 0x8DDB, 0x9817, 0x5224,
+ 0x5742, 0x677F, 0x7248, 0x74E3, 0x8CA9, 0x8FA6, 0x9211, ALTCHR,
+/* 0xF730 - 0xF7FF */
+ ALTCHR, 0x962A, 0x516B, 0x53ED, 0x634C, 0x4F69, 0x5504, 0x6096,
+ 0x6557, 0x6C9B, 0x6D7F, 0x724C, 0x72FD, 0x7A17, 0x8987, 0x8C9D,
+ 0x5F6D, 0x6F8E, 0x70F9, 0x81A8, 0x610E, 0x4FBF, 0x504F, 0x6241,
+ 0x7247, 0x7BC7, 0x7DE8, 0x7FE9, 0x904D, 0x97AD, 0x9A19, 0x8CB6,
+ 0x576A, 0x5E73, 0x67B0, 0x840D, 0x8A55, 0x5420, 0x5B16, 0x5E63,
+ 0x5EE2, 0x5F0A, 0x6583, 0x80BA, 0x853D, 0x9589, 0x965B, 0x4F48,
+ 0x5305, 0x530D, 0x530F, 0x5486, 0x54FA, 0x5703, 0x5E03, 0x6016,
+ 0x629B, 0x62B1, 0x6355, 0xFA06, 0x6CE1, 0x6D66, 0x75B1, 0x7832,
+ 0x80DE, 0x812F, 0x82DE, 0x8461, 0x84B2, 0x888D, 0x8912, 0x900B,
+ 0x92EA, 0x98FD, 0x9B91, 0x5E45, 0x66B4, 0x66DD, 0x7011, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x7206, 0xFA07, 0x4FF5, 0x527D, 0x5F6A, 0x6153, 0x6753,
+ 0x6A19, 0x6F02, 0x74E2, 0x7968, 0x8868, 0x8C79, 0x98C7, 0x98C4,
+ 0x9A43, 0x54C1, 0x7A1F, 0x6953, 0x8AF7, 0x8C4A, 0x98A8, 0x99AE,
+ 0x5F7C, 0x62AB, 0x75B2, 0x76AE, 0x88AB, 0x907F, 0x9642, 0x5339,
+ 0x5F3C, 0x5FC5, 0x6CCC, 0x73CC, 0x7562, 0x758B, 0x7B46, 0x82FE,
+ 0x999D, 0x4E4F, 0x903C, 0x4E0B, 0x4F55, 0x53A6, 0x590F, 0x5EC8,
+ 0x6630, 0x6CB3, 0x7455, 0x8377, 0x8766, 0x8CC0, 0x9050, 0x971E,
+ 0x9C15, 0x58D1, 0x5B78, 0x8650, 0x8B14, 0x9DB4, 0x5BD2, 0x6068,
+ 0x608D, 0x65F1, 0x6C57, 0x6F22, 0x6FA3, 0x701A, 0x7F55, 0x7FF0,
+ 0x9591, 0x9592, 0x9650, 0x97D3, 0x5272, 0x8F44, 0x51FD, 0x542B,
+ 0x54B8, 0x5563, 0x558A, 0x6ABB, 0x6DB5, 0x7DD8, 0x8266, 0x929C,
+ 0x9677, 0x9E79, 0x5408, 0x54C8, 0x76D2, 0x86E4, 0x95A4, 0x95D4,
+ 0x965C, 0x4EA2, 0x4F09, 0x59EE, 0x5AE6, 0x5DF7, 0x6052, 0x6297,
+ 0x676D, 0x6841, 0x6C86, 0x6E2F, 0x7F38, 0x809B, 0x822A, ALTCHR,
+/* 0xF830 - 0xF8FF */
+ ALTCHR, 0xFA08, 0xFA09, 0x9805, 0x4EA5, 0x5055, 0x54B3, 0x5793,
+ 0x595A, 0x5B69, 0x5BB3, 0x61C8, 0x6977, 0x6D77, 0x7023, 0x87F9,
+ 0x89E3, 0x8A72, 0x8AE7, 0x9082, 0x99ED, 0x9AB8, 0x52BE, 0x6838,
+ 0x5016, 0x5E78, 0x674F, 0x8347, 0x884C, 0x4EAB, 0x5411, 0x56AE,
+ 0x73E6, 0x9115, 0x97FF, 0x9909, 0x9957, 0x9999, 0x5653, 0x589F,
+ 0x865B, 0x8A31, 0x61B2, 0x6AF6, 0x737B, 0x8ED2, 0x6B47, 0x96AA,
+ 0x9A57, 0x5955, 0x7200, 0x8D6B, 0x9769, 0x4FD4, 0x5CF4, 0x5F26,
+ 0x61F8, 0x665B, 0x6CEB, 0x70AB, 0x7384, 0x73B9, 0x73FE, 0x7729,
+ 0x774D, 0x7D43, 0x7D62, 0x7E23, 0x8237, 0x8852, 0xFA0A, 0x8CE2,
+ 0x9249, 0x986F, 0x5B51, 0x7A74, 0x8840, 0x9801, 0x5ACC, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x4FE0, 0x5354, 0x593E, 0x5CFD, 0x633E, 0x6D79, 0x72F9,
+ 0x8105, 0x8107, 0x83A2, 0x92CF, 0x9830, 0x4EA8, 0x5144, 0x5211,
+ 0x578B, 0x5F62, 0x6CC2, 0x6ECE, 0x7005, 0x7050, 0x70AF, 0x7192,
+ 0x73E9, 0x7469, 0x834A, 0x87A2, 0x8861, 0x9008, 0x90A2, 0x93A3,
+ 0x99A8, 0x516E, 0x5F57, 0x60E0, 0x6167, 0x66B3, 0x8559, 0x8E4A,
+ 0x91AF, 0x978B, 0x4E4E, 0x4E92, 0x547C, 0x58D5, 0x58FA, 0x597D,
+ 0x5CB5, 0x5F27, 0x6236, 0x6248, 0x660A, 0x6667, 0x6BEB, 0x6D69,
+ 0x6DCF, 0x6E56, 0x6EF8, 0x6F94, 0x6FE0, 0x6FE9, 0x705D, 0x72D0,
+ 0x7425, 0x745A, 0x74E0, 0x7693, 0x795C, 0x7CCA, 0x7E1E, 0x80E1,
+ 0x82A6, 0x846B, 0x84BF, 0x864E, 0x865F, 0x8774, 0x8B77, 0x8C6A,
+ 0x93AC, 0x9800, 0x9865, 0x60D1, 0x6216, 0x9177, 0x5A5A, 0x660F,
+ 0x6DF7, 0x6E3E, 0x743F, 0x9B42, 0x5FFD, 0x60DA, 0x7B0F, 0x54C4,
+ 0x5F18, 0x6C5E, 0x6CD3, 0x6D2A, 0x70D8, 0x7D05, 0x8679, 0x8A0C,
+ 0x9D3B, 0x5316, 0x548C, 0x5B05, 0x6A3A, 0x706B, 0x7575, ALTCHR,
+/* 0xF930 - 0xF9FF */
+ ALTCHR, 0x798D, 0x79BE, 0x82B1, 0x83EF, 0x8A71, 0x8B41, 0x8CA8,
+ 0x9774, 0xFA0B, 0x64F4, 0x652B, 0x78BA, 0x78BB, 0x7A6B, 0x4E38,
+ 0x559A, 0x5950, 0x5BA6, 0x5E7B, 0x60A3, 0x63DB, 0x6B61, 0x6665,
+ 0x6853, 0x6E19, 0x7165, 0x74B0, 0x7D08, 0x9084, 0x9A69, 0x9C25,
+ 0x6D3B, 0x6ED1, 0x733E, 0x8C41, 0x95CA, 0x51F0, 0x5E4C, 0x5FA8,
+ 0x604D, 0x60F6, 0x6130, 0x614C, 0x6643, 0x6644, 0x69A5, 0x6CC1,
+ 0x6E5F, 0x6EC9, 0x6F62, 0x714C, 0x749C, 0x7687, 0x7BC1, 0x7C27,
+ 0x8352, 0x8757, 0x9051, 0x968D, 0x9EC3, 0x532F, 0x56DE, 0x5EFB,
+ 0x5F8A, 0x6062, 0x6094, 0x61F7, 0x6666, 0x6703, 0x6A9C, 0x6DEE,
+ 0x6FAE, 0x7070, 0x736A, 0x7E6A, 0x81BE, 0x8334, 0x86D4, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x8AA8, 0x8CC4, 0x5283, 0x7372, 0x5B96, 0x6A6B, 0x9404,
+ 0x54EE, 0x5686, 0x5B5D, 0x6548, 0x6585, 0x66C9, 0x689F, 0x6D8D,
+ 0x6DC6, 0x723B, 0x80B4, 0x9175, 0x9A4D, 0x4FAF, 0x5019, 0x539A,
+ 0x540E, 0x543C, 0x5589, 0x55C5, 0x5E3F, 0x5F8C, 0x673D, 0x7166,
+ 0x73DD, 0x9005, 0x52DB, 0x52F3, 0x5864, 0x58CE, 0x7104, 0x718F,
+ 0x71FB, 0x85B0, 0x8A13, 0x6688, 0x85A8, 0x55A7, 0x6684, 0x714A,
+ 0x8431, 0x5349, 0x5599, 0x6BC1, 0x5F59, 0x5FBD, 0x63EE, 0x6689,
+ 0x7147, 0x8AF1, 0x8F1D, 0x9EBE, 0x4F11, 0x643A, 0x70CB, 0x7566,
+ 0x8667, 0x6064, 0x8B4E, 0x9DF8, 0x5147, 0x51F6, 0x5308, 0x6D36,
+ 0x80F8, 0x9ED1, 0x6615, 0x6B23, 0x7098, 0x75D5, 0x5403, 0x5C79,
+ 0x7D07, 0x8A16, 0x6B20, 0x6B3D, 0x6B46, 0x5438, 0x6070, 0x6D3D,
+ 0x7FD5, 0x8208, 0x50D6, 0x51DE, 0x559C, 0x566B, 0x56CD, 0x59EC,
+ 0x5B09, 0x5E0C, 0x6199, 0x6198, 0x6231, 0x665E, 0x66E6, 0x7199,
+ 0x71B9, 0x71BA, 0x72A7, 0x79A7, 0x7A00, 0x7FB2, 0x8A70, ALTCHR,
+};
+
+CODE_CONV_TWO_OCTET_TO_UCS2(cc_ksc5601johab_to_ucs2, /* function name */
+ tblKsc5601JohabToUcs2, /* table name */
+ 0x0084, 0x00F9, /* code range (high byte) */
+ 0x0030, 0x00FF, /* code range (low byte) */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/KSCJOHAB/main.c b/xc/extras/X-TrueType/KSCJOHAB/main.c
new file mode 100644
index 000000000..abb3ee35e
--- /dev/null
+++ b/xc/extras/X-TrueType/KSCJOHAB/main.c
@@ -0,0 +1,71 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ KSCJOHAB
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "kscjohab", NULL, NULL, KSCJOHAB, { 0x30, 0xff, 0x84, 0xf9, 0xd931 } },
+ { "ksc5601johab", NULL, NULL, KSCJOHAB,
+ { 0x30, 0xff, 0x84, 0xf9, 0xd931 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_ksc5601johab_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { KSCJOHAB, EPlfmISO, EEncISO10646,
+ cc_ksc5601johab_to_ucs2, NULL },
+ { KSCJOHAB, EPlfmUnicode, EEncAny,
+ cc_ksc5601johab_to_ucs2, NULL },
+ { KSCJOHAB, EPlfmMS, EEncMSUnicode,
+ cc_ksc5601johab_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(KSCJOHAB_entrypoint)
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/MULEENCODING/ASCIILAOtoUCS2.c b/xc/extras/X-TrueType/MULEENCODING/ASCIILAOtoUCS2.c
new file mode 100644
index 000000000..b19ac7f24
--- /dev/null
+++ b/xc/extras/X-TrueType/MULEENCODING/ASCIILAOtoUCS2.c
@@ -0,0 +1,72 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ IBM Laotian encoding to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ http://www.unicode.org/pending/lao/cp01133.gif
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblAsciilaoToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ ALTCHR, 0x0E81, 0x0E82, 0x0E84, 0x0E87, 0x0E88, 0x0EAA, 0x0E8A,
+ 0x0E8D, 0x0E94, 0x0E95, 0x0E96, 0x0E97, 0x0E99, 0x0E9A, 0x0E9B,
+ 0x0E9C, 0x0E9D, 0x0E9E, 0x0E9F, 0x0EA1, 0x0EA2, 0x0EA3, 0x0EA5,
+ 0x0EA7, 0x0EAB, 0x0EAD, 0x0EAE, ALTCHR, ALTCHR, ALTCHR, 0x0EAF,
+ 0x0EB0, 0x0EB2, 0x0EB3, 0x0EB4, 0x0EB5, 0x0EB6, 0x0EB7, 0x0EB8,
+ 0x0EB9, 0x0EBC, 0x0EB1, 0x0EBB, 0x0EBD, ALTCHR, ALTCHR, ALTCHR,
+ 0x0EC0, 0x0EC1, 0x0EC2, 0x0EC3, 0x0EC4, 0x0EC8, 0x0EC9, 0x0ECA,
+ 0x0ECB, 0x0ECC, 0x0ECD, 0x0EC6, ALTCHR, 0x0EDC, 0x0EDD, 0x20AD,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0ED0, 0x0ED1, 0x0ED2, 0x0ED3, 0x0ED4, 0x0ED5, 0x0ED6, 0x0ED7,
+ 0x0ED8, 0x0ED9, ALTCHR, ALTCHR, 0x00A2, 0x00AC, 0x00A6, ALTCHR
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_asciilao_to_ucs2, /* function name */
+ tblAsciilaoToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/MULEENCODING/Imakefile b/xc/extras/X-TrueType/MULEENCODING/Imakefile
new file mode 100644
index 000000000..d42735148
--- /dev/null
+++ b/xc/extras/X-TrueType/MULEENCODING/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: MULEENCODING */
+
+#define ModuleName MULEENCODING
+SRCS = ASCIILAOtoUCS2.c MULELAOtoUCS2.c MULETIBETANtoUCS2.c main.c
+OBJS = ASCIILAOtoUCS2.o MULELAOtoUCS2.o MULETIBETANtoUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/MULEENCODING/MULELAOtoUCS2.c b/xc/extras/X-TrueType/MULEENCODING/MULELAOtoUCS2.c
new file mode 100644
index 000000000..ce4f3eb29
--- /dev/null
+++ b/xc/extras/X-TrueType/MULEENCODING/MULELAOtoUCS2.c
@@ -0,0 +1,76 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ mulelao to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998,1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Table build by looking into the unicode chart,
+ http://charts.unicode.org/Unicode.charts/normal/U0E80.html
+ and an actual X11 font using mulelao-1 encoding.
+
+ added the SKIP monetary symbol (U+20AD) at its logical place -- srtxg
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblMulelao1ToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ ALTCHR, 0x0E81, 0x0E82, ALTCHR, 0x0E84, ALTCHR, ALTCHR, 0x0E87,
+ 0x0E88, ALTCHR, 0x0E8A, ALTCHR, ALTCHR, 0x0E8D, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x0E94, 0x0E95, 0x0E96, 0x0E97,
+ ALTCHR, 0x0E99, 0x0E9A, 0x0E9B, 0x0E9C, 0x0E9D, 0x0E9E, 0x0E9F,
+ ALTCHR, 0x0EA1, 0x0EA2, 0x0EA3, ALTCHR, 0x0EA5, ALTCHR, 0x0EA7,
+ ALTCHR, ALTCHR, 0x0EAA, 0x0EAB, ALTCHR, 0x0EAD, 0x0EAE, 0x0EAF,
+ 0x0EB0, 0x0EB1, 0x0EB2, 0x0EB3, 0x0EB4, 0x0EB5, 0x0EB6, 0x0EB7,
+ 0x0EB8, 0x0EB9, ALTCHR, 0x0EBB, 0x0EBC, 0x0EBD, ALTCHR, 0x20ad,
+ 0x0EC0, 0x0EC1, 0x0EC2, 0x0EC3, 0x0EC4, ALTCHR, 0x0EC6, ALTCHR,
+ 0x0EC8, 0x0EC9, 0x0ECA, 0x0ECB, 0x0ECC, 0x0ECD, ALTCHR, ALTCHR,
+ 0x0ED0, 0x0ED1, 0x0ED2, 0x0ED3, 0x0ED4, 0x0ED5, 0x0ED6, 0x0ED7,
+ 0x0ED8, 0x0ED9, ALTCHR, 0x0EDC, 0x0EDD, ALTCHR, ALTCHR, ALTCHR
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_mulelao1_to_ucs2, /* function name */
+ tblMulelao1ToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/MULEENCODING/MULETIBETANtoUCS2.c b/xc/extras/X-TrueType/MULEENCODING/MULETIBETANtoUCS2.c
new file mode 100644
index 000000000..2114b85f7
--- /dev/null
+++ b/xc/extras/X-TrueType/MULEENCODING/MULETIBETANtoUCS2.c
@@ -0,0 +1,125 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ muletibetan to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+ ---- ********* NOT FINISHED YET ******** -----
+
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Table build by looking into the unicode chart,
+ and an actual X11 font using muletibetan-{0,1} encoding.
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblMuletibetanToUcs2[] = {
+/* 0x2121 - 0x2175 */
+ 0x0020, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0F00, 0x0F01, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0F08, ALTCHR, ALTCHR, 0x0F0B, ALTCHR, 0x0F0D, 0x0F0E, 0x0F0F,
+ 0x0F10, 0x0F11, ALTCHR, ALTCHR, 0x0F14, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ 0x0F20, 0x0F21, 0x0F22, 0x0F23, 0x0F24, 0x0F25, 0x0F26, 0x0F27,
+ 0x0F28, 0x0F29, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x0F35, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x0F3C, 0x0F3D, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2221 - 0x2275 */
+ 0x0F40, 0x0F41, 0x0F42, 0x0F43, 0x0F44, 0x0F45, 0x0F46,
+ 0x0F47, ALTCHR, 0x0F49, 0x0F4A, 0x0F4B, 0x0F4C, 0x0F4D, 0x0F4E,
+ 0x0F4F, 0x0F50, 0x0F51, 0x0F52, 0x0F53, 0x0F54, 0x0F55, 0x0F56,
+ 0x0F57, 0x0F58, 0x0F59, 0x0F5A, 0x0F5B, 0x0F5C, 0x0F5D, 0x0F5E,
+ 0x0F5F, 0x0F60, 0x0F61, 0x0F62, 0x0F63, 0x0F64, 0x0F65, 0x0F66,
+ 0x0F67, 0x0F68, 0x0F69, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, 0x0F7A, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2321 - 0x2375 */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2421 - 0x2475 */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+/* 0x2521 - 0x2575 */
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+};
+
+CODE_CONV_TWO_OCTET_TO_UCS2(cc_muletibetan_to_ucs2, /* function name */
+ tblMuletibetanToUcs2, /* table name */
+ 0x0021, 0x0025, /* code range (high byte) */
+ 0x0021, 0x0075, /* code range (low byte) */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/MULEENCODING/main.c b/xc/extras/X-TrueType/MULEENCODING/main.c
new file mode 100644
index 000000000..3231bef3d
--- /dev/null
+++ b/xc/extras/X-TrueType/MULEENCODING/main.c
@@ -0,0 +1,83 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1998,1999 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ MULELAO,
+ ASCIILAO
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "mulelao", NULL, "1", MULELAO,
+ { 0x20, 0xff, 0, 0, 0x20 } },
+ { "ibm", NULL, "cp1133", ASCIILAO,
+ { 0x20, 0xff, 0, 0, 0x20 } },
+/* { "muletibetan", NULL, NULL, MULETIBETAN,
+ { 0x21, 0x75, 0x21, 0x25, 0x2121 } }, */
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_mulelao1_to_ucs2);
+CODECONV_TEMPLATE(cc_asciilao_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { MULELAO, EPlfmISO, EEncISO10646,
+ cc_mulelao1_to_ucs2, NULL },
+ { MULELAO, EPlfmUnicode, EEncAny,
+ cc_mulelao1_to_ucs2, NULL },
+ { MULELAO, EPlfmMS, EEncMSUnicode,
+ cc_mulelao1_to_ucs2, NULL },
+ { ASCIILAO, EPlfmISO, EEncISO10646,
+ cc_asciilao_to_ucs2, NULL },
+ { ASCIILAO, EPlfmUnicode, EEncAny,
+ cc_asciilao_to_ucs2, NULL },
+ { ASCIILAO, EPlfmMS, EEncMSUnicode,
+ cc_asciilao_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(MULEENCODING_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/TCVN/Imakefile b/xc/extras/X-TrueType/TCVN/Imakefile
new file mode 100644
index 000000000..12f995ed2
--- /dev/null
+++ b/xc/extras/X-TrueType/TCVN/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: TCVN */
+
+#define ModuleName TCVN
+SRCS = TCVNtoUCS2.c main.c
+OBJS = TCVNtoUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/TCVN/TCVNtoUCS2.c b/xc/extras/X-TrueType/TCVN/TCVNtoUCS2.c
new file mode 100644
index 000000000..5f99f66e5
--- /dev/null
+++ b/xc/extras/X-TrueType/TCVN/TCVNtoUCS2.c
@@ -0,0 +1,78 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ TCVN (Vietnamese) to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Thans to Nguyen-Dai Quy for the description of this encoding.
+
+ Contrary to the VISCII encoding doesn't have uppercase letters for
+ each lower case one; but as it is the official encoding used in VietNam
+ it should be supported.
+ Note that no low range positions (first char is at 0x02) are used,
+ so the iso-8859-* macros can be used.
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblTCVNToUcs2[] = {
+/* 0x00A0 - 0x00FF */
+ ALTCHR, 0x0102, 0x00c2, 0x00ca, 0x00d4, 0x01a0, 0x01af, 0x0110,
+ 0x0103, 0x00e2, 0x00ea, 0x00f4, 0x01a1, 0x01b0, 0x0111, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x00e0, 0x1ea3, 0x00e3,
+ 0x00e1, 0x1ea1, ALTCHR, 0x1eb1, 0x1eb3, 0x1eb5, 0x1eaf, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x1eb7, 0x1ea7,
+ 0x1ea9, 0x1eab, 0x1ea5, 0x1ead, 0x00e8, ALTCHR, 0x1ebb, 0x1ebd,
+ 0x00e9, 0x1eb9, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ebf, 0x1ec7, 0x00ec,
+ 0x1ec9, ALTCHR, ALTCHR, ALTCHR, 0x0129, 0x00ed, 0x1ecb, 0x00f2,
+ ALTCHR, 0x1ecf, 0x00f5, 0x00f3, 0x1ecd, 0x1ed3, 0x1ed5, 0x1ed7,
+ 0x1ed1, 0x1ed9, 0x1edd, 0x1edf, 0x1ee1, 0x1edb, 0x1ee3, 0x00f9,
+ ALTCHR, 0x1ee7, 0x0169, 0x00fa, 0x1ee5, 0x1eeb, 0x1eed, 0x1eef,
+ 0x1ee9, 0x1ef1, 0x1ef3, 0x1ef7, 0x1ef9, 0x00fd, 0x1ef5, ALTCHR
+};
+
+CODE_CONV_ISO8859_TO_UCS2(cc_tcvn_to_ucs2, /* function name */
+ tblTCVNToUcs2, /* table name */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/TCVN/main.c b/xc/extras/X-TrueType/TCVN/main.c
new file mode 100644
index 000000000..85708ed68
--- /dev/null
+++ b/xc/extras/X-TrueType/TCVN/main.c
@@ -0,0 +1,69 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ I ignore if there is any official naming for TCVN encoded fonts
+ on X11. Let's accept *-tcvn*
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ TCVN
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "tcvn", NULL, NULL, TCVN, { 0x00, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+CODECONV_TEMPLATE(cc_tcvn_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { TCVN, EPlfmISO, EEncISO10646, cc_tcvn_to_ucs2, NULL },
+ { TCVN, EPlfmUnicode, EEncAny, cc_tcvn_to_ucs2, NULL },
+ { TCVN, EPlfmMS, EEncMSUnicode, cc_tcvn_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(TCVN_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/VISCII/Imakefile b/xc/extras/X-TrueType/VISCII/Imakefile
new file mode 100644
index 000000000..9457f8ca4
--- /dev/null
+++ b/xc/extras/X-TrueType/VISCII/Imakefile
@@ -0,0 +1,9 @@
+/* code converter: VISCII */
+
+#define ModuleName VISCII
+SRCS = VISCIItoUCS2.c main.c
+OBJS = VISCIItoUCS2.o main.o
+
+#include <xttmod.rules>
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/VISCII/VISCIItoUCS2.c b/xc/extras/X-TrueType/VISCII/VISCIItoUCS2.c
new file mode 100644
index 000000000..444b41026
--- /dev/null
+++ b/xc/extras/X-TrueType/VISCII/VISCIItoUCS2.c
@@ -0,0 +1,99 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+
+ VISCII (Vietnamese) to unicode table
+
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Table build by looking into the unicode chart,
+ and an actual X11 font using viscii1.1-1 encoding.
+
+ Contrary to the iso8859-* family of charsets viscii also uses low range
+ positions (first char is at 0x02) so the table goes from 0x00 to 0xff.
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#define ALTCHR 0x0020
+
+static ucs2_t tblVisciiToUcs2[] = {
+/* 0x0000 - 0x007F */
+ ALTCHR, ALTCHR, 0x1eb2, ALTCHR, ALTCHR, 0x1eb4, 0x1eaa, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x1ef6, ALTCHR, ALTCHR, ALTCHR,
+ ALTCHR, 0x1ef8, ALTCHR, ALTCHR, ALTCHR, ALTCHR, 0x1ef4, ALTCHR,
+ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027,
+ 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
+ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037,
+ 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
+ 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
+ 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
+ 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
+ 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
+ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067,
+ 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
+ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077,
+ 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, ALTCHR,
+/* 0x0080 - 0x009F */
+ 0x1ea0, 0x1eae, 0x1eb0, 0x1eb6, 0x1ea4, 0x1ea6, 0x1ea8, 0x1eac,
+ 0x1ebc, 0x1eb8, 0x1ebe, 0x1ec0, 0x1ec2, 0x1ec4, 0x1ec6, 0x1ed0,
+ 0x1ed2, 0x1ed4, 0x1ed6, 0x1ed8, 0x1ee2, 0x1eda, 0x1edc, 0x1ede,
+ 0x1eca, 0x1ece, 0x1ecc, 0x1ec8, 0x1ee6, 0x0168, 0x1ee4, 0x1ef2,
+/* 0x00A0 - 0x00FF */
+ 0x00d5, 0x1eaf, 0x1eb1, 0x1eb7, 0x1ea5, 0x1ea7, 0x1ea9, 0x1ead,
+ 0x1ebd, 0x1eb9, 0x1ebf, 0x1ec1, 0x1ec3, 0x1ec5, 0x1ec7, 0x1ed1,
+ 0x1ed3, 0x1ed5, 0x1ed7, 0x1ee0, 0x01a0, 0x1ed9, 0x1edd, 0x1edf,
+ 0x1ecb, 0x1ef0, 0x1ee8, 0x1eea, 0x1eec, 0x01a1, 0x1edb, 0x01af,
+ 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x1ea2, 0x0102, 0x1eb3, 0x1eb5,
+ 0x00c8, 0x00c9, 0x00ca, 0x1eba, 0x00cc, 0x00cd, 0x0128, 0x1ef3,
+ 0x0110, 0x1ee9, 0x00d2, 0x00d3, 0x00d4, 0x1ea1, 0x1ef7, 0x1eeb,
+ 0x1eed, 0x00d9, 0x00da, 0x1ef9, 0x1ef5, 0x00dd, 0x1ee1, 0x01b0,
+ 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x1ea3, 0x0103, 0x1eef, 0x1eab,
+ 0x00e8, 0x00e9, 0x00ea, 0x1ebb, 0x00ec, 0x00ed, 0x0129, 0x1ec9,
+ 0x0111, 0x1ef1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x1ecf, 0x1ecd,
+ 0x1ee5, 0x00f9, 0x00fa, 0x0169, 0x1ee7, 0x00fd, 0x1ee3, 0x1eee
+};
+
+CODE_CONV_ONE_OCTET_TO_UCS2(cc_viscii_to_ucs2, /* function name */
+ tblVisciiToUcs2, /* table name */
+ 0x00,0xff, /* begin and end of table */
+ ALTCHR /* alt char code (on UCS2) */
+ )
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/VISCII/main.c b/xc/extras/X-TrueType/VISCII/main.c
new file mode 100644
index 000000000..d8804f7ee
--- /dev/null
+++ b/xc/extras/X-TrueType/VISCII/main.c
@@ -0,0 +1,70 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+ Copyright (c) 1998 Pablo Saratxaga <srtxg@chanae.alphanet.ch>
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+
+ Contrary to the iso8859-* family of charsets viscii also uses low range
+ positions (first char is at 0x02) so the table goes from 0x00 to 0xff.
+
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+
+typedef enum
+{
+ VISCII
+} CharSetMagic;
+
+static CharSetRelation const charSetRelations[] = {
+ { "viscii1", "1", "1", VISCII, { 0x00, 0xff, 0, 0, 0x20 } },
+ { NULL, NULL, NULL, 0, { 0, 0, 0, 0, 0 } }
+};
+
+
+CODECONV_TEMPLATE(cc_viscii_to_ucs2);
+static MapIDRelation const mapIDRelations[] = {
+ { VISCII, EPlfmISO, EEncISO10646, cc_viscii_to_ucs2, NULL },
+ { VISCII, EPlfmUnicode, EEncAny, cc_viscii_to_ucs2, NULL },
+ { VISCII, EPlfmMS, EEncMSUnicode, cc_viscii_to_ucs2, NULL },
+ { -1, 0, 0, NULL, NULL }
+};
+
+STD_ENTRYFUNC_TEMPLATE(VISCII_entrypoint)
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttcache.c b/xc/extras/X-TrueType/xttcache.c
new file mode 100644
index 000000000..561536abd
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcache.c
@@ -0,0 +1,359 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1997 Jyunji Takagi, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+/*
+ * B-Tree
+ */
+
+#include "xttcommon.h"
+#include "fontmisc.h"
+#include "xttcache.h"
+
+BTreePtr BTree_Alloc()
+{
+ BTreePtr this = (BTreePtr) xalloc(sizeof(BTreeRec));
+ if (this != NULL) {
+ memset(this, 0x00, sizeof(BTreeRec));
+ }
+ return this;
+}
+
+int BTree_Search(BTreePtr this, int key, void **value)
+{
+ PagePtr ptr;
+ int i;
+ NodePtr np;
+
+ for (ptr = this->root; ptr; ) {
+ i = 0;
+ np = ptr->node;
+ while ((i < ptr->n) && np->key < key) {
+ i++;
+ np++;
+ }
+ if ((i < ptr->n) && (np->key == key)) {
+ *value = np->value;
+ return 1;
+ }
+ ptr = ptr->branch[i];
+ }
+ *value = NULL;
+ return 0;
+}
+
+static void BTree_InsertItem(BTreePtr this, PagePtr ptr, int index)
+{
+ int i;
+
+ for (i = ptr->n; i > index; i--) {
+ ptr->node[i] = ptr->node[i - 1];
+ ptr->branch[i + 1] = ptr->branch[i];
+ }
+ ptr->node[index] = this->node;
+ ptr->branch[index + 1] = this->page;
+ ptr->n++;
+}
+
+static void BTree_Split(BTreePtr this, PagePtr ptr, int index)
+{
+ PagePtr p;
+ int i, m;
+
+ p = (PagePtr) xalloc(sizeof(PageRec));
+ m = (index <= BTreeHalfSize) ? BTreeHalfSize : BTreeHalfSize + 1;
+ for (i = m + 1; i <= BTreeHalfSize * 2; i++) {
+ p->node[i - m - 1] = ptr->node[i - 1];
+ p->branch[i - m] = ptr->branch[i];
+ }
+ ptr->n = m;
+ p->n = BTreeHalfSize * 2 - m;
+ if (index <= BTreeHalfSize) {
+ BTree_InsertItem(this, ptr, index);
+ } else {
+ BTree_InsertItem(this, p, index - m);
+ }
+ this->node = ptr->node[ptr->n - 1];
+ p->branch[0] = ptr->branch[ptr->n];
+ ptr->n--;
+ this->page = p;
+}
+
+static int BTree_InsertSub(BTreePtr this, PagePtr ptr)
+{
+ int i;
+ NodePtr np;
+
+ if (ptr == NULL) {
+ this->page = NULL;
+ return 0;
+ }
+ i = 0;
+ np = ptr->node;
+ while ((i < ptr->n) && (np->key < this->node.key)) {
+ i++;
+ np++;
+ }
+ if ((i < ptr->n) && np->key == this->node.key) {
+ /* already registered */
+ return 1;
+ }
+ if (BTree_InsertSub(this, ptr->branch[i])) {
+ return 1;
+ }
+ if (ptr->n < BTreeHalfSize * 2) {
+ BTree_InsertItem(this, ptr, i);
+ return 1;
+ } else {
+ BTree_Split(this, ptr, i);
+ return 0;
+ }
+}
+
+void BTree_Insert(BTreePtr this, int key, void *value)
+{
+ PagePtr ptr;
+
+ this->node.key = key;
+ this->node.value = value;
+ if (BTree_InsertSub(this, this->root)) {
+ return;
+ }
+ ptr = (PagePtr) xalloc(sizeof(PageRec));
+ ptr->n = 1;
+ ptr->branch[0] = this->root;
+ ptr->node[0] = this->node;
+ ptr->branch[1] = this->page;
+ this->root = ptr;
+}
+
+#if 0 /* delete functions are not tested. */
+static void BTree_RemoveItem(BTreePtr this, PagePtr ptr, int index)
+{
+ while (++index < ptr->n) {
+ ptr->node[index - 1] = ptr->node[index];
+ ptr->branch[index] = ptr->branch[index + 1];
+ }
+ this->under = --(ptr->n) < BTreeHalfSize;
+}
+
+static void BTree_MoveRight(BTreePtr this, PagePtr ptr, int index)
+{
+ PagePtr left, right;
+ int i;
+
+ left = ptr->branch[index - 1];
+ right = ptr->branch[index];
+ for (i = right->n; i > 0; i--) {
+ right->node[i] = right->node[i - 1];
+ right->branch[i + 1] = right->branch[i];
+ }
+ right->branch[1] = right->branch[0];
+ right->n++;
+ right->node[0] = ptr->node[index - 1];
+ ptr->node[index - 1] = left->node[left->n - 1];
+ right->branch[0] = left->branch[left->n];
+ left->n--;
+}
+
+static void BTree_MoveLeft(BTreePtr this, PagePtr ptr, int index)
+{
+ PagePtr left, right;
+ int i;
+
+ right = ptr->branch[index];
+ left = ptr->branch[index - 1];
+ left->n++;
+ left->node[left->n - 1] = ptr->node[index - 1];
+ left->branch[left->n] = right->branch[0];
+ ptr->node[index - 1] = right->node[0];
+ right->branch[0] = right->branch[1];
+ right->n--;
+ for (i = 1; i < right ->n; i++) {
+ right->node[i - 1] = right->node[i];
+ right->branch[i] = right->branch[i + 1];
+ }
+}
+
+static void BTree_Combine(BTreePtr this, PagePtr ptr, int index)
+{
+ PagePtr left, right;
+ int i;
+
+ right = ptr->branch[index];
+ left = ptr->branch[index - 1];
+ left->n++;
+ left->node[left->n - 1] = ptr->node[index - 1];
+ left->branch[left->n] = right->branch[0];
+ for (i = 1; i <= right->n; i++) {
+ left->n++;
+ left->node[left->n - 1] = right->node[i - 1];
+ left->branch[left->n] = right->branch[i];
+ }
+ BTree_RemoveItem(this, ptr, i - 1);
+ xfree(right);
+
+}
+
+static void BTree_Restore(BTreePtr this, PagePtr ptr, int index)
+{
+ this->under = 0;
+ if (index > 0) {
+ if (ptr->branch[index - 1]->n > BTreeHalfSize) {
+ BTree_MoveRight(this, ptr, index);
+ } else {
+ BTree_Combine(this, ptr, index);
+ }
+ } else {
+ if (ptr->branch[1]->n > BTreeHalfSize) {
+ BTree_MoveLeft(this, ptr, 1);
+ } else {
+ BTree_Combine(this, ptr, 1);
+ }
+ }
+}
+
+static void BTree_DeleteSub(BTreePtr this, PagePtr ptr)
+{
+ PagePtr p;
+ int i;
+ NodePtr np;
+
+ if (ptr == NULL) {
+ return;
+ }
+ i = 0;
+ np = ptr->node;
+ while ((i < ptr->n) && (np->key < this->node.key)) {
+ i++;
+ np++;
+ }
+ if ((i < ptr->n) && (np->key == this->node.key)) {
+ this->del = 1;
+ if ((p = ptr->branch[i + 1]) != NULL) {
+ while (p->branch[0] != NULL) {
+ p = p->branch[0];
+ }
+ ptr->node[i] = this->node = p->node[0];
+ BTree_DeleteSub(this, ptr->branch[i + 1]);
+ if (this->under) {
+ BTree_Restore(this, ptr, i + 1);
+ }
+ } else {
+ BTree_RemoveItem(this, ptr, i);
+ }
+ } else {
+ BTree_DeleteSub(this, ptr->branch[i]);
+ if (this->under) {
+ BTree_Restore(this, ptr, i);
+ }
+ }
+}
+
+int BTree_Delete(BTreePtr this, int key, void *value)
+{
+ PagePtr ptr;
+
+ this->node.key = key;
+ this->node.value = value;
+ this->del = this->under = 0;
+ BTree_DeleteSub(this, this->root);
+ if (this->del) {
+ if (this->root->n == 0) {
+ ptr = this->root;
+ this->root = this->root->branch[0];
+ xfree(ptr);
+ }
+ /* deleted */
+ return 1;
+ }
+ /* not found */
+ return 0;
+}
+#endif /* 0 */
+
+static void BTree_FreeSub(PagePtr ptr)
+{
+ int i;
+
+ if (ptr != NULL) {
+ for (i = 0; i <= ptr->n; i++) {
+ BTree_FreeSub(ptr->branch[i]);
+ }
+ xfree(ptr);
+ }
+}
+
+void BTree_Free(BTreePtr this)
+{
+ BTree_FreeSub(this->root);
+}
+
+#if 0
+static int count, depth, maxdepth;
+
+static int BTree_PrintSub(PagePtr ptr)
+{
+ int i;
+
+ if (ptr == NULL) {
+ fprintf(stderr, ".");
+ return;
+ }
+ fprintf(stderr, " (");
+ depth++;
+ maxdepth = depth;
+ for (i = 0; i < ptr->n; i++) {
+ BTree_PrintSub(ptr->branch[i]);
+ fprintf(stderr, "%x", ptr->node[i].key);
+ count++;
+ }
+ BTree_PrintSub(ptr->branch[ptr->n]);
+ fprintf(stderr, ") ");
+ depth--;
+}
+
+void BTree_Print(BTreePtr this)
+{
+ count = depth = maxdepth = 0;
+ BTree_PrintSub(this->root);
+ fprintf(stderr, "count %d depth %d\n", count, maxdepth);
+}
+#endif /* 0 */
+
+/*
+ * End Of File
+ */
diff --git a/xc/extras/X-TrueType/xttcache.h b/xc/extras/X-TrueType/xttcache.h
new file mode 100644
index 000000000..160081a33
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcache.h
@@ -0,0 +1,72 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1997 Jyunji Takagi, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+
+/*
+ * B-Tree
+ */
+
+#ifndef _XTTCACHE_H_
+#define _XTTCACHE_H_
+
+#define BTreeHalfSize 4
+
+typedef struct _NodeRec {
+ int key;
+ void *value;
+} NodeRec, *NodePtr;
+
+typedef struct _PageRec {
+ int n;
+ NodeRec node[BTreeHalfSize * 2];
+ struct _PageRec *branch[BTreeHalfSize * 2 + 1];
+} PageRec, *PagePtr;
+
+typedef struct _BTree {
+/* private */
+ NodeRec node;
+ PagePtr page;
+ int del, under;
+/* public */
+ PagePtr root;
+} BTreeRec, *BTreePtr;
+
+extern BTreePtr BTree_Alloc(void);
+extern int BTree_Search(BTreePtr this, int key, void **value);
+extern void BTree_Insert(BTreePtr this, int key, void *value);
+extern void BTree_Free(BTreePtr this);
+extern void BTree_Print(BTreePtr this);
+
+#endif /* _BTREE_H_ */
+
+/*
+ * End Of File
+ */
diff --git a/xc/extras/X-TrueType/xttcap.c b/xc/extras/X-TrueType/xttcap.c
new file mode 100644
index 000000000..e30a37d61
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcap.c
@@ -0,0 +1,689 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "fontmisc.h"
+#include "xttcap.h"
+
+/*
+ Prototypes for obsoleted OS (e.g. SunOS4)
+ */
+
+#if (defined(sun) && !(defined(SVR4) || defined(__SVR4)))
+double strtod(char *str, char **ptr);
+double strtol(char *str, char **ptr, int base);
+#endif
+
+
+/**************************************************************************
+ Private Data Types
+ */
+
+/* Property Record List */
+/* List Node */
+typedef struct TagSPropRecValListNodeP
+{
+ SPropRecValContainerEntityP containerE;
+ struct TagSPropRecValListNodeP *nextNode;
+} SPropRecValListNodeP;
+
+
+/**************************************************************************
+ Tables
+ */
+
+/* valid record field */
+static SPropertyRecord const validRecords[] =
+{
+ { "FontFile", eRecTypeString },
+ { "FaceNumber", eRecTypeInteger },
+ { "AutoItalic", eRecTypeDouble },
+ { "AutoBold", eRecTypeBool },
+ { "ForceProportional", eRecTypeBool },
+ { "ForceSpacing", eRecTypeString },
+ { "ScaleBBoxWidth", eRecTypeDouble },
+ { "ScaleWidth", eRecTypeDouble },
+ { "EncodingOptions", eRecTypeString },
+ { "Hinting", eRecTypeBool },
+ { "VeryLazyMetrics", eRecTypeBool },
+ { "CodeRange", eRecTypeString },
+ { "Dummy", eRecTypeVoid }
+};
+static int const
+numOfValidRecords = sizeof(validRecords)/sizeof(validRecords[0]);
+
+/* correspondence between record name and cap variable name */
+static struct {
+ char const * capVariable;
+ char const * recordName;
+} const correspondRelations[] = {
+ { "fn", "FaceNumber" },
+ { "ai", "AutoItalic" },
+ { "ab", "AutoBold" },
+#if True /* obsoleted ->->-> */
+ { "fp", "ForceProportional" },
+#endif /* <-<-<- obsoleted */
+ { "fs", "ForceSpacing" },
+ { "bw", "ScaleBBoxWidth" },
+ { "sw", "ScaleWidth" },
+ { "eo", "EncodingOptions" },
+ { "vl", "VeryLazyMetrics" },
+ { "cr", "CodeRange" },
+ { "hi", "Hinting" }
+};
+static int const
+numOfCorrespondRelations
+= sizeof(correspondRelations)/sizeof(correspondRelations[0]);
+
+/**************************************************************************
+ Functions
+ */
+
+#ifdef USE_TTP_FILE
+
+#ifndef LEN_LINEBUF
+#define LEN_LINEBUF 2048
+#endif /* !def LEN_LINEBUF */
+
+/* get one line */
+static Bool /* True == Error, False == Success */
+get_one_line(FILE *is, char *buf)
+{
+ Bool result = False;
+ int count = 0;
+ Bool flHead = True;
+ Bool flSpace = False;
+ Bool flInSingleQuote = False;
+ Bool flInDoubleQuote = False;
+ Bool flBackSlash = False;
+ Bool flFirstElement = True;
+
+ *buf = '\0';
+ for (;;) {
+ int c = fgetc(is);
+
+ if (ferror(is)) {
+ fprintf(stderr, "truetype font property file : read error.\n");
+ result = True;
+ break;
+ }
+
+ if (EOF == c) {
+ if (flInSingleQuote || flInDoubleQuote) {
+ fprintf(stderr,
+ "truetype font property file : unmatched quote.\n");
+ result = True;
+ }
+ break;
+ }
+ if (flInSingleQuote) {
+ if ('\'' == c) {
+ /* end of single quoted string */
+ flInSingleQuote = False;
+ c = -1; /* NOT extract to buffer. */
+ } else
+ /* others, extract all character to buffer unconditionally. */
+ ;
+ goto trans;
+ }
+ if (flBackSlash) {
+ /* escape --- when just before character is backslash,
+ next character is escaped. */
+ flBackSlash = False;
+ if ('n' == c)
+ /* newline */
+ c = '\n';
+ if ('\n' == c)
+ /* ignore newline */
+ c = -1;
+ else
+ /* others, extract all character to buffer unconditionally. */
+ ;
+ goto trans;
+ }
+ if ('\\' == c) {
+ /* set flag to escape next character. */
+ flBackSlash = True;
+ c = -1; /* NOT extract to buffer. */
+ goto trans;
+ }
+ if (flInDoubleQuote) {
+ if ('"' == c) {
+ /* end of double quoted string */
+ flInDoubleQuote = False;
+ c = -1; /* NOT extract to buffer. */
+ } else
+ /* others, extract all character to buffer unconditionally. */
+ ;
+ goto trans;
+ }
+ if ('#' == c) {
+ /* skip comment till end of line. */
+ while ('\n' != c) {
+ c = fgetc(is);
+ if (ferror(is)) {
+ fprintf(stderr,
+ "truetype font property file : read error.\n");
+ result = True;
+ break;
+ }
+ if (EOF == c) {
+ break;
+ }
+ }
+ break;
+ }
+ if ('\'' == c) {
+ /* into single quoted string */
+ flInSingleQuote = True;
+ c = -1; /* NOT extract to buffer. */
+ goto trans;
+ }
+ if ('"' == c) {
+ /* into double quoted string */
+ flInDoubleQuote = True;
+ c = -1; /* NOT extract to buffer. */
+ goto trans;
+ }
+ if ('\n' == c)
+ /* End of Line */
+ break;
+ if (isspace(c)) {
+ /* convine multiple spaces */
+ if (!flHead)
+ /* except space at the head of line */
+ flSpace = True;
+ continue;
+ }
+ trans:
+ /* set flHead to False, since current character is not white space
+ when reaches here. */
+ flHead = False;
+ do {
+ if (count>=LEN_LINEBUF-1) {
+ /* overflow */
+ fprintf(stderr,
+ "truetype font property file : too long line.\n");
+ result = True;
+ goto quit;
+ }
+ if (flSpace) {
+ /* just before characters is white space, but
+ current character is not WS. */
+ if (flFirstElement) {
+ /* this spaces is the first cell(?) of white spaces. */
+ flFirstElement = False;
+ /* separate record name and record value */
+ *buf = (char)0xff;
+ } else
+ *buf = ' ';
+ flSpace = False;
+ } else
+ if (-1 != c) {
+ *buf = c;
+ c = -1; /* invalidate */
+ } else
+ /* skip */
+ buf--;
+ buf++;
+ } while (-1 != c); /* when 'c' is not -1, it means
+ that 'c' contains an untreated character. */
+ }
+ *buf = '\0';
+
+ quit:
+ return result;
+}
+
+/* parse one line */
+static Bool /* True == Error, False == Success */
+parse_one_line(SDynPropRecValList *pThisList, FILE *is)
+{
+ Bool result = False;
+ char *buf = NULL;
+ char *recordHead, *valueHead = NULL;
+
+ if (NULL == (buf = xalloc(LEN_LINEBUF))) {
+ fprintf(stderr,
+ "truetype font property file : cannot allocate memory.\n");
+ result = True;
+ goto abort;
+ }
+ {
+ recordHead = buf;
+/* refRecordValue->refRecordType = NULL;*/
+ do {
+ if (get_one_line(is, buf)) {
+ result = True;
+ goto quit;
+ }
+ if (feof(is)) {
+ if ('\0' == *buf)
+ goto quit;
+ break;
+ }
+ } while ('\0' == *buf);
+
+ if (NULL != (valueHead = strchr(buf, 0xff))) {
+ *valueHead = '\0';
+ valueHead++;
+ } else
+ valueHead = buf+strlen(buf);
+#if 0
+ fprintf(stderr,
+ "truetype font property file : \n"
+ "recName:\"%s\"\nvalue:\"%s\"\n",
+ recordHead, valueHead);
+#endif
+ result = SPropRecValList_add_record(pThisList, recordHead, valueHead);
+ }
+ quit:
+ xfree(buf);
+ abort:
+ return result;
+}
+
+/* Read Property File */
+Bool /* True == Error, False == Success */
+SPropRecValList_read_prop_file(SDynPropRecValList *pThisList,
+ char const * const strFileName)
+{
+ Bool result = False;
+ FILE *is;
+
+#if 1
+ if (!strcmp(strFileName, "-"))
+ is = stdin;
+ else
+#endif
+ is = fopen(strFileName, "r");
+ if (NULL == is) {
+ fprintf(stderr, "truetype font property : cannot open file %s.\n",
+ strFileName);
+ result = True;
+ goto abort;
+ }
+ {
+ for (;;) {
+ if (False != (result = parse_one_line(pThisList, is)))
+ goto quit;
+ if (feof(is))
+ break;
+ }
+ }
+ quit:
+#if 1
+ if (strcmp(strFileName, "-"))
+#endif
+ fclose(is);
+ abort:
+ return result;
+}
+#endif /* USE_TTP_FILE */
+
+/* get property record type by record name */
+static Bool /* True == Found, False == Not Found */
+get_record_type_by_name(SPropertyRecord const ** const refRefRecord, /*result*/
+ char const *strName)
+{
+ Bool result = False;
+ int i;
+
+ *refRefRecord = NULL;
+ for (i=0; i<numOfValidRecords; i++) {
+ if (!mystrcasecmp(validRecords[i].strRecordName, strName)) {
+ result = True;
+ *refRefRecord = &validRecords[i];
+ break;
+ }
+ }
+
+ return result;
+}
+
+/* Constructor for Container Node */
+Bool /* True == Error, False == Success */
+SPropRecValList_new(SDynPropRecValList *pThisList)
+{
+ Bool result = False;
+
+ pThisList->headNode = NULL;
+
+ return result;
+}
+
+/* Destructor for Container List */
+Bool /* True == Error, False == Success */
+SPropRecValList_delete(SDynPropRecValList *pThisList)
+{
+ Bool result = False;
+ SPropRecValListNodeP *p, *np;
+
+ for (p=pThisList->headNode; NULL!=p; p=np) {
+ np = p->nextNode;
+ switch (p->containerE.refRecordType->recordType) {
+ case eRecTypeInteger:
+ break;
+ case eRecTypeDouble:
+ break;
+ case eRecTypeBool:
+ break;
+ case eRecTypeString:
+ if (SPropContainer_value_str(&p->containerE))
+ xfree((void*)SPropContainer_value_str(&p->containerE));
+ break;
+ case eRecTypeVoid:
+ break;
+ }
+ xfree(p);
+ }
+
+ pThisList->headNode = NULL;
+
+ return result;
+}
+
+#ifdef DUMP
+void
+SPropRecValList_dump(SRefPropRecValList *pThisList)
+{
+ SPropRecValListNodeP *p;
+ for (p=pThisList->headNode; NULL!=p; p=p->nextNode) {
+ switch (p->containerE.refRecordType->recordType) {
+ case eRecTypeInteger:
+ fprintf(stderr, "%s = %d\n",
+ p->containerE.refRecordType->strRecordName,
+ p->containerE.uValue.integerValue);
+ break;
+ case eRecTypeDouble:
+ fprintf(stderr, "%s = %f\n",
+ p->containerE.refRecordType->strRecordName,
+ p->containerE.uValue.doubleValue);
+ break;
+ case eRecTypeBool:
+ fprintf(stderr, "%s = %s\n",
+ p->containerE.refRecordType->strRecordName,
+ p->containerE.uValue.boolValue
+ ? "True":"False");
+ break;
+ case eRecTypeString:
+ fprintf(stderr, "%s = \"%s\"\n",
+ p->containerE.refRecordType->strRecordName,
+ p->containerE.uValue.dynStringValue);
+ break;
+ case eRecTypeVoid:
+ fprintf(stderr, "%s = void\n",
+ p->containerE.refRecordType->strRecordName);
+ break;
+ }
+ }
+}
+#endif
+
+/* Add Property Record Value */
+extern Bool /* True == Error, False == Success */
+SPropRecValList_add_record(SDynPropRecValList *pThisList,
+ char const * const recordName,
+ char const * const strValue)
+{
+ Bool result = False;
+ SPropRecValContainerEntityP tmpContainerE;
+
+ if (get_record_type_by_name(&tmpContainerE.refRecordType, recordName)) {
+ switch (tmpContainerE.refRecordType->recordType) {
+ case eRecTypeInteger:
+ {
+ int val;
+ char *endPtr;
+
+ val = strtol(strValue, &endPtr, 0);
+ if ('\0' != *endPtr) {
+ fprintf(stderr,
+ "truetype font property : "
+ "%s record needs integer value.\n",
+ recordName);
+ result = True;
+ goto quit;
+ }
+ SPropContainer_value_int(&tmpContainerE) = val;
+ }
+ break;
+ case eRecTypeDouble:
+ {
+ double val;
+ char *endPtr;
+
+ val = strtod(strValue, &endPtr);
+ if ('\0' != *endPtr) {
+ fprintf(stderr,
+ "truetype font property : "
+ "%s record needs floating point value.\n",
+ recordName);
+ result = True;
+ goto quit;
+ }
+ SPropContainer_value_dbl(&tmpContainerE) = val;
+ }
+ break;
+ case eRecTypeBool:
+ {
+ Bool val;
+
+ if (!mystrcasecmp(strValue, "yes"))
+ val = True;
+ else if (!mystrcasecmp(strValue, "y"))
+ val = True;
+ else if (!mystrcasecmp(strValue, "on"))
+ val = True;
+ else if (!mystrcasecmp(strValue, "true"))
+ val = True;
+ else if (!mystrcasecmp(strValue, "t"))
+ val = True;
+ else if (!mystrcasecmp(strValue, "ok"))
+ val = True;
+ else if (!mystrcasecmp(strValue, "no"))
+ val = False;
+ else if (!mystrcasecmp(strValue, "n"))
+ val = False;
+ else if (!mystrcasecmp(strValue, "off"))
+ val = False;
+ else if (!mystrcasecmp(strValue, "false"))
+ val = False;
+ else if (!mystrcasecmp(strValue, "f"))
+ val = False;
+ else if (!mystrcasecmp(strValue, "bad"))
+ val = False;
+ else {
+ fprintf(stderr,
+ "truetype font property : "
+ "%s record needs boolean value.\n",
+ recordName);
+ result = True;
+ goto quit;
+ }
+ SPropContainer_value_bool(&tmpContainerE) = val;
+ }
+ break;
+ case eRecTypeString:
+ {
+ char *p;
+
+ if (NULL == (p = (char *)xalloc(strlen(strValue)+1))) {
+ fprintf(stderr,
+ "truetype font property : "
+ "cannot allocate memory.\n");
+ result = True;
+ goto quit;
+ }
+ strcpy(p, strValue);
+ SPropContainer_value_str(&tmpContainerE) = p;
+ }
+ break;
+ case eRecTypeVoid:
+ if ('\0' != *strValue) {
+ fprintf(stderr,
+ "truetype font property : "
+ "%s record needs void.\n", recordName);
+ result = True;
+ }
+ break;
+ }
+ {
+ /* add to list */
+ SPropRecValListNodeP *newNode;
+
+ if (NULL == (newNode =
+ (SPropRecValListNodeP *)xalloc(sizeof(*newNode)))) {
+ fprintf(stderr,
+ "truetype font property : "
+ "cannot allocate memory.\n");
+ result = True;
+ goto quit;
+ }
+ newNode->nextNode = pThisList->headNode;
+ newNode->containerE = tmpContainerE;
+ tmpContainerE.refRecordType = NULL; /* invalidate --
+ disown value handle. */
+ pThisList->headNode = newNode;
+ }
+ } else {
+ /* invalid record name */
+ fprintf(stderr,
+ "truetype font : "
+ "invalid record name \"%s.\"\n", recordName);
+ result = True;
+ }
+
+ quit:
+ return result;
+}
+
+
+/* Search Property Record */
+Bool /* True == Hit, False == Miss */
+SPropRecValList_search_record(SRefPropRecValList *pThisList,
+ SPropRecValContainer *refRecValue,
+ char const * const recordName)
+{
+ Bool result = False;
+ SPropRecValListNodeP *p;
+
+ *refRecValue = NULL;
+ for (p=pThisList->headNode; NULL!=p; p=p->nextNode) {
+ if (!mystrcasecmp(p->containerE.refRecordType->strRecordName,
+ recordName)) {
+ *refRecValue = &p->containerE;
+ result = True;
+ break;
+ }
+ }
+
+ return result;
+}
+
+
+/* Parse TTCap */
+Bool /* True == Error, False == Success */
+SPropRecValList_add_by_font_cap(SDynPropRecValList *pThisList,
+ char const *strCapHead)
+{
+ Bool result = False;
+ /* SPropertyRecord const *refRecordType; */
+ char const *term;
+
+ if (NULL == (term = strrchr(strCapHead, ':')))
+ goto abort;
+
+ while (strCapHead<term) {
+ int i;
+ char const *nextColon = strchr(strCapHead, ':');
+ if (0<nextColon-strCapHead) {
+ char *duplicated = (char *)xalloc((nextColon-strCapHead)+1);
+ {
+ char *value;
+
+ memcpy(duplicated, strCapHead, nextColon-strCapHead);
+ duplicated[nextColon-strCapHead] = '\0';
+ if (NULL != (value=strchr(duplicated, '='))) {
+ *value = '\0';
+ value++;
+ } else
+ value = &duplicated[nextColon-strCapHead];
+
+ for (i=0; i<numOfCorrespondRelations; i++) {
+ if (!mystrcasecmp(correspondRelations[i].capVariable,
+ duplicated)) {
+ if (SPropRecValList_add_record(pThisList,
+ correspondRelations[i]
+ .recordName,
+ value))
+ break;
+ goto next;
+ }
+ }
+ fprintf(stderr, "truetype font : Illegal Font Cap.\n");
+ result = True;
+ break;
+ next:
+ ;
+ }
+ xfree(duplicated);
+ }
+ strCapHead = nextColon+1;
+ }
+
+ /* quit: */
+ abort:
+ return result;
+}
+
+
+#if 0
+int main()
+{
+ SDynPropRecValList list;
+
+ SPropRecValList_new(&list);
+ SPropRecValList_read_prop_file(&list, "-");
+ SPropRecValList_dump(&list);
+ SPropRecValList_delete(&list);
+
+ return 0;
+}
+#endif
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttcap.h b/xc/extras/X-TrueType/xttcap.h
new file mode 100644
index 000000000..ebbeba681
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcap.h
@@ -0,0 +1,123 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#ifndef _XTTCAP_H_
+#define _XTTCAP_H_ (1)
+
+/*******************************************************************
+ Data Types
+ */
+
+/* Record Type */
+typedef enum
+{
+ eRecTypeInteger,
+ eRecTypeDouble,
+ eRecTypeBool,
+ eRecTypeString,
+ eRecTypeVoid=-1
+} ERecType;
+
+/* Record Name vs Record Type */
+typedef struct
+{
+ char const *strRecordName;
+ ERecType const recordType;
+} SPropertyRecord;
+
+/* Record Value Container */
+typedef struct
+{
+ SPropertyRecord const *refRecordType;
+ union {
+ int integerValue;
+ double doubleValue;
+ Bool boolValue;
+ char *dynStringValue;
+ } uValue;
+} SPropRecValContainerEntityP, *SPropRecValContainer;
+
+/* Record Value List */
+typedef struct TagSPropRecValListNodeP SPropRecValListNode;
+typedef struct
+{
+ SPropRecValListNode *headNode;
+} SDynPropRecValList;
+typedef SDynPropRecValList const SRefPropRecValList;
+
+
+/*******************************************************************
+ Functions
+ */
+
+/* Constructor for Rec Val List */
+extern Bool /* True == Error, False == Success */
+SPropRecValList_new(SDynPropRecValList *pThisList);
+/* Destructor for Rec Val List */
+extern Bool /* True == Error, False == Success */
+SPropRecValList_delete(SDynPropRecValList *pThisList);
+/* Read Property File */
+extern Bool /* True == Error, False == Success */
+SPropRecValList_read_prop_file(SDynPropRecValList *pThisList,
+ char const * const strFileName);
+/* Add Property Record Value */
+extern Bool /* True == Error, False == Success */
+SPropRecValList_add_record(SDynPropRecValList *pThisList,
+ char const * const recordName,
+ char const * const strValue);
+/* Search Property Record */
+extern Bool /* True == Hit, False == Miss */
+SPropRecValList_search_record(SRefPropRecValList *pThisList,
+ SPropRecValContainer *refContRecVal,
+ char const * const recordName);
+/* Add by Font Cap */
+extern Bool /* True == Error, False == Success */
+SPropRecValList_add_by_font_cap(SDynPropRecValList *pThisList,
+ char const *strCapHead);
+
+#ifdef DUMP
+void
+SPropRecValList_dump(SRefPropRecValList *refList);
+#endif
+
+#define SPropContainer_value_int(contRecVal)\
+ ((contRecVal)->uValue.integerValue)
+#define SPropContainer_value_dbl(contRecVal)\
+ ((contRecVal)->uValue.doubleValue)
+#define SPropContainer_value_bool(contRecVal)\
+ ((contRecVal)->uValue.boolValue)
+#define SPropContainer_value_str(contRecVal)\
+ ((contRecVal)->uValue.dynStringValue)
+
+#endif /* !def _XTTCAP_H_ */
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttcconv.c b/xc/extras/X-TrueType/xttcconv.c
new file mode 100644
index 000000000..a30194271
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcconv.c
@@ -0,0 +1,635 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+/* ***This file depend on XFree86 Loader architecture*** */
+
+#include "X.h"
+#include "xttcommon.h"
+#include "xttcconv.h"
+#include "xttcconvP.h"
+
+#ifdef CCONV_MODULE
+# ifndef FONTMODULE
+/* for X11R6.[0-4] or XFree86 3.3.x */
+
+# include "fontmisc.h"
+
+# include <dlfcn.h>
+# ifndef DL_OPTION
+# ifdef RTLD_NOW
+# define DL_OPTION RTLD_NOW
+# else
+# if defined(__NetBSD__) || defined(__OpenBSD__)
+# define DL_OPTION DL_LAZY
+# else
+# define DL_OPTION 1
+# endif
+# endif
+# endif /* DL_OPTION */
+# ifndef DLOPEN
+# define DLOPEN dlopen
+# endif /* DLOPEN */
+# ifndef DLSYM
+# define DLSYM dlsym
+# endif /* DLSYM */
+# ifndef DLCLOSE
+# define DLCLOSE dlclose
+# endif /* DLCLOSE */
+# ifndef CCONV_MODULE_DIR
+# define CCONV_MODULE_DIR "/usr/X11R6/lib/modules/codeconv"
+# endif /* CCONV_MODULE_DIR */
+# define LEN_CCONV_MODULE_DIR (sizeof(CCONV_MODULE_DIR)-1)
+# ifndef CCONV_MODULE_EXTENTION
+# define CCONV_MODULE_EXTENTION ".so"
+# endif /* CCONV_MODULE_EXTENTION */
+# define LEN_CCONV_MODULE_EXTENTION (sizeof(CCONV_MODULE_EXTENTION)-1)
+ /*
+ * Entrypoint function name strategy
+ * e.g.:
+ * module file name = "Foo.so"-> "Foo_entrypoint"
+ *
+ * To prevent symbol name confliction when using preloaded or
+ * statically linked code converter, the author add a module name
+ * to symbol name prefix.
+ */
+# ifndef CCONV_ENTRYPOINT_POSTFIX
+# define CCONV_ENTRYPOINT_POSTFIX "_entrypoint"
+# endif /* CCONV_ENTRYPOINT_POSTFIX */
+# define LEN_CCONV_ENTRYPOINT_POSTFIX (sizeof(CCONV_ENTRYPOINT_POSTFIX)-1)
+
+# else
+/* for New Designed XFree86 */
+# include "misc.h"
+# include "fontmod.h"
+# include "xf86Module.h"
+
+# ifndef CCONV_MODULE_SUBDIR
+# define CCONV_MODULE_SUBDIR "codeconv"
+# endif /* CCONV_MODULE_SUBDIR */
+
+# ifndef CCONV_MODULE_EXTENTION
+# if ! MakeDllModules
+# define CCONV_MODULE_EXTENTION ".a"
+# else
+# define CCONV_MODULE_EXTENTION ".so"
+# endif /* defined(FONTMODULE) && ! MakeDllModules */
+# endif /* CCONV_MODULE_EXTENTION */
+# define LEN_CCONV_MODULE_EXTENTION (sizeof(CCONV_MODULE_EXTENTION)-1)
+# ifndef CCONV_ENTRYPOINT_POSTFIX
+# define CCONV_ENTRYPOINT_POSTFIX "_entrypoint"
+# endif /* CCONV_ENTRYPOINT_POSTFIX */
+# define LEN_CCONV_ENTRYPOINT_POSTFIX (sizeof(CCONV_ENTRYPOINT_POSTFIX)-1)
+
+/* CCONV_USE_SYMBOLIC_ENTRY_POINT cannot be defined! */
+#ifdef CCONV_USE_SYMBOLIC_ENTRY_POINT
+/* XXX */
+char *entryName = NULL;
+static int entryNameAllocated = 0;
+#endif
+
+/* end of section for New Designed XFree86 */
+# endif /* FONTMODULE */
+#endif /* CCONV_MODULE */
+
+#if defined(CSRG_BASED) && !defined(__ELF__)
+#define PREPEND_UNDERSCORE
+#endif
+
+#if 0
+void*
+mydlopen(const char *path, int mode)
+{
+ void *ret;
+ ret = dlopen(path, mode);
+ fprintf(stderr, "dlopen(%s, %d)=%p\n", path, mode, ret);
+ if (NULL == ret)
+ fprintf(stderr, " (%s)\n", dlerror());
+ return ret;
+}
+mydlsym(void *handle, const char *symbol)
+{
+ void *ret;
+ ret = dlsym(handle, symbol);
+ fprintf(stderr, "dlsym(%p, %s)=%p\n", handle, symbol, ret);
+ return ret;
+}
+mydlclose(void *handle)
+{
+ int ret;
+ ret = dlclose(handle);
+ fprintf(stderr, "dlclose(%p)=%d\n", handle, ret);
+ return ret;
+}
+#endif
+
+
+#ifdef FONTMODULE
+/* for New Designed XFree86 */
+
+extern FontModule xttModule; /* in module/xttmodule.c */
+
+DECLARE_SUBREQ(cconvSubReq)
+
+static const char* convModuleSubdir[] = {
+ CCONV_MODULE_SUBDIR,
+#if 0
+ "fonts/"CCONV_MODULE_SUBDIR,
+#endif
+ NULL,
+};
+
+#endif
+
+
+
+/*************************************************
+ tables
+ */
+
+#ifndef CCONV_MODULE
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_1_entrypoint);
+#ifdef OPT_ENCODINGS
+ENTRYFUNC_PROTO_TEMPLATE(BIG5_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(GB2312_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(JISX0201_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(JISX0208_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(JISX0212_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(KSC5601_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(KSCJOHAB_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_2_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_3_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_4_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_5_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_6_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_7_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_8_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_9_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_10_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_11_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_14_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ISO8859_15_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(KOI8_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(VISCII_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(TCVN_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ARMSCII8_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(ARABIC_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(MULEENCODING_entrypoint);
+ENTRYFUNC_PROTO_TEMPLATE(DOSENCODING_entrypoint);
+#endif /* OPT_ENCODINGS */
+#endif /* !CCONV_MODULE */
+
+/* List of EntryPoint For Statically Linked Code Converter. */
+static mod_entrypoint_ptr_t preloadedCodeConverter[] = {
+#ifdef CCONV_MODULE
+ /* !CCONV_MODULE
+ --- You can add particular module to link it statically. */
+#else /* CCONV_MODULE */
+ /* !CCONV_MODULE --- All code converter must statically linked to use. */
+ ISO8859_1_entrypoint,
+#ifdef OPT_ENCODINGS
+ BIG5_entrypoint,
+ GB2312_entrypoint,
+ JISX0201_entrypoint,
+ JISX0208_entrypoint,
+ JISX0212_entrypoint,
+ KSC5601_entrypoint,
+ KSCJOHAB_entrypoint,
+ ISO8859_2_entrypoint,
+ ISO8859_3_entrypoint,
+ ISO8859_4_entrypoint,
+ ISO8859_5_entrypoint,
+ ISO8859_6_entrypoint,
+ ISO8859_7_entrypoint,
+ ISO8859_8_entrypoint,
+ ISO8859_9_entrypoint,
+ ISO8859_10_entrypoint,
+ ISO8859_11_entrypoint,
+ ISO8859_14_entrypoint,
+ ISO8859_15_entrypoint,
+ KOI8_entrypoint,
+ VISCII_entrypoint,
+ TCVN_entrypoint,
+ ARMSCII8_entrypoint,
+ ARABIC_entrypoint,
+ MULEENCODING_entrypoint,
+ DOSENCODING_entrypoint,
+#endif /* OPT_ENCODINGS */
+#endif /* !CCONV_MODULE */
+ NULL
+};
+
+
+/*************************************************
+ codeconv public functions
+ */
+
+/* find code converter */
+Bool /* isFound */
+codeconv_search_code_converter(char const *charsetName,
+ TT_Face hFace, int numberOfCharMaps,
+ SRefPropRecValList *refListPropRecVal,
+ CodeConverterInfo *
+ refCodeConverterInfo /* result */,
+ int *refMapID /* result */)
+{
+ Bool isFound = False;
+ CharSetSelectionHints hints;
+
+ {
+ /* construct hints struct */
+ hints.charsetStdName = NULL;
+ hints.charsetYear = NULL;
+ hints.charsetEncoding = NULL;
+ hints.hFace = hFace;
+ hints.numberOfCharMaps = numberOfCharMaps;
+ hints.refListPropRecVal = refListPropRecVal;
+ {
+ /* separate charset name string */
+ char *p, *q;
+
+ hints.charsetStdName = p = strdup(charsetName);
+ if (NULL != (q=strchr(p, '.'))) {
+ /* YEAR field */
+ *q = '\0'; q++;
+ hints.charsetYear = p = q;
+ }
+ if (NULL != (q=strchr(p, '-'))) {
+ /* ENCODING field */
+ *q = '\0'; q++;
+ hints.charsetEncoding = q;
+ }
+ }
+ }
+ {
+ refCodeConverterInfo->refCharSetInfo = NULL;
+ refCodeConverterInfo->handleModule = NULL;
+ refCodeConverterInfo->ptrCodeConverter = NULL;
+ refCodeConverterInfo->destructor = NULL;
+ refCodeConverterInfo->work = NULL;
+ }
+ {
+ /* scan preloaded converter */
+ mod_entrypoint_ptr_t *p;
+ for (p=preloadedCodeConverter; NULL != *p; p++) {
+ if (False != (isFound = (*p)(&hints,
+ refCodeConverterInfo,
+ refMapID)))
+ goto quit;
+ }
+ }
+#ifdef CCONV_MODULE
+ {
+#if !defined(FONTMODULE)
+ char* pathModule = NULL;
+/* for X11R6.[0-4] or XFree86 3.3.x */
+
+ DIR *dir = NULL;
+ struct dirent *dp;
+ if (NULL == (dir = opendir(CCONV_MODULE_DIR)))
+ goto endScanMod;
+ while (NULL != (dp=readdir(dir)) && !isFound) {
+ const char *baseName = dp->d_name;
+ int baseNameLen = strlen(baseName);
+ /* check extention */
+ if (!strcmp(baseName+(baseNameLen-LEN_CCONV_MODULE_EXTENTION),
+ CCONV_MODULE_EXTENTION)) {
+ /* match extention */
+ char *entrypointFuncName;
+ {
+ /* concat dirName & baseName */
+ pathModule =
+ (char *)xalloc(LEN_CCONV_MODULE_DIR+1+baseNameLen +1);
+ strcpy(pathModule, CCONV_MODULE_DIR);
+ strcat(pathModule, "/");
+ strcat(pathModule, baseName);
+ }
+ {
+ int entrypointFuncNameBaseLen = baseNameLen;
+#if defined(PREPEND_UNDERSCORE)
+ entrypointFuncNameBaseLen++; /* For FuncSym prefix "_" */
+#endif
+ /* make entrypoint function name */
+ entrypointFuncName =
+ (char *)xalloc(entrypointFuncNameBaseLen
+ +LEN_CCONV_ENTRYPOINT_POSTFIX+1);
+#if defined(PREPEND_UNDERSCORE)
+ /* FuncSym prefix "_" */
+ strcpy(entrypointFuncName, "_");
+ /* "Foo.so" into entrypointFuncName */
+ strcat(entrypointFuncName, baseName);
+#else
+ /* "Foo.so" into entrypointFuncName */
+ strcpy(entrypointFuncName, baseName);
+#endif
+ /* "Foo" into entrypointFuncName */
+ entrypointFuncName[entrypointFuncNameBaseLen-
+ LEN_CCONV_MODULE_EXTENTION] = '\0';
+ /* "Foo_entrypoint" into entrypointFuncName */
+ strcat(entrypointFuncName, CCONV_ENTRYPOINT_POSTFIX);
+ }
+ {
+ /* bind and call module */
+ ft_module_handle_t handle;
+
+ if (NULL != (handle = DLOPEN(pathModule, DL_OPTION))) {
+ mod_entrypoint_ptr_t entryPoint;
+ entryPoint =
+ (mod_entrypoint_ptr_t)DLSYM(handle,
+ entrypointFuncName);
+ if (NULL != entryPoint)
+ isFound =
+ (*entryPoint)(&hints, refCodeConverterInfo,
+ refMapID);
+ if (isFound) {
+ refCodeConverterInfo->handleModule = handle;
+ } else {
+ DLCLOSE(handle);
+ }
+ } else {
+ fprintf(stderr, "warning: cannot dlopen - %s\n",
+ dlerror());
+ }
+ }
+ xfree(entrypointFuncName);
+ } /* match file name extention */
+ } /* loop by directory entry */
+ endScanMod:
+ if (dir)
+ closedir(dir);
+ if(pathModule)
+ xfree(pathModule);
+#else /* ! FONTMODULE */
+/* for New Designed XFree86 */
+
+ char** list = NULL;
+ ModuleSetupArg moduleArg;
+
+ moduleArg.charSetHints = &hints;
+ moduleArg.refCodeConverterInfo = refCodeConverterInfo;
+ moduleArg.refMapID = refMapID;
+
+ if (NULL !=
+ (list = LoaderListDirs(convModuleSubdir, NULL))) {
+
+#ifdef CCONV_USE_SYMBOLIC_ENTRY_POINT
+ mod_entrypoint_ptr_t entryPoint = NULL; /* XXX */
+
+ {
+ /* calc max basename length and allocate entry name */
+ int length = 0;
+ char** l;
+
+ for (l=list; *l; l++)
+ if(strlen(*l) > length)
+ length = strlen(*l);
+ length += LEN_CCONV_ENTRYPOINT_POSTFIX;
+
+ if (NULL == entryName){
+ entryName = xalloc(length+1);
+ entryNameAllocated = length;
+ }
+ else
+ if (length > entryNameAllocated) {
+ entryName = xrealloc(entryName, length+1);
+ entryNameAllocated = length;
+ }
+ if (NULL == entryName)
+ goto endScanMod;
+ }
+#endif /* CCONV_USE_SYMBOLIC_ENTRY_POINT */
+
+ {
+ char **l;
+ char **tryItFirst = NULL;
+
+ for (l=list; *l ; l++) {
+ if(!mystrcasecmp(*l,moduleArg.charSetHints->charsetStdName))
+ tryItFirst = l;
+ }
+
+ if(tryItFirst)
+ l = tryItFirst;
+ else
+ l = list;
+
+ while(*l && !isFound) {
+ /* load and call module */
+ pointer handle;
+ int errorMajor;
+ int errorMinor;
+
+#ifdef CCONV_USE_SYMBOLIC_ENTRY_POINT
+ /* XXX */
+ /* compound entry point name */
+ strcpy(entryName, *l);
+ strcat(entryName, CCONV_ENTRYPOINT_POSTFIX);
+#endif /* CCONV_USE_SYMBOLIC_ENTRY_POINT */
+
+ handle = LoadSubModule(xttModule.module,
+ *l, convModuleSubdir, NULL,
+ &moduleArg, &cconvSubReq,
+ &errorMajor, &errorMinor);
+
+ if (NULL != handle) {
+ refCodeConverterInfo->handleModule =
+ (ft_module_handle_t)handle;
+ isFound = True;
+ goto endScanMod;
+ }
+
+ if (NULL != tryItFirst) {
+ l = list;
+ tryItFirst = NULL;
+ }
+ else
+ l++;
+
+ } /* loop by directory entry */
+ }
+ endScanMod:
+ LoaderFreeDirList(list);
+ }
+#endif /* !FONTMODULE */
+ }
+#endif /* CCONV_MODULE */
+ quit:
+ {
+ /* destruct hints struct */
+ if (hints.charsetStdName)
+ xfree((char *)hints.charsetStdName);
+ }
+ return isFound;
+}
+
+
+/* free code converter */
+void
+codeconv_free_code_converter(CodeConverterInfo *refCodeConverterInfo)
+{
+ if (refCodeConverterInfo->destructor)
+ (refCodeConverterInfo->destructor)(refCodeConverterInfo);
+#ifdef CCONV_MODULE
+ if (refCodeConverterInfo->handleModule) {
+#ifdef FONTMODULE
+ UnloadSubModule(refCodeConverterInfo->handleModule);
+#else
+ DLCLOSE(refCodeConverterInfo->handleModule);
+#endif
+ }
+#endif /* CCONV_MODULE */
+ refCodeConverterInfo->handleModule = NULL;
+ refCodeConverterInfo->destructor = NULL;
+}
+
+
+/************************************************
+ codeconv private functions
+ */
+
+/* search charset info from relationship table */
+Bool /* isFound */
+codeconv_search_charset(CharSetRelation const *charSetRelations,
+ char const *charsetStdName,
+ char const *charsetYear,
+ char const *charsetEncoding,
+ int *refMagicNumber /* result */,
+ CharSetInfo const **refRefCharSetInfo /* result */)
+{
+ Bool isFound = False;
+ CharSetRelation const *p;
+
+ for (p=charSetRelations; NULL != p->charsetStdName; p++) {
+ /* check STANDARD field */
+ if ( !mystrcasecmp(p->charsetStdName, charsetStdName))
+ /* check YEAR field */
+ if ( !p->charsetYear /* mean as no need to check the YEAR field */
+ || (charsetYear &&
+ !mystrcasecmp(p->charsetYear, charsetYear)))
+ /* check ENCODING field */
+ if ( !p->charsetEncoding /* mean as no need
+ to check the ENCODING field */
+ || (charsetEncoding && !mystrcasecmp(p->charsetEncoding,
+ charsetEncoding))) {
+ /* match!! */
+ isFound = True;
+ *refMagicNumber = p->magicNumber;
+ *refRefCharSetInfo = &p->charSetInfo;
+ break;
+ }
+ }
+
+ return isFound;
+}
+
+
+/* search map ID from relations */
+Bool /* isFound */
+codeconv_search_map_id(CharSetSelectionHints const *charSetHints,
+ CharSetRelation const *refCharSetRelations,
+ MapIDRelation const *refMapIDRelations,
+ CodeConverterInfo *refCodeConverterInfo /* result */,
+ int *refMapID /* result */)
+{
+ Bool isFound = False;
+ int magic;
+
+ {
+ /* default code converter */
+ refCodeConverterInfo->ptrCodeConverter = null_code_converter;
+ }
+
+ if (codeconv_search_charset(refCharSetRelations,
+ charSetHints->charsetStdName,
+ charSetHints->charsetYear,
+ charSetHints->charsetEncoding,
+ &magic,
+ &refCodeConverterInfo->refCharSetInfo)) {
+ MapIDRelation const *p;
+
+ for (p=refMapIDRelations;
+ !isFound && 0<=p->magicNumber;
+ p++) {
+ if (p->magicNumber == magic) {
+ if (p->platform == EPlfmAny) {
+ isFound = True;
+ *refMapID = 0;
+ goto found;
+ } else {
+ int i;
+ for (i=0;
+ !isFound && i<charSetHints->numberOfCharMaps;
+ i++) {
+ TT_UShort platform, encoding;
+ TT_Get_CharMap_ID(charSetHints->hFace, i,
+ &platform, &encoding);
+ if (p->platform == platform) {
+ if (p->encoding == EEncAny ||
+ p->encoding == encoding) {
+ isFound = True;
+ *refMapID = i;
+ goto found;
+ }
+ }
+ }
+ }
+ }
+ }
+found:
+ if (isFound) {
+ if (NULL != p->ptrCodeConverter) {
+ refCodeConverterInfo->ptrCodeConverter =
+ p->ptrCodeConverter;
+ }
+ if (NULL != p->callback)
+ (*p->callback)(charSetHints, refCodeConverterInfo, refMapID);
+ }
+ }
+
+ return isFound;
+}
+
+
+/* null code converter */
+ft_char_code_t /* result charCodeDst */
+null_code_converter(ft_char_code_t charCodeSrc)
+{
+ return charCodeSrc;
+}
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttcconv.h b/xc/extras/X-TrueType/xttcconv.h
new file mode 100644
index 000000000..9d218e3ae
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcconv.h
@@ -0,0 +1,105 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+
+#ifndef _XTTCCONV_H_
+#define _XTTCCONV_H_ (1)
+
+#include "xttcap.h"
+
+/*************************************
+ Data Types
+ */
+
+#if 0
+typedef unsigned short one_octet_t;
+typedef unsigned short two_octet_t;
+#endif
+typedef unsigned short ft_char_code_t;
+typedef ft_char_code_t ucs2_t;
+typedef ft_char_code_t (*ft_code_converter_ptr_t)(ft_char_code_t idx);
+typedef void *ft_module_handle_t;
+
+
+/*
+ Charset Information Struct
+ --- To keep backward compatibility,
+ you should not change the sequence of the elements.
+ you should only add new elements to the tail of the struct.
+ */
+typedef struct {
+ int firstCol;
+ int lastCol;
+ int firstRow;
+ int lastRow;
+ int defaultCh;
+} CharSetInfo;
+
+
+/*
+ Code Converter Information Struct
+ */
+typedef struct TagCodeConverterInfo {
+ CharSetInfo const *refCharSetInfo;
+ ft_module_handle_t handleModule;
+ ft_code_converter_ptr_t ptrCodeConverter;
+ void (*destructor)(struct TagCodeConverterInfo *codeConverterInfo);
+ void *work;
+} CodeConverterInfo;
+
+
+/************************************
+ Prototypes
+ */
+
+/* search code converter */
+Bool /* isFound */
+codeconv_search_code_converter(char const *charSetName,
+ TT_Face hFace, int numberOfCharMaps,
+ SRefPropRecValList *refListPropRecVal,
+ CodeConverterInfo *
+ refCodeConverterInfo /*result*/,
+ int *refMapID /*result*/);
+
+/* free code converter */
+void
+codeconv_free_code_converter(CodeConverterInfo *refCodeConverterInfo);
+
+/* null code converter */
+ft_char_code_t /* result charCodeDst */
+null_code_converter(ft_char_code_t charCodeSrc);
+
+
+#endif /* !def _XTTCCONV_H_ */
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttcconvP.h b/xc/extras/X-TrueType/xttcconvP.h
new file mode 100644
index 000000000..55c1397c6
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcconvP.h
@@ -0,0 +1,269 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Takuya SHIOZAKI, All Rights reserved.
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1999 Mutsumi ISHIKAWA, All rights reserved.
+ Copyright (c) 1999 Nozomi YTOW, All rights reserved.
+ Copyright (c) 1998,1999 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+ */
+/* $XFree86: xc/extras/X-TrueType/xttcconvP.h,v 1.4 1999/07/18 16:04:14 dawes Exp $ */
+
+#ifndef _XTTCCONVP_H_
+#define _XTTCCONVP_H_ 1
+
+
+/*************************************
+ Data Types
+ */
+
+/*
+ Charset Selection Hints Struct
+ --- To keep backward compatibility,
+ you should not change the sequence of the elements.
+ You should only add new elements to the tail of the struct.
+ */
+typedef struct {
+ char const *charsetStdName; /* e.g. "iso8859", "jisx0208" .... */
+ char const *charsetYear; /* e.g. "1983" of "jisx0208.1983" */
+ char const *charsetEncoding; /* e.g. "1" of "iso8859-1" */
+ TT_Face hFace;
+ int numberOfCharMaps;
+ SRefPropRecValList *refListPropRecVal;
+ /* user property */
+} CharSetSelectionHints;
+
+
+/*
+ relation between Charset Name and info.
+ */
+typedef struct {
+ char const *charsetStdName; /* e.g. "iso8859", "jisx0208" .... */
+ char const *charsetYear; /* e.g. "1983" of "jisx0208.1983" */
+ char const *charsetEncoding; /* e.g. "1" of "iso8859-1" */
+ int magicNumber; /* serial number of char set */
+ CharSetInfo charSetInfo; /* char set info */
+} CharSetRelation;
+
+
+/* Module Entry Pointer */
+typedef
+Bool /* isFound */
+(*mod_entrypoint_ptr_t)(CharSetSelectionHints const *charSetHints,
+ CodeConverterInfo *refCodeConverterInfo /* result */,
+ int *refMapID /* result */);
+
+/*
+ relation between charset and mapID
+ */
+
+enum {
+ EPlfmUnicode = 0,
+ EPlfmApple = 1,
+ EPlfmISO = 2,
+ EPlfmMS = 3,
+ EPlfmAny = -1
+};
+enum {
+ EEncUnicodeAny = -1,
+ EEncAppleRoman = 0,
+ EEncAppleJapanese = 1,
+ EEncAppleCenteuro = 29,
+ EEncAppleCyrillic = 7,
+ EEncISOASCII = 0,
+ EEncISO10646 = 1,
+ EEncISO8859_1 = 2,
+ EEncMSSymbol = 0,
+ EEncMSUnicode = 1,
+ EEncMSShiftJIS = 2,
+ EEncMSBig5WGL4 = 4,
+ EEncMSWansung = 5,
+ EEncAny = -1
+};
+typedef struct {
+ int magicNumber;
+ int platform, encoding;
+ ft_code_converter_ptr_t ptrCodeConverter;
+ void (*callback)(CharSetSelectionHints const *charSetHints,
+ CodeConverterInfo *refCodeConverterInfo /* result */,
+ int *refMapID /* result */);
+} MapIDRelation;
+
+
+/*************************************
+ Code convert function templates
+ */
+
+/* 1 octet charset to unicode */
+#define CODE_CONV_ONE_OCTET_TO_UCS2(funcName, tableName,\
+ begin, end,\
+ altChar)\
+ft_char_code_t /* result charCodeDst */\
+funcName(ft_char_code_t codeSrc)\
+{\
+ ucs2_t codeDst;\
+\
+ if (codeSrc>=begin && codeSrc<=end)\
+ codeDst = tableName[codeSrc-begin];\
+ else\
+ codeDst = altChar;\
+\
+ return codeDst;\
+}
+
+/* 2 octet charset to unicode */
+#define CODE_CONV_TWO_OCTET_TO_UCS2(funcName, tableName,\
+ beginHigh, endHigh,\
+ beginLow, endLow,\
+ altChar)\
+ft_char_code_t /* result charCodeDst */\
+funcName(ft_char_code_t codeSrc)\
+{\
+ ucs2_t codeDst;\
+ int high = codeSrc >> 8;\
+ int low = codeSrc & 0xff;\
+\
+ if (high>=beginHigh && high<=endHigh && low>=beginLow && low<=endLow)\
+ codeDst =\
+ tableName[(high-beginHigh)*(endLow-beginLow+1)+(low-beginLow)];\
+ else\
+ codeDst = altChar;\
+\
+ return codeDst;\
+}
+
+
+/* iso8859-* to unicode or apple roman */
+#define CODE_CONV_ISO8859_TO_UCS2(funcName, tableName, altChar)\
+ft_char_code_t /* result charCodeDst */\
+funcName(ft_char_code_t codeSrc)\
+{\
+ ucs2_t codeDst = 0;\
+\
+ if (codeSrc>=0xa0)\
+ codeDst = tableName[codeSrc-0xa0];\
+ else if (codeSrc<0x80)\
+ codeDst = codeSrc;\
+\
+ return codeDst;\
+}
+
+
+/*************************************
+ Code convert functions
+ */
+
+#define CODECONV_TEMPLATE(funcName)\
+ft_char_code_t /* result charCodeDst */\
+funcName(ft_char_code_t codeSrc)
+
+
+/********************************************
+ Module Entry Point Function Template
+ */
+
+#define ENTRYFUNC_PROTO_TEMPLATE(funcName) \
+Bool /* isFound */\
+funcName(CharSetSelectionHints const *charSetHints,\
+ CodeConverterInfo *refCodeConverterInfo /* result */,\
+ int *refMapID /* result */)
+
+#define ENTRYFUNC_TEMPLATE(funcName) \
+ENTRYFUNC_PROTO_TEMPLATE(funcName); \
+CCONV_MODULE_SETUP \
+ENTRYFUNC_PROTO_TEMPLATE(funcName) \
+
+#define STD_ENTRYFUNC_TEMPLATE(funcName) \
+ENTRYFUNC_TEMPLATE(funcName) \
+{\
+ return codeconv_search_map_id(charSetHints,\
+ charSetRelations,\
+ mapIDRelations,\
+ refCodeConverterInfo,\
+ refMapID);\
+}
+
+
+/*************************************
+ callback function template
+ */
+
+#define CODECONV_CALLBACK_TEMPLATE(funcName)\
+void funcName(CharSetSelectionHints const *charSetHints,\
+ CodeConverterInfo *refCodeConverterInfo /* result */,\
+ int *refMapID /* result */)
+
+
+/********************************************
+ Private Functions
+ */
+
+/* search charset info from relationship table */
+Bool /* isFound */
+codeconv_search_charset(CharSetRelation const *charSetRelations,
+ char const *charsetStdName,
+ char const *charsetYear,
+ char const *charsetEncoding,
+ int *refMagicNumber /* result */,
+ CharSetInfo const **refRefCharSetInfo /* result */);
+
+/* search map ID */
+Bool /* isFound */
+codeconv_search_map_id(CharSetSelectionHints const *charSetHints,
+ CharSetRelation const *refCharSetRelations,
+ MapIDRelation const *refMapIDRelations,
+ CodeConverterInfo *refCodeConverterInfo /* result */,
+ int *refMapID /* result */);
+
+
+#endif /* !def _XTTCCONVP_H_ */
+
+
+#ifdef FONTMODULE
+/* for New Designed XFree86 font module */
+
+/*
+ * This is moved to xttcommon.h because it needs to be included before
+ * "xf86_ansic.h"
+ */
+#if 0
+#include "xf86Module.h"
+#endif
+#include "xttversion.h"
+#include "cconvversion.h"
+
+/* end of New Designed XFree86 font module */
+#else
+/* dlopen module */
+
+#define CCONV_MODULE_SETUP
+
+#endif
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttchinfo.c b/xc/extras/X-TrueType/xttchinfo.c
new file mode 100644
index 000000000..4b1de77f4
--- /dev/null
+++ b/xc/extras/X-TrueType/xttchinfo.c
@@ -0,0 +1,148 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1997 Jyunji Takagi, All rights reserved.
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 Kazushi (Jam) Marukawa, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+#include "fntfilst.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcache.h"
+#include "xttstruct.h"
+
+#define CharInfoPoolUnitSize 256
+
+CharInfoPoolPtr
+CharInfoPool_Alloc(void)
+{
+ CharInfoPoolPtr this = (CharInfoPoolPtr) xalloc(sizeof(*this));
+ if (this != NULL) {
+ /* Initialize CharInfoUnit portion */
+ this->unit = NULL;
+ this->n = this->index = 0;
+ /* Initialize BitmapInfoUnit portion */
+ this->bunit = NULL;
+ this->bn = 0;
+ }
+ return this;
+}
+
+CharInfoPtr
+CharInfoPool_Get(CharInfoPoolPtr this)
+{
+ CharInfoUnitPtr ptr;
+ CharInfoPtr cptr;
+
+ if ((this->n == 0) || (this->index == CharInfoPoolUnitSize)) {
+ ptr = (CharInfoUnitPtr) xrealloc(this->unit, (this->n + 1) *
+ sizeof(*ptr));
+ if (ptr == NULL)
+ return NULL;
+ this->unit = ptr;
+
+ cptr = (CharInfoPtr)xalloc(CharInfoPoolUnitSize * sizeof(CharInfoRec));
+ if (cptr == NULL)
+ return NULL;
+
+ ptr = this->unit + this->n;
+ ptr->charInfo = cptr;
+
+ this->n++;
+ this->index = 0;
+ } else
+ ptr = this->unit + (this->n - 1);
+
+ /* return new charInfo */
+ ptr->charInfo[this->index].bits = NULL;
+ return &ptr->charInfo[this->index++];
+}
+
+void
+CharInfoPool_Set(CharInfoPoolPtr this, CharInfoPtr dat, int size)
+{
+ BitmapInfoUnitPtr ptr;
+ char *bptr;
+ int newsize;
+
+ ptr = &this->bunit[this->bn - 1];
+ if (this->bn == 0 || ptr->cur + size > ptr->bitmapsize) {
+ /* make a new room. */
+ ptr = (BitmapInfoUnitPtr) xrealloc(this->bunit, (this->bn + 1) *
+ sizeof(*ptr));
+ if (ptr == NULL)
+ return;
+ this->bunit = ptr;
+
+ newsize = 4096; /* magic number, 4KB */
+ if (size > newsize / 2)
+ newsize = size;
+
+ bptr = (char *) xalloc(newsize);
+ if (bptr == NULL)
+ return;
+ memset(bptr, 0, newsize);
+
+ ptr = this->bunit + this->bn;
+ ptr->bitmap = bptr;
+ ptr->bitmapsize = newsize;
+ ptr->cur = 0;
+
+ this->bn++;
+ }
+
+ dat->bits = ptr->bitmap + ptr->cur;
+ ptr->cur += size;
+}
+
+void
+CharInfoPool_Free(CharInfoPoolPtr this)
+{
+ int i;
+ for (i = 0; i < this->n; i++)
+ xfree(this->unit[i].charInfo);
+ for (i = 0; i < this->bn; i++)
+ xfree(this->bunit[i].bitmap);
+ xfree(this->unit);
+ xfree(this->bunit);
+ this->unit = NULL;
+ this->bunit = NULL;
+ this->n = 0;
+ this->bn = 0;
+}
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttcommon.h b/xc/extras/X-TrueType/xttcommon.h
new file mode 100644
index 000000000..d417c78ef
--- /dev/null
+++ b/xc/extras/X-TrueType/xttcommon.h
@@ -0,0 +1,125 @@
+/* -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- */
+/*
+ ===FileName: ===
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 Takuya SHIOZAKI, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+/* $XFree86: xc/extras/X-TrueType/xttcommon.h,v 1.4 1999/07/18 16:04:15 dawes Exp $ */
+
+#ifndef _XTTCOMMON_H_
+#define _XTTCOMMON_H_ (1)
+
+/*******************************************************
+ * Headers
+ */
+
+#ifndef FONTMODULE
+/* for X11R6.[0-4], XFree86 3.3.x */
+
+ /* ISO C and POSIX Headers */
+# include <sys/types.h>
+ /* # include <assert.h> */
+# include <ctype.h>
+# include <dirent.h>
+# include <errno.h>
+# include <fcntl.h>
+# include <float.h>
+# include <grp.h>
+# include <limits.h>
+ /* # include <locale.h> */
+# ifdef _XOPEN_SOURCE
+# include <math.h>
+# else
+# define _XOPEN_SOURCE /* to get prototype for hypot on some systems */
+# include <math.h>
+# undef _XOPEN_SOURCE
+# endif
+# include <pwd.h>
+ /* # include <setjmp.h> */
+ /* # include <signal.h> */
+# include <stdarg.h>
+# include <stddef.h>
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# include <sys/stat.h>
+ /* # include <sys/utsname.h> */
+ /* # include <sys/wait.h> */
+ /* # include <termios.h> */
+# include <time.h>
+# include <unistd.h>
+ /* # include <utime.h> */
+
+#else
+/* for New Designed XFree86 */
+
+# include <X11/X.h>
+# include <X11/Xmd.h>
+# include <X11/Xfuncproto.h>
+# ifdef FONTMODULE
+/* for New Designed XFree86 font module */
+# include "xf86Module.h"
+# endif
+# include "fontmisc.h"
+# include "xf86_ansic.h"
+
+#endif
+
+#include <freetype.h>
+
+
+/******************************************************
+ Macros
+ */
+
+#if 0
+#ifndef Bool
+#define Bool int
+#endif /* Bool */
+#endif
+
+#ifndef True
+#define True (-1)
+#endif /* True */
+#ifndef False
+#define False (0)
+#endif /* False */
+
+/******************************************************
+ Prototypes
+ */
+
+/* compare strings with ignoring case */
+Bool /* False == equal, True == not equal */
+mystrcasecmp(char const *s1, char const *s2);
+
+#endif
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttdump.c b/xc/extras/X-TrueType/xttdump.c
new file mode 100644
index 000000000..87baa0aa9
--- /dev/null
+++ b/xc/extras/X-TrueType/xttdump.c
@@ -0,0 +1,234 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1997 Jyunji Takagi, All rights reserved.
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#ifdef DUMP
+
+#ifndef FONTMODULE
+#include <X11/Xos.h>
+#endif
+#include "xttcommon.h"
+#include "fntfilst.h"
+
+void
+DumpFontPathElement(FontPathElementPtr ptr)
+{
+ fprintf(stderr, "FontPathElement 0x%x\n", ptr);
+ if ((ptr == NULL) || ((unsigned) ptr >= 0xf0000000)) {
+ return;
+ }
+ /*
+ fprintf(stderr, " name_length %d\n", ptr->name_length);
+ fprintf(stderr, " name \"%s\"\n", ptr->name);
+ fprintf(stderr, " type %d\n", ptr->type);
+ fprintf(stderr, " refcount %d\n", ptr->refcount);
+ fprintf(stderr, " private 0x%x\n", ptr->private);
+ fprintf(stderr, "\n");
+ */
+}
+
+void
+DumpxCharInfo(xCharInfo *ptr)
+{
+ fprintf(stderr, "FontInfo 0x%x\n", ptr);
+ if (ptr == NULL) {
+ return;
+ }
+ fprintf(stderr, " leftSideBearing %d\n", ptr->leftSideBearing);
+ fprintf(stderr, " rightSideBearing %d\n", ptr->rightSideBearing);
+ fprintf(stderr, " characterWidth %d\n", ptr->characterWidth);
+ fprintf(stderr, " ascent %d\n", ptr->ascent);
+ fprintf(stderr, " descent %d\n", ptr->descent);
+ fprintf(stderr, " attributes 0x%x\n", ptr->attributes);
+ fprintf(stderr, "\n");
+}
+
+void
+DumpFontInfo(FontInfoPtr ptr)
+{
+ fprintf(stderr, "FontInfo 0x%x\n", ptr);
+ if (ptr == NULL) {
+ return;
+ }
+ fprintf(stderr, " firstCol 0x%x\n", ptr->firstCol);
+ fprintf(stderr, " lastCol 0x%x\n", ptr->lastCol);
+ fprintf(stderr, " firstRow 0x%x\n", ptr->firstRow);
+ fprintf(stderr, " lastRow 0x%x\n", ptr->lastRow);
+ fprintf(stderr, " defaultCh 0x%x\n", ptr->defaultCh);
+ fprintf(stderr, " noOverlap %d\n", ptr->noOverlap);
+ fprintf(stderr, " terminalFont %d\n", ptr->terminalFont);
+ fprintf(stderr, " constantMetrics %d\n", ptr->constantMetrics);
+ fprintf(stderr, " constantWidth %d\n", ptr->constantWidth);
+ fprintf(stderr, " inkInside %d\n", ptr->inkInside);
+ fprintf(stderr, " inkMetrics %d\n", ptr->inkMetrics);
+ fprintf(stderr, " allExist %d\n", ptr->allExist);
+ fprintf(stderr, " drawDirection %d\n", ptr->drawDirection);
+ fprintf(stderr, " cachable %d\n", ptr->cachable);
+ fprintf(stderr, " anamorphic %d\n", ptr->anamorphic);
+ fprintf(stderr, " maxOverlap %d\n", ptr->maxOverlap);
+ fprintf(stderr, " pad 0x%x\n", ptr->pad);
+ fprintf(stderr, " maxbounds ->\n"); DumpxCharInfo(&ptr->maxbounds);
+ fprintf(stderr, " minbounds ->\n"); DumpxCharInfo(&ptr->minbounds);
+ fprintf(stderr, " ink_maxbounds ->\n"); DumpxCharInfo(&ptr->ink_maxbounds);
+ fprintf(stderr, " ink_minbounds ->\n"); DumpxCharInfo(&ptr->ink_minbounds);
+ fprintf(stderr, " fontAscent %d\n", ptr->fontAscent);
+ fprintf(stderr, " fontDescent %d\n", ptr->fontDescent);
+ fprintf(stderr, " nprops %d\n", ptr->nprops);
+ fprintf(stderr, " props -> 0x%x\n", ptr->props);
+ fprintf(stderr, " isStringProp \"%s\"\n", ptr->isStringProp);
+ fprintf(stderr, "\n");
+}
+
+void
+DumpFont(FontPtr ptr)
+{
+ fprintf(stderr, "Font 0x%x\n", ptr);
+ if (ptr == NULL) {
+ return;
+ }
+ fprintf(stderr, " refcnt %d\n", ptr->refcnt);
+ fprintf(stderr, " info ->\n"); DumpFontInfo(&ptr->info);
+ fprintf(stderr, " bit 0x%x\n", ptr->bit);
+ fprintf(stderr, " byte 0x%x\n", ptr->byte);
+ fprintf(stderr, " glyph 0x%x\n", ptr->glyph);
+ fprintf(stderr, " scan 0x%x\n", ptr->scan);
+ fprintf(stderr, " format %x\n", ptr->format);
+ fprintf(stderr, " get_glyphs 0x%x\n", ptr->get_glyphs);
+ fprintf(stderr, " get_metrics 0x%x\n", ptr->get_metrics);
+ fprintf(stderr, " unload_font 0x%x\n", ptr->unload_font);
+ fprintf(stderr, " unload_glyphs 0x%x\n", ptr->unload_glyphs);
+ fprintf(stderr, " fpe ->\n"); DumpFontPathElement(ptr->fpe);
+ fprintf(stderr, " svrPrivate 0x%x\n", ptr->svrPrivate);
+ fprintf(stderr, " fontPrivate 0x%x\n", ptr->fontPrivate);
+ fprintf(stderr, " fpePrivate 0x%x\n", ptr->fpePrivate);
+ fprintf(stderr, " maxPrivate %d\n", ptr->maxPrivate);
+ fprintf(stderr, " devPrivates 0x%x\n", ptr->devPrivates);
+ fprintf(stderr, "\n");
+}
+
+void
+DumpFontName(FontNamePtr ptr)
+{
+ fprintf(stderr, "FontName 0x%x\n", ptr);
+ if (ptr == NULL) {
+ return;
+ }
+ fprintf(stderr, " name \"%s\"\n", ptr->name);
+ fprintf(stderr, " length %d\n", ptr->length);
+ fprintf(stderr, " ndashes %d\n", ptr->ndashes);
+ fprintf(stderr, "\n");
+}
+
+void
+DumpFontEntry(FontEntryPtr ptr)
+{
+ fprintf(stderr, "FontEntry 0x%x\n", ptr);
+ if (ptr == NULL) {
+ return;
+ }
+ fprintf(stderr, " name ->\n"); DumpFontName(&ptr->name);
+ fprintf(stderr, " type %d\n", ptr->type);
+ switch (ptr->type) {
+ case FONT_ENTRY_SCALABLE:
+ fprintf(stderr, " u.scalable.renderer -> 0x%x\n", ptr->u.scalable.renderer);
+ fprintf(stderr, " u.scalable.fileName \"%s\"\n", ptr->u.scalable.fileName);
+ fprintf(stderr, " u.scalable.extra -> 0x%x\n", ptr->u.scalable.extra);
+ break;
+ case FONT_ENTRY_SCALE_ALIAS:
+ break;
+ case FONT_ENTRY_BITMAP:
+ fprintf(stderr, " u.bitmap.renderer -> 0x%x\n", ptr->u.bitmap.renderer);
+ fprintf(stderr, " u.bitmap.fileName \"%s\"\n", ptr->u.bitmap.fileName);
+ fprintf(stderr, " u.bitmap.pFont -> 0x%x\n", ptr->u.bitmap.pFont);
+ break;
+ case FONT_ENTRY_ALIAS:
+ fprintf(stderr, " u.alias.resolved \"%s\"\n", ptr->u.alias.resolved);
+ break;
+ case FONT_ENTRY_BC:
+ fprintf(stderr, " u.bc.vals ???\n");
+ fprintf(stderr, " u.bc.entry ->\n"); DumpFontEntry(ptr->u.bc.entry);
+ break;
+ }
+ fprintf(stderr, "\n");
+}
+
+void
+DumpfsRange(fsRange *ptr)
+{
+ fprintf(stderr, "fsRange 0x%x\n", ptr);
+ if (ptr == NULL) {
+ return;
+ }
+ fprintf(stderr, " min_char_high %d\n", ptr->min_char_high);
+ fprintf(stderr, " min_char_low %d\n", ptr->min_char_low);
+ fprintf(stderr, " max_char_high %d\n", ptr->max_char_high);
+ fprintf(stderr, " max_char_low %d\n", ptr->max_char_low);
+ fprintf(stderr, "\n");
+}
+
+void
+DumpFontScalable(FontScalablePtr ptr)
+{
+ int i;
+ fprintf(stderr, "FontScalable 0x%x\n", ptr);
+ if (ptr == NULL) {
+ return;
+ }
+ fprintf(stderr, " values_supplied 0x%x\n", ptr->values_supplied);
+ fprintf(stderr, " pixel_matrix[] = {%g, %g, %g, %g}\n",
+ ptr->pixel_matrix[0], ptr->pixel_matrix[1],
+ ptr->pixel_matrix[2], ptr->pixel_matrix[3]);
+ fprintf(stderr, " point_matrix[] = {%g, %g, %g, %g}\n",
+ ptr->point_matrix[0], ptr->point_matrix[1],
+ ptr->point_matrix[2], ptr->point_matrix[3]);
+ fprintf(stderr, " pixel %d\n", ptr->pixel);
+ fprintf(stderr, " point %d\n", ptr->point);
+ fprintf(stderr, " x %d\n", ptr->x);
+ fprintf(stderr, " y %d\n", ptr->y);
+ fprintf(stderr, " width %d\n", ptr->width);
+ fprintf(stderr, " xlfdName \"%s\"\n", ptr->xlfdName);
+ fprintf(stderr, " nranges %d\n", ptr->nranges);
+ for (i = 0; i < ptr->nranges; i++) {
+ DumpfsRange(&ptr->ranges[i]);
+ }
+ fprintf(stderr, "\n");
+}
+
+#endif /* DUMP */
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttfuncs.c b/xc/extras/X-TrueType/xttfuncs.c
new file mode 100644
index 000000000..1efe2eb24
--- /dev/null
+++ b/xc/extras/X-TrueType/xttfuncs.c
@@ -0,0 +1,1901 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 Kazushi (Jam) Marukawa, All rights reserved.
+ Copyright (c) 1998 Takuya SHIOZAKI, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+/* $XFree86: xc/extras/X-TrueType/xttfuncs.c,v 1.4 1999/06/13 16:18:06 dawes Exp $ */
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+/*
+ X-TrueType Server -- invented by Go Watanabe.
+
+ This Version includes the follow feautures:
+ JAMPATCHs:
+ written by Kazushi (Jam) Marukawa.
+ CodeConv:
+ Moduled CodeConv:
+ TTCap:
+ written by Takuya SHIOZAKI.
+*/
+
+#ifndef FONTMODULE
+#include <X11/Xos.h>
+#endif
+#include <X11/X.h>
+#include "fntfilst.h"
+#include "xttcommon.h"
+#include "xttcap.h"
+#include "xttcconv.h"
+#include "xttcache.h"
+#include "xttstruct.h"
+
+/* prototypes */
+/* from lib/font/fontfile/defaults.c */
+extern void
+FontDefaultFormat(int *bit, int *byte, int *glyph, int *scan);
+/* from lib/font/fontfile/renderers.c */
+extern Bool
+FontFileRegisterRenderer(FontRendererPtr renderer);
+/* from lib/font/util/format.c */
+extern int
+CheckFSFormat(fsBitmapFormat format, fsBitmapFormatMask fmask,
+ int *bit_order, int *byte_order, int *scan,
+ int *glyph, int *image);
+/* from lib/font/util/fontaccel.c */
+extern void
+FontComputeInfoAccelerators(FontInfoPtr pFontInfo);
+
+static int FreeType_InitCount = 0;
+static TT_Engine engine;
+
+static int
+FreeType_Init(void)
+{
+ dprintf((stderr, "FreeTypeInit\n"));
+ if (FreeType_InitCount == 0) {
+ if (TT_Init_FreeType(&engine)) {
+ fprintf(stderr, "freetype: Could not create engine instance\n");
+ return -1;
+ }
+ }
+ FreeType_InitCount++;
+ return 0;
+}
+
+static int
+FreeType_Deinit(void)
+{
+ dprintf((stderr, "FreeTypeDeInit\n"));
+ if (FreeType_InitCount <= 0) {
+ return -1;
+ }
+ if (--FreeType_InitCount == 0) {
+ if (TT_Done_FreeType(engine) < 0) {
+ return -1;
+ }
+ }
+ return 0;
+}
+
+static FreeTypeFaceInfo *faceTable = NULL;
+static int faceTableCount = 0;
+
+static int
+FreeType_OpenFace(FreeTypeOpenFaceHints const *refHints)
+{
+ int i, error, num;
+ TT_Face face;
+ TT_Face_Properties prop;
+ TT_Glyph glyph;
+ FreeTypeFaceInfoPtr ptr;
+ int ttcno = 0;
+ SPropRecValContainer contRecValue;
+
+ dprintf((stderr,
+ "FreeType_OpenFace: %s %s %s\n",
+ refHints->fontName, refHints->familyName, refHints->ttFontName));
+
+ if ((error = TT_Open_Face(engine, refHints->ttFontName, &face))) {
+ fprintf(stderr, "freetype: can't open face: %s\n", refHints->ttFontName);
+ return -1;
+ }
+
+ if ((error = TT_Get_Face_Properties(face, &prop))) {
+ TT_Close_Face(face);
+ fprintf(stderr, "freetype: can't get face property.\n");
+ return -1;
+ }
+
+ if (SPropRecValList_search_record(refHints->refListPropRecVal,
+ &contRecValue,
+ "FaceNumber")) {
+ /* get face number from Property File directly */
+ if (SPropContainer_value_int(contRecValue)<0 ||
+ SPropContainer_value_int(contRecValue)>=prop.num_Faces) {
+ fprintf(stderr, "Bad face collection:%d\n",
+ SPropContainer_value_int(contRecValue));
+ return -1;
+ }
+ ttcno = SPropContainer_value_int(contRecValue);
+ if (ttcno) {
+ TT_Close_Face(face);
+ if ((error = TT_Open_Collection(engine, refHints->ttFontName, ttcno,
+ &face))) {
+ fprintf(stderr, "Can't Open face collection:%d\n", ttcno);
+ return -1;
+ }
+ }
+ }
+#ifdef USE_XLFD_AUTO_CONTROL
+ else {
+ /* check font's family name from face infomation */
+ int n, i, j;
+ TT_UShort len;
+ short platform, encoding, language, id;
+ char *str;
+ for (i = prop.num_Faces - 1; i>=0; i--) {
+ TT_Close_Face(face);
+ dprintf((stderr, "Open Collection No:%d\n", i));
+ if ((error = TT_Open_Collection(engine, refHints->ttFontName, i,
+ &face))) {
+ fprintf(stderr, "Can't open face collection:%d\n", i);
+ return -1;
+ }
+ n = TT_Get_Name_Count(face);
+ for (j=0;j<n;j++) {
+ TT_Get_Name_ID(face, j, &platform, &encoding, &language, &id);
+ TT_Get_Name_String(face, j, &str, &len);
+#if 0
+ if (str)
+ fprintf(stderr, "id:%02d [%x] [%x] [%x] [%d] %*.*s\n",
+ id, platform, encoding, language, len, len, len, str);
+#endif
+ if (str && id == 4 /*Name Id*/) {
+ if (platform == 3 && encoding == 1) { /* MS-Unicode */
+ int k;
+ len /= 2;
+#if 0
+ for (k=0;k<len;k++)
+ fprintf(stderr, "%c", str[k*2+1]);
+ fprintf(stderr, "\n");
+#endif
+ for (k=0;k<len;k++) {
+ if (str[k*2+1] == '-' && refHints->familyName[k] == '_')
+ continue;
+ if (tolower(str[k*2+1]) != tolower(refHints->familyName[k]))
+ break;
+ }
+ if (k == len)
+ goto ttccheck_end;
+ } else {
+#if 0
+ fprintf(stderr, "%*.*s\n", len, len, str);
+#endif
+ if (!strncasecmp(str, refHints->familyName, len))
+ goto ttccheck_end;
+ }
+ }
+ }
+ }
+ ttccheck_end:
+ ttcno = i;
+ }
+#endif /* USE_XLFD_AUTO_CONTROL - obsoleted. */
+
+ dprintf((stderr, "Select Collection %d\n", ttcno));
+
+ /* check !! */
+ for (i = 0; i < faceTableCount; i++) {
+ if (strcmp(faceTable[i].fontName, refHints->fontName) == 0 &&
+ faceTable[i].ttcno == ttcno) {
+ /* reopen */
+ if (faceTable[i].flag) {
+ if ((error = TT_Get_Face_Properties(face, &prop))) {
+ TT_Close_Face(face);
+ fprintf(stderr, "freetype: can't get face property.\n");
+ return -1;
+ }
+ if ((num = TT_Get_CharMap_Count(face)) < 0) {
+ TT_Close_Face(face);
+ fprintf(stderr, "freetype: can't get charmap count.\n");
+ return -1;
+ }
+ if ((error = TT_New_Glyph(face, &glyph))) {
+ TT_Close_Face(face);
+ fprintf(stderr, "freetype: can't get new glyph.\n");
+ return -1;
+ }
+ faceTable[i].face = face;
+ faceTable[i].ttcno = ttcno;
+ faceTable[i].prop = prop;
+ faceTable[i].glyph = glyph;
+ faceTable[i].mapnum = num;
+ faceTable[i].flag = 0;
+ } else
+ TT_Close_Face(face);
+ faceTable[i].refCount++;
+ return i;
+ }
+ }
+
+ dprintf((stderr, "No Face. Make New Face\n"));
+
+ if (!(ptr = (FreeTypeFaceInfoPtr)
+ xrealloc(faceTable, (faceTableCount+1) * sizeof(*ptr)))){
+ fprintf(stderr, "xrealloc: can't alloc memory for fonttable\n");
+ return -1;
+ }
+
+ if ((error = TT_Get_Face_Properties(face, &prop))) {
+ TT_Close_Face(face);
+ fprintf(stderr, "freetype: can't get face property.\n");
+ return -1;
+ }
+ if ((num = TT_Get_CharMap_Count(face)) < 0) {
+ TT_Close_Face(face);
+ fprintf(stderr, "freetype: can't get charmap count.\n");
+ return -1;
+ }
+ if ((error = TT_New_Glyph(face, &glyph))) {
+ TT_Close_Face(face);
+ fprintf(stderr, "freetype: can't get new glyph.\n");
+ return -1;
+ }
+
+ faceTable = ptr;
+ faceTable[faceTableCount].fontName = strdup(refHints->fontName);
+ faceTable[faceTableCount].ttcno = ttcno;
+ faceTable[faceTableCount].refCount = 1;
+ faceTable[faceTableCount].face = face;
+ faceTable[faceTableCount].prop = prop;
+ faceTable[faceTableCount].glyph = glyph;
+ faceTable[faceTableCount].mapnum = num;
+ faceTable[faceTableCount].flag = 0;
+ faceTable[faceTableCount].scaleWidth = 1.0;
+ faceTable[faceTableCount].scaleBBoxWidth = 1.0;
+ faceTable[faceTableCount].isAutoBold = False;
+ if (SPropRecValList_search_record(refHints->refListPropRecVal,
+ &contRecValue,
+ "ScaleWidth")) {
+ /* Scaling to Width */
+ double scaleWidth = SPropContainer_value_dbl(contRecValue);
+
+ if (scaleWidth<=0.0) {
+ fprintf(stderr, "ScaleWitdh needs plus.\n");
+ return -1;
+ }
+ faceTable[faceTableCount].scaleWidth = scaleWidth;
+ }
+ if (SPropRecValList_search_record(refHints->refListPropRecVal,
+ &contRecValue,
+ "ScaleBBoxWidth")) {
+ /* Scaling to Bounding Box Width */
+ double scaleBBoxWidth = SPropContainer_value_dbl(contRecValue);
+
+ if (scaleBBoxWidth<=0.0) {
+ fprintf(stderr, "ScaleBBoxWitdh needs plus.\n");
+ return -1;
+ }
+ faceTable[faceTableCount].scaleBBoxWidth = scaleBBoxWidth;
+ }
+ faceTable[faceTableCount].scaleBBoxWidth *=
+ faceTable[faceTableCount].scaleWidth;
+ if (SPropRecValList_search_record(refHints->refListPropRecVal,
+ &contRecValue,
+ "AutoBold")) {
+ /* Set or Reset Auto Bold Flag */
+ if (SPropContainer_value_bool(contRecValue))
+ faceTable[faceTableCount].isAutoBold = True;
+ }
+
+
+ i = faceTableCount++;
+ return i;
+}
+
+static int
+FreeType_CloseFace(int index)
+{
+ dprintf((stderr, "FreeType_CloseFace: %d\n", index));
+ if (index < faceTableCount) {
+ if (faceTable[index].refCount <= 0) {
+ fprintf(stderr, "FreeType_CloseFace: bad index\n");
+ return -1;
+ }
+ if (--faceTable[index].refCount == 0) {
+ TT_Done_Glyph(faceTable[index].glyph);
+ TT_Close_Face(faceTable[index].face);
+ faceTable[index].flag = -1;
+ }
+ return 0;
+ }
+ fprintf(stderr, "FreeType_CloseFace: bad index\n");
+ return -1;
+}
+
+static void
+convertNothing(FreeTypeFont *ft, unsigned char *p, int size)
+{
+}
+
+static void
+convertBitOrder(FreeTypeFont *ft, unsigned char *p, int size)
+{
+ extern void
+ BitOrderInvert(register unsigned char *buf, register int nbytes);
+
+ BitOrderInvert(p, size);
+}
+
+static void
+convertByteOrder(FreeTypeFont *ft, unsigned char *p, int size)
+{
+ extern void TwoByteSwap(register unsigned char *buf, register int nbytes);
+ extern void FourByteSwap(register unsigned char *buf, register int nbytes);
+
+ if (ft->pFont->bit != ft->pFont->byte) {
+ switch (ft->pFont->scan) {
+ case 1:
+ break;
+ case 2:
+ TwoByteSwap(p, size);
+ case 4:
+ FourByteSwap(p, size);
+ }
+ }
+}
+
+static void
+convertBitByteOrder(FreeTypeFont *ft, unsigned char *p, int size)
+{
+ convertBitOrder(ft, p, size);
+ convertByteOrder(ft, p, size);
+}
+
+#define ABS(a) (((a)<0)?-(a):(a))
+
+static int
+FreeType_OpenFont(FreeTypeFont *ft,
+ FontScalablePtr vals, int glyph,
+ FreeTypeOpenFaceHints const *refHints)
+{
+ int mapID, fid, error, result;
+ FreeTypeFaceInfo *fi;
+ TT_Instance instance;
+ double base_size;
+
+ base_size = hypot(vals->point_matrix[2], vals->point_matrix[3]);
+
+ result = Successful;
+ fid = -1;
+ ft->pool = NULL;
+
+ if (FreeType_Init()< 0) {
+ result = AllocError;
+ goto abort;
+ }
+
+ if ((ft->fid = fid = FreeType_OpenFace(refHints)) < 0) {
+ result = BadFontName;
+ goto deinitQuit;
+ }
+
+ fi = &faceTable[fid];
+ if (!codeconv_search_code_converter(refHints->charsetName,
+ fi->face, fi->mapnum,
+ refHints->refListPropRecVal,
+ &ft->codeConverterInfo,
+ &mapID)) {
+ fprintf(stderr,
+ "FreeType_OpenFont: don't mach charset %s\n",
+ refHints->charsetName);
+ result = BadFontName;
+ goto deinitQuit;
+ }
+
+ TT_Get_CharMap(fi->face, mapID, &ft->charmap);
+
+ /* create instance */
+ if ((error = TT_New_Instance(fi->face, &instance))) {
+ result = BadFontName;
+ goto deinitQuit;
+ }
+
+ /* set resolution of instance */
+ if ((error = TT_Set_Instance_Resolutions(instance,
+ (int)vals->x, (int)vals->y))) {
+ result = BadFontName;
+ goto doneInstQuit;
+ }
+
+ {
+ int flRotated = 0, flStretched = 0;
+
+ if (vals->point_matrix[1] != 0 || vals->point_matrix[2] != 0)
+ flRotated = flStretched = 1;
+ else if (vals->point_matrix[0] != vals->point_matrix[3])
+ flStretched = 1;
+ else if (fi->scaleWidth != 1.0)
+ flStretched = 1;
+
+ TT_Set_Instance_Transform_Flags(instance, flRotated, flStretched);
+
+ /*
+ * The size depend on the height, not the width.
+ * So use point_matrix[3].
+ */
+ if ((error = TT_Set_Instance_CharSize(instance,
+ base_size *64))) {
+ result = BadFontName;
+ goto doneInstQuit;
+ }
+ /* set matrix */
+ ft->matrix.xx =
+ fi->scaleWidth *
+ vals->point_matrix[0] / base_size * 65536;
+ ft->matrix.xy =
+ fi->scaleWidth *
+ vals->point_matrix[2] / base_size * 65536;
+ ft->matrix.yx =
+ vals->point_matrix[1] / base_size * 65536;
+ ft->matrix.yy =
+ vals->point_matrix[3] / base_size * 65536;
+
+ dprintf((stderr, "matrix: %x %x %x %x\n",
+ ft->matrix.xx,
+ ft->matrix.yx,
+ ft->matrix.xy,
+ ft->matrix.yy));
+ }
+
+#if 0
+ /*
+ * ft->map will be calculated in get_glyph_prop and get_glyph_const.
+ * So now commented out them.
+ */
+ {
+ int bytes;
+ ft->map.rows = ABS(vals->pixel_matrix[3])
+ + ABS(vals->pixel_matrix[1]) + 0.5;
+ if (ft->spacing)
+ bytes =
+ (fi->scaleWidth*
+ (ABS(vals->pixel_matrix[0]) + ABS(vals->pixel_matrix[2]))
+ +(fi->isAutoBold?1.0:0.0)
+ +7.5) / 8;
+ else
+ bytes =
+ (fi->scaleBBoxWidth*
+ (ABS(vals->pixel_matrix[0]) + ABS(vals->pixel_matrix[2]))
+ +(fi->isAutoBold?1.0:0.0)
+ +7.5) / 8;
+ bytes += glyph - 1;
+ bytes -= bytes % glyph;
+ ft->map.cols = bytes;
+ ft->map.width = bytes * 8;
+ ft->map.flow = TT_Flow_Down;
+ ft->map.size = ft->map.rows * ft->map.cols;
+ dprintf((stderr, "rows:%d cols:%d\n", ft->map.rows, ft->map.cols));
+ }
+#endif
+
+ ft->instance = instance;
+ TT_Get_Instance_Metrics(instance, &ft->imetrics);
+
+ if ((ft->pool = CharInfoPool_Alloc()) == NULL) {
+ result = AllocError;
+ goto doneInstQuit;
+ }
+
+ if ((ft->btree = BTree_Alloc()) == NULL) {
+ result = AllocError;
+ goto doneInstQuit;
+ }
+
+ return result;
+
+ doneInstQuit:
+ TT_Done_Instance(instance);
+ deinitQuit:
+ if (ft->pool)
+ CharInfoPool_Free(ft->pool);
+ if (fid>=0)
+ FreeType_CloseFace(fid);
+ FreeType_Deinit();
+ abort:
+ return result;
+}
+
+static void
+FreeType_CloseFont(FontPtr pFont)
+{
+ FreeTypeFont *ft = (FreeTypeFont*) pFont->fontPrivate;
+
+ dprintf((stderr, "FreeType_CloseFont: %x\n", pFont));
+
+ TT_Done_Instance(ft->instance);
+ BTree_Free(ft->btree);
+ CharInfoPool_Free(ft->pool);
+
+ FreeType_CloseFace(ft->fid);
+ FreeType_Deinit();
+ codeconv_free_code_converter(&ft->codeConverterInfo);
+
+ xfree(ft);
+ xfree(pFont->info.props);
+}
+
+static char nochardat;
+static CharInfoRec nocharinfo = {/*metrics*/{0,0,0,0,0,0},
+ /*bits*/&nochardat};
+
+static void
+make_up_bold_bitmap(TT_Raster_Map *map)
+{
+ int x, y;
+ char *p = (char *)map->bitmap;
+ for (y=0; y<map->rows; y++) {
+ char lsb = 0;
+ for (x=0; x<map->cols; x++) {
+ char tmp = *p<<7;
+ *p |= (*p>>1) | lsb;
+ lsb = tmp;
+ p++;
+ }
+ }
+}
+
+
+/* Back Door into the FreeType... */
+
+#ifndef VERY_LAZY
+#define VERY_LAZY 1
+#endif
+
+
+#if VERY_LAZY
+/* table "HMTX" */
+typedef struct
+{
+ TT_UShort advance;
+ TT_Short bearing;
+} TT_LongMetrics;
+typedef TT_Short TT_ShortMetrics;
+#endif
+
+
+/* calculate glyph metric from glyph index */
+
+static xCharInfo *
+get_metrics(FreeTypeFont *ft, int c)
+{
+ FreeTypeFaceInfo *fi = &faceTable[ft->fid];
+
+ CharInfoPtr charInfo;
+ int width, ascent, descent;
+ int lbearing, rbearing;
+ TT_Glyph_Metrics metrics;
+
+ TT_BBox bbox;
+
+ if (!BTree_Search(ft->btree, c, (void **)&charInfo)) {
+#if VERY_LAZY
+ if (!ft->isVeryLazy) {
+#endif
+
+ TT_Load_Glyph(ft->instance, fi->glyph, c, ft->flag);
+ TT_Get_Glyph_Metrics(fi->glyph, &metrics);
+
+ {
+ TT_Outline outline;
+ TT_Get_Glyph_Outline(fi->glyph, &outline);
+ outline.dropout_mode = 2;
+ TT_Transform_Outline(&outline, &ft->matrix);
+ TT_Get_Outline_BBox(&outline, &bbox);
+ }
+#if VERY_LAZY
+ } else {
+ /* very lazy method */
+#ifndef MIN
+#define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+#ifndef MAX
+#define MAX(a,b) (((a)>(b))?(a):(b))
+#endif
+ TT_Vector p0, p1, p2, p3;
+
+ {
+ /* horizontal */
+ TT_Horizontal_Header *pHH = fi->prop.horizontal;
+ int numHMs = pHH->number_Of_HMetrics;
+
+ if (c<numHMs) {
+ metrics.advance =
+ TT_MulFix( ((TT_LongMetrics*)pHH->long_metrics+c)
+ ->advance,
+ ft->imetrics.x_scale );
+ metrics.bbox.xMax =
+ TT_MulFix( ((TT_LongMetrics*)pHH->long_metrics+c)
+ ->advance
+#if 0
+ - pHH->min_Right_Side_Bearing,
+#else
+ ,
+#endif
+ ft->imetrics.x_scale );
+ metrics.bbox.xMin = metrics.bearingX =
+ TT_MulFix( ((TT_LongMetrics*)pHH->long_metrics+c)
+ ->bearing,
+ ft->imetrics.x_scale );
+ } else {
+ metrics.advance =
+ TT_MulFix( ((TT_LongMetrics*)pHH
+ ->long_metrics+numHMs-1)
+ ->advance,
+ ft->imetrics.x_scale );
+ metrics.bbox.xMax =
+ TT_MulFix( ((TT_LongMetrics*)pHH
+ ->long_metrics+numHMs-1)
+ ->advance
+ - pHH->min_Right_Side_Bearing,
+ ft->imetrics.x_scale );
+ metrics.bbox.xMin = metrics.bearingX =
+ TT_MulFix( *((TT_ShortMetrics*)pHH
+ ->short_metrics+c-numHMs),
+ ft->imetrics.x_scale );
+ }
+ }
+ {
+ /* vertical */
+ TT_Header *pH = fi->prop.header;
+ metrics.bbox.yMin = TT_MulFix( pH->yMin,
+ ft->imetrics.y_scale );
+ metrics.bbox.yMax = TT_MulFix( pH->yMax,
+ ft->imetrics.y_scale );
+ }
+ p0.x = p2.x = metrics.bbox.xMin;
+ p1.x = p3.x = metrics.bbox.xMax;
+ p0.y = p1.y = metrics.bbox.yMin;
+ p2.y = p3.y = metrics.bbox.yMax;
+
+ TT_Transform_Vector(&p0.x, &p0.y, &ft->matrix);
+ TT_Transform_Vector(&p1.x, &p1.y, &ft->matrix);
+ TT_Transform_Vector(&p2.x, &p2.y, &ft->matrix);
+ TT_Transform_Vector(&p3.x, &p3.y, &ft->matrix);
+#if 0
+ fprintf(stderr,
+ "(%.1f %.1f) (%.1f %.1f)"
+ "(%.1f %.1f) (%.1f %.1f)\n",
+ p0.x / 64.0, p0.y / 64.0,
+ p1.x / 64.0, p1.y / 64.0,
+ p2.x / 64.0, p2.y / 64.0,
+ p3.x / 64.0, p3.y / 64.0);
+#endif
+ bbox.xMin = MIN(p0.x, MIN(p1.x, MIN(p2.x, p3.x)));
+ bbox.xMax = MAX(p0.x, MAX(p1.x, MAX(p2.x, p3.x)));
+ bbox.yMin = MIN(p0.y, MIN(p1.y, MIN(p2.y, p3.y)));
+ bbox.yMax = MAX(p0.y, MAX(p1.y, MAX(p2.y, p3.y)));
+ }
+#endif /* VERY_LAZY */
+
+
+ /*
+ * Use floor64 and ceil64 to calulate exectly since values might
+ * be minus.
+ */
+#define FLOOR64(x) ((x) & -64)
+#define CEIL64(x) (((x) + 64 - 1) & -64)
+ ascent = FLOOR64(bbox.yMax + 32) / 64;
+ descent = CEIL64(-bbox.yMin - 32) / 64;
+ lbearing = FLOOR64(bbox.xMin + 32) / 64;
+ rbearing = FLOOR64(bbox.xMax + 32) / 64 + (fi->isAutoBold?1:0);
+
+ width =
+ FLOOR64((int)floor(metrics.advance * fi->scaleBBoxWidth
+ * ft->pixel_width_unit_x + 0.5) + 32) / 64;
+
+ if ((charInfo = CharInfoPool_Get(ft->pool)) == NULL) {
+ charInfo = &nocharinfo;
+ fprintf(stderr, "can't get charinfo area\n");
+ goto next;
+ }
+ charInfo->metrics.leftSideBearing = lbearing;
+ charInfo->metrics.rightSideBearing = rbearing;
+ charInfo->metrics.ascent = ascent;
+ charInfo->metrics.descent = descent;
+ charInfo->metrics.characterWidth = width;
+ charInfo->metrics.attributes =
+ (unsigned short)(short)(floor(metrics.advance/64. * 1000.
+ / ft->pixel_size));
+ BTree_Insert(ft->btree, c, charInfo);
+ }
+ next:
+ return &charInfo->metrics;
+}
+
+
+static CharInfoPtr
+get_glyph_prop(FreeTypeFont *ft, int c)
+{
+ FreeTypeFaceInfo *fi = &faceTable[ft->fid];
+ CharInfoPtr charInfo;
+ TT_Outline outline;
+
+ int width, height, descent, lbearing;
+ int glyph = ft->pFont->glyph;
+ int bytes;
+
+ if (!BTree_Search(ft->btree, c, (void **)&charInfo) ||
+ charInfo->bits == NULL) {
+ if (!charInfo) {
+ /* Make charInfo */
+ get_metrics(ft, c);
+ /* Retry to get it created in get_metrics(). */
+ BTree_Search(ft->btree, c, (void **)&charInfo);
+ if (!charInfo) {
+ charInfo = &nocharinfo;
+ fprintf(stderr, "can't get charinfo area\n");
+ goto next;
+ }
+ }
+
+ TT_Load_Glyph(ft->instance, fi->glyph, c, ft->flag);
+ TT_Get_Glyph_Outline(fi->glyph, &outline);
+ outline.dropout_mode = 2;
+ TT_Transform_Outline(&outline, &ft->matrix);
+
+ lbearing = charInfo->metrics.leftSideBearing;
+ descent = charInfo->metrics.descent;
+ width = charInfo->metrics.rightSideBearing - lbearing;
+ height = charInfo->metrics.ascent + descent;
+
+ /* Make just fit bitmap and draw character on it */
+ ft->map.rows = height;
+ bytes = (width + 7) / 8;
+ bytes = (bytes + (glyph) - 1) & -glyph;
+ ft->map.cols = bytes;
+ ft->map.width = width;
+ ft->map.flow = TT_Flow_Down;
+ ft->map.size = ft->map.rows * ft->map.cols;
+ CharInfoPool_Set(ft->pool, charInfo, ft->map.size);
+ ft->map.bitmap = charInfo->bits;
+
+ TT_Translate_Outline(&outline, -lbearing * 64, descent * 64);
+ TT_Get_Outline_Bitmap(engine, &outline, &ft->map);
+ if (fi->isAutoBold)
+ make_up_bold_bitmap(&ft->map);
+ (*ft->convert)(ft, ft->map.bitmap, ft->map.size);
+ }
+ next:
+ return charInfo;
+}
+
+static CharInfoPtr
+get_glyph_const(FreeTypeFont *ft, int c)
+{
+ FreeTypeFaceInfo *fi = &faceTable[ft->fid];
+ CharInfoPtr charInfo;
+ TT_Outline outline;
+
+ int width, height, descent, lbearing;
+ int glyph = ft->pFont->glyph;
+ int bytes;
+
+ if (!BTree_Search(ft->btree, c, (void **)&charInfo) ||
+ charInfo->bits == NULL) {
+ if (!charInfo) {
+#if 1
+ if ((charInfo = CharInfoPool_Get(ft->pool)) == NULL) {
+ charInfo = &nocharinfo;
+ fprintf(stderr, "can't get charinfo area\n");
+ goto next;
+ }
+ BTree_Insert(ft->btree, c, charInfo);
+#else
+ /* Make charInfo */
+ get_metrics(ft, c);
+ /* Retry to get it created in get_metrics(). */
+ BTree_Search(ft->btree, c, (void **)&charInfo);
+ if (!charInfo) {
+ charInfo = &nocharinfo;
+ fprintf(stderr, "can't get charinfo area\n");
+ goto next;
+ }
+#endif
+ }
+
+ TT_Load_Glyph(ft->instance, fi->glyph, c, ft->flag);
+ TT_Get_Glyph_Outline(fi->glyph, &outline);
+ outline.dropout_mode = 2;
+ TT_Transform_Outline(&outline, &ft->matrix);
+
+ lbearing = ft->pFont->info.maxbounds.leftSideBearing;
+ descent = ft->pFont->info.maxbounds.descent;
+ width = ft->pFont->info.maxbounds.rightSideBearing - lbearing;
+ height = ft->pFont->info.maxbounds.ascent + descent;
+
+ /* Make maxbounds bitmap and draw character on it */
+ ft->map.rows = height;
+ bytes = (width + 7) / 8;
+ bytes = (bytes + (glyph) - 1) & -glyph;
+ ft->map.cols = bytes;
+ ft->map.width = width;
+ ft->map.flow = TT_Flow_Down;
+ ft->map.size = ft->map.rows * ft->map.cols;
+ CharInfoPool_Set(ft->pool, charInfo, ft->map.size);
+ ft->map.bitmap = charInfo->bits;
+
+ /* Write metrics */
+ charInfo->metrics = ft->pFont->info.maxbounds;
+
+ TT_Translate_Outline(&outline, -lbearing * 64, descent * 64);
+ TT_Get_Outline_Bitmap(engine, &outline, &ft->map);
+ if (fi->isAutoBold)
+ make_up_bold_bitmap(&ft->map);
+ (*ft->convert)(ft, ft->map.bitmap, ft->map.size);
+ }
+ next:
+ return charInfo;
+}
+
+int
+FreeTypeGetGlyphs (FontPtr pFont,
+ unsigned long count,
+ unsigned char *chars,
+ FontEncoding encoding,
+ unsigned long *pCount,
+ CharInfoPtr *glyphs)
+{
+ FreeTypeFont *ft = (FreeTypeFont*) pFont->fontPrivate;
+ CharInfoPtr *glyphsBase = glyphs;
+
+ dprintf((stderr, "FreeTypeGetGlyphs: %p %d\n", pFont, count));
+
+ if (ft->spacing == 'p' || ft->spacing == 'm') { /* proportional */
+ switch (encoding) {
+ case Linear8Bit:
+ case TwoD8Bit:
+ while (count--) {
+ unsigned c = *chars++;
+ c = ft->codeConverterInfo.ptrCodeConverter(c);
+ dprintf((stderr, "%04x\n", c));
+ *glyphs++ = get_glyph_prop(ft,
+ TT_Char_Index(ft->charmap, c));
+ }
+ break;
+ case Linear16Bit:
+ case TwoD16Bit:
+ while (count--) {
+ unsigned c1, c2;
+ c1 = *chars++;
+ c2 = *chars++;
+ dprintf((stderr, "code: %02x%02x ->", c1,c2));
+ if (!(c1 >= pFont->info.firstRow &&
+ c1 <= pFont->info.lastRow &&
+ c2 >= pFont->info.firstCol &&
+ c2 <= pFont->info.lastCol)) {
+ *glyphs++ = &nocharinfo;
+ dprintf((stderr, "invalid code\n"));
+ } else {
+ c1 = ft->codeConverterInfo.ptrCodeConverter(c1<<8|c2);
+ dprintf((stderr, "%04x\n", c1));
+ *glyphs++ = get_glyph_prop(ft,
+ TT_Char_Index(ft->charmap, c1));
+ }
+ }
+ break;
+ }
+ } else {
+ switch (encoding) {
+ case Linear8Bit:
+ case TwoD8Bit:
+ while (count--) {
+ unsigned c = *chars++;
+ c = ft->codeConverterInfo.ptrCodeConverter(c);
+ *glyphs++ = get_glyph_const(ft,
+ TT_Char_Index(ft->charmap, c));
+ }
+ break;
+ case Linear16Bit:
+ case TwoD16Bit:
+ while (count--) {
+ unsigned c1, c2;
+ c1 = *chars++;
+ c2 = *chars++;
+ dprintf((stderr, "code: %02x%02x ->", c1,c2));
+ if (!(c1 >= pFont->info.firstRow &&
+ c1 <= pFont->info.lastRow &&
+ c2 >= pFont->info.firstCol &&
+ c2 <= pFont->info.lastCol)) {
+ *glyphs++ = &nocharinfo;
+ dprintf((stderr, "invalid code\n"));
+ } else {
+ c1 = ft->codeConverterInfo.ptrCodeConverter(c1<<8|c2);
+ dprintf((stderr, "%04x\n", c1));
+ *glyphs++ = get_glyph_const(ft,
+ TT_Char_Index(ft->charmap,
+ c1));
+ }
+ }
+ break;
+ }
+ }
+
+ *pCount = glyphs - glyphsBase;
+ return Successful;
+}
+
+int
+FreeTypeGetMetrics (FontPtr pFont,
+ unsigned long count,
+ unsigned char *chars,
+ FontEncoding encoding,
+ unsigned long *pCount,
+ xCharInfo **glyphs)
+{
+ FreeTypeFont *ft = (FreeTypeFont*) pFont->fontPrivate;
+ xCharInfo **glyphsBase = glyphs;
+ unsigned int c;
+
+ /*dprintf((stderr, "FreeTypeGetMetrics: %d\n", count));*/
+ if (ft->spacing == 'm' || ft->spacing == 'p') {
+ switch (encoding) {
+ case Linear8Bit:
+ case TwoD8Bit:
+ while (count--) {
+ c = *chars++;
+/* dprintf((stderr, "code: %04x ->", c));*/
+ c = ft->codeConverterInfo.ptrCodeConverter(c);
+/* dprintf((stderr, "%04x\n", c));*/
+ *glyphs++ = get_metrics(ft, TT_Char_Index(ft->charmap, c));
+ }
+ break;
+ case Linear16Bit:
+ case TwoD16Bit:
+ while (count--) {
+ c = *chars++ << 8; c |= *chars++;
+/* dprintf((stderr, "code: %04x ->", c));*/
+ c = ft->codeConverterInfo.ptrCodeConverter(c);
+/* dprintf((stderr, "%04x\n", c));*/
+ *glyphs++ = get_metrics(ft, TT_Char_Index(ft->charmap, c));
+ }
+ break;
+ }
+ *pCount = glyphs - glyphsBase;
+ } else { /* -c- */
+ switch (encoding) {
+ case Linear8Bit:
+ case TwoD8Bit:
+ while (count--) {
+ chars++; chars++;
+ *glyphs++ = &pFont->info.maxbounds;
+ }
+ break;
+ case Linear16Bit:
+ case TwoD16Bit:
+ while (count--) {
+ chars++; chars++;
+ *glyphs++ = &pFont->info.maxbounds;
+ }
+ break;
+ }
+ *pCount = glyphs - glyphsBase;
+ }
+
+ return Successful;
+}
+
+void
+FreeTypeUnloadFont(FontPtr pFont)
+{
+ dprintf((stderr, "FreeTypeUnloadFont: %x\n", pFont));
+ FreeType_CloseFont(pFont);
+}
+
+#ifdef USE_XLFD_AUTO_CONTROL
+struct {
+ char *name;
+ int sign;
+} slantinfo[] = {
+ { "o", 1 },
+ { "ro", -1 }
+};
+#endif /* USE_XLFD_AUTO_CONTROL - obsoleted. */
+
+static void
+adjust_min_max(minc, maxc, tmp)
+ xCharInfo *minc, *maxc, *tmp;
+{
+#define MINMAX(field,ci) \
+ if (minc->field > (ci)->field) \
+ minc->field = (ci)->field; \
+ if (maxc->field < (ci)->field) \
+ maxc->field = (ci)->field;
+
+ MINMAX(ascent, tmp);
+ MINMAX(descent, tmp);
+ MINMAX(leftSideBearing, tmp);
+ MINMAX(rightSideBearing, tmp);
+ MINMAX(characterWidth, tmp);
+
+ if ((INT16)minc->attributes > (INT16)tmp->attributes)
+ minc->attributes = tmp->attributes;
+ if ((INT16)maxc->attributes < (INT16)tmp->attributes)
+ maxc->attributes = tmp->attributes;
+#undef MINMAX
+}
+
+void
+freetype_compute_bounds(FreeTypeFont *ft,
+ FontInfoPtr pinfo,
+ FontScalablePtr vals)
+{
+ int row, col;
+ short c;
+ xCharInfo minchar, maxchar, *tmpchar;
+ int overlap, maxOverlap;
+ long swidth = 0;
+ long total_width = 0;
+ int num_chars = 0;
+
+ minchar.ascent = minchar.descent =
+ minchar.leftSideBearing = minchar.rightSideBearing =
+ minchar.characterWidth = minchar.attributes = 32767;
+ maxchar.ascent = maxchar.descent =
+ maxchar.leftSideBearing = maxchar.rightSideBearing =
+ maxchar.characterWidth = maxchar.attributes = -32767;
+ maxOverlap = -32767;
+
+ for (row = pinfo->firstRow; row <= pinfo->lastRow; row++) {
+ for (col = pinfo->firstCol; col <= pinfo->lastCol; col++) {
+ c = row<<8|col;
+#if 0
+ fprintf(stderr, "comp_bounds: %x ->", c);
+#endif
+ c = ft->codeConverterInfo.ptrCodeConverter(c);
+#if 0
+ fprintf(stderr, "%x\n", c);
+#endif
+ if (c) {
+ tmpchar = get_metrics(ft, TT_Char_Index(ft->charmap, c));
+ adjust_min_max(&minchar, &maxchar, tmpchar);
+ overlap = tmpchar->rightSideBearing - tmpchar->characterWidth;
+ if (maxOverlap < overlap)
+ maxOverlap = overlap;
+ num_chars++;
+ swidth += ABS(tmpchar->characterWidth);
+ total_width += tmpchar->characterWidth;
+ }
+ }
+ }
+
+ if (num_chars > 0) {
+ swidth = (swidth * 10.0 + num_chars / 2.0) / num_chars;
+ if (total_width < 0)
+ swidth = -swidth;
+ vals->width = swidth;
+ } else
+ vals->width = 0;
+
+ pinfo->maxbounds = maxchar;
+ pinfo->minbounds = minchar;
+ pinfo->ink_maxbounds = maxchar;
+ pinfo->ink_minbounds = minchar;
+ pinfo->maxOverlap = maxOverlap;
+}
+
+
+/*
+ * restrict code range
+ *
+ * boolean for the numeric zone:
+ * results = results & (ranges[0] | ranges[1] | ... ranges[nranges-1])
+ */
+
+static void
+restrict_code_range(unsigned short *refFirstCol,
+ unsigned short *refFirstRow,
+ unsigned short *refLastCol,
+ unsigned short *refLastRow,
+ fsRange const *ranges, int nRanges)
+{
+ if (nRanges) {
+ int minCol = 256, minRow = 256, maxCol = -1, maxRow = -1;
+ fsRange const *r = ranges;
+ int i;
+
+ for (i=0; i<nRanges; i++) {
+ if (r->min_char_high != r->max_char_high) {
+ minCol = 0x00;
+ maxCol = 0xff;
+ } else {
+ if (minCol > r->min_char_low)
+ minCol = r->min_char_low;
+ if (maxCol < r->max_char_low)
+ maxCol = r->max_char_low;
+ }
+ if (minRow > r->min_char_high)
+ minRow = r->min_char_high;
+ if (maxRow < r->max_char_high)
+ maxRow = r->max_char_high;
+ r++;
+ }
+
+ if (minCol > *refLastCol)
+ *refFirstCol = *refLastCol;
+ else if (minCol > *refFirstCol)
+ *refFirstCol = minCol;
+
+ if (maxCol < *refFirstCol)
+ *refLastCol = *refFirstCol;
+ else if (maxCol < *refLastCol)
+ *refLastCol = maxCol;
+
+ if (minRow > *refLastRow) {
+ *refFirstRow = *refLastRow;
+ *refFirstCol = *refLastCol;
+ } else if (minRow > *refFirstRow)
+ *refFirstRow = minRow;
+
+ if (maxRow < *refFirstRow) {
+ *refLastRow = *refFirstRow;
+ *refLastCol = *refFirstCol;
+ } else if (maxRow < *refLastRow)
+ *refLastRow = maxRow;
+ }
+}
+
+
+static void
+restrict_code_range_by_str(unsigned short *refFirstCol,
+ unsigned short *refFirstRow,
+ unsigned short *refLastCol,
+ unsigned short *refLastRow,
+ char const *str)
+{
+ int nRanges = 0;
+ fsRange *ranges = NULL;
+ char const *p, *q;
+
+ p = q = str;
+ for (;;) {
+ int minpoint=0, maxpoint=65535;
+ long val;
+
+ /* skip comma and/or space */
+ while (',' == *p || isspace(*p))
+ p++;
+
+ /* begin point */
+ if ('-' != *p) {
+ val = strtol(p, (char **)&q, 0);
+ if (p == q)
+ /* end or illegal */
+ break;
+ if (val<0 || val>65535) {
+ /* out of zone */
+ break;
+ }
+ minpoint = val;
+ p=q;
+ }
+
+ /* skip space */
+ while (isspace(*p))
+ p++;
+
+ if (',' != *p && '\0' != *p) {
+ /* contiune */
+ if ('-' == *p)
+ /* hyphon */
+ p++;
+ else
+ /* end or illegal */
+ break;
+
+ /* skip space */
+ while (isspace(*p))
+ p++;
+
+ val = strtol(p, (char **)&q, 0);
+ if (p != q) {
+ if (val<0 || val>65535)
+ break;
+ maxpoint = val;
+ } else if (',' != *p && '\0' != *p)
+ /* end or illegal */
+ break;
+ p=q;
+ } else
+ /* comma - single code */
+ maxpoint = minpoint;
+
+ if (minpoint>maxpoint) {
+ int tmp;
+ tmp = minpoint;
+ minpoint = maxpoint;
+ maxpoint = tmp;
+ }
+
+ /* add range */
+#if 0
+ fprintf(stderr, "zone: 0x%04X - 0x%04X\n", minpoint, maxpoint);
+ fflush(stderr);
+#endif
+ nRanges++;
+ ranges = (fsRange *)xrealloc(ranges, nRanges*sizeof(*ranges));
+ if (NULL == ranges)
+ break;
+ {
+ fsRange *r = ranges+nRanges-1;
+
+ r->min_char_low = minpoint & 0xff;
+ r->max_char_low = maxpoint & 0xff;
+ r->min_char_high = (minpoint>>8) & 0xff;
+ r->max_char_high = (maxpoint>>8) & 0xff;
+ }
+ }
+
+ if (ranges) {
+ restrict_code_range(refFirstCol, refFirstRow, refLastCol, refLastRow,
+ ranges, nRanges);
+ xfree(ranges);
+ }
+}
+
+
+int
+FreeTypeOpenScalable (fpe, ppFont, flags, entry, fileName, vals,
+ format, fmask, non_cachable_font)
+ FontPathElementPtr fpe;
+ FontPtr *ppFont;
+ int flags;
+ FontEntryPtr entry;
+ char *fileName;
+ FontScalablePtr vals;
+ fsBitmapFormat format;
+ fsBitmapFormatMask fmask;
+ FontPtr non_cachable_font; /* We don't do licensing */
+{
+ int result = Successful;
+ int i;
+ FontPtr pFont;
+ FontInfoPtr pinfo;
+ FreeTypeFont *ft;
+ int ret, bit, byte, glyph, scan, image;
+/* FontScalableRec tmpvals;*/
+
+ char xlfdName[MAXFONTNAMELEN];
+ char familyname[MAXFONTNAMELEN];
+ char charset[MAXFONTNAMELEN], slant[MAXFONTNAMELEN];
+ int spacing = 'r'; /* avoid 'uninitialized variable using' warning */
+
+ SDynPropRecValList listPropRecVal;
+ FreeTypeOpenFaceHints hints;
+ char *dynStrTTFileName = NULL;
+ char *dynStrRealFileName = NULL;
+ SPropRecValContainer contRecValue;
+
+ double base_width, base_height;
+
+ dprintf((stderr,
+ "\n+FreeTypeOpenScalable(%x, %x, %x, %x, %s, %x, %x, %x, %x)\n",
+ fpe, ppFont, flags, entry, fileName, vals,
+ format, fmask, non_cachable_font));
+
+#ifdef DUMP
+ DumpFontPathElement(fpe);
+ DumpFontEntry(entry);
+ DumpFontScalable(vals);
+#endif
+
+ hints.isProp = False;
+ hints.fontName = fileName;
+ hints.charsetName = charset;
+ hints.familyName = familyname;
+ hints.refListPropRecVal = &listPropRecVal;
+
+
+ if (SPropRecValList_new(&listPropRecVal)) {
+ result = AllocError;
+ goto quit;
+ }
+ {
+ int len = strlen(fileName);
+ char *capHead = NULL;
+ {
+ /* font cap */
+ char *p1=NULL, *p2=NULL;
+
+ if (NULL != (p1=strrchr(fileName, '/')))
+ if (NULL != (p2=strrchr(p1, ':'))) {
+ /* colon exist in the right side of slash. */
+ int dirLen = p1-fileName+1;
+ int baseLen = fileName+len - p2 -1;
+
+ dynStrRealFileName = (char *)xalloc(dirLen+baseLen+1);
+ memcpy(dynStrRealFileName, fileName, dirLen);
+ strcpy(dynStrRealFileName+dirLen, p2+1);
+ capHead = p1+1;
+ } else
+ dynStrRealFileName = strdup(fileName);
+ else
+ dynStrRealFileName = strdup(fileName);
+ } /* font cap */
+
+#ifdef USE_TTP_FILE
+ /* ttp file - obsoleted. */
+ if (len>0 && 'p' == fileName[len-1]) {
+ hints.isProp = True;
+ if (SPropRecValList_read_prop_file(&listPropRecVal,
+ dynStrRealFileName)) {
+ result = BadFontFormat;
+ goto quit;
+ }
+ if (SPropRecValList_search_record(&listPropRecVal,
+ &contRecValue,
+ "FontFile")) {
+ /* TrueTypeFont File from Property File Record */
+#if 0
+ fprintf(stderr, "FontFile %s\n",
+ SPropContainer_value_str(contRecValue));
+#endif
+ if ('/' == SPropContainer_value_str(contRecValue)[0])
+ /* absolute path */
+ dynStrTTFileName =
+ strdup(SPropContainer_value_str(contRecValue));
+ else {
+ /* relative path */
+ char const *baseName =
+ strrchr(fileName, '/');
+ if (NULL == baseName)
+ /* relative from current path */
+ dynStrTTFileName =
+ strdup(SPropContainer_value_str(contRecValue));
+ else {
+ int lenDirName =
+ baseName-fileName+1;
+ dynStrTTFileName =
+ xalloc(lenDirName+
+ strlen(
+ SPropContainer_value_str(contRecValue))
+ +1);
+ memcpy(dynStrTTFileName, fileName, lenDirName);
+ strcpy(&dynStrTTFileName[lenDirName],
+ SPropContainer_value_str(contRecValue));
+ }
+ }
+#if 0
+ fprintf(stderr, "FontFile(after) %s\n",
+ dynStrTTFileName);
+#endif
+ } else {
+ /* TrueTypeFont File from Property File Name */
+ dynStrTTFileName = strdup(dynStrRealFileName);
+ dynStrTTFileName[len-1] = 'f';
+ if (access(dynStrTTFileName, F_OK)) {
+ dynStrTTFileName[len-1] = 'c';
+ if (access(dynStrTTFileName, F_OK)) {
+ result = BadFontPath;
+ xfree(dynStrTTFileName);
+ goto quit;
+ }
+ }
+ }
+ hints.ttFontName = dynStrTTFileName;
+ } else
+#endif /* USE_TTP_FILE --- obsoleted. */
+ hints.ttFontName = dynStrRealFileName;
+
+ {
+ /* font cap */
+ if (capHead)
+ if (SPropRecValList_add_by_font_cap(&listPropRecVal,
+ capHead)) {
+ result = BadFontPath;
+ goto quit;
+ }
+ }
+ }
+
+ {
+ char *p = entry->name.name, *p1=NULL;
+ for (i=0; i<13; i++) {
+ if (*p) {
+ p1 = p + 1;
+ if (!(p = strchr(p1,'-'))) p = strchr(p1, '\0');
+ }
+ switch (i) {
+ case 0: /* foundry */
+ break;
+ case 1: /* family */
+ strncpy(familyname, p1, p-p1);
+ familyname[p-p1] = '\0';
+ break;
+ case 2: /* weight */
+ break;
+ case 3: /* slant */
+ strncpy(slant, p1, p-p1);
+ slant[p-p1] = '\0';
+ break;
+ case 4: /* width */
+ case 5: /* none */
+ case 6: /* pixel */
+ case 7: /* point */
+ case 8: /* res x */
+ case 9: /* res y */
+ break;
+ case 10: /* spacing */
+ spacing = tolower(*p1);
+ break;
+ case 11: /* av width */
+ break;
+ case 12: /* charset */
+ strcpy(charset, p1);
+ /* eliminate zone description */
+ {
+ char *p2;
+ if (NULL != (p2 = strchr(charset, '[')))
+ *p2 = '\0';
+ }
+ }
+ }
+ }
+ dprintf((stderr, "charset: %s spacing: %d slant: %s\n",
+ charset, spacing, slant));
+
+
+ /* slant control */
+ if (SPropRecValList_search_record(&listPropRecVal,
+ &contRecValue,
+ "AutoItalic")) {
+ vals->pixel_matrix[2] +=
+ vals->pixel_matrix[0] * SPropContainer_value_dbl(contRecValue);
+ vals->point_matrix[2] +=
+ vals->point_matrix[0] * SPropContainer_value_dbl(contRecValue);
+ vals->pixel_matrix[3] +=
+ vals->pixel_matrix[1] * SPropContainer_value_dbl(contRecValue);
+ vals->point_matrix[3] +=
+ vals->point_matrix[1] * SPropContainer_value_dbl(contRecValue);
+ }
+#ifdef USE_XLFD_AUTO_CONTROL
+ else
+ for (i=0; i<sizeof(slantinfo)/sizeof(slantinfo[0]); i++) {
+ if (!mystrcasecmp(slant, slantinfo[i].name)) {
+ vals->pixel_matrix[2] +=
+ vals->pixel_matrix[0] * slantinfo[i].sign * 0.5;
+ vals->point_matrix[2] +=
+ vals->point_matrix[0] * slantinfo[i].sign * 0.5;
+ vals->pixel_matrix[3] +=
+ vals->pixel_matrix[1] * slantinfo[i].sign * 0.5;
+ vals->point_matrix[3] +=
+ vals->point_matrix[1] * slantinfo[i].sign * 0.5;
+ break;
+ }
+ }
+#endif /* USE_XLFD_AUTO_CONTROL - obsoleted. */
+
+ /* Reject ridiculously small font sizes that will blow up the math */
+ if ((base_width = hypot(vals->pixel_matrix[0], vals->pixel_matrix[1])) < 1.0 ||
+ (base_height = hypot(vals->pixel_matrix[2], vals->pixel_matrix[3])) < 1.0) {
+ fprintf(stderr, "too small font\n");
+ result = BadFontName;
+ goto quit;
+ }
+
+ /* set up default values */
+ FontDefaultFormat(&bit, &byte, &glyph, &scan);
+ /* get any changes made from above */
+ ret = CheckFSFormat(format, fmask, &bit, &byte, &scan, &glyph, &image);
+ if (ret != Successful) {
+ result = ret;
+ goto quit;
+ }
+
+ /* allocate font struct */
+ if (!(pFont = CreateFontRec())) {
+ result = AllocError;
+ goto quit;
+ }
+
+ /* allocate private font data */
+ if ((ft = (FreeTypeFont *)xalloc(sizeof(*ft))) == NULL) {
+ DestroyFontRec(pFont);
+ result = AllocError;
+ goto quit;
+ }
+
+ /* init private font data */
+ memset(ft, 0, sizeof(*ft));
+
+ ft->pixel_size = base_height;
+ ft->pixel_width_unit_x = vals->pixel_matrix[0]/base_height;
+
+ /* hinting control */
+ ft->flag = TTLOAD_DEFAULT;
+ if (SPropRecValList_search_record(&listPropRecVal,
+ &contRecValue,
+ "Hinting"))
+ /* if not true, turn off hinting
+ * some broken truetype font cannot get bitmaps when
+ * hinting is applied */
+ if (!SPropContainer_value_bool(contRecValue))
+ ft->flag = TTLOAD_SCALE_GLYPH;
+
+ if ((ret = FreeType_OpenFont(ft, vals, glyph, &hints))
+ != Successful) {
+ xfree(ft);
+ DestroyFontRec(pFont);
+ result = BadFontName;
+ goto quit;
+ }
+
+ ft->pFont = pFont;
+ if (bit == MSBFirst) {
+ if (byte == LSBFirst) {
+ ft->convert = convertNothing;
+ } else {
+ ft->convert = convertByteOrder;
+ }
+ } else {
+ if (byte == LSBFirst) {
+ ft->convert = convertBitOrder;
+ } else {
+ ft->convert = convertBitByteOrder;
+ }
+ }
+
+ ft->spacing = spacing;
+#if True /* obsoleted ->->-> */
+ if (SPropRecValList_search_record(&listPropRecVal,
+ &contRecValue,
+ "ForceProportional"))
+ ft->spacing = SPropContainer_value_bool(contRecValue)?'p':'c';
+ else
+#endif /* <-<-<- obsoleted */
+ if (SPropRecValList_search_record(&listPropRecVal,
+ &contRecValue,
+ "ForceSpacing")) {
+ char *strSpace = SPropContainer_value_str(contRecValue);
+ Bool err = False;
+
+ if (1 != strlen(strSpace))
+ err = True;
+ else
+ switch (strSpace[0]) {
+ case 'p':
+ case 'm':
+ case 'c':
+ ft->spacing = strSpace[0];
+ break;
+ default:
+ err = True;
+ }
+ if (err) {
+ xfree(ft);
+ DestroyFontRec(pFont);
+ result = BadFontName;
+ goto quit;
+ }
+ }
+ /* very lazy metrics */
+ ft->isVeryLazy = False;
+ if (SPropRecValList_search_record(&listPropRecVal,
+ &contRecValue,
+ "VeryLazyMetrics"))
+ if (NULL == getenv("NOVERYLAZY"))
+ /* If NOVERYLAZY is defined, the vl option is ignored. */
+ ft->isVeryLazy = SPropContainer_value_bool(contRecValue);
+
+ /* Fill in font record. Data format filled in by reader. */
+ pFont->format = format;
+ pFont->bit = bit;
+ pFont->byte = byte;
+ pFont->glyph = glyph;
+ pFont->scan = scan;
+ pFont->get_metrics = FreeTypeGetMetrics;
+ pFont->get_glyphs = FreeTypeGetGlyphs;
+ pFont->unload_font = FreeTypeUnloadFont;
+ pFont->unload_glyphs = NULL;
+ pFont->refcnt = 0;
+ pFont->fontPrivate = (unsigned char *)ft;
+
+ /* set ColInfo */
+ pinfo = &pFont->info;
+ pinfo->firstCol = ft->codeConverterInfo.refCharSetInfo->firstCol;
+ pinfo->firstRow = ft->codeConverterInfo.refCharSetInfo->firstRow;
+ pinfo->lastCol = ft->codeConverterInfo.refCharSetInfo->lastCol;
+ pinfo->lastRow = ft->codeConverterInfo.refCharSetInfo->lastRow;
+ pinfo->defaultCh = ft->codeConverterInfo.refCharSetInfo->defaultCh;
+ /* restriction of the code range */
+ {
+
+ if (SPropRecValList_search_record(&listPropRecVal,
+ &contRecValue,
+ "CodeRange")) {
+ restrict_code_range_by_str(&pinfo->firstCol, &pinfo->firstRow,
+ &pinfo->lastCol, &pinfo->lastRow,
+ SPropContainer_value_str(contRecValue));
+ }
+ restrict_code_range(&pinfo->firstCol, &pinfo->firstRow,
+ &pinfo->lastCol, &pinfo->lastRow,
+ vals->ranges, vals->nranges);
+ }
+
+ pinfo->allExist = 0;
+ pinfo->drawDirection = LeftToRight;
+ pinfo->cachable = 1;
+ pinfo->anamorphic = False; /* XXX ? */
+
+ pFont->info.inkMetrics = 0;
+ pFont->info.allExist = 0;
+ pFont->info.maxOverlap = 0;
+ pFont->info.pad = (short)0xf0f0; /* 0, 0xf0f0 ??? */
+
+ {
+ /* exact bounding box */
+ int raw_ascent, raw_descent, raw_width; /* RAW */
+ int lsb, rsb, desc, asc;
+ double newlsb, newrsb, newdesc, newasc;
+ double point[2];
+ double scale;
+
+ /*
+ * X11's values are not same as TrueType values.
+ * lsb is same.
+ * rsb is not same. X's rsb is xMax.
+ * asc is same.
+ * desc is negative.
+ *
+ * NOTE THAT:
+ * `prop' is instance of TT_Face_Properties, and
+ * get by using TT_Get_Face_Properties().
+ * Thus, `prop' applied no transformation.
+ */
+
+ asc = faceTable[ft->fid].prop.horizontal->Ascender;
+ desc = -(faceTable[ft->fid].prop.horizontal->Descender);
+ lsb = faceTable[ft->fid].prop.horizontal->min_Left_Side_Bearing;
+ rsb = faceTable[ft->fid].prop.horizontal->xMax_Extent;
+ if (rsb == 0)
+ rsb = faceTable[ft->fid].prop.horizontal->advance_Width_Max;
+
+ raw_width = faceTable[ft->fid].prop.horizontal->advance_Width_Max;
+ raw_ascent = faceTable[ft->fid].prop.horizontal->Ascender;
+ raw_descent = -(faceTable[ft->fid].prop.horizontal->Descender);
+
+ /*
+ * Apply scaleBBoxWidth.
+ */
+ lsb = (int)floor(lsb * faceTable[ft->fid].scaleBBoxWidth);
+ rsb = (int)floor(rsb * faceTable[ft->fid].scaleBBoxWidth + 0.5);
+ raw_width = raw_width * faceTable[ft->fid].scaleBBoxWidth;
+
+#define TRANSFORM_POINT(matrix, x, y, dest) \
+ ((dest)[0] = (matrix)[0] * (x) + (matrix)[2] * (y), \
+ (dest)[1] = (matrix)[1] * (x) + (matrix)[3] * (y))
+
+#define CHECK_EXTENT(lsb, rsb, desc, asc, data) \
+ ((lsb) > (data)[0] ? (lsb) = (data)[0] : 0 , \
+ (rsb) < (data)[0] ? (rsb) = (data)[0] : 0, \
+ (-desc) > (data)[1] ? (desc) = -(data)[1] : 0 , \
+ (asc) < (data)[1] ? (asc) = (data)[1] : 0)
+
+ /* Compute new extents for this glyph */
+ TRANSFORM_POINT(vals->pixel_matrix, lsb, -desc, point);
+ newlsb = point[0];
+ newrsb = newlsb;
+ newdesc = -point[1];
+ newasc = -newdesc;
+ TRANSFORM_POINT(vals->pixel_matrix, lsb, asc, point);
+ CHECK_EXTENT(newlsb, newrsb, newdesc, newasc, point);
+ TRANSFORM_POINT(vals->pixel_matrix, rsb, -desc, point);
+ CHECK_EXTENT(newlsb, newrsb, newdesc, newasc, point);
+ TRANSFORM_POINT(vals->pixel_matrix, rsb, asc, point);
+ CHECK_EXTENT(newlsb, newrsb, newdesc, newasc, point);
+
+ /*
+ * TrueType font is scaled. So we made scaling value.
+ */
+ scale = 1.0 / faceTable[ft->fid].prop.header->Units_Per_EM;
+ lsb = (int)floor(newlsb * scale + 0.5);
+ rsb = (int)floor(newrsb * scale + 0.5);
+ desc = (int)ceil(newdesc * scale - 0.5);
+ asc = (int)floor(newasc * scale + 0.5);
+
+ raw_width *= base_width * 1000. * scale / base_height;
+ raw_ascent *= 1000. * scale;
+ raw_descent *= 1000. * scale;
+
+ /* ComputeBounds */
+ if (ft->spacing == 'c' || ft->spacing == 'm') { /* constant width */
+
+ int width =
+ faceTable[ft->fid].prop.horizontal->advance_Width_Max
+ * faceTable[ft->fid].scaleBBoxWidth;
+
+ /* AVERAGE_WIDTH ... 1/10 pixel unit */
+ vals->width =(int)floor(width * 10.0 *
+ vals->pixel_matrix[0] * scale + 0.5);
+ /* width */
+ width = (int)floor(width * vals->pixel_matrix[0] * scale + 0.5);
+
+ if (ft->spacing == 'c') {
+ /* Use same maxbounds and minbounds to make fast. */
+ pFont->info.maxbounds.leftSideBearing = lsb;
+ pFont->info.maxbounds.rightSideBearing = rsb;
+ pFont->info.maxbounds.characterWidth = width;
+ pFont->info.maxbounds.ascent = asc;
+ pFont->info.maxbounds.descent = desc;
+ pFont->info.maxbounds.attributes = raw_width;
+
+ pFont->info.minbounds = pFont->info.maxbounds;
+ } else {
+ /* Use different maxbounds and minbounds
+ to let X check metrics. */
+ pFont->info.maxbounds.leftSideBearing = 0;
+ pFont->info.maxbounds.rightSideBearing = rsb;
+ pFont->info.maxbounds.characterWidth = width;
+ pFont->info.maxbounds.ascent = asc;
+ pFont->info.maxbounds.descent = desc;
+ pFont->info.maxbounds.attributes = raw_width;
+
+ pFont->info.minbounds.leftSideBearing = lsb;
+ pFont->info.minbounds.rightSideBearing = 0;
+ pFont->info.minbounds.characterWidth = width;
+ pFont->info.minbounds.ascent = asc;
+ pFont->info.minbounds.descent = desc;
+ pFont->info.minbounds.attributes = 0;
+ }
+
+ pFont->info.ink_maxbounds = pFont->info.maxbounds;
+ pFont->info.ink_minbounds = pFont->info.minbounds;
+ pFont->info.maxOverlap = rsb - width;
+
+ } else { /* proportional */
+ freetype_compute_bounds(ft, pinfo, vals);
+ }
+
+ /* set ascent/descent */
+ pFont->info.fontAscent = asc;
+ pFont->info.fontDescent = desc;
+
+ /* set name for property */
+ strncpy(xlfdName, vals->xlfdName, sizeof(xlfdName));
+ FontParseXLFDName(xlfdName, vals, FONT_XLFD_REPLACE_VALUE);
+ dprintf((stderr, "name: %s\n", xlfdName));
+
+ /* set properties */
+ freetype_compute_props(&pFont->info, vals,
+ raw_width, raw_ascent, raw_descent,
+ xlfdName);
+ }
+
+ /* Set the pInfo flags */
+ /* Properties set by FontComputeInfoAccelerators:
+ pInfo->noOverlap;
+ pInfo->terminalFont;
+ pInfo->constantMetrics;
+ pInfo->constantWidth;
+ pInfo->inkInside;
+ */
+ FontComputeInfoAccelerators(pinfo);
+#ifdef DUMP
+ DumpFont(pFont);
+#endif
+ *ppFont = pFont;
+
+ result = Successful;
+
+ quit:
+ if (dynStrTTFileName)
+ xfree(dynStrTTFileName);
+ if (dynStrRealFileName)
+ xfree(dynStrRealFileName);
+ return result;
+}
+
+int
+FreeTypeGetInfoScalable(fpe, pFontInfo, entry, fontName, fileName, vals)
+ FontPathElementPtr fpe;
+ FontInfoPtr pFontInfo;
+ FontEntryPtr entry;
+ FontNamePtr fontName;
+ char *fileName;
+ FontScalablePtr vals;
+{
+ FontPtr pfont;
+ int flags = 0;
+ long format = 0;
+ long fmask = 0;
+ int ret;
+
+ dprintf((stderr, "FreeTypeGetInfoScalable\n"));
+
+ ret = FreeTypeOpenScalable(fpe, &pfont, flags, entry,
+ fileName, vals, format, fmask, 0);
+ if (ret != Successful)
+ return ret;
+ *pFontInfo = pfont->info;
+
+ pfont->info.props = NULL;
+ pfont->info.isStringProp = NULL;
+
+ FreeType_CloseFont(pfont);
+ return Successful;
+}
+
+static FontRendererRec renderers[] =
+{
+ {
+ ".ttf", 4,
+ (int (*)()) 0, FreeTypeOpenScalable,
+ (int (*)()) 0, FreeTypeGetInfoScalable,
+ 0, CAP_MATRIX | CAP_CHARSUBSETTING
+ },
+ {
+ ".ttc", 4,
+ (int (*)()) 0, FreeTypeOpenScalable,
+ (int (*)()) 0, FreeTypeGetInfoScalable,
+ 0, CAP_MATRIX | CAP_CHARSUBSETTING
+ }
+#ifdef USE_TTP_FILE
+ ,
+ {
+ ".ttp", 4,
+ (int (*)()) 0, FreeTypeOpenScalable,
+ (int (*)()) 0, FreeTypeGetInfoScalable,
+ 0, CAP_MATRIX | CAP_CHARSUBSETTING
+ }
+#endif /* obsoleted */
+};
+
+int
+XTrueTypeRegisterFontFileFunctions()
+{
+ int i;
+ /* make standard prop */
+ freetype_make_standard_props();
+
+ /* reset */
+ /* register */
+ for (i=0;i<sizeof(renderers)/sizeof(renderers[0]);i++)
+ FontFileRegisterRenderer(renderers + i);
+
+ return 0;
+}
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttmisc.c b/xc/extras/X-TrueType/xttmisc.c
new file mode 100644
index 000000000..75e5082b7
--- /dev/null
+++ b/xc/extras/X-TrueType/xttmisc.c
@@ -0,0 +1,78 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 Takuya SHIOZAKI, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+#include "xttcommon.h"
+
+/**************************************************************************
+ Functions
+ */
+
+/* compare strings, ignoring case */
+Bool /* False == equal, True == not equal */
+mystrcasecmp(char const *s1, char const *s2)
+{
+ Bool result = True;
+
+#if (defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) ||\
+ defined(__bsdi__)) && !defined(FONTMODULE)
+ /* 4.4BSD has strcasecmp function. */
+ result = strcasecmp(s1, s2) != 0;
+#else
+ {
+ unsigned int len1 = strlen(s1);
+
+ if (len1 == strlen(s2)) {
+ int i;
+ for (i=0; i<len1; i++) {
+ if (toupper(*s1++) != toupper(*s2++))
+ goto quit;
+ }
+ result = False;
+ } else
+ /* len1 != len2 -> not equal*/
+ ;
+ }
+ quit:
+ ;
+#endif
+
+ return result;
+}
+
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttprop.c b/xc/extras/X-TrueType/xttprop.c
new file mode 100644
index 000000000..754e2cf04
--- /dev/null
+++ b/xc/extras/X-TrueType/xttprop.c
@@ -0,0 +1,280 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 Takuya SHIOZAKI, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+
+#include "xttversion.h"
+
+static char const * const releaseID =
+ _XTT_RELEASE_NAME;
+
+/* THIS FILE IS BASED ON Speedo Font lib spinfo.c */
+
+/*------------------------- original copyright ------------------------*/
+/*
+ * Copyright 1990, 1991 Network Computing Devices;
+ * Portions Copyright 1987 by Digital Equipment Corporation
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Network Computing Devices or Digital
+ * not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission.
+ *
+ * NETWORK COMPUTING DEVICES AND DIGITAL DISCLAIM ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL NETWORK COMPUTING DEVICES OR DIGITAL BE
+ * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Dave Lemke, Network Computing Devices, Inc
+ */
+
+/*
+Copyright (c) 1987 X Consortium
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+*/
+
+#ifndef FONTMODULE
+#include <X11/Xos.h>
+#endif
+#include <X11/X.h>
+#include "fntfilst.h"
+#include "xttcommon.h"
+
+/* percentage of pointsize used to specify ascent & descent */
+#define STRETCH_FACTOR 120
+
+enum scaleType {
+ atom, truncate_atom, pixel_size, point_size, resolution_x,
+ resolution_y, average_width
+};
+
+typedef struct _fontProp {
+ char *name;
+ long atom;
+ enum scaleType type;
+} fontProp;
+
+static fontProp fontNamePropTable[] = {
+ { "FOUNDRY", 0, atom },
+ { "FAMILY_NAME", 0, atom },
+ { "WEIGHT_NAME", 0, atom },
+ { "SLANT", 0, atom },
+ { "SETWIDTH_NAME", 0, atom },
+ { "ADD_STYLE_NAME", 0, atom },
+ { "PIXEL_SIZE", 0, pixel_size },
+ { "POINT_SIZE", 0, point_size },
+ { "RESOLUTION_X", 0, resolution_x },
+ { "RESOLUTION_Y", 0, resolution_y },
+ { "SPACING", 0, atom },
+ { "AVERAGE_WIDTH", 0, average_width },
+ { "CHARSET_REGISTRY", 0, atom },
+ { "CHARSET_ENCODING", 0, truncate_atom },
+};
+
+/* Warning: following array is closely related to the sequence of
+ defines after it. */
+
+static fontProp extraProps[] = {
+ { "FONT", 0, 0 },
+ { "COPYRIGHT", 0, 0 },
+ { "RAW_PIXEL_SIZE", 0, 0 },
+ { "RAW_POINT_SIZE", 0, 0 },
+ { "RAW_ASCENT", 0, 0 },
+ { "RAW_DESCENT", 0, 0 },
+ { "RAW_AVERAGE_WIDTH", 0, 0 },
+};
+
+/* this is a bit kludgy */
+#define FONTPROP 0
+#define COPYRIGHTPROP 1
+#define RAWPIXELPROP 2
+#define RAWPOINTPROP 3
+#define RAWASCENTPROP 4
+#define RAWDESCENTPROP 5
+#define RAWWIDTHPROP 6
+
+#define NNAMEPROPS (sizeof(fontNamePropTable) / sizeof(fontProp))
+#define NEXTRAPROPS (sizeof(extraProps) / sizeof(fontProp))
+
+#define NPROPS (NNAMEPROPS + NEXTRAPROPS)
+
+extern Atom MakeAtom(char *string, unsigned len, Bool makeit);
+
+void
+freetype_make_standard_props(void)
+{
+ int i;
+ fontProp *t;
+ i = sizeof(fontNamePropTable) / sizeof(fontProp);
+ for (t = fontNamePropTable; i; i--, t++)
+ t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), True);
+ i = sizeof(extraProps) / sizeof(fontProp);
+ for (t = extraProps; i; i--, t++)
+ t->atom = MakeAtom(t->name, (unsigned) strlen(t->name), True);
+}
+
+void
+freetype_compute_props(FontInfoPtr pinfo,
+ FontScalablePtr vals,
+ int raw_width,
+ int raw_ascent,
+ int raw_descent,
+ char *fontname)
+{
+ FontPropPtr pp;
+ int i, nprops;
+ fontProp *fpt;
+ char *is_str;
+ char *ptr1 = NULL, *ptr2, *ptr3;
+ /* FontScalableRec tmpvals;*/
+
+ nprops = pinfo->nprops = NPROPS;
+ pinfo->isStringProp = (char *) xalloc(sizeof(char) * nprops);
+ pinfo->props = (FontPropPtr) xalloc(sizeof(FontPropRec) * nprops);
+ if (!pinfo->isStringProp || !pinfo->props) {
+ xfree(pinfo->isStringProp);
+ pinfo->isStringProp = (char *) 0;
+ xfree(pinfo->props);
+ pinfo->props = (FontPropPtr) 0;
+ return;
+ }
+ memset(pinfo->isStringProp, 0, (sizeof(char) * nprops));
+
+ ptr2 = fontname;
+ for (i = NNAMEPROPS, pp = pinfo->props, fpt = fontNamePropTable,
+ is_str = pinfo->isStringProp; i;
+ i--, pp++, fpt++, is_str++) {
+
+ if (*ptr2) {
+ ptr1 = ptr2 + 1;
+ if (!(ptr2 = strchr(ptr1, '-'))) ptr2 = strchr(ptr1, '\0');
+ }
+
+ pp->name = fpt->atom;
+ switch (fpt->type) {
+ case atom:
+ *is_str = True;
+ pp->value = MakeAtom(ptr1, ptr2 - ptr1, True);
+ break;
+ case truncate_atom:
+ *is_str = True;
+ for (ptr3 = ptr1; *ptr3; ptr3++)
+ if (*ptr3 == '[')
+ break;
+ pp->value = MakeAtom(ptr1, ptr3 - ptr1, True);
+ break;
+ case pixel_size:
+ pp->value = (int)(vals->pixel_matrix[3] +
+ (vals->pixel_matrix[3] > 0 ? .5 : -.5));
+ break;
+ case point_size:
+ pp->value = (int)(vals->point_matrix[3] * 10.0 +
+ (vals->point_matrix[3] > 0 ? .5 : -.5));
+ break;
+ case resolution_x:
+ pp->value = vals->x;
+ break;
+ case resolution_y:
+ pp->value = vals->y;
+ break;
+ case average_width:
+ pp->value = vals->width;
+ break;
+ }
+ }
+
+ for (i=0, fpt = extraProps; i < NEXTRAPROPS; i++, is_str++, pp++, fpt++){
+ pp->name = fpt->atom;
+ switch (i) {
+ case FONTPROP:
+ *is_str = True;
+ pp->value = MakeAtom(fontname, strlen(fontname), True);
+ break;
+ case COPYRIGHTPROP:
+ *is_str = True;
+ pp->value = MakeAtom("copyright",
+ strlen("copyright"), True);
+ break;
+ case RAWPIXELPROP:
+ *is_str = False;
+ pp->value = 1000;
+ break;
+ case RAWPOINTPROP:
+ *is_str = False;
+ pp->value = (long)(72270.0 / (double)vals->y + .5);
+ break;
+ case RAWASCENTPROP:
+ *is_str = False;
+ pp->value = raw_ascent;
+ break;
+ case RAWDESCENTPROP:
+ *is_str = False;
+ pp->value = raw_descent;
+ break;
+ case RAWWIDTHPROP:
+ *is_str = False;
+ pp->value = raw_width;
+ break;
+ }
+ }
+}
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttstruct.h b/xc/extras/X-TrueType/xttstruct.h
new file mode 100644
index 000000000..b05c9497b
--- /dev/null
+++ b/xc/extras/X-TrueType/xttstruct.h
@@ -0,0 +1,142 @@
+/* ===EmacsMode: -*- Mode: C; tab-width:4; c-basic-offset: 4; -*- === */
+/* ===FileName: ===
+ Copyright (c) 1998 Go Watanabe, All rights reserved.
+ Copyright (c) 1998 Takuya SHIOZAKI, All rights reserved.
+ Copyright (c) 1998 X-TrueType Server Project, All rights reserved.
+
+===Notice
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+ Major Release ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2]
+
+Notice===
+*/
+
+#ifndef _XTTSTRUCT_H_
+#define _XTTSTRUCT_H_
+
+#ifdef DUMP
+#define dprintf(args) fprintf args;
+void DumpFontPathElement(FontPathElementPtr ptr);
+void DumpxCharInfo(xCharInfo *ptr);
+void DumpFont(FontPtr ptr);
+void DumpFontName(FontNamePtr ptr);
+void DumpFontEntry(FontEntryPtr ptr);
+void DumpfsRange(fsRange *ptr);
+void DumpFontScalable(FontScalablePtr ptr);
+#else
+#define dprintf(args)
+#endif
+
+typedef struct {
+ CharInfoPtr charInfo;
+} CharInfoUnit, *CharInfoUnitPtr;
+
+typedef struct {
+ char *bitmap;
+ int bitmapsize;
+ int cur;
+} BitmapInfoUnit, *BitmapInfoUnitPtr;
+
+typedef struct {
+ CharInfoUnitPtr unit;
+ int n; /* number of unit */
+ int index; /* current unit's index */
+ BitmapInfoUnitPtr bunit;
+ int bn; /* number of unix */
+} CharInfoPool, *CharInfoPoolPtr;
+
+/* xttchinfo.c */
+CharInfoPoolPtr CharInfoPool_Alloc(void);
+CharInfoPtr CharInfoPool_Get(CharInfoPoolPtr this);
+void CharInfoPool_Set(CharInfoPoolPtr ptr, CharInfoPtr dat, int size);
+void CharInfoPool_Free(CharInfoPoolPtr this);
+
+typedef struct FreeTypeFaceOpenHints {
+ char const *fontName;
+ char const *familyName;
+ char const *ttFontName;
+ char const *realFontName;
+ char const *charsetName;
+ Bool isProp;
+ SRefPropRecValList *refListPropRecVal;
+} FreeTypeOpenFaceHints, *FreeTypeOpenFaceHintsPtr;
+
+typedef struct FreeTypeFaceInfo {
+ char *fontName;
+ int refCount;
+ TT_Face face;
+ TT_Face_Properties prop; /* get by using TT_Get_FaceProperties.
+ This derived from TTF headers */
+ TT_Glyph glyph; /* handle for instance of glyph */
+ TT_Glyph_Metrics metrics;
+ int mapnum;
+ int flag;
+ double scaleBBoxWidth;
+ double scaleWidth;
+ Bool isAutoBold;
+ int ttcno;
+} FreeTypeFaceInfo, *FreeTypeFaceInfoPtr;
+
+typedef struct FreeTypeFont {
+ FontPtr pFont; /* font infomation */
+ int fid; /* faceinfo index */
+
+ TT_Instance instance;
+ TT_Instance_Metrics imetrics;
+
+ TT_Matrix matrix; /* transration matrix for the outline vectors */
+ TT_Raster_Map map;
+ int flag;
+
+ CharInfoPoolPtr pool;
+ BTreePtr btree;
+
+ TT_CharMap charmap;
+/* int (*codeconv)(TT_CharMap map, u_short idx); */
+ CodeConverterInfo codeConverterInfo;
+
+ void (*convert)(
+#if NeedNestedPrototypes
+ struct FreeTypeFont* /* font */,
+ unsigned char * /* p */,
+ int size
+#endif
+ );
+
+ int spacing;
+ Bool isVeryLazy;
+
+ double pixel_size; /* to calc attributes (actual height) */
+ double pixel_width_unit_x; /* to calc width (cosine) */
+
+} FreeTypeFont, *FreeTypeFontPtr;
+
+/* xttinfo.c */
+void freetype_make_standard_props(void);
+void freetype_compute_props(FontInfoPtr, FontScalablePtr,
+ int raw_width, int raw_ascent, int raw_descent,
+ char *);
+
+#endif /* _XTTSTRUCT_H_ */
+
+/* end of file */
diff --git a/xc/extras/X-TrueType/xttversion.h b/xc/extras/X-TrueType/xttversion.h
new file mode 100644
index 000000000..11ad7d3d6
--- /dev/null
+++ b/xc/extras/X-TrueType/xttversion.h
@@ -0,0 +1,17 @@
+/*
+ * THIS FILE WAS GENERATED AUTOMATICALLY
+ * -- THIS FILE SHOULD NOT BE CHANGED BY YOUR HANDS.
+ */
+#if (!(defined(__XTTVERSION_H)))
+# define __XTTVERSION_H 0x010200
+
+# define _XTT_V_MAJOR 1
+# define _XTT_V_MINOR 2
+# define _XTT_V_REVISION 0
+# define _XTT_VENDOR_NAME "X-TrueType Server Project"
+# define _XTT_RELEASE_NAME \
+ "===X-TT-ID: X-TrueType Server Version 1.2 [Aoi MATSUBARA Release 2] ==="
+
+#endif
+
+/* end of file */
diff --git a/xc/extras/Xpm/CHANGES b/xc/extras/Xpm/CHANGES
new file mode 100644
index 000000000..b90e6cdd7
--- /dev/null
+++ b/xc/extras/Xpm/CHANGES
@@ -0,0 +1,957 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/**************************************************************************\
+* *
+* HISTORY of user-visible changes *
+* *
+\**************************************************************************/
+
+3.4k (98/03/18)
+
+ ENHANCEMENTS:
+ - A new program called cxpm is provided to check on XPM files and help
+ figuring out where the file might be invalid.
+ - The FAQ and README are now in HTML.
+
+ BUGS CORRECTED:
+ - A bug in writing pixmaps out on an 32 bit depth visual and MSBFirst
+ machine.
+ - patch from Uwe Langenkamp <Uwe.Langenkamp@t-online.de>
+ - A severe bug in parsing the pixels section when an unknown character
+ is encountered.
+
+3.4j (96/12/31)
+
+ ENHANCEMENTS:
+ - The XPM library can now be built under Amiga DOS. This entirely comes
+ from: Lorens Younes <d93-hyo@nada.kth.se>
+ See the README.AMIGA file for details.
+ - Changes for MSW: big performance improvement in ParseAndPutPixels(),
+ fixed creation of the mask in SetColor()
+ - patch from Jan Wielemaker <jan@swi.psy.uva.nl>
+ - makefiles are provided for VMS
+ - given by Martin P.J. Zinser m.zinser@gsi.de
+ - Imakefiles reworked to get smoother builds and fixes from:
+ - Paul DuBois dubois@primate.wisc.edu
+ - Larry Schwimmer schwim@cyclone.stanford.edu
+ - thanks to some code rearrangement the library is smaller (the size
+ reduction goes from 4 to 7% depending on the system)
+
+ BUGS CORRECTED:
+ - A severe bug (introduced in 3.4i as part of the sprintf
+ optimization) in code writing XPM extensions to a buffer
+ XpmCreateBufferFromImage/Pixmap.
+ - The XpmAttributes definition in xpm.h was declaring nalloc_colors to
+ be Bool, it's an int.
+
+3.4i (96/09/13)
+
+ NEW FEATURES:
+ - The XPM library now allows the application to pass its own color
+ allocation/free functions. For this matter the following was done:
+ The XpmAttributes structure has three new fields alloc_color,
+ free_color, and color_closure. The following new valuemasks were
+ added XpmAllocColorFunc, XpmFreeColorsFunc, XpmColorClosure. And
+ two new types were defined XpmAllocColorFunc and XpmFreeColorsFunc.
+ See documentation for details.
+
+ ENHANCEMENTS:
+ - Windows NT support. It should compile and run fine based on the X
+ Consortium X11R6 distribution.
+ - The README file contains information to compile on Solaris with gcc.
+ - Part of the code has been optimized by using the value returned by
+ sprintf instead of calling strlen. Add the flag -DVOID_SPRINTF
+ if on your system sprintf returns void.
+ - patch from Thomas Ott thommy@rz.fh-augsburg.de
+
+ BUGS CORRECTED:
+ - XpmFree is now a real function (simply calling free by default).
+
+ CHANGES TO THE DOC:
+ - The documentation describes the new XpmAttributes fields and their
+ use.
+
+3.4h (96/02/01)
+
+ NEW FEATURES:
+ - The XpmAttributes has a new member called 'alloc_close_colors' which
+ lets the caller specify whether close colors should be allocated
+ using XAllocColor or not. This is especially useful when one uses a
+ private colormap full of read/write cells.
+ The xpm.h header file define a new bitmap flag called
+ XpmAllocCloseColors to use along with this new slot.
+ - Dale Pease peased@bigbird.cso.gtegsc.com
+ - The XpmAttributes has a new member called 'bitmap_format' which lets
+ the caller specify the format of 1 bit depth images (XYBitmap or
+ ZPixmap). The xpm.h header file define a new bitmap flag called
+ XpmBitmapFormat to use along with this new field.
+
+ ENHANCEMENTS:
+ - XpmReadFileTo[Image/Pixmap], XpmCreate[Image/Pixmap]FromData,
+ XpmCreateImageFromDataFromBuffer functions do no longer use a
+ temporary XpmImage object, which reduces a lot the amount of memory
+ used. On the other hand it can take a little more time, but given the
+ following figures (based on sxpm) it is a real good trade-off.
+
+ Reading a 22x22 pixmap with 5 colors no time change is detected
+ using time:
+ real 0.3
+ user 0.1
+ sys 0.1
+
+ Reading a 1279x1023 pixmap with 14 colors (quite extreme case for
+ XPM!) the time goes from:
+ real 1.9
+ user 0.8
+ sys 0.8
+
+ to:
+ real 2.2
+ user 1.8
+ sys 0.3
+
+ Reading the 22x22 pixmap with 5 colors the memory usage (under
+ purify) goes from:
+ 255256 code
+ 55496 data/bss
+ 163848 heap (peak use)
+ 4248 stack
+ to:
+ 271240 code
+ 55472 data/bss
+ 159752 heap (peak use)
+ 4224 stack
+
+ And reading the 1279x1023 pixmap with 14 colors it goes from:
+ 255256 code
+ 55496 data/bss
+ 6705160 heap (peak use)
+ 4280 stack
+ to:
+ 271240 code
+ 55472 data/bss
+ 1732616 heap (peak use)
+ 4264 stack
+
+ This clearly shows that while for small pixmaps there is no real
+ difference on both sides, for large pixmaps this makes a huge
+ difference about the amount of memory used and it is not much
+ slower.
+
+ Note that you can still get the old behavior using both
+ XpmReadFileToXpmImage and XpmCreate[Image/Pixmap]FromXpmImage instead
+ of XpmReadFileTo[Image/Pixmap]. Once more XPM gives you the choice!
+
+ BUGS CORRECTED:
+ - when defined locally the global symbols strcasecmp and strdup are
+ now called xpmstrcasecmp and xpmstrdup to avoid any possible
+ conflict.
+ - VMS has a bogus file system which requires a work around in
+ XpmReadFileToBuffer.
+ - patch from Bob.Deen@jpl.nasa.gov
+ - the type of the exactColors attribute has been changed from unsigned
+ int to Bool.
+
+ CHANGES TO THE DOC:
+ - the documentation describes the new XpmAttributes fields
+ alloc_close_colors and bitmap_format.
+
+3.4g (95/10/08)
+
+ ENHANCEMENTS:
+ - The XpmAttributes structure has now two new slots: alloc_pixels and
+ nalloc_pixels in order to provide an easy way to free allocated
+ colors. The new bitmask XpmReturnAllocPixels should be used to
+ request this data through the valuemask. Unless you really know why,
+ you should use this instead of XpmReturnPixels, pixels, and npixels.
+ - the XPM1 format parsing has been improved.
+ - patch from Chuck Thompson <cthomp@cs.uiuc.edu>
+ - compilers defining _STDC_ to something different from 1 are now
+ considered as ANSI compilers.
+ - the README file provides now more info on how to build XPM depending
+ on the system.
+
+ BUGS CORRECTED:
+ - a bug introduced in 3.4f in the XPM1 format parsing function.
+ - fix from Chuck Thompson <cthomp@cs.uiuc.edu>
+ - the hashtable was not free when the color parsing failed.
+ - patch from ackley@cs.unm.edu (David Ackley)
+ - the close color mechanism wasn't used if one of the closeness
+ parameter was null. Now only one needs to be different from 0.
+ Lorens Younes d93-hyo@nada.kth.se
+ - parsing of long comments failed with a segmentation fault.
+
+ CHANGES TO THE DOC:
+ - the documentation describes the new XpmAttributes fields
+ alloc_pixels and nalloc_pixels and how they are used.
+
+3.4f (95/05/29)
+
+ ENHANCEMENTS:
+ - Defines IMAKE_DEFINES in the top Imakefile so one can easily avoid
+ building the shared library.
+ - Add some information about the installation process in the README.
+ - filenames are surrounded with quotes when calling gzip or compress in
+ order to allow spaces within filenames.
+ - William Parn <parn@fgm.com>
+ - the compilation and the shared library building should be smoother
+ on Alpha OSF/1.
+ - patch from Dale Moore <Dale.Moore@CS.cmu.edu>
+
+ BUGS CORRECTED:
+ - a segmentation fault occurring in some weird case.
+
+3.4e (95/03/01)
+
+ ENHANCEMENTS:
+ - The top Imakefile passes CDEBUGFLAGS and DEFINES to subdirs. Thus
+ only this Imakefile should need to be edited by users.
+ - FAQ includes the answer to the question "How can I get a non
+ rectangular icon using XPM ?"
+ - VMS support updated
+ - patch from Martin P.J. Zinser m.zinser@gsi.de
+
+ BUGS CORRECTED:
+ - XpmCreateImageFromXpmImage() called from XpmReadFileToPixmap() could
+ lead to a segmentation fault since free was called on a memory block
+ size variable instead of the block itself. Note: this bug has been
+ introduced in 3.4d.
+
+3.4d (95/01/31)
+
+ ENHANCEMENTS:
+ - sxpm now supports a -version option command.
+
+ BUGS CORRECTED:
+ - the list of pixels returned in XpmAttributes was wrong when two
+ colors were defined as None in the read XPM
+ - Lionel.Mallet@sophia.inria.fr
+ - the parser was skipping whitespace reading extensions strings. This
+ has been fixed so extensions lines are now returned exactly as they
+ are.
+ - some compilation control added for the dec alpha with X11R5 (LONG64)
+ - patch from Fredrik Lundh <Fredrik_Lundh@ivab.se>
+ - when writing an XPM file, '-' characters are replaced with '_'
+ characters in the array name, in order to get a valid C syntax name.
+ - XYPixmap format images were not correctly handled.
+ - XPM1 file with names using multiple '_' characters are now handled
+ correctly.
+ - todd@erda.rl.af.mil (Todd Gleason)
+
+3.4c (94/06/06)
+
+ Yes, this is kind of quick. But this is because no code has been modified,
+ this is just a new packaging to make the whole stuff more suitable to the
+ X development team's requests for inclusion in the R6 contrib.
+
+ ENHANCEMENTS:
+ - Several filenames were too long to fit without any conflict on DOS
+ and CD-ROM filesystems. They have been renamed.
+ - Imakefiles use XCOMM for comments instead of the # character.
+ - the Postscript documentation file doc/xpm.ps is now distributed as
+ doc/xpm.PS.gz and allows browsing with tools such as ghostview.
+ - Besides, parts of lib/misc.c have been moved to several new files,
+ and some functions of data.c have been moved to other files in
+ order to get a better link profile.
+ - I've also added a FAQ hoping this will prevent people from
+ continuously filling my mailbox with the same questions.
+ - sxpm.c includes <X11/xpm.h> instead of "xpm.h" and BUILDINCTOP is
+ used in Makefiles as expected.
+ - Everything can be done simply using "xmkmf -a" and "make".
+
+3.4b (94/05/24)
+
+ ENHANCEMENTS:
+ - XPM can now be built under MS Windows. Yes, this is possible and this
+ entirely comes from:
+ - Hermann Dunkel <hedu@cul-ipn.uni-kiel.de>
+ See the README.MSW file for details.
+
+ - building the shared library now depends on the SharedLibXpm variable
+ and no longer on the SharedLibX variable which is private to the X
+ Window System project.
+ - patch from Stephen Gildea <gildea@x.org>
+ Other variables can now be set for the various locations needed.
+
+ - lib/parse.c does no longer use a 256x256 array in the stack but
+ malloc it instead.
+
+ - The Copyright notice which has been re-written from the X11R6's one
+ should be clearer and is now present in every file.
+
+ BUGS CORRECTED:
+ - lib/xpmP.h does no longer define a Boolean type which conflicts with
+ the Intrinsic definition. Instead the type Bool defined in Xlib is
+ used.
+ - neumann@watson.ibm.com (Gustaf Neumann)
+
+3.4a (94/03/29)
+
+ BUGS CORRECTED:
+ - passing NULL as shapemask_return to XpmReadFileToPixmap and similar
+ functions was leading to a bus error.
+ - Dean Luick <dean@falcon.natinst.com>
+
+3.4 (94/03/14)
+
+ IMPORTANT NOTE:
+ This version is not compatible with 3.3. Fortunately most people should
+ only need to recompile.
+ I apology for this but CDE/Motif have put heavy pressure to go that
+ way. The point is that I designed and released Xpm 3.3 in order to let
+ OSF include a clean version of Xpm in Motif 2.0. This new version was
+ not fully compatible with 3.2 but I thought it didn't matter since this
+ was going to be the first version used within Motif. Unfortunately CDE
+ was already using xpm-3.2 internally and requires both source and
+ binary backward compatibility. By the way I must say they didn't drop
+ us a single line to let us know they were using it and thus were
+ expecting stability. All this could have been avoided...
+
+ However, since I had to go for a not compatible version I took this as
+ an opportunity to modify the lower level API, which was new in 3.3 and
+ which was somewhat clumsy, in order to provide yet a better API.
+
+ The library has been modified to have both source and binary backward
+ compatibility with xpm-3.2. This implies it is not either source or
+ binary compatible with 3.3. The fields related to the 3.2 XpmInfos
+ mechanism have been put back into the XpmAttributes structure. The new
+ 3.3 XpmInfos struct has been renamed as XpmInfo to avoid conflict with
+ the old 3.2 flag which is back too. All the semantic related to the
+ XpmAttributes infos fields is back as well.
+
+ So this new version provides a high level API which is fully
+ compatible with 3.2 and still provides the 3.3 lower level API
+ (XpmImage) with the XpmInfos struct renamed as XpmInfo. This leads to
+ some redundancy but this was the best I could do to satisfy both
+ CDE/Motif people who needed the backward compatibility and myself (who
+ always tries to provide you with the best ;-).
+
+ Tests have been successfully performed with pixmap-2.1, pixmap-2.4, and
+ sxpm.
+
+ ENHANCEMENTS:
+ - The colorTable member of the XpmAttributes structure is now an
+ (XpmColor*) in order to be compatible with an XpmImage colorTable.
+ However in order to be backward compatible this field is cast to
+ (XpmColor **), which is equivalent to (char ***), when it is used
+ with the old flags XpmInfos and XpmReturnInfos. To handle the new
+ type the new flags XpmColorTable and XpmReturnColorTable have been
+ defined.
+ - The XpmInfo struct has been extended to avoid having to deal with an
+ XpmAttributes at the lower level. The idea is that all the data
+ stored in an Xpm file can be retrieve through both an XpmImage and
+ an XpmInfo struct. See the documentation for details.
+ - XpmUndefPixel is defined and exported by xpm.h in order to let
+ clients providing their own colorTable when writing out an Xpm file.
+ See the documentation for details.
+ - in sxpm/sxpm.c, set attribute XtNinput to True on toplevel widget.
+ Windows that don't "take" input, never get focus, as mandated by
+ the ICCM.
+ patch from Henrique Martins <martins@hplhasm.hpl.hp.com>
+ - lib/Imakefile modified to build the shared library under IRIX 5.
+ patch from simon@lia.di.epfl.ch (Simon Leinen)
+
+ NEW FEATURES:
+ - a new function and a new define should help client figuring out with
+ which Xpm library version they are working. These are
+ XpmIncludeVersion and XpmLibraryVersion().
+
+3.3 (93/12/20)
+
+ NEW FEATURES:
+ - XPM1 files are now supported.
+ - a new function is provided to get an error string related to the
+ returned error code.
+ - suggested by Detlef Schmier <detlef@mfr.dec.com>
+
+ ENHANCEMENTS:
+ - gzip and gunzip are called with the -q option (quiet)
+ - patch from Chris P. Ross <cross@eng.umd.edu>
+ - the parser is again more flexible about the way the strings are
+ distributed on lines. Actually a single line XPM file can be read.
+ - the documentation should be clearer about shapemask generation and
+ XpmAttributes valuemask.
+
+ BUGS CORRECTED:
+ - reading some binary file was leading to a bus error.
+ - patch from Detlef Schmier <detlef@mfr.dec.com>
+ - the ? character is no longer used when writing an XPM file in order
+ to avoid possible ANSI trigraphs.
+
+3.3alpha (93/08/13)
+
+ NEW FEATURES:
+ - a new level interface is provided to allow applications to do either
+ icon editing or data caching.
+ The XpmAttributes has been changed but most applications will just
+ need to be recompiled.
+ - new structures are provided to deal with the new lower level:
+ XpmImage, XpmColor, XpmInfos.
+
+ - a separate distribution called xpm-contrib is available. This
+ includes the converters which used to be part of this distribution
+ plus:
+ two new applications:
+ * nexpm to draw a pixmap in *any* existing window from
+ Ralph Betza <gnohmon@ssiny.com>
+ * xpmview to display a list of Xpm files from
+ Jean Michel Leon <leon@sophia.inria.fr>
+
+ a hacky string to pixmap converter, provided by
+ Robert H. Forsman Jr. <thoth@manatee.cis.ufl.edu>
+
+ The Xpm editor called pixmap will also be part of this contrib.
+ This does not mean it is the best pixmap editor one can find
+ but it is the only one that I know of which tries to handle
+ all the features of this format.
+
+ ENHANCEMENTS:
+ - the code to build XImage data has been optimized by
+ jules@x.co.uk (Julian Gosnell)
+ the old code is still available when compiling with the
+ -DWITHOUT_SPEEDUPS flag.
+
+ - closecolor code was not re-entrant
+ - dbl@visual.com (David B. Lewis)
+ - fix gzip filename (*.gz and no longer *.z).
+ - Jason Patterson <jasonp@fitmail.fit.qut.edu.au>
+ - sxpm has 2 new options:
+ -nom to do not display the mask if there is one
+ -cp <color> <pixel> to override a color value with a given
+ pixel, i.e. sxpm plaid.xpm -cp red 4
+
+ also the '-s' adn '-p' options have been renamed to '-sc' and '-sp'.
+
+ - xpm.h defines XpmFormat, XpmVersion, and XpmRevision numbers.
+
+ BUGS CORRECTED:
+ - closecolor minor fix
+ - Jason Patterson <jasonp@fitmail.fit.qut.edu.au>
+
+3.2g (93/04/26)
+
+ ENHANCEMENTS:
+ - much faster close colors
+ - piping from/to compressed files now handles GNU's gzip (.z) format
+ - added XpmColorKey attribute - ability to specify which visual's
+ colors to use (ie: now it's possible to read in a pixmap in a
+ color visual, but use the colors specified for monochrome).
+ - added -mono, -grey4, -grey and -color options to sxpm to demonstrate
+ the XpmColorKey attribute.
+ - Jason Patterson <jasonp@fitmail.qut.edu.au>
+
+ BUGS CORRECTED:
+ - fixed bug where redefining "None" as a pixel stopped mask generation
+ - minor SVR4 defines for <string.h>
+ - fixed annoying closecolor bug related to read/write color cells
+ - fixed minor bug in color value -> pixel overloading
+ - manual updated to include new red/green/blue closeness attributes
+ - Jason Patterson <jasonp@fitmail.qut.edu.au>
+
+ - the top Imakefile was missing the depend target
+ - sxpm/Imakefile fixed so that -L../lib is set before the standard
+ library location.
+ - Vivek Khera <khera@cs.duke.edu>
+
+ - lib/xpmP.h now defines bcopy as memcpy for VMS (required by recent
+ versions of VMS)
+ - J. Daniel Smith <dsmith@ann-arbor.applicon.slb.com>
+
+ - the lib/Imakefile didn't work with X11R4.
+
+
+3.2f (93/03/17)
+
+ NEW FEATURES:
+ - the library provides four new functions to deal with Xpm files
+ loaded in memory as single character strings buffers:
+
+ XpmCreateImageFromBuffer
+ XpmCreatePixmapFromBuffer
+ XpmCreateBufferFromImage
+ XpmCreateBufferFromPixmap
+
+ - in addition, as a convenience, two functions are provided to copy a
+ file in a buffer and to write a file from a buffer:
+
+ XpmReadFileToBuffer
+ XpmWriteFileFromBuffer
+
+ ENHANCEMENTS:
+ - Files are now dispatched in the following sub-directories:
+ lib, sxpm, and doc.
+ - Imakefiles will let you build a shared library as well as the static
+ one (with either X11R4 or X11R5).
+ - The documentation has been ported from LaTeX to FrameMaker and is
+ now included in the distribution in its PostScript form (doc/xpm.ps).
+ Source files are available on request.
+ Also the documentation has been reorganized and includes a table of
+ contents and an index of the functions (the number of functions
+ increasing this became a requisite).
+
+ BUGS CORRECTED:
+ - Many warnings have been fixed - patch from Daniel Dardailler
+ daniel@osf.org
+
+3.2e (93/02/05)
+
+ ENHANCEMENTS:
+ - use XpmMalloc, XpmRealloc, XpmCalloc, and XpmFree which are defines
+ in xpmP.h. This should help people wanting to use their own functions.
+
+ BUGS CORRECTED:
+ - Intrinsic.h is no longer included.
+ - bzero is defined as memset on SYSV and SVR4.
+ - some memory initialization bug concerning XpmAttributes.
+
+3.2d (93/01/27)
+
+ ENHANCEMENTS:
+ - compile on Solaris 2.0
+ - patch from Clint Jeffery <cjeffery@cs.arizona.edu>
+
+ BUGS CORRECTED:
+ - shape masks are now set correctly for LSBFirst (Decs).
+ - pixmaps are now set correctly for 2 bit displays (Nexts).
+ - patch from Josef Leherbauer <joe@takeFive.co.at>
+ - isspace was called on getc which fails when EOF is returned.
+ - Marelli Paolo <marelli@colos3.usr.dsi.unimi.it>
+
+3.2c (92/12/29)
+
+ ENHANCEMENTS:
+ - parsing optimized for single and double characters color
+ - patch originally from Martin Brunecky
+ marbru@build1.auto-trol.com
+
+ BUGS CORRECTED:
+ - XpmFreeExtensions was calling free on some argument without checking
+ it was not NULL.
+ - strdup was not correctly defined for systems which do not provide
+ it. - Hans-Peter Lichtin <lich@zellweger.ch>
+ - some bug in XpmCrDataFI.c
+ - Sven Delmas garfield@avalanche.cs.tu-berlin.de
+
+ NOTE:
+ - there is still a bug with the creation of the clipmask on display of
+ depth 2 but I can't find a fix because unfortunately I don't have such
+ a rendering system and nobody gets the time to investigate for me.
+
+3.2b (92/10/19)
+
+ ENHANCEMENTS:
+ - Create XpmReadFileToData and XpmWriteFileFromData
+ - Dan Greening <dgreen@sti.com>
+ - added "close colors" support and ability to redefine color values
+ as pixels at load time, as well as color names
+ - Jason Patterson <jasonp@fitmail.qut.edu.au>
+ - errors while parsing or allocating colors now revert to other
+ visual defaults, creating pixmap/image as expected, and returning
+ XpmSuccess. The old behavior of XpmColorError being returned and no
+ pixmap/image being created can be retained by setting the
+ exactColors attribute.
+ - Jason Patterson <jasonp@fitmail.qut.edu.au>
+
+ BUGS CORRECTED:
+ - SVR4 defines for including <string.h> instead of <strings.h>
+ - Jason Patterson <jasonp@fitmail.qut.edu.au>
+ - attributes->extensions and attributes->nextensions fields were not
+ set correctly when no extensions present in file.
+ - Simon_Scott Cornish <cornish@ecr.mu.oz.au>
+
+3.2a (92/08/17)
+
+ ENHANCEMENTS:
+ - use the mock lisp hashing function instead of the gnu emacs one,
+ it is faster in some cases and never slower (I've not found any case).
+
+ BUGS CORRECTED:
+ - function prototypes for ansi compilers.
+ - some memory initialization bugs (purify is just great for this).
+ - empty strings in extensions are now correctly handled.
+
+3.2 (92/07/06)
+
+ NEW FEATURES:
+ - both format and functions handle extensions data. This allow people
+ to store additional data related to a pixmap. See documentation for
+ detail.
+ - sxpm supports the new option '-c' to use a private colormap. This is
+ useful when displaying pixmaps using a lot of colors.
+ - sxpm supports the new option '-v' (verbose) to get possible
+ extensions print out on standard error.
+
+ ENHANCEMENTS:
+ - most of the code has been reworked to be improved and thus almost
+ every function is faster. It takes less than 6 seconds of real time on
+ a sun4 to display, with sxpm, a 487x635 pixmap using 213 colors, while
+ it takes 32 seconds with the old library! It takes 18 seconds to
+ display a 1279x1023 screen dump using 14 colors while xwud takes 10
+ seconds.
+ Of course performance improvements are not always that great, they
+ depend on the size and number of colors but I'm sure everybody will
+ appreciate ;-)
+ I know how to improve it more but this will require changes in the
+ architecture so this is not for now. Some optimizations have been
+ contributed by gregor@kafka.saic.com (gregg hanna) and
+ jnc@csl.biosci.arizona.edu (John N. Calley).
+ - the Imakefile is modified to let you install sxpm - Rainer Klute
+ <klute@irb.informatik.uni-dortmund.de>
+ - xpmP.h declares popen for Sequent platforms - Clinton Jeffery
+ <cjeffery@cs.arizona.edu>
+ - XpmWriteFileFromImage/Pixmap rather than truncating the pixmap name
+ to the first dot changes dots to underscores to get a valid C syntax
+ name.
+
+
+ BUGS CORRECTED:
+ - there was a bug in the image creation function for some 24 bits
+ displays. It is fixed.
+ - allocated color pixels are now freed when an error occurs -
+ nusser@dec1.wu-wien.ac.at (Stefan Nusser)
+
+ CHANGES TO THE DOC:
+ - the documentation describes the new XpmExtension structure and how
+ to use it with read and write functions.
+
+3.1 (92/02/03)
+
+ ENHANCEMENTS:
+ - sxpm now have more standard options (mainly suggested by
+ Rainer Sinkwitz <sinkwitz@ifi.unizh.ch>):
+
+ Usage: sxpm [options...]
+ Where options are:
+
+ [-d host:display] Display to connect to.
+ [-g geom] Geometry of window.
+ [-hints] Set ResizeInc for window.
+ [-icon filename] Set pixmap for iconWindow.
+ [-s symbol_name color_name] Overwrite color defaults.
+ [-p symbol_name pixel_value] Overwrite color defaults.
+ [-plaid] Read the included plaid pixmap.
+ [filename] Read from file 'filename', and from
+ standard input if 'filename' is '-'.
+ [-o filename] Write to file 'filename', and to standard
+ output if 'filename' is '-'.
+ [-nod] Don't display in window.
+ [-rgb filename] Search color names in the rgb text file
+ 'filename'.
+
+ if no input is specified sxpm reads from standard input.
+
+
+ - Xpm functions and Ppm converters now deal with multiword colornames.
+ patches from Rainer Sinkwitz <sinkwitz@ifi.unizh.ch>.
+
+
+3.0 (91/10/03)
+
+ Functions name and defines have been modified again (sorry for that)
+ as follows:
+
+ XpmReadPixmapFile XpmReadFileToPixmap
+ XpmWritePixmapFile XpmWriteFileFromPixmap
+
+ XpmPixmapColorError XpmColorError
+ XpmPixmapSuccess XpmSuccess
+ XpmPixmapOpenFailed XpmOpenFailed
+ XpmPixmapFileInvalid XpmFileInvalid
+ XpmPixmapNoMemory XpmNoMemory
+ XpmPixmapColorFailed XpmColorFailed
+
+ To update code using Xpm you can use the included shell script called
+ rename with the sed commands files name-3.0b-3.0c and name-3.0c-3.0.
+ Old names still valid though.
+
+ NEW FEATURES:
+ - four new functions to work with images instead of pixmaps:
+
+ XpmReadFileToImage
+ XpmWriteFileFromImage
+ XpmCreateImageFromData
+ XpmCreateDataFromImage
+
+ ENHANCEMENTS:
+ Algorithms to create and scan images and pixmaps are based on the
+ MIT's R5 code, thus they are much cleaner than old ones and should
+ avoid any problem with any visual (yes, I trust MIT folks :-)
+
+ BUGS CORRECTED:
+ Imakefile use INCDIR instead of ROOTDIR.
+
+ CHANGES TO THE DOC:
+ - the documentation presents the four new functions.
+
+3.0c (91/09/18)
+
+ In answer to request of people functions, types and defines names have
+ been changed as follows:
+
+ XCreatePixmapFromData XpmCreatePixmapFromData
+ XCreateDataFromPixmap XpmCreateDataFromPixmap
+ XReadPixmapFile XpmReadPixmapFile
+ XWritePixmapFile XpmWritePixmapFile
+ XFreeXpmAttributes XpmFreeAttributes
+
+ PixmapColorError XpmPixmapColorError
+ PixmapSuccess XpmPixmapSuccess
+ PixmapOpenFailed XpmPixmapOpenFailed
+ PixmapFileInvalid XpmPixmapFileInvalid
+ PixmapNoMemory XpmPixmapNoMemory
+ PixmapColorFailed XpmPixmapColorFailed
+
+ ColorSymbol XpmColorSymbol
+
+ Generally speaking every public name begins with 'Xpm' and every
+ private one with 'xpm'. This should avoid any possible conflict.
+
+ Some files have also be renamed accordingly.
+
+ NEW FEATURES:
+ - support for VMS and two new options for sxpm: icon and hints (see
+ manual for details) Richard Hess <rhess%pleione%cimshop@uunet.UU.NET>
+ - DEFINES in Imakefile and Makefile.noXtree allows you to set the
+ following:
+
+ ZPIPE for un/compressing piped feature (default is on)
+ NEED_STRCASECMP for system which doesn't provide one (default
+ is off)
+
+ - xpmtoppm.c has is own strstr function which is used if NEED_STRSTR
+ is defined when compiling - Hugues.Leroy@irisa.fr (Hugues Leroy).
+
+ BUGS CORRECTED:
+ - many bugs have been fixed, especially for ansi compilers -
+ Doyle C. Davidson (doyle@doyled.b23b.ingr.com) and
+ Clifford D. Morrison (cdm%bigdaddy%edsr@uunet.UU.NET)
+ - parser is again a little more improved
+
+3.0b (91/09/12)
+
+ This is a complete new version with a new API and where files and
+ structures have been renamed. So this should be taken as a new
+ starting release.
+ This release should be quickly followed by the 3.0 because I'm planning
+ to send it for X11R5 contrib which ends October 5th.
+
+ NEW FEATURES:
+ - support for transparent color.
+ - support for hotspot.
+ - a new function: XCreateDataFromPixmap to create an XPM data from a
+ pixmap in order to be able to create a new pixmap from this data using
+ the XCreatePixmapFromData function later on.
+ - a new structure: XpmAttributes which replace the XpmInfo structure
+ and which leads to a much simpler API with less arguments.
+ - arguments such as visual, colormap and depth are optional, default
+ values are taken if omitted.
+ - parsing and allocating color failures don't simply break anymore. If
+ another default color can be found it is used and a PixmapColorError
+ is returned. In case no color can be found then it breaks and returns
+ PixmapColorFailed.
+ - for this reason the ErrorStatus codes are redefined as follows:
+
+ null if full success
+ positive if partial success
+ negative if failure
+
+ with:
+ #define PixmapColorError 1
+ #define PixmapSuccess 0
+ #define PixmapOpenFailed -1
+ #define PixmapFileInvalid -2
+ #define PixmapNoMemory -3
+ #define PixmapColorFailed -4
+
+ - sxpm prints out a warning when a requested color could not be parsed
+ or alloc'ed, and an error when none has been found.
+ - sxpm handles pixmap with transparent color. For this purpose the
+ plaid_mask.xpm is added to the distribution.
+
+ BUGS CORRECTED:
+ - I've again improved the memory management.
+ - the parser is also improved.
+ - when writing a pixmap to a file the variable name could be
+ "plaid.xpm" which is not valid in C. Now the extension name is cut off
+ to give "plaid" as variable name.
+ - reading multiple words colornames such as "peach puff" where leading
+ to non readable Xpm files. They are now skipped to have only single
+ word colorname. Lionel Mallet (mallet@ipvpel.unipv.it).
+ - parser was triggered by the "/" character inside string.
+ Doyle C. Davidson (doyle@doyled.b23b.ingr.com). This is corrected.
+ - sxpm maps the window only if the option "-nod" is not selected.
+
+ CHANGES TO THE DOC:
+ - the documentation presents the new API and features.
+
+3.0a (91/04/10)
+
+ This is an alpha version because it supports the new version of XPM,
+ but the library interface is still the same. Indeed it will change in
+ future release to get rid of obsolete stuff such as the type argument
+ of the XWritePixmapFile function.
+
+ ******************************* WARNING *********************************
+ The format is not anymore XPM2, it is XPM version 3 which is XPM2
+ limited to the C syntax with the key word "XPM" in place of "XPM2 C".
+ The interface library has not changed yet but the type argument of
+ XWritePixmapFile and the type member of XpmInfo are not used anymore.
+ Meanwhile the library which is now called libXpm.a is backward
+ compatible as XPM2 files can be read. But the XWritePixmapFile
+ function only writes out XPM version 3 files.
+ *************************************************************************
+
+ NEW FEATURES:
+ - the library doesn't use global variables anymore, thus it should be
+ able to share it.
+ - sxpm has been rewritten on top of Xt, it can be used to convert
+ files from XPM2 to XPM version 3.
+ - xpm1to2c.perl has been upgraded to the new XPM version and renamed
+ as xpm1to3.perl
+ - ppmtoxpm2.c and ppmtoxpm2.1 have been upgraded too and renamed
+ ppmtoxpm.c and ppmtoxpm.1. In addition the xpmtoppm.c and xpmtoppm.1
+ of the pbmplus package have been upgraded too. xpmtoppm can thus
+ convert XPM version 1 and 3 to a portable pixmap. These files should
+ replace the original ones which are part of the pbmplus package. See
+ the ppm.README file for more details.
+ - the library contains RCS variables which allows you to get revision
+ numbers with ident (which is part of the RCS package). The Id number
+ is an internal rcs number for my eyes only. The official one is found
+ in Version.
+
+ BUGS CORRECTED:
+ - the memory management has been much improved in order to avoid
+ memory leaks.
+ - the XImage building algorithm has been changed to support correctly
+ different visual depths. There is special code to handle depths 1, 4,
+ 6, 8, 24, and 32 to build the image and send it in one whack, and
+ other depths are supported by building the image with XPutPixel which
+ is slow but sure.
+ - similar algorithms are used to read pixmaps and write them out.
+
+ CHANGES TO THE DOC:
+ - the documentation presents the new XPM format.
+
+
+2.8 (90/12/19)
+
+ ******************************* WARNING *********************************
+ Since the last release two structures have been modified and have now
+ bigger sizes, so ANY CODE USING THE libXPM2 NEEDS TO BE RECOMPILED.
+ *************************************************************************
+
+ NEW FEATURES:
+ - the ColorSymbol struct contains the new member 'pixel' which allow
+ to override default colors by giving a pixel value (in such a case
+ symbol value must be set to NULL),
+ - the XpmInfo struct contains the new member 'rgb_fname' in which one
+ can specify an rgb text file name while writing a pixmap with the
+ XWritePixmapFile function (otherwise this member should be set to
+ NULL). This way colorname will be searched and written out if found
+ instead of the RGB value,
+ - Imakefile originally provided by stolcke@ICSI.Berkeley.EDU,
+ - the old Makefile is now distributed as Makefile.noXtree and presents
+ install targets,
+ - the demo application is renamed sxpm (Show XPM), creates a window of
+ the size of the pixmap if no geometry is specified, prints out
+ messages instead of status when an error occurs, handles the new
+ option -p for overriding colors by giving a pixel value (not really
+ useful but is just here to show this new feature), handles the new
+ option -rgb for specifying an rgb text file, and ends on
+ keypress as buttonpress,
+ - defines for SYSV have been provided by Paul Breslaw
+ <paul@mecazh.uucp>,
+ - the distribution includes a new directory called converters which
+ contains xpm1to2 and xpm1to2c perl converters and a ppmtoxpm2
+ converter provided by Paul Breslaw who upgraded the original ppmtoxpm
+ written by Mark W. Snitily <mark@zok.uucp>.
+
+ CHANGES TO THE DOC:
+ - this file is created and will give old users a quick reference to
+ changes made from one release to the next one,
+ - documentation is changed to present the new ColorSymbol structure
+ and the way to override colors by giving a pixel value, and to present
+ the new XpmInfo structure and how to use it,
+ - a man page for sxpm is added to the distrib,
+ - the README file talks about sxpm and no more demo, and have
+ reference to the different converters.
+
+2.7 (90/11/12)
+
+ NEW FEATURES:
+ - XReadPixmapFile reads from stdin if filename is NULL,
+ - XWritePixmapFile writes to stdin if filename is NULL,
+ - the demo application handles the new option -nod for no displaying
+ the pixmap in a window (useful when used as converter).
+
+ CHANGES TO THE DOC:
+ - documentation about the new feature.
+
+2.6 (90/10/29)
+
+ NEW FEATURES:
+ - from nazgul@alphalpha.com (Kee Hinckley): changes to make the
+ library usable as C++ code, and on Apollo without any warning.
+
+ BUGS CORRECTED:
+ - from nazgul@alphalpha.com (Kee Hinckley): the xpm include files was
+ declaring XWritePixmapFile as taking in arg a Pixmap pointer instead
+ of a Pixmap.
+
+2.5 (90/10/17)
+
+ BUGS CORRECTED:
+ - XWritePixmapFile was not closing the file while ending normally.
+
+2.4 (90/09/06)
+
+ NEW FEATURES:
+ - XReadPixmapFile reads from a piped uncompress if the given filename
+ ends by .Z or if filename.Z exists,
+ - XWritePixmapFile writes to a piped compress if the given filename
+ ends by .Z.
+
+ BUGS CORRECTED:
+ - demo now deals with window manager.
+
+ CHANGES TO THE DOC:
+ - documentation about compressed files management.
+
+2.3 (90/08/30)
+
+ BUGS CORRECTED:
+ - handle monochrome display correctly,
+ - comments can be empty.
+
+2.2 (90/08/27)
+
+ BUGS CORRECTED:
+ - when reading some invalid free was dumping core on some machine.
+
+2.1 (90/08/24)
+
+ First distribution of XPM2.
+
diff --git a/xc/extras/Xpm/COPYRIGHT b/xc/extras/Xpm/COPYRIGHT
new file mode 100644
index 000000000..446fa4cd8
--- /dev/null
+++ b/xc/extras/Xpm/COPYRIGHT
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+Arnaud LE HORS BULL Research FRANCE -- Koala Project
+ (XPM - X PixMap format version 2 & 3)
+ Internet: lehors@sophia.inria.fr
+Surface Mail: Arnaud LE HORS, INRIA - Sophia Antipolis,
+ 2004, route des Lucioles, 06565 Valbonne Cedex -- FRANCE
+ Voice phone: (33) 93.65.77.71, Fax: (33) 93 65 77 66, Telex: 97 00 50 F
diff --git a/xc/extras/Xpm/FAQ.html b/xc/extras/Xpm/FAQ.html
new file mode 100644
index 000000000..18d4ee6ff
--- /dev/null
+++ b/xc/extras/Xpm/FAQ.html
@@ -0,0 +1,344 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html lang="en">
+<HEAD>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<TITLE>FAQ XPM</TITLE>
+</HEAD>
+
+<body>
+<h1 align="center">The XPM<br>
+Frequently Asked Questions</h1>
+<p>
+This article contains the answers to some Frequently Asked Questions about the
+XPM format and/or library. If you don't find the answer to your problem here,
+then you can mail either to lehors@sophia.inria.fr or to the mailing list
+xpm-talk@sophia.inria.fr.
+
+
+<h2>Contents</h2>
+
+<ol>
+<li><a href="#Q1">How do I convert my images to or from XPM ?</a>
+<li><a href="#Q2">Why are my XPM files said to be invalid ?</a>
+<li><a href="#Q3">Why does my program core dumps using XPM ?</a>
+<li><a href="#Q4">Why does my program core dumps using XPM with a widget ?</a>
+<li><a href="#Q5">How can I get a non rectangular icon using XPM ?</a>
+<li><a href="#Q6">What exactly triggers the creation of a mask when using XPM ?</a>
+<li><a href="#Q7">How should I use the mask ?</a>
+<li><a href="#Q8">Is there a string to pixmap converter somewhere ?</a>
+<li><a href="#Q9">How can I edit XPM icons ?</a>
+<li><a href="#Q10">Is there a collection of icons somewhere ?</a>
+<li><a href="#Q11">The documentation fails to print out. Why ?</a>
+<li><a href="#copy">Copyright</a>
+</ol>
+
+
+<h2><a name="Q1">1. How do I convert my images to or from XPM ?</a></h2>
+<p>
+ Netpbm is surely the best image conversion package that I know of. It defines
+ formats for color, gray and monochrome images and provides a set of filters.
+ Thus a GIF image can be converted to XPM with something like:
+<p>
+ $ giftoppm youricon.gif | ppmtoxpm > youricon.xpm
+<p>
+ The latest release can be found at least from wuarchive.wustl.edu
+ (128.252.135.4), directory /graphics/graphics/packages/NetPBM
+
+
+<h2><a name="Q2">2. Why are my XPM files said to be invalid ?</a></h2>
+<p>
+ There are three official versions of the XPM format. The XPM library since
+ version 3.3 can read all them but writes out only XPM 3. Also the small
+ program called sxpm which is part of the XPM library package can be used to
+ automatically translate XPM 1 and 2 files to XPM 3 with a command such as:
+<p>
+ $ sxpm -nod yourxpm1or2file -o yourxpm3file
+<p>
+ Also, the XPM format defines "None" to be the color name meaning
+ "transparent", but IXI used to hack the XPM library in its early days to
+ handle transparency as "#Transparent". This makes IXI format not compatible
+ with the official XPM format, and so not readable neither by the official XPM
+ library nor any of the programs built on top of it.
+<p>
+ The only solutions are either to stick on IXI programs which can deal with
+ their format or convert your files to the standard XPM format. This can be
+ done simply by changing "#Transparent" to "None".
+
+
+<h2><a name="Q3">3. Why does my program core dumps using XPM ?</a></h2>
+<p>
+ Be sure the XpmAttributes structure you pass by reference has a valid
+ valuemask. You can give NULL instead if you don't want to use an
+ XpmAttributes but if you do, you MUST initialize its valuemask component to
+ some valid value, at least 0, otherwise unpredictable errors can occur.
+<p>
+ So instead of doing something like:
+<pre>
+ XpmAttributes attrib;
+
+ XpmReadFileToPixmap(dpy, d, filename, &amp;pixmap, &amp;mask, &amp;attrib);
+</pre>
+<p>
+ you should do:
+<pre>
+ XpmAttributes attrib;
+
+ attrib.valuemask = 0;
+ XpmReadFileToPixmap(dpy, d, filename, &amp;pixmap, &amp;mask, &amp;attrib);
+</pre>
+
+
+<h2><a name="Q4">4. Why does my program core dumps using XPM with a widget ?</a></h2>
+<ul>
+<li>First the XPM library is Xlib level, so don't pass your widget as a
+ Drawable parameter. A Drawable is either a Window or a Pixmap. The widget's
+ window can do the job but:
+
+<li>Then a widget only gets a Window when realized, so passing XtWindow(widget)
+ with a not yet realized widget is wrong. Either realize you widget first or
+ use another window. Since the Drawable parameter is only used to specify
+ the screen to which the pixmap must be created on, most of the time the
+ default root window is just fine.
+</ul>
+
+
+<h2><a name="Q5">5. How can I get a non rectangular icon using XPM ?</a></h2>
+<p>
+ The X Window System does not support transparent color. However there are
+ several ways you can use to get the same visual effect using XPM:
+<ul>
+<li>First you can use the None color to get a shape mask and use it as
+ explained below (question 7).
+
+<li>Second you can define a symbolic color name such as "mask" in the XPM
+ format file, then use the color overriding mechanism to set this symbolic
+ color to the color of the underlying object. Note that in this case the XPM
+ library won't create a shape mask, and that if the color of the underlying
+ object is changed then you'll have to create a new pixmap.
+</ul>
+
+
+<h2><a name="Q6">6. What exactly triggers the creation of a mask when using XPM ?</a></h2>
+<p>
+ Basically a mask is created if "None" is used as one of the color of the
+ pixmap. Be aware that this is not only true if it is used in the XPM of the
+ pixmap since the colors can be overridden at load time. So a mask is created
+ if the "None" color is used at load time, coming either from the XPM
+ definition or the color overriding.
+
+
+<h2><a name="Q7">7. How should I use the mask ?</a></h2>
+<p>
+ There are basically two ways of using the mask:
+<ul>
+<li>Use the mask as a shapemask with the X11 Nonrectangular Saphe Window
+ Extension. Typically this is what should be done when the icon is used in a
+ desktop.
+
+<li>Use the mask as a clipmask in the GC you pass to XCopyArea when drawing the
+ pixmap. So the "transparent" pixels being not actually drawn will get the
+ underlying pixels colors.
+</ul>
+
+
+<h2><a name="Q8">8. Is there a string to pixmap converter for Motif ?</a></h2>
+<p>
+ Yes, Motif 2.0 or later does support XPM pixmaps as well as XBM bitmaps.
+
+
+<h2><a name="Q9">9. How can I edit XPM icons ?</a></h2>
+<p>
+ As listed below several editors either commercial or not are supporting the
+ XPM format. However, pixmap is the one I would recommend since it is freely
+ available and, being fully dedicated to XPM, it allows to edit all the
+ special things, such as the symbolic color names, which makes XPM different
+ from all the other image formats. Pixmap can always be found by ftp from
+ ftp.x.org (contrib) and avahi.inria.fr (pub/pixmap).
+<p>
+Last Update: 3 August 1994
+<table border=1>
+<caption>XPM Icon Editors</caption>
+<tr><th>Program<th>Infos<th>Source/Author<th>Platforms<th>SA<th>XPM<th>cost
+<tr><td>pixmap<td><ul>
+ <li><a href="ftp://ftp.x.org/contrib/application/pixmap/pixmap2.6.tar.gz">ftp://ftp.x.org/contrib/application/pixmap/pixmap2.6.tar.gz</a>
+ <li>requires 3.4 or higher revision of Xpm lib.
+ <li>supports all XPM format features
+ <li>current version doesn't work on 24-plane displays
+</ul>
+<td>Lionel Mallet<td>source<td>yes<td>3<td>NC
+
+<tr><td>pixt<td><ul>
+ <li><a href="ftp://ftp.x.org/contrib/pixt.tar.Z">ftp://ftp.x.org/contrib/pixt.tar.Z</a>
+ <li>doesn't work on 24-plane displays
+ <li>last updated November 1991
+</ul>
+<td>J. Michael Flanery<td>source<td>yes<td>1<td>NC
+
+<tr><td>pixed<td><ul>
+ <li>part of X.desktop
+ <li>current version doesn't work on 24-plane displays
+</ul>
+<td>IXI<td>Many UNIX<td>no<td>3<td>N/A
+
+<tr><td>olpixmap<td><ul>
+ <li>packaged with the OLIT (OpenLook) toolkit
+</ul>
+<td>USL<td>Sun, SVR4.2, UnixWare<td>no<td>1<td>N/A
+
+<tr><td>xfedor<td><ul>
+ <li>only uses XLIB
+ <li>doesn't work on 24-plane displays
+</ul>
+<td>Daniel Dardailler<td>source<td>yes<td>3<td>NC
+
+<tr><td>SCOpaint<td><ul>
+ <li>included with the ODT package
+</ul>
+<td>SCO/Wing Eng<td>ODT<td>yes<td>2.8<td>N/A
+
+<tr><td>pme.icn<td><ul>
+ <li>written in the Icon language
+</ul>
+<td>Icon Project<td>source<td>yes<td>3<td>NC
+
+<tr><td>PixEditT<td><ul>
+ <li>there is currently no support for editing the colormap
+</ul>
+<td>Free Widget Foundation<td>source<td>yes<td>3<td>NC
+
+<tr><td>xscribble<td><ul>
+ <li>requires the FWF, 8-bit pseudocolor
+ <li><a href="ftp://ftp.cis.ufl.edu/pub/thoth">ftp://ftp.cis.ufl.edu/pub/thoth</a>
+ <li>Alpha version (last updated April 1993)
+</ul>
+<td>Robert Forsman<td>source<td>yes<td>?<td>NC
+
+<tr><td>vueicon<td><ul>
+ <li>included with Vue3.0
+</ul>
+<td>Hewlett-Packard<td>HP<td>yes<td>3<td>N/A
+
+<tr><td>iconedit V3<td>&nbsp;<td>SunSoft<td>Sparc/Sun3<td>yes<td>2<td>N/A
+
+<tr><td>Pixmap Editor<td><ul>
+ <li>this is a Widget, not a complete program
+</ul>
+<td>ICS<td>?<td>yes<td>?<td>?
+
+<tr><td>ezX<td>&nbsp;<td>Sunrise Softwarey<td>?<td>?<td>?<td>N/A
+
+<tr><td>XPaint<td><ul>
+ <li>full featured, works on all displays
+ <li>current release is 2.1.1 (last update January 1994)
+</ul>
+<td>David Koblas<td>source<td>yes<td>3<td>NC
+
+<tr><td>Phoenix<td><ul>
+ <li>full featured, 24-bit painting program, requires Motif.
+ <li><a href="ftp://nic.funet.fi/pub/graphics/packages/phoenix">ftp://nic.funet.fi/pub/graphics/packages/phoenix</a>
+ <li>Beta version (last updated September 1993)
+</ul>
+<td>ohtcolor@niksula.hut.fi<td>source<td>yes<td>3<td>NC
+
+<tr><td>pixed<td><ul>
+ <li>pixed is part of the TeleUSE UIMS
+ <li>More info is available from service@ignite.alsys.com
+</ul>
+<td>Alsys<td>Many UNIX<td>yes<td>3<td>N/A
+
+<tr><td>display<td><ul>
+ <li><a href="ftp://ftp.x.org/contrib/application/ImageMagick/ImageMagick-3.2.tar.gz">ftp://ftp.x.org/contrib/application/ImageMagick/ImageMagick-3.2.tar.gz</a>
+ <li>lots of image conversion and manipulation features
+</ul>
+<td>John Cristy<td>source<td>yes<td>3<td>NC
+</table>
+
+<p>
+SA - Stand Alone program<br>
+NC - No Charge (i.e. free); most programs are copyrighted.<br>
+XPM - XPM format supported<br>
+source - built from source code; likely works on all standard X platforms<br>
+N/A - icon editor is normally distributed with other software
+
+<p>
+Send updates, additions, corrections, etc. to <a
+href="mailto:dan@bristol.com">dan@bristol.com</a>
+
+
+<h2><a name="Q10">10. Is there a collection of icons somewhere ?</a></h2>
+<p>
+ At least there is one freely available: Anthony's X Icon Library. You can
+ found it on several ftp servers, such as <a href="ftp://server.berkeley.edu/pub/AIcons">server.berkeley.edu/pub/AIcons</a>. It
+ contains only small icons (less than about 100x100 pixels in size) which are
+ stored in groups in a logical way. Color icons are stored in XPM format and
+ Black & White icons in XBM.
+
+
+<h2><a name="Q11">11. The documentation fails to print out. Why ?</a></h2>
+<p>
+ The PostScript documentation file is formatted for US letter paper. Frame
+ Maker tries very hard to ensure that you have the right paper and punts if
+ you don't. However, you can easily work around this problem by applying the
+ following patch. If for some reason applying the patch fails, you can still
+ do it by hand. Just locate the corresponding block in the PS file and remove
+ the lines with a leading '-' character.
+ By the way, this applies to any doc generated by Frame Maker. The
+ corresponding block might be slightly different depending on which version of
+ Frame Maker was used, but it is still easy to locate.
+
+<pre>
+*** xpm.PS Wed Sep 11 15:47:43 1996
+--- xpm-A4.PS Thu Nov 21 09:27:28 1996
+***************
+*** 647,668 ****
+ 0 ne /edown exch def
+ /yscale exch def
+ /xscale exch def
+- FMLevel1 {
+- manualfeed {setmanualfeed} if
+- /FMdicttop countdictstack 1 add def
+- /FMoptop count def
+- setpapername
+- manualfeed {true} {papersize} ifelse
+- {manualpapersize} {false} ifelse
+- {desperatepapersize} {false} ifelse
+- { (Can't select requested paper size for Frame print job!) FMFAILURE } if
+- count -1 FMoptop {pop pop} for
+- countdictstack -1 FMdicttop {pop end} for
+- }
+- {{1 dict dup /PageSize [paperwidth paperheight]put setpagedevice}stopped
+- { (Can't select requested paper size for Frame print job!) FMFAILURE } if
+- {1 dict dup /ManualFeed manualfeed put setpagedevice } stopped pop }
+- ifelse
+
+ FMPColor {
+ currentcolorscreen
+--- 647,652 ----
+</pre>
+
+
+<hr>
+<h2><a name="copy">Copyright (C) 1989-95 GROUPE BULL</a></h2>
+<p>
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+<p>
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+<p>
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+<p>
+Except as contained in this notice, the name of GROUPE BULL shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from GROUPE BULL.
+</body>
+</html>
diff --git a/xc/extras/Xpm/FILES b/xc/extras/Xpm/FILES
new file mode 100644
index 000000000..e1bf3fa15
--- /dev/null
+++ b/xc/extras/Xpm/FILES
@@ -0,0 +1,68 @@
+CHANGES
+COPYRIGHT
+FAQ.html
+FILES
+Imakefile
+Makefile.noX
+README.html
+README.AMIGA
+README.MSW
+namecvt
+lib
+lib/Imakefile
+lib/Makefile.noX
+lib/Makefile.AmigaGCC
+lib/Smakefile
+lib/Attrib.c
+lib/CrBufFrI.c
+lib/CrBufFrP.c
+lib/CrDatFrI.c
+lib/CrDatFrP.c
+lib/CrIFrBuf.c
+lib/CrIFrDat.c
+lib/CrIFrP.c
+lib/CrPFrBuf.c
+lib/CrPFrDat.c
+lib/CrPFrI.c
+lib/Image.c
+lib/Info.c
+lib/RdFToBuf.c
+lib/RdFToDat.c
+lib/RdFToI.c
+lib/RdFToP.c
+lib/WrFFrBuf.c
+lib/WrFFrDat.c
+lib/WrFFrI.c
+lib/WrFFrP.c
+lib/amigax.h
+lib/amigax.c
+lib/create.c
+lib/data.c
+lib/descrip.mms
+lib/hashtab.c
+lib/make.com
+lib/misc.c
+lib/parse.c
+lib/rgb.c
+lib/rgbtab.h
+lib/scan.c
+lib/simx.h
+lib/simx.c
+lib/xpm.h
+lib/XpmI.h
+lib/Xpm-def.cpp
+doc
+doc/xpm.PS
+sxpm
+sxpm/Imakefile
+sxpm/Makefile.noX
+sxpm/plaid.xpm
+sxpm/plaid_ext.xpm
+sxpm/plaid_mask.xpm
+sxpm/sxpm.c
+sxpm/sxpm.man
+cxpm
+cxpm/Imakefile
+cxpm/Makefile.noX
+cxpm/cxpm.c
+cxpm/cxpm.man
diff --git a/xc/extras/Xpm/Imakefile b/xc/extras/Xpm/Imakefile
new file mode 100644
index 000000000..4bba2c2da
--- /dev/null
+++ b/xc/extras/Xpm/Imakefile
@@ -0,0 +1,74 @@
+XCOMM
+XCOMM
+XCOMM Copyright (C) 1989-95 GROUPE BULL
+XCOMM
+XCOMM Permission is hereby granted, free of charge, to any person obtaining a
+XCOMM copy of this software and associated documentation files
+XCOMM (the "Software"), to deal in the Software without restriction, including
+XCOMM without limitation the rights to use, copy, modify, merge, publish,
+XCOMM distribute, sublicense, and/or sell copies of the Software, and to permit
+XCOMM persons to whom the Software is furnished to do so, subject to the
+XCOMM following conditions:
+XCOMM The above copyright notice and this permission notice shall be included
+XCOMM in all copies or substantial portions of the Software.
+XCOMM
+XCOMM THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+XCOMM OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+XCOMM MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+XCOMM IN NO EVENT SHALL GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+XCOMM LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+XCOMM FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+XCOMM DEALINGS IN THE SOFTWARE.
+XCOMM
+XCOMM Except as contained in this notice, the name of GROUPE BULL shall not be
+XCOMM used in advertising or otherwise to promote the sale, use or other
+XCOMM dealings in this Software without prior written authorization from
+XCOMM GROUPE BULL.
+XCOMM
+
+XCOMM
+XCOMM XPM Imakefile - Arnaud LE HORS
+XCOMM
+
+
+XCOMM You may need to modify the following DEFINES variable as follows:
+XCOMM if your system doesn't provide strcasecmp add -DNEED_STRCASECMP
+XCOMM if your system doesn't provide strdup add -DNEED_STRDUP
+XCOMM if your system doesn't provide pipe add -DNO_ZPIPE
+XCOMM if on your system sprintf doesn't return the number of bytes transmitted
+XCOMM add -DVOID_SPRINTF
+
+#if defined(UltrixArchitecture) || \
+ (defined(MipsArchitecture) && !defined(SGIArchitecture))
+STRDUPDEF = -DNEED_STRDUP
+#else
+# if defined(Win32Architecture) || defined(USLArchitecture) || \
+ (defined(HasStrcasecmp) && !HasStrcasecmp)
+STRCASECMPDEF = -DNEED_STRCASECMP
+# else
+# if defined(SunArchitecture) && !defined(SVR4Architecture)
+SPRINTFDEF = -DVOID_SPRINTF
+# endif
+# endif
+#endif
+#if defined(Win32Architecture)
+ZPIPEDEF = -DNO_ZPIPE
+#endif
+
+DEFINES = $(STRDUPDEF) $(STRCASECMPDEF) $(SPRINTFDEF) $(ZPIPEDEF)
+
+XCOMM You can uncomment the following line to avoid building the shared lib
+XCOMM IMAKE_DEFINES = -DSharedLibXpm=NO
+
+
+XCOMM
+XCOMM Normally the following part should not need to be edited
+XCOMM
+
+#define IHaveSubdirs
+#define PassCDebugFlags "CDEBUGFLAGS=$(CDEBUGFLAGS)" "DEFINES=$(DEFINES)"
+
+ SUBDIRS = lib sxpm cxpm
+
+MakeSubdirs($(SUBDIRS))
+DependSubdirs($(SUBDIRS))
diff --git a/xc/extras/Xpm/Makefile.noX b/xc/extras/Xpm/Makefile.noX
new file mode 100644
index 000000000..aa94a2c26
--- /dev/null
+++ b/xc/extras/Xpm/Makefile.noX
@@ -0,0 +1,70 @@
+#
+# Copyright (C) 1989-95 GROUPE BULL
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of GROUPE BULL shall not be
+# used in advertising or otherwise to promote the sale, use or other dealings
+# in this Software without prior written authorization from GROUPE BULL.
+#
+
+#
+# XPM Makefile - Arnaud LE HORS
+#
+
+# NOTE: if the build fails on your system using this Makefile, you need to check
+# and possibly edit each of the Makefile in the subdirs lib, sxpm, and cxpm.
+
+SUBDIRS= lib sxpm cxpm
+
+MAKE=make
+MFLAGS=-f Makefile.noX
+INSTALL= install -c
+CURRENT_DIR=.
+
+all::
+ @case '${MFLAGS}' in *[ik]*) set +e;; esac; \
+ for i in $(SUBDIRS) ;\
+ do \
+ (cd $$i ; echo "making" all "in $(CURRENT_DIR)/$$i..."; \
+ $(MAKE) $(MFLAGS) all); \
+ done
+clean::
+ @case '${MFLAGS}' in *[ik]*) set +e;; esac; \
+ for i in $(SUBDIRS) ;\
+ do \
+ (cd $$i ; echo "cleaning" "in $(CURRENT_DIR)/$$i..."; \
+ $(MAKE) $(MFLAGS) RM_CMD='$(RM_CMD)' clean); \
+ done
+
+
+install::
+ @case '${MFLAGS}' in *[ik]*) set +e;; esac; \
+ for i in $(SUBDIRS) ;\
+ do \
+ (cd $$i ; echo "installing" "in $(CURRENT_DIR)/$$i..."; \
+ $(MAKE) $(MFLAGS) DESTDIR='$(DESTDIR)' INSTALL='$(INSTALL)' install); \
+ done
+
+install.man::
+ @case '${MFLAGS}' in *[ik]*) set +e;; esac; \
+ for i in $(SUBDIRS) ;\
+ do \
+ (cd $$i ; echo "installing man pages" "in $(CURRENT_DIR)/$$i..."; \
+ $(MAKE) $(MFLAGS) DESTDIR='$(DESTDIR)' install.man); \
+ done
diff --git a/xc/extras/Xpm/README.AMIGA b/xc/extras/Xpm/README.AMIGA
new file mode 100644
index 000000000..7a40137dd
--- /dev/null
+++ b/xc/extras/Xpm/README.AMIGA
@@ -0,0 +1,10 @@
+The XPM library for Amiga works best with AmigaOS 3.x, but will work
+(with limited color support) with earlier OS versions too. It can be
+compiled with both SAS/C and GCC (makefiles are included).
+
+All functions except the Xpm*Pixmap* functions are supported.
+
+I have also written some Amiga-specific utility functions (not
+included). Contact me if you would like to have them too.
+
+-Lorens Younes (d93-hyo@nada.kth.se)
diff --git a/xc/extras/Xpm/README.MSW b/xc/extras/Xpm/README.MSW
new file mode 100644
index 000000000..f6315256e
--- /dev/null
+++ b/xc/extras/Xpm/README.MSW
@@ -0,0 +1,127 @@
+
+README.MSW hedu@cul-ipn.uni-kiel.de 5/94
+
+ The XPM library for MS-Windows
+
+Motivated by the wxWindows library, which is a (freely available) toolkit
+for developing multi-platform, graphical applications from the same body
+of C++ code, I wanted to have XPM pixmaps for MS-windows. Instead of rewriting
+a XPM-parser I managed to port the XPM-library-code to MS-windows.
+Thanks to Anaud Le Hors this became a part of the official XPM-library.
+
+Until now it's only used together with wxWindows. And even there it's more
+a kind of beta. But it should be possible to run it as a simple libxpm.a
+without wxWindows.
+
+The key is a transformation of some X types plus some basic X functions.
+There is not yet a special MSW-API, so you should know the X types used.
+
+The following is done in simx.h:
+
+typedef HDC Display;
+typedef COLORREF Pixel;
+
+typedef struct {
+ Pixel pixel;
+ BYTE red, green, blue;
+} XColor;
+
+typedef struct {
+ HBITMAP bitmap;
+ unsigned int width;
+ unsigned int height;
+ unsigned int depth;
+} XImage;
+
+With these defines and the according functions from simx.c you can call
+XPM-functions the way it's done under X windows. It can look like this:
+
+ ErrorStatus=XpmCreateImageFromData(&dc, data,
+ &ximage,(XImage **)NULL, &xpmAttr);
+ ms_bitmap = ximage->bitmap;
+ // releases the malloc,but do not destroy the bitmap
+ XImageFree(ximage);
+
+Supported functions are the Xpm*Image* but not the Xpm*Pixmap*.
+
+DRAWBACKS:
+The main drawback is the missing support for Colormaps! There was nothing for
+it in wxWindows, so I did not know how to deal with Colormaps.
+
+The size of the pixmaps is bounded by malloc() (width*height*2 < 64K).
+
+Close colors do not look that close. But that seems to be the window system.
+
+Neither a special API for MSW nor a special MSW documentation other than this.
+(I can only point you to wxxpm as an example , see below.)
+
+INSTALLATION:
+There is not yet a makefile with it. Simply take all the *.c files
+into your project except the files related to Pixmap operations: *P*.c.
+!!!You MUST set FOR_MSW on the preprocessor options!!!
+(You might uncomment NEED_STRCASECMP in xpm.h if it's in your lib)
+This should compile into libxpm.a. Good luck...
+
+FTP:
+wxWindows is currently available from the Artificial Intelligence
+Applications Institute (University of Edinburgh) by anonymous FTP.
+ skye.aiai.ed.ac.uk pub/wxwin/
+or read http://burray.aiai.ed.ac.uk/aiai/aiai.html
+
+wxxpm, XPM support for wxWindows, the latest version is available at
+ yoda.cul-ipn.uni-kiel.de pub/wxxpm/
+ and maybe in the contrib or tools of wxWindows
+
+Please contact me if you have suggestions, comments or problems!
+
+================================================================
+Some fixes and comments by Jan Wielemaker (jan@swi.psy.uva.nl),
+Oct 24, 1996:
+
+ * Please try not to disturb me on this, XPM is not my
+ piece of cake.
+
+ * Hermann Dunkel has appearently moved in virtual space.
+
+Changes:
+
+ * I've used the xpm package under NT 4.0 and MSVC++ 4.2.
+
+ * I've made a big performance improvement in
+ ParseAndPutPixels(), fixed creation of the mask in
+ SetColor() in create.c. I looked into XCreateImage()
+ in simx.c, but commented out my improvement for reasons
+ you'll find there. If you know what is going on, statement
+ (1) does not apply to you.
+
+Comments on installation:
+
+ * Donot include the to/from pixmap files into the project.
+ These are the ones containing a capital P somewhere in their
+ name. You can also first include all, and then remove all
+ the files you get errors on :-)
+
+ * The DC that is requested should be a valid memory DC, thus
+ CreateCompatibleDC(NULL) provides a good generic one, but
+ GetDC(NULL) doesn't! This costed me some time.
+
+ * The real difficulty is using the mask, mostly due to the
+ bad documentation. If 95 or NT is your target, use:
+
+ MaskBlt(context.hdc, // Destination DC
+ x, y, w, h, // Destination area
+ mhdc, // Memory DC with the image selected
+ sx, sy, // Source X,Y
+ msk, // HBITMAP of the mask
+ sx, sy, // Mask X,Y
+ MAKEROP4(SRCPAINT, SRCCOPY)); // The magic op code.
+================================================================
+
+
+--
+ ////|\\\\ \\\\\\ Hermann Dunkel
+ O O ////// IPN Uni Kiel, Germany
+ | \\\\\\ Tel: +49 431 / 880 3144
+ \___/ ////// E-mail: hedu@cul-ipn.uni-kiel.de
+ \_/ \\\\\\ X.400 : c=de;a=d400;p=uni-kiel;ou=nw-didaktik;s=dunkel
+
diff --git a/xc/extras/Xpm/README.XFree86 b/xc/extras/Xpm/README.XFree86
new file mode 100644
index 000000000..a3400206f
--- /dev/null
+++ b/xc/extras/Xpm/README.XFree86
@@ -0,0 +1,4 @@
+When importing version A.Bc of Xpm, use:
+
+ cvs import -m "Xpm version A.Bc" xc/extras/Xpm XPM XPM-A_Bc
+
diff --git a/xc/extras/Xpm/README.html b/xc/extras/Xpm/README.html
new file mode 100644
index 000000000..6711f23b3
--- /dev/null
+++ b/xc/extras/Xpm/README.html
@@ -0,0 +1,303 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html lang="en">
+<HEAD>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<TITLE>XPM README</TITLE>
+</HEAD>
+
+<body>
+<h1 align="center">XPM README</h1>
+
+<h2>Contents</h2>
+
+<ol>
+<li><a href="#sec1">What Is XPM?</a>
+<li><a href="#sec2">Where to get XPM?</a>
+<li><a href="#sec3">Documentation</a>
+<li><a href="#sec4">Installation</a>
+<ol>
+<li><a href="#sec4.1">With imake</a>
+<li><a href="#sec4.2">Without imake</a>
+</ol>
+<li><a href="#sec5">SXPM</a>
+<li><a href="#sec6">CXPM</a>
+<li><a href="#sec7">Other Tools</a>
+<li><a href="#sec8">Discussion</a>
+<li><a href="#copy">Copyright</a>
+</ol>
+
+
+<h2><a name="sec1">1. What Is XPM?</a></h2>
+<p>
+XPM (X PixMap) is a format for storing/retrieving X pixmaps to/from files.
+<p>
+Here is provided a library containing a set of four functions, similar to the
+X bitmap functions as defined in the Xlib: <code>XpmCreatePixmapFromData</code>,
+<code>XpmCreateDataFromPixmap</code>, <code>XpmReadFileToPixmap</code> and <code>XpmWriteFileFromPixmap</code> for
+respectively including, storing, reading and writing this format, plus four
+other: <code>XpmCreateImageFromData</code>, <code>XpmCreateDataFromImage</code>, <code>XpmReadFileToImage</code> and
+<code>XpmWriteFileFromImage</code> for working with images instead of pixmaps.
+<p>
+This new version provides a C includable format, defaults for different types
+of display: monochrome/color/grayscale, hotspot coordinates and symbol names
+for colors for overriding default colors when creating the pixmap. It provides
+a mechanism for storing information while reading a file which is re-used
+while writing. This way comments, default colors and symbol names aren't lost.
+It also handles "transparent pixels" by returning a shape mask in addition to
+the created pixmap.
+<p>
+See the XPM Manual for details.
+
+
+<h2><a name="sec2">2. Where to get XPM?</a></h2>
+<p>
+New XPM updates are announced on the comp.windows.x newsgroup, and on the
+"xpm-talk" list and you can always consult the XPM Home page at <a
+href="http://www.inria.fr/koala/lehors/xpm.html">http://www.inria.fr/koala/lehors/xpm.html</a>
+<p>The latest "official" XPM release can always be found at:
+<br>Boston, USA: <a
+href="ftp://ftp.x.org/contrib">ftp://ftp.x.org/contrib</a>
+<br>Sophia Antipolis, France: <a
+href="ftp://koala.inria.fr/pub/xpm">ftp://koala.inria.fr/pub/xpm</a>
+
+
+<h2><a name="sec3">3. Documentation</a></h2>
+<p>
+Old users might read the <a href="CHANGES">CHANGES</a> file for a history
+of changes interesting the user.
+<p>
+Read the doc. The documentation is in PostScript format (<a
+href="doc/xpm.PS">doc/xpm.PS</a>) and has been produced with
+FrameMaker. The source files are available on request.
+<p>
+A <a href="FAQ.html">FAQ</a> (Frequently Asked Questions) is also provided,
+so if you experience any problem you should have a look at this file.
+
+
+<h2><a name="sec4">4. Installation</a></h2>
+<p>
+To obtain the XPM library, first uncompress and untar the compressed tar file
+in an appropriate directory.
+<p>
+Then you can either compile XPM via "imake" or in a stand-alone way.
+
+<h3><a name="sec4.1">4.1. With imake</a></h3>
+<p>
+ Imakefiles are provided to build both shared and unshared libraries.
+ However, building a shared lib is very OS dependent and often requires
+ specific files which are not available. Also config files are often not
+ set correctly for this task. So if it fails you can avoid trying to
+ build one and simply build the static library instead. In order to do
+ so you should edit the top Imakefile to add -DSharedLibXpm=NO to the
+ definition of IMAKE_DEFINES as described.
+<p>
+ The compilation and installation of the library and the sxpm program
+ should only require you to edit the top Imakefile. But you should do so
+ in order to specify the locations where the various files should be
+ installed and to set the DEFINES variable accordingly to your system.
+<p>
+ On Solaris 2.* the compilation works only in the native svr4
+ environment, avoid the bsd one or it won't compile. Especially you
+ should be using /opt/SUNWspro/bin/cc and not /usr/ucb/cc.
+ Also since the compiler is no longer part of the OS distribution a lot
+ of people use gcc instead. This is fine, but be aware that the imake
+ tool you get as part of the X Window System on a solaris box is
+ configured for cc. Therefore the compilation using the generated
+ Makefiles will not succeed unless you have changed the default
+ configuration. An easy work around is to directly edit the generated
+ lib/Makefile to change '-K pic' to '-fpic'. Fixing your imake
+ configuration would be better though.
+<p>
+ On Linux, if you do not use ELF yet you'd better get the binary
+ distribution available from sunsite. Because it's really a pain to
+ build a shared lib and the current XPM distribution doesn't contain
+ the jump files you would need to do so. On the other hand people have
+ had no problems building it using ELF.
+<p>
+ Then execute the following command:
+<pre>
+ xmkmf -a
+</pre>
+<p>
+ or if this option is not supported by your version of xmkmf:
+<pre>
+ xmkmf
+ make Makefiles
+ make includes
+ make depend (optional)
+</pre>
+<p>
+ Then simply execute:
+<pre>
+ make
+</pre>
+<p>
+ which will build the XPM library and the sxpm application.
+ Then do:
+<pre>
+ make install
+ make install.man
+</pre>
+<p>
+ which will install the library and the sxpm program and man page.
+<p>
+ If it fails, be sure you have set the DEFINES correctly in the top
+ Imakefile to suit your machine.
+
+<h4>NOTE ON USING IMAKE:</h4>
+<p>
+ Building the XPM distribution with imake requires to have imake
+ <strong>correctly installed and configured</strong> on your
+ system. I do my best at tweaking the Imakefiles so they work with
+ as many imake flavors people might have as possible but there is
+ nothing I can do against wrong imake configurations. So if your
+ build fails using imake, don't send me email for advice. Get your
+ imake configuration fixed or forget about it!
+
+
+<h3><a name="sec4.2">4.2. Without imake</a></h3>
+<p>
+ A set of makefiles is provided for those who do not have imake
+ available on their system. However, this is only provided as a
+ convenience and you should be considered as a starting point and not as
+ something ready to use. These makefiles, called Makefile.noX, will most
+ likely require some editing in order be set accordingly to your system.
+<p>
+ Once this setting is done, you should be able to compile XPM, by
+ executing the following command:
+<pre>
+ make -f Makefile.noX
+</pre>
+<p>
+ Then to install it, do:
+<pre>
+ make -f Makefile.noX install
+</pre>
+
+
+<h2><a name="sec5">5. SXPM</a></h2>
+<p>
+In addition to the library the sxpm tool is provided to show XPM file and
+convert them from XPM1 or XPM2 to XPM version 3. If you have previously done
+'make' or 'make all' you should already have it, otherwise just do:
+<pre>
+ cd sxpm; make
+</pre>
+<p>
+This application shows you most of the features of XPM and its source can be
+used to quickly see how to use the provided functions.
+<p>
+By executing 'sxpm -help' you will get the usage.
+<p>
+Executing 'sxpm -plaid' will show a demo of the XpmCreatePixmapFromData
+function. The pixmap is created from the static variable plaid defined in the
+sxpm.c file. sxpm will end when you press the key 'q' in the created window.
+<p>
+Executing 'sxpm -plaid -sc lines_in_mix blue' will show the feature of
+overriding color symbols giving a colorname, executing 'sxpm -plaid -sp
+lines_in_mix 1' will show overriding giving a pixel value, and executing 'sxpm
+-plaid -cp red 0' will show overriding giving a color value.
+<p>
+Then you should try 'sxpm -plaid -o output' to get an output file using the
+XpmWriteFileFromPixmap function.
+<p>
+You can now try 'sxpm -plaid -o - -nod -rgb /usr/lib/X11/rgb.txt' to directly
+get the pixmap printed out on the standard output with colornames instead of
+rgb values.
+<p>
+Then you should try 'sxpm plaid.xpm' to use the XpmReadFileToPixmap function,
+and 'cat plaid_mask.xpm|sxpm' to see how "transparent pixels" are handled.
+<p>
+The XpmCreatePixmapFromData function is on purpose called without any XpmInfos
+flag to show the utility of this one. Indeed, compare the color section of the
+two files foo and bar obtained from 'sxpm -nod -plaid -o foo' and 'sxpm -nod
+plaid.xpm -o bar'. All the default colors and also the comments have been
+restored.
+<p>
+To end look at plaid_ext.xpm and try "sxpm -nod plaid_ext.xpm -v" to see how
+extensions are handled.
+<p>
+Of course, other combinations are allowed and should be tried. Thus, 'sxpm
+plaid.xpm -o output -nod' will show you how to convert a file from XPM1 or XPM2
+to a XPM version 3 using sxpm.
+<p>
+See the manual page for more detail.
+
+
+<h2><a name="sec6">6. CXPM</a></h2>
+<p>
+The cxpm tool is provided to help you figure out whether an XPM file is correct
+or not with regard to its format. If you have previously done 'make' or
+'make all' you should already have it, otherwise just do:
+<pre>
+ cd cxpm; make
+</pre>
+<p>
+The related man page will tell you everything about it but here is a simple
+example of what it does:
+<pre>
+$ ./cxpm bogus_pixmap
+Xpm Error: Invalid XPM file.
+Error found line 3 near character 5
+</pre>
+<p>
+It is pretty limited but at least, unlike sxpm, it gives you some hint on where
+the error occured within the file.
+
+
+<h2><a name="sec7">7. Other Tools</a></h2>
+<p>
+Several converters dealing with XPM and a pixmap editor can be found in the
+xpm-contrib distribution. Also I recommend the use of netpbm to do any kind of
+general image operations such as scaling, resizing, dithering, and to convert
+from and to any other image format.
+
+<h2><a name="sec8">8. Discussion</a></h2>
+<p>
+There is a mailing list to discuss about XPM which is <a
+href="mailto:xpm-talk@sophia.inria.fr">xpm-talk@sophia.inria.fr</a>.
+Any request to subscribe should be sent to <a
+href="mailto:xpm-talk-request@sophia.inria.fr">xpm-talk-request@sophia.inria.fr</a>.
+The archive of the xpm-talk list is available through the web at
+<a
+href="http://zenon.inria.fr/koala/xpm-talk-hypermail">http://zenon.inria.fr/koala/xpm-talk-hypermail</a>
+and through ftp at <a
+href="ftp://koala.inria.fr/pub/xpm/xpm-talk-archive">ftp://koala.inria.fr/pub/xpm/xpm-talk-archive</a>
+<p>
+Please mail any bug reports or modifications done, comments, suggestions,
+requests for updates or patches to port on another machine to:
+
+<p>Email: <a href="lehors@sophia.inria.fr">lehors@sophia.inria.fr</a>
+<br>Phone: +33 (0)4 93 65 78 89
+<br>Surface Mail:<br>
+Arnaud Le Hors<br>
+Inria BP.93<br>
+2004, Route des lucioles<br>
+06902 Sophia Antipolis Cedex<br>
+FRANCE
+
+
+<hr>
+<h2><a name="copy">Copyright (C) 1989-95 GROUPE BULL</a></h2>
+<p>
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+<p>
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+<p>
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+<p>
+Except as contained in this notice, the name of GROUPE BULL shall not be
+used in advertising or otherwise to promote the sale, use or other dealings
+in this Software without prior written authorization from GROUPE BULL.
+</body>
diff --git a/xc/extras/Xpm/cxpm/Imakefile b/xc/extras/Xpm/cxpm/Imakefile
new file mode 100644
index 000000000..97ac8e66f
--- /dev/null
+++ b/xc/extras/Xpm/cxpm/Imakefile
@@ -0,0 +1,66 @@
+XCOMM
+XCOMM
+XCOMM Copyright (C) 1998 Arnaud LE HORS
+XCOMM
+XCOMM Permission is hereby granted, free of charge, to any person obtaining a
+XCOMM copy of this software and associated documentation files
+XCOMM (the "Software"), to deal in the Software without restriction, including
+XCOMM without limitation the rights to use, copy, modify, merge, publish,
+XCOMM distribute, sublicense, and/or sell copies of the Software, and to permit
+XCOMM persons to whom the Software is furnished to do so, subject to the
+XCOMM following conditions:
+XCOMM The above copyright notice and this permission notice shall be included
+XCOMM in all copies or substantial portions of the Software.
+XCOMM
+XCOMM THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+XCOMM OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+XCOMM MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+XCOMM IN NO EVENT SHALL Arnaud LE HORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+XCOMM OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+XCOMM ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+XCOMM OTHER DEALINGS IN THE SOFTWARE.
+XCOMM
+XCOMM Except as contained in this notice, the name of Arnaud LE HORS shall not
+XCOMM be used in advertising or otherwise to promote the sale, use or other
+XCOMM dealings in this Software without prior written authorization from
+XCOMM Arnaud LE HORS.
+XCOMM
+
+XCOMM
+XCOMM XPM Imakefile - Arnaud LE HORS
+XCOMM
+
+XCOMM default locations
+#ifndef XpmBinDir
+#define XpmBinDir $(BINDIR)
+#endif
+#ifndef XpmManDir
+#define XpmManDir $(MANDIR)
+#endif
+#ifndef XpmIncDir
+#define XpmIncDir $(BUILDINCTOP)
+#endif
+
+ XPMBINDIR = XpmBinDir
+ XPMMANDIR = XpmManDir
+ XPMINCDIR = XpmIncDir
+
+ INCLUDES = -I$(BUILDINCDIR) -I$(XPMINCDIR)
+
+#ifdef OsNameDefines
+OS_NAME_DEFINES = OsNameDefines
+#endif
+
+ SRCS = cxpm.c
+ OBJS = cxpm.o
+
+#if (ProjectX < 6)
+AllTarget(cxpm)
+#else
+AllTarget(ProgramTargetName(cxpm))
+#endif
+NormalProgramTarget(cxpm,$(OBJS),$(DEPLIB),$(LOCAL_LIBRARIES),)
+InstallProgram(cxpm,$(XPMBINDIR))
+InstallManPage(cxpm,$(XPMMANDIR))
+DependTarget()
+LintTarget()
diff --git a/xc/extras/Xpm/cxpm/Makefile.noX b/xc/extras/Xpm/cxpm/Makefile.noX
new file mode 100644
index 000000000..9b51755f5
--- /dev/null
+++ b/xc/extras/Xpm/cxpm/Makefile.noX
@@ -0,0 +1,64 @@
+#
+# Copyright (C) 1998 Arnaud LE HORS
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# Arnaud LE HORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of Arnaud LE HORS shall not be
+# used in advertising or otherwise to promote the sale, use or other dealings
+# in this Software without prior written authorization from Arnaud LE HORS.
+#
+
+#
+# XPM Makefile - Arnaud LE HORS
+#
+
+# where the program will be installed
+DESTBINDIR=/usr/local/bin/X11
+# where the man page will be installed
+MANDIR=/usr/local/man/manl
+
+CC = cc
+RM = rm -f
+# on sysV, define this as cp.
+INSTALL = install -c
+
+CDEBUGFLAGS= -O
+
+INCLUDES= -I..
+
+OBJS= cxpm.o
+
+CFLAGS= $(CDEBUGFLAGS) $(INCLUDES) $(DEFINES)
+
+all: cxpm
+
+clean:
+ $(RM) *.o cxpm
+
+cxpm: cxpm.o
+ $(CC) $(CFLAGS) cxpm.o -o cxpm
+
+install:
+ $(INSTALL) -m 0755 cxpm $(DESTBINDIR)
+
+install.man:
+ $(INSTALL) -m 0644 cxpm.man $(MANDIR)/cxpm.l
+
+# Other dependencies.
+cxpm.o: ../lib/XpmI.h ../lib/data.c ../lib/parse.c ../lib/RdFToI.c \
+ ../lib/hashtab.c ../lib/misc.c ../lib/Attrib.c ../lib/Image.c
diff --git a/xc/extras/Xpm/cxpm/cxpm.c b/xc/extras/Xpm/cxpm/cxpm.c
new file mode 100644
index 000000000..c99db177c
--- /dev/null
+++ b/xc/extras/Xpm/cxpm/cxpm.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 1998 Arnaud LE HORS
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * Arnaud LE HORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Arnaud LE HORS shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from Arnaud LE HORS.
+ */
+
+/*****************************************************************************\
+* cxpm.c: *
+* *
+* Check XPM File program *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#define CXPMPROG
+
+#include "../lib/XpmI.h"
+
+#undef xpmGetC
+#define xpmGetC(data) sGetc(data, data->stream.file)
+#define Getc sGetc
+#define Ungetc sUngetc
+
+
+/*
+ * special getc and ungetc counting read lines and characters
+ * note that 's' could stand both for "special" and "slow" ;-)
+ */
+static int
+sGetc(data)
+ xpmData *data;
+{
+ int c = getc(data->stream.file);
+ if (c == '\n') {
+ data->lineNum++;
+ data->charNum = 0;
+ } else {
+ data->charNum++;
+ }
+ return c;
+}
+
+static void
+sUngetc(data, c)
+ xpmData *data;
+ int c;
+{
+ ungetc(c, data->stream.file);
+ if (c == '\n') {
+ data->lineNum--;
+ data->charNum = 0;
+ } else {
+ data->charNum--;
+ }
+}
+
+/* include all the code we need (yeah, I know, quite ugly...) */
+#include "../lib/data.c"
+#include "../lib/parse.c"
+#include "../lib/RdFToI.c" /* only for OpenReadFile and xpmDataClose */
+#include "../lib/hashtab.c"
+#include "../lib/misc.c"
+#include "../lib/Attrib.c"
+#include "../lib/Image.c"
+
+void
+ErrorMessage(ErrorStatus, data)
+ int ErrorStatus;
+ xpmData *data;
+
+{
+ char *error = NULL;
+
+ switch (ErrorStatus) {
+ case XpmSuccess:
+ return;
+ case XpmOpenFailed:
+ error = "Cannot open file";
+ break;
+ case XpmFileInvalid:
+ error = "Invalid XPM file";
+ break;
+ case XpmNoMemory:
+ error = "Not enough memory";
+ break;
+ case XpmColorFailed:
+ error = "Failed to parse color";
+ break;
+ }
+
+ if (error) {
+ fprintf(stderr, "Xpm Error: %s.\n", error);
+ if (ErrorStatus == XpmFileInvalid && data)
+ fprintf(stderr, "Error found line %d near character %d\n",
+ data->lineNum + 1,
+ data->charNum + 1);
+ exit(1);
+ }
+}
+
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ XpmImage image;
+ char *filename;
+ int ErrorStatus;
+ xpmData data;
+
+ if (argc > 1) {
+ if (!strcmp(argv[1], "-?") || !strncmp(argv[1], "-h", 2)) {
+ fprintf(stderr, "Usage: %s [filename]\n", argv[0]);
+ exit(1);
+ }
+ filename = argv[1];
+ } else {
+ filename = NULL;
+ }
+
+ xpmInitXpmImage(&image);
+
+ if ((ErrorStatus = OpenReadFile(filename, &data)) != XpmSuccess)
+ ErrorMessage(ErrorStatus, NULL);
+
+ ErrorStatus = xpmParseData(&data, &image, NULL);
+ ErrorMessage(ErrorStatus, &data);
+
+ xpmDataClose(&data);
+ XpmFreeXpmImage(&image);
+
+ exit(0);
+}
diff --git a/xc/extras/Xpm/cxpm/cxpm.man b/xc/extras/Xpm/cxpm/cxpm.man
new file mode 100644
index 000000000..21d63fd21
--- /dev/null
+++ b/xc/extras/Xpm/cxpm/cxpm.man
@@ -0,0 +1,49 @@
+.\"Copyright (C) 1998 Arnaud LE HORS
+.\"
+.\"Permission is hereby granted, free of charge, to any person obtaining a copy
+.\"of this software and associated documentation files (the "Software"), to
+.\"deal in the Software without restriction, including without limitation the
+.\"rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+.\"sell copies of the Software, and to permit persons to whom the Software is
+.\"furnished to do so, subject to the following conditions:
+.\"
+.\"The above copyright notice and this permission notice shall be included in
+.\"all copies or substantial portions of the Software.
+.\"
+.\"THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+.\"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+.\"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+.\"Arnaud LE HORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+.\"IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+.\"CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\"Except as contained in this notice, the name of Arnaud LE HORS shall not be
+.\"used in advertising or otherwise to promote the sale, use or other dealings
+.\"in this Software without prior written authorization from Arnaud LE HORS.
+.\"
+.nr )S 12
+.TH CXPM 1
+.PD
+.ad b
+.SH NAME
+cxpm \- Check an XPM (X PixMap) file - XPM 1, 2, or 3.
+.SH SYNOPSIS
+\fBcxpm\fR
+[\|\fIfilename\fP\|]
+.SH DESCRIPTION
+.PP
+The \fBcxpm\fP program can be used to check the format of any XPM (version 1, 2,
+or 3) file. On error, unlike \fBsxpm\fR, \fBcxpm\fR prints out an error message
+indicating where the parser choked. This should help finding out what's wrong
+with an XPM file but do not expect too much from it though. This is not even
+close from being some kind of lint program for XPM. First, it stops at the
+first error it encounters - so several fix and retry cycles may be necessary to
+get your file to parse successfully. Second, \fBcxpm\fP only cares about
+the format. If, for instance, your pixmap uses too many colors for your system
+you still may experience difficulties displaying it. Be warned.
+.PP
+When no \fIfilename\fP is given \fBcxpm\fR reads from the standard input.
+.SH AUTHOR
+Arnaud Le Hors (lehors@sophia.inria.fr)
+.br
+Copyright (C) 1998 by Arnaud LE HORS.
diff --git a/xc/extras/Xpm/doc/xpm.PS.gz b/xc/extras/Xpm/doc/xpm.PS.gz
new file mode 100644
index 000000000..40e25de9d
--- /dev/null
+++ b/xc/extras/Xpm/doc/xpm.PS.gz
Binary files differ
diff --git a/xc/extras/Xpm/lib/Attrib.c b/xc/extras/Xpm/lib/Attrib.c
new file mode 100644
index 000000000..04b843b99
--- /dev/null
+++ b/xc/extras/Xpm/lib/Attrib.c
@@ -0,0 +1,302 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* Attrib.c: *
+* *
+* XPM library *
+* Functions related to the XpmAttributes structure *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+/* 3.2 backward compatibility code */
+LFUNC(CreateOldColorTable, int, (XpmColor *ct, int ncolors,
+ XpmColor ***oldct));
+
+LFUNC(FreeOldColorTable, void, (XpmColor **colorTable, int ncolors));
+
+/*
+ * Create a colortable compatible with the old style colortable
+ */
+static int
+CreateOldColorTable(ct, ncolors, oldct)
+ XpmColor *ct;
+ int ncolors;
+ XpmColor ***oldct;
+{
+ XpmColor **colorTable, **color;
+ int a;
+
+ colorTable = (XpmColor **) XpmMalloc(ncolors * sizeof(XpmColor *));
+ if (!colorTable) {
+ *oldct = NULL;
+ return (XpmNoMemory);
+ }
+ for (a = 0, color = colorTable; a < ncolors; a++, color++, ct++)
+ *color = ct;
+ *oldct = colorTable;
+ return (XpmSuccess);
+}
+
+static void
+FreeOldColorTable(colorTable, ncolors)
+ XpmColor **colorTable;
+ int ncolors;
+{
+ int a, b;
+ XpmColor **color;
+ char **sptr;
+
+ if (colorTable) {
+ for (a = 0, color = colorTable; a < ncolors; a++, color++) {
+ for (b = 0, sptr = (char **) *color; b <= NKEYS; b++, sptr++)
+ if (*sptr)
+ XpmFree(*sptr);
+ }
+ XpmFree(*colorTable);
+ XpmFree(colorTable);
+ }
+}
+
+/* end 3.2 bc */
+
+/*
+ * Free the computed color table
+ */
+void
+xpmFreeColorTable(colorTable, ncolors)
+ XpmColor *colorTable;
+ int ncolors;
+{
+ int a, b;
+ XpmColor *color;
+ char **sptr;
+
+ if (colorTable) {
+ for (a = 0, color = colorTable; a < ncolors; a++, color++) {
+ for (b = 0, sptr = (char **) color; b <= NKEYS; b++, sptr++)
+ if (*sptr)
+ XpmFree(*sptr);
+ }
+ XpmFree(colorTable);
+ }
+}
+
+/*
+ * Free array of extensions
+ */
+void
+XpmFreeExtensions(extensions, nextensions)
+ XpmExtension *extensions;
+ int nextensions;
+{
+ unsigned int i, j, nlines;
+ XpmExtension *ext;
+ char **sptr;
+
+ if (extensions) {
+ for (i = 0, ext = extensions; i < nextensions; i++, ext++) {
+ if (ext->name)
+ XpmFree(ext->name);
+ nlines = ext->nlines;
+ for (j = 0, sptr = ext->lines; j < nlines; j++, sptr++)
+ if (*sptr)
+ XpmFree(*sptr);
+ if (ext->lines)
+ XpmFree(ext->lines);
+ }
+ XpmFree(extensions);
+ }
+}
+
+/*
+ * Return the XpmAttributes structure size
+ */
+
+int
+XpmAttributesSize()
+{
+ return sizeof(XpmAttributes);
+}
+
+/*
+ * Init returned data to free safely later on
+ */
+void
+xpmInitAttributes(attributes)
+ XpmAttributes *attributes;
+{
+ if (attributes) {
+ attributes->pixels = NULL;
+ attributes->npixels = 0;
+ attributes->colorTable = NULL;
+ attributes->ncolors = 0;
+/* 3.2 backward compatibility code */
+ attributes->hints_cmt = NULL;
+ attributes->colors_cmt = NULL;
+ attributes->pixels_cmt = NULL;
+/* end 3.2 bc */
+ if (attributes->valuemask & XpmReturnExtensions) {
+ attributes->extensions = NULL;
+ attributes->nextensions = 0;
+ }
+ if (attributes->valuemask & XpmReturnAllocPixels) {
+ attributes->alloc_pixels = NULL;
+ attributes->nalloc_pixels = 0;
+ }
+ }
+}
+
+/*
+ * Fill in the XpmAttributes with the XpmImage and the XpmInfo
+ */
+void
+xpmSetAttributes(attributes, image, info)
+ XpmAttributes *attributes;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ if (attributes->valuemask & XpmReturnColorTable) {
+ attributes->colorTable = image->colorTable;
+ attributes->ncolors = image->ncolors;
+
+ /* avoid deletion of copied data */
+ image->ncolors = 0;
+ image->colorTable = NULL;
+ }
+/* 3.2 backward compatibility code */
+ else if (attributes->valuemask & XpmReturnInfos) {
+ int ErrorStatus;
+
+ ErrorStatus = CreateOldColorTable(image->colorTable, image->ncolors,
+ (XpmColor ***)
+ &attributes->colorTable);
+
+ /* if error just say we can't return requested data */
+ if (ErrorStatus != XpmSuccess) {
+ attributes->valuemask &= ~XpmReturnInfos;
+ if (!(attributes->valuemask & XpmReturnPixels)) {
+ XpmFree(attributes->pixels);
+ attributes->pixels = NULL;
+ attributes->npixels = 0;
+ }
+ attributes->ncolors = 0;
+ } else {
+ attributes->ncolors = image->ncolors;
+ attributes->hints_cmt = info->hints_cmt;
+ attributes->colors_cmt = info->colors_cmt;
+ attributes->pixels_cmt = info->pixels_cmt;
+
+ /* avoid deletion of copied data */
+ image->ncolors = 0;
+ image->colorTable = NULL;
+ info->hints_cmt = NULL;
+ info->colors_cmt = NULL;
+ info->pixels_cmt = NULL;
+ }
+ }
+/* end 3.2 bc */
+ if (attributes->valuemask & XpmReturnExtensions) {
+ attributes->extensions = info->extensions;
+ attributes->nextensions = info->nextensions;
+
+ /* avoid deletion of copied data */
+ info->extensions = NULL;
+ info->nextensions = 0;
+ }
+ if (info->valuemask & XpmHotspot) {
+ attributes->valuemask |= XpmHotspot;
+ attributes->x_hotspot = info->x_hotspot;
+ attributes->y_hotspot = info->y_hotspot;
+ }
+ attributes->valuemask |= XpmCharsPerPixel;
+ attributes->cpp = image->cpp;
+ attributes->valuemask |= XpmSize;
+ attributes->width = image->width;
+ attributes->height = image->height;
+}
+
+/*
+ * Free the XpmAttributes structure members
+ * but the structure itself
+ */
+void
+XpmFreeAttributes(attributes)
+ XpmAttributes *attributes;
+{
+ if (attributes->valuemask & XpmReturnPixels && attributes->npixels) {
+ XpmFree(attributes->pixels);
+ attributes->pixels = NULL;
+ attributes->npixels = 0;
+ }
+ if (attributes->valuemask & XpmReturnColorTable) {
+ xpmFreeColorTable(attributes->colorTable, attributes->ncolors);
+ attributes->colorTable = NULL;
+ attributes->ncolors = 0;
+ }
+/* 3.2 backward compatibility code */
+ else if (attributes->valuemask & XpmInfos) {
+ if (attributes->colorTable) {
+ FreeOldColorTable((XpmColor **) attributes->colorTable,
+ attributes->ncolors);
+ attributes->colorTable = NULL;
+ attributes->ncolors = 0;
+ }
+ if (attributes->hints_cmt) {
+ XpmFree(attributes->hints_cmt);
+ attributes->hints_cmt = NULL;
+ }
+ if (attributes->colors_cmt) {
+ XpmFree(attributes->colors_cmt);
+ attributes->colors_cmt = NULL;
+ }
+ if (attributes->pixels_cmt) {
+ XpmFree(attributes->pixels_cmt);
+ attributes->pixels_cmt = NULL;
+ }
+ if (attributes->pixels) {
+ XpmFree(attributes->pixels);
+ attributes->pixels = NULL;
+ attributes->npixels = 0;
+ }
+ }
+/* end 3.2 bc */
+ if (attributes->valuemask & XpmReturnExtensions
+ && attributes->nextensions) {
+ XpmFreeExtensions(attributes->extensions, attributes->nextensions);
+ attributes->extensions = NULL;
+ attributes->nextensions = 0;
+ }
+ if (attributes->valuemask & XpmReturnAllocPixels
+ && attributes->nalloc_pixels) {
+ XpmFree(attributes->alloc_pixels);
+ attributes->alloc_pixels = NULL;
+ attributes->nalloc_pixels = 0;
+ }
+ attributes->valuemask = 0;
+}
diff --git a/xc/extras/Xpm/lib/CrBufFrI.c b/xc/extras/Xpm/lib/CrBufFrI.c
new file mode 100644
index 000000000..33e4fd9bf
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrBufFrI.c
@@ -0,0 +1,400 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrBufFrI.c: *
+* *
+* XPM library *
+* Scan an image and possibly its mask and create an XPM buffer *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+LFUNC(WriteColors, int, (char **dataptr, unsigned int *data_size,
+ unsigned int *used_size, XpmColor *colors,
+ unsigned int ncolors, unsigned int cpp));
+
+LFUNC(WritePixels, void, (char *dataptr, unsigned int *used_size,
+ unsigned int width, unsigned int height,
+ unsigned int cpp, unsigned int *pixels,
+ XpmColor *colors));
+
+LFUNC(WriteExtensions, void, (char *dataptr, unsigned int *used_size,
+ XpmExtension *ext, unsigned int num));
+
+LFUNC(ExtensionsSize, int, (XpmExtension *ext, unsigned int num));
+LFUNC(CommentsSize, int, (XpmInfo *info));
+
+int
+XpmCreateBufferFromImage(display, buffer_return, image, shapeimage, attributes)
+ Display *display;
+ char **buffer_return;
+ XImage *image;
+ XImage *shapeimage;
+ XpmAttributes *attributes;
+{
+ XpmImage xpmimage;
+ XpmInfo info;
+ int ErrorStatus;
+
+ /* initialize return value */
+ if (buffer_return)
+ *buffer_return = NULL;
+
+ /* create an XpmImage from the image */
+ ErrorStatus = XpmCreateXpmImageFromImage(display, image, shapeimage,
+ &xpmimage, attributes);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /* create the buffer from the XpmImage */
+ if (attributes) {
+ xpmSetInfo(&info, attributes);
+ ErrorStatus =
+ XpmCreateBufferFromXpmImage(buffer_return, &xpmimage, &info);
+ } else
+ ErrorStatus =
+ XpmCreateBufferFromXpmImage(buffer_return, &xpmimage, NULL);
+
+ /* free the XpmImage */
+ XpmFreeXpmImage(&xpmimage);
+
+ return (ErrorStatus);
+}
+
+
+#undef RETURN
+#define RETURN(status) \
+{ \
+ ErrorStatus = status; \
+ goto error; \
+}
+
+int
+XpmCreateBufferFromXpmImage(buffer_return, image, info)
+ char **buffer_return;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ /* calculation variables */
+ int ErrorStatus;
+ char buf[BUFSIZ];
+ unsigned int cmts, extensions, ext_size = 0;
+ unsigned int l, cmt_size = 0;
+ char *ptr = NULL, *p;
+ unsigned int ptr_size, used_size;
+
+ *buffer_return = NULL;
+
+ cmts = info && (info->valuemask & XpmComments);
+ extensions = info && (info->valuemask & XpmExtensions)
+ && info->nextensions;
+
+ /* compute the extensions and comments size */
+ if (extensions)
+ ext_size = ExtensionsSize(info->extensions, info->nextensions);
+ if (cmts)
+ cmt_size = CommentsSize(info);
+
+ /* write the header line */
+#ifndef VOID_SPRINTF
+ used_size =
+#endif
+ sprintf(buf, "/* XPM */\nstatic char * image_name[] = {\n");
+#ifdef VOID_SPRINTF
+ used_size = strlen(buf);
+#endif
+ ptr_size = used_size + ext_size + cmt_size + 1;
+ ptr = (char *) XpmMalloc(ptr_size);
+ if (!ptr)
+ return XpmNoMemory;
+ strcpy(ptr, buf);
+
+ /* write the values line */
+ if (cmts && info->hints_cmt) {
+#ifndef VOID_SPRINTF
+ used_size +=
+#endif
+ sprintf(ptr + used_size, "/*%s*/\n", info->hints_cmt);
+#ifdef VOID_SPRINTF
+ used_size += strlen(info->hints_cmt) + 5;
+#endif
+ }
+#ifndef VOID_SPRINTF
+ l =
+#endif
+ sprintf(buf, "\"%d %d %d %d", image->width, image->height,
+ image->ncolors, image->cpp);
+#ifdef VOID_SPRINTF
+ l = strlen(buf);
+#endif
+
+ if (info && (info->valuemask & XpmHotspot)) {
+#ifndef VOID_SPRINTF
+ l +=
+#endif
+ sprintf(buf + l, " %d %d", info->x_hotspot, info->y_hotspot);
+#ifdef VOID_SPRINTF
+ l = strlen(buf);
+#endif
+ }
+ if (extensions) {
+#ifndef VOID_SPRINTF
+ l +=
+#endif
+ sprintf(buf + l, " XPMEXT");
+#ifdef VOID_SPRINTF
+ l = strlen(buf);
+#endif
+ }
+#ifndef VOID_SPRINTF
+ l +=
+#endif
+ sprintf(buf + l, "\",\n");
+#ifdef VOID_SPRINTF
+ l = strlen(buf);
+#endif
+ ptr_size += l;
+ p = (char *) XpmRealloc(ptr, ptr_size);
+ if (!p)
+ RETURN(XpmNoMemory);
+ ptr = p;
+ strcpy(ptr + used_size, buf);
+ used_size += l;
+
+ /* write colors */
+ if (cmts && info->colors_cmt) {
+#ifndef VOID_SPRINTF
+ used_size +=
+#endif
+ sprintf(ptr + used_size, "/*%s*/\n", info->colors_cmt);
+#ifdef VOID_SPRINTF
+ used_size += strlen(info->colors_cmt) + 5;
+#endif
+ }
+ ErrorStatus = WriteColors(&ptr, &ptr_size, &used_size,
+ image->colorTable, image->ncolors, image->cpp);
+
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+ /*
+ * now we know the exact size we need, realloc the data
+ * 4 = 1 (for '"') + 3 (for '",\n')
+ * 1 = - 2 (because the last line does not end with ',\n') + 3 (for '};\n')
+ */
+ ptr_size += image->height * (image->width * image->cpp + 4) + 1;
+
+ p = (char *) XpmRealloc(ptr, ptr_size);
+ if (!p)
+ RETURN(XpmNoMemory);
+ ptr = p;
+
+ /* print pixels */
+ if (cmts && info->pixels_cmt) {
+#ifndef VOID_SPRINTF
+ used_size +=
+#endif
+ sprintf(ptr + used_size, "/*%s*/\n", info->pixels_cmt);
+#ifdef VOID_SPRINTF
+ used_size += strlen(info->pixels_cmt) + 5;
+#endif
+ }
+ WritePixels(ptr + used_size, &used_size, image->width, image->height,
+ image->cpp, image->data, image->colorTable);
+
+ /* print extensions */
+ if (extensions)
+ WriteExtensions(ptr + used_size, &used_size,
+ info->extensions, info->nextensions);
+
+ /* close the array */
+ strcpy(ptr + used_size, "};\n");
+
+ *buffer_return = ptr;
+
+ return (XpmSuccess);
+
+/* exit point in case of error, free only locally allocated variables */
+error:
+ if (ptr)
+ XpmFree(ptr);
+ return (ErrorStatus);
+}
+
+static int
+WriteColors(dataptr, data_size, used_size, colors, ncolors, cpp)
+ char **dataptr;
+ unsigned int *data_size;
+ unsigned int *used_size;
+ XpmColor *colors;
+ unsigned int ncolors;
+ unsigned int cpp;
+{
+ char buf[BUFSIZ];
+ unsigned int a, key, l;
+ char *s, *s2;
+ char **defaults;
+
+ *buf = '"';
+ for (a = 0; a < ncolors; a++, colors++) {
+
+ defaults = (char **) colors;
+ s = buf + 1;
+ strncpy(s, *defaults++, cpp);
+ s += cpp;
+
+ for (key = 1; key <= NKEYS; key++, defaults++) {
+ if (s2 = *defaults) {
+#ifndef VOID_SPRINTF
+ s +=
+#endif
+ sprintf(s, "\t%s %s", xpmColorKeys[key - 1], s2);
+#ifdef VOID_SPRINTF
+ s += strlen(s);
+#endif
+ }
+ }
+ strcpy(s, "\",\n");
+ l = s + 3 - buf;
+ s = (char *) XpmRealloc(*dataptr, *data_size + l);
+ if (!s)
+ return (XpmNoMemory);
+ *data_size += l;
+ strcpy(s + *used_size, buf);
+ *used_size += l;
+ *dataptr = s;
+ }
+ return (XpmSuccess);
+}
+
+static void
+WritePixels(dataptr, used_size, width, height, cpp, pixels, colors)
+ char *dataptr;
+ unsigned int *used_size;
+ unsigned int width;
+ unsigned int height;
+ unsigned int cpp;
+ unsigned int *pixels;
+ XpmColor *colors;
+{
+ char *s = dataptr;
+ unsigned int x, y, h;
+
+ h = height - 1;
+ for (y = 0; y < h; y++) {
+ *s++ = '"';
+ for (x = 0; x < width; x++, pixels++) {
+ strncpy(s, colors[*pixels].string, cpp);
+ s += cpp;
+ }
+ strcpy(s, "\",\n");
+ s += 3;
+ }
+ /* duplicate some code to avoid a test in the loop */
+ *s++ = '"';
+ for (x = 0; x < width; x++, pixels++) {
+ strncpy(s, colors[*pixels].string, cpp);
+ s += cpp;
+ }
+ *s++ = '"';
+ *used_size += s - dataptr;
+}
+
+static int
+ExtensionsSize(ext, num)
+ XpmExtension *ext;
+ unsigned int num;
+{
+ unsigned int x, y, a, size;
+ char **line;
+
+ size = 0;
+ for (x = 0; x < num; x++, ext++) {
+ /* 11 = 10 (for ',\n"XPMEXT ') + 1 (for '"') */
+ size += strlen(ext->name) + 11;
+ a = ext->nlines;
+ for (y = 0, line = ext->lines; y < a; y++, line++)
+ /* 4 = 3 (for ',\n"') + 1 (for '"') */
+ size += strlen(*line) + 4;
+ }
+ /* 13 is for ',\n"XPMENDEXT"' */
+ return size + 13;
+}
+
+static void
+WriteExtensions(dataptr, used_size, ext, num)
+ char *dataptr;
+ unsigned int *used_size;
+ XpmExtension *ext;
+ unsigned int num;
+{
+ unsigned int x, y, a;
+ char **line;
+ char *s = dataptr;
+
+ for (x = 0; x < num; x++, ext++) {
+#ifndef VOID_SPRINTF
+ s +=
+#endif
+ sprintf(s, ",\n\"XPMEXT %s\"", ext->name);
+#ifdef VOID_SPRINTF
+ s += strlen(ext->name) + 11;
+#endif
+ a = ext->nlines;
+ for (y = 0, line = ext->lines; y < a; y++, line++) {
+#ifndef VOID_SPRINTF
+ s +=
+#endif
+ sprintf(s, ",\n\"%s\"", *line);
+#ifdef VOID_SPRINTF
+ s += strlen(*line) + 4;
+#endif
+ }
+ }
+ strcpy(s, ",\n\"XPMENDEXT\"");
+ *used_size += s - dataptr + 13;
+}
+
+static int
+CommentsSize(info)
+ XpmInfo *info;
+{
+ int size = 0;
+
+ /* 5 = 2 (for "/_*") + 3 (for "*_/\n") */
+ if (info->hints_cmt)
+ size += 5 + strlen(info->hints_cmt);
+
+ if (info->colors_cmt)
+ size += 5 + strlen(info->colors_cmt);
+
+ if (info->pixels_cmt)
+ size += 5 + strlen(info->pixels_cmt);
+
+ return size;
+}
diff --git a/xc/extras/Xpm/lib/CrBufFrP.c b/xc/extras/Xpm/lib/CrBufFrP.c
new file mode 100644
index 000000000..4aec4fbb9
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrBufFrP.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrBufFrP.c: *
+* *
+* XPM library *
+* Scan a pixmap and possibly its mask and create an XPM buffer *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmCreateBufferFromPixmap(display, buffer_return, pixmap, shapemask,
+ attributes)
+ Display *display;
+ char **buffer_return;
+ Pixmap pixmap;
+ Pixmap shapemask;
+ XpmAttributes *attributes;
+{
+ XImage *ximage = NULL;
+ XImage *shapeimage = NULL;
+ unsigned int width = 0;
+ unsigned int height = 0;
+ int ErrorStatus;
+
+ /* get geometry */
+ if (attributes && attributes->valuemask & XpmSize) {
+ width = attributes->width;
+ height = attributes->height;
+ }
+ /* get the ximages */
+ if (pixmap)
+ xpmCreateImageFromPixmap(display, pixmap, &ximage, &width, &height);
+ if (shapemask)
+ xpmCreateImageFromPixmap(display, shapemask, &shapeimage,
+ &width, &height);
+
+ /* create the buffer */
+ ErrorStatus = XpmCreateBufferFromImage(display, buffer_return, ximage,
+ shapeimage, attributes);
+
+ /* destroy the ximages */
+ if (ximage)
+ XDestroyImage(ximage);
+ if (shapeimage)
+ XDestroyImage(shapeimage);
+
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/CrDatFrI.c b/xc/extras/Xpm/lib/CrDatFrI.c
new file mode 100644
index 000000000..b16084670
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrDatFrI.c
@@ -0,0 +1,340 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrDataFI.c: *
+* *
+* XPM library *
+* Scan an image and possibly its mask and create an XPM array *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+LFUNC(CreateColors, int, (char **dataptr, unsigned int *data_size,
+ XpmColor *colors, unsigned int ncolors,
+ unsigned int cpp));
+
+LFUNC(CreatePixels, void, (char **dataptr, unsigned int width,
+ unsigned int height, unsigned int cpp,
+ unsigned int *pixels, XpmColor *colors));
+
+LFUNC(CountExtensions, void, (XpmExtension *ext, unsigned int num,
+ unsigned int *ext_size,
+ unsigned int *ext_nlines));
+
+LFUNC(CreateExtensions, void, (char **dataptr, unsigned int offset,
+ XpmExtension *ext, unsigned int num,
+ unsigned int ext_nlines));
+
+int
+XpmCreateDataFromImage(display, data_return, image, shapeimage, attributes)
+ Display *display;
+ char ***data_return;
+ XImage *image;
+ XImage *shapeimage;
+ XpmAttributes *attributes;
+{
+ XpmImage xpmimage;
+ XpmInfo info;
+ int ErrorStatus;
+
+ /* initialize return value */
+ if (data_return)
+ *data_return = NULL;
+
+ /* create an XpmImage from the image */
+ ErrorStatus = XpmCreateXpmImageFromImage(display, image, shapeimage,
+ &xpmimage, attributes);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /* create the data from the XpmImage */
+ if (attributes) {
+ xpmSetInfo(&info, attributes);
+ ErrorStatus = XpmCreateDataFromXpmImage(data_return, &xpmimage, &info);
+ } else
+ ErrorStatus = XpmCreateDataFromXpmImage(data_return, &xpmimage, NULL);
+
+ /* free the XpmImage */
+ XpmFreeXpmImage(&xpmimage);
+
+ return (ErrorStatus);
+}
+
+#undef RETURN
+#define RETURN(status) \
+{ \
+ ErrorStatus = status; \
+ goto exit; \
+}
+
+int
+XpmCreateDataFromXpmImage(data_return, image, info)
+ char ***data_return;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ /* calculation variables */
+ int ErrorStatus;
+ char buf[BUFSIZ];
+ char **header = NULL, **data, **sptr, **sptr2, *s;
+ unsigned int header_size, header_nlines;
+ unsigned int data_size, data_nlines;
+ unsigned int extensions = 0, ext_size = 0, ext_nlines = 0;
+ unsigned int offset, l, n;
+
+ *data_return = NULL;
+
+ extensions = info && (info->valuemask & XpmExtensions)
+ && info->nextensions;
+
+ /* compute the number of extensions lines and size */
+ if (extensions)
+ CountExtensions(info->extensions, info->nextensions,
+ &ext_size, &ext_nlines);
+
+ /*
+ * alloc a temporary array of char pointer for the header section which
+ * is the hints line + the color table lines
+ */
+ header_nlines = 1 + image->ncolors;
+ header_size = sizeof(char *) * header_nlines;
+ header = (char **) XpmCalloc(header_size, sizeof(char *));
+ if (!header)
+ return (XpmNoMemory);
+
+ /* print the hints line */
+ s = buf;
+#ifndef VOID_SPRINTF
+ s +=
+#endif
+ sprintf(s, "%d %d %d %d", image->width, image->height,
+ image->ncolors, image->cpp);
+#ifdef VOID_SPRINTF
+ s += strlen(s);
+#endif
+
+ if (info && (info->valuemask & XpmHotspot)) {
+#ifndef VOID_SPRINTF
+ s +=
+#endif
+ sprintf(s, " %d %d", info->x_hotspot, info->y_hotspot);
+#ifdef VOID_SPRINTF
+ s += strlen(s);
+#endif
+ }
+ if (extensions) {
+ strcpy(s, " XPMEXT");
+ s += 7;
+ }
+ l = s - buf + 1;
+ *header = (char *) XpmMalloc(l);
+ if (!*header)
+ RETURN(XpmNoMemory);
+ header_size += l;
+ strcpy(*header, buf);
+
+ /* print colors */
+ ErrorStatus = CreateColors(header + 1, &header_size,
+ image->colorTable, image->ncolors, image->cpp);
+
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+ /* now we know the size needed, alloc the data and copy the header lines */
+ offset = image->width * image->cpp + 1;
+ data_size = header_size + (image->height + ext_nlines) * sizeof(char *)
+ + image->height * offset + ext_size;
+
+ data = (char **) XpmMalloc(data_size);
+ if (!data)
+ RETURN(XpmNoMemory);
+
+ data_nlines = header_nlines + image->height + ext_nlines;
+ *data = (char *) (data + data_nlines);
+ n = image->ncolors;
+ for (l = 0, sptr = data, sptr2 = header; l <= n; l++, sptr++, sptr2++) {
+ strcpy(*sptr, *sptr2);
+ *(sptr + 1) = *sptr + strlen(*sptr2) + 1;
+ }
+
+ /* print pixels */
+ data[header_nlines] = (char *) data + header_size
+ + (image->height + ext_nlines) * sizeof(char *);
+
+ CreatePixels(data + header_nlines, image->width, image->height,
+ image->cpp, image->data, image->colorTable);
+
+ /* print extensions */
+ if (extensions)
+ CreateExtensions(data + header_nlines + image->height - 1, offset,
+ info->extensions, info->nextensions,
+ ext_nlines);
+
+ *data_return = data;
+ ErrorStatus = XpmSuccess;
+
+/* exit point, free only locally allocated variables */
+exit:
+ if (header) {
+ for (l = 0; l < header_nlines; l++)
+ if (header[l])
+ XpmFree(header[l]);
+ XpmFree(header);
+ }
+ return(ErrorStatus);
+}
+
+static int
+CreateColors(dataptr, data_size, colors, ncolors, cpp)
+ char **dataptr;
+ unsigned int *data_size;
+ XpmColor *colors;
+ unsigned int ncolors;
+ unsigned int cpp;
+{
+ char buf[BUFSIZ];
+ unsigned int a, key, l;
+ char *s, *s2;
+ char **defaults;
+
+ for (a = 0; a < ncolors; a++, colors++, dataptr++) {
+
+ defaults = (char **) colors;
+ strncpy(buf, *defaults++, cpp);
+ s = buf + cpp;
+
+ for (key = 1; key <= NKEYS; key++, defaults++) {
+ if (s2 = *defaults) {
+#ifndef VOID_SPRINTF
+ s +=
+#endif
+ sprintf(s, "\t%s %s", xpmColorKeys[key - 1], s2);
+#ifdef VOID_SPRINTF
+ s += strlen(s);
+#endif
+ }
+ }
+ l = s - buf + 1;
+ s = (char *) XpmMalloc(l);
+ if (!s)
+ return (XpmNoMemory);
+ *data_size += l;
+ *dataptr = strcpy(s, buf);
+ }
+ return (XpmSuccess);
+}
+
+static void
+CreatePixels(dataptr, width, height, cpp, pixels, colors)
+ char **dataptr;
+ unsigned int width;
+ unsigned int height;
+ unsigned int cpp;
+ unsigned int *pixels;
+ XpmColor *colors;
+{
+ char *s;
+ unsigned int x, y, h, offset;
+
+ h = height - 1;
+ offset = width * cpp + 1;
+ for (y = 0; y < h; y++, dataptr++) {
+ s = *dataptr;
+ for (x = 0; x < width; x++, pixels++) {
+ strncpy(s, colors[*pixels].string, cpp);
+ s += cpp;
+ }
+ *s = '\0';
+ *(dataptr + 1) = *dataptr + offset;
+ }
+ /* duplicate some code to avoid a test in the loop */
+ s = *dataptr;
+ for (x = 0; x < width; x++, pixels++) {
+ strncpy(s, colors[*pixels].string, cpp);
+ s += cpp;
+ }
+ *s = '\0';
+}
+
+static void
+CountExtensions(ext, num, ext_size, ext_nlines)
+ XpmExtension *ext;
+ unsigned int num;
+ unsigned int *ext_size;
+ unsigned int *ext_nlines;
+{
+ unsigned int x, y, a, size, nlines;
+ char **line;
+
+ size = 0;
+ nlines = 0;
+ for (x = 0; x < num; x++, ext++) {
+ /* 1 for the name */
+ nlines += ext->nlines + 1;
+ /* 8 = 7 (for "XPMEXT ") + 1 (for 0) */
+ size += strlen(ext->name) + 8;
+ a = ext->nlines;
+ for (y = 0, line = ext->lines; y < a; y++, line++)
+ size += strlen(*line) + 1;
+ }
+ /* 10 and 1 are for the ending "XPMENDEXT" */
+ *ext_size = size + 10;
+ *ext_nlines = nlines + 1;
+}
+
+static void
+CreateExtensions(dataptr, offset, ext, num, ext_nlines)
+ char **dataptr;
+ unsigned int offset;
+ XpmExtension *ext;
+ unsigned int num;
+ unsigned int ext_nlines;
+{
+ unsigned int x, y, a, b;
+ char **line;
+
+ *(dataptr + 1) = *dataptr + offset;
+ dataptr++;
+ a = 0;
+ for (x = 0; x < num; x++, ext++) {
+ sprintf(*dataptr, "XPMEXT %s", ext->name);
+ a++;
+ if (a < ext_nlines)
+ *(dataptr + 1) = *dataptr + strlen(ext->name) + 8;
+ dataptr++;
+ b = ext->nlines;
+ for (y = 0, line = ext->lines; y < b; y++, line++) {
+ strcpy(*dataptr, *line);
+ a++;
+ if (a < ext_nlines)
+ *(dataptr + 1) = *dataptr + strlen(*line) + 1;
+ dataptr++;
+ }
+ }
+ strcpy(*dataptr, "XPMENDEXT");
+}
diff --git a/xc/extras/Xpm/lib/CrDatFrP.c b/xc/extras/Xpm/lib/CrDatFrP.c
new file mode 100644
index 000000000..1593b7ba1
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrDatFrP.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrDataFP.c: *
+* *
+* XPM library *
+* Scan a pixmap and possibly its mask and create an XPM array *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmCreateDataFromPixmap(display, data_return, pixmap, shapemask, attributes)
+ Display *display;
+ char ***data_return;
+ Pixmap pixmap;
+ Pixmap shapemask;
+ XpmAttributes *attributes;
+{
+ XImage *ximage = NULL;
+ XImage *shapeimage = NULL;
+ unsigned int width = 0;
+ unsigned int height = 0;
+ int ErrorStatus;
+
+ /* get geometry */
+ if (attributes && attributes->valuemask & XpmSize) {
+ width = attributes->width;
+ height = attributes->height;
+ }
+ /* get the ximages */
+ if (pixmap)
+ xpmCreateImageFromPixmap(display, pixmap, &ximage, &width, &height);
+ if (shapemask)
+ xpmCreateImageFromPixmap(display, shapemask, &shapeimage,
+ &width, &height);
+
+ /* create the data */
+ ErrorStatus = XpmCreateDataFromImage(display, data_return, ximage,
+ shapeimage, attributes);
+
+ /* destroy the ximages */
+ if (ximage)
+ XDestroyImage(ximage);
+ if (shapeimage)
+ XDestroyImage(shapeimage);
+
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/CrIFrBuf.c b/xc/extras/Xpm/lib/CrIFrBuf.c
new file mode 100644
index 000000000..ba863ac3e
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrIFrBuf.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrIFrBuf.c: *
+* *
+* XPM library *
+* Parse an Xpm buffer (file in memory) and create the image and possibly its *
+* mask *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+LFUNC(OpenBuffer, void, (char *buffer, xpmData *mdata));
+
+int
+XpmCreateImageFromBuffer(display, buffer, image_return,
+ shapeimage_return, attributes)
+ Display *display;
+ char *buffer;
+ XImage **image_return;
+ XImage **shapeimage_return;
+ XpmAttributes *attributes;
+{
+ XpmImage image;
+ XpmInfo info;
+ int ErrorStatus;
+ xpmData mdata;
+
+ xpmInitXpmImage(&image);
+ xpmInitXpmInfo(&info);
+
+ /* open buffer to read */
+ OpenBuffer(buffer, &mdata);
+
+ /* create the XImage from the XpmData */
+ if (attributes) {
+ xpmInitAttributes(attributes);
+ xpmSetInfoMask(&info, attributes);
+ ErrorStatus = xpmParseDataAndCreate(display, &mdata,
+ image_return, shapeimage_return,
+ &image, &info, attributes);
+ } else
+ ErrorStatus = xpmParseDataAndCreate(display, &mdata,
+ image_return, shapeimage_return,
+ &image, NULL, attributes);
+ if (attributes) {
+ if (ErrorStatus >= 0) /* no fatal error */
+ xpmSetAttributes(attributes, &image, &info);
+ XpmFreeXpmInfo(&info);
+ }
+
+ /* free the XpmImage */
+ XpmFreeXpmImage(&image);
+
+ return (ErrorStatus);
+}
+
+int
+XpmCreateXpmImageFromBuffer(buffer, image, info)
+ char *buffer;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ xpmData mdata;
+ int ErrorStatus;
+
+ /* init returned values */
+ xpmInitXpmImage(image);
+ xpmInitXpmInfo(info);
+
+ /* open buffer to read */
+ OpenBuffer(buffer, &mdata);
+
+ /* create the XpmImage from the XpmData */
+ ErrorStatus = xpmParseData(&mdata, image, info);
+
+ return (ErrorStatus);
+}
+
+/*
+ * open the given buffer to be read or written as an xpmData which is returned
+ */
+static void
+OpenBuffer(buffer, mdata)
+ char *buffer;
+ xpmData *mdata;
+{
+ mdata->type = XPMBUFFER;
+ mdata->cptr = buffer;
+ mdata->CommentLength = 0;
+}
diff --git a/xc/extras/Xpm/lib/CrIFrDat.c b/xc/extras/Xpm/lib/CrIFrDat.c
new file mode 100644
index 000000000..f3c19c7cd
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrIFrDat.c
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrIFrData.c: *
+* *
+* XPM library *
+* Parse an Xpm array and create the image and possibly its mask *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+LFUNC(OpenArray, void, (char **data, xpmData *mdata));
+
+int
+XpmCreateImageFromData(display, data, image_return,
+ shapeimage_return, attributes)
+ Display *display;
+ char **data;
+ XImage **image_return;
+ XImage **shapeimage_return;
+ XpmAttributes *attributes;
+{
+ XpmImage image;
+ XpmInfo info;
+ int ErrorStatus;
+ xpmData mdata;
+
+ xpmInitXpmImage(&image);
+ xpmInitXpmInfo(&info);
+
+ /* open data */
+ OpenArray(data, &mdata);
+
+ /* create an XpmImage from the file */
+ if (attributes) {
+ xpmInitAttributes(attributes);
+ xpmSetInfoMask(&info, attributes);
+ ErrorStatus = xpmParseDataAndCreate(display, &mdata,
+ image_return, shapeimage_return,
+ &image, &info, attributes);
+ } else
+ ErrorStatus = xpmParseDataAndCreate(display, &mdata,
+ image_return, shapeimage_return,
+ &image, NULL, attributes);
+ if (attributes) {
+ if (ErrorStatus >= 0) /* no fatal error */
+ xpmSetAttributes(attributes, &image, &info);
+ XpmFreeXpmInfo(&info);
+ }
+
+ /* free the XpmImage */
+ XpmFreeXpmImage(&image);
+
+ return (ErrorStatus);
+}
+
+int
+XpmCreateXpmImageFromData(data, image, info)
+ char **data;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ xpmData mdata;
+ int ErrorStatus;
+
+ /* init returned values */
+ xpmInitXpmImage(image);
+ xpmInitXpmInfo(info);
+
+ /* open data */
+ OpenArray(data, &mdata);
+
+ /* create the XpmImage from the XpmData */
+ ErrorStatus = xpmParseData(&mdata, image, info);
+
+ return (ErrorStatus);
+}
+
+/*
+ * open the given array to be read or written as an xpmData which is returned
+ */
+static void
+OpenArray(data, mdata)
+ char **data;
+ xpmData *mdata;
+{
+ mdata->type = XPMARRAY;
+ mdata->stream.data = data;
+ mdata->cptr = *data;
+ mdata->line = 0;
+ mdata->CommentLength = 0;
+ mdata->Bcmt = mdata->Ecmt = NULL;
+ mdata->Bos = mdata->Eos = '\0';
+ mdata->format = 0; /* this can only be Xpm 2 or 3 */
+}
diff --git a/xc/extras/Xpm/lib/CrIFrP.c b/xc/extras/Xpm/lib/CrIFrP.c
new file mode 100644
index 000000000..f8aa4eddf
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrIFrP.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrIFrP.c: *
+* *
+* XPM library *
+* Create the XImage related to the given Pixmap. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+void
+xpmCreateImageFromPixmap(display, pixmap, ximage_return, width, height)
+ Display *display;
+ Pixmap pixmap;
+ XImage **ximage_return;
+ unsigned int *width;
+ unsigned int *height;
+{
+ unsigned int dum;
+ int dummy;
+ Window win;
+
+ if (*width == 0 && *height == 0)
+ XGetGeometry(display, pixmap, &win, &dummy, &dummy,
+ width, height, &dum, &dum);
+
+ *ximage_return = XGetImage(display, pixmap, 0, 0, *width, *height,
+ AllPlanes, ZPixmap);
+}
diff --git a/xc/extras/Xpm/lib/CrPFrBuf.c b/xc/extras/Xpm/lib/CrPFrBuf.c
new file mode 100644
index 000000000..19e7cb9ca
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrPFrBuf.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrPFrBuf.c: *
+* *
+* XPM library *
+* Parse an Xpm buffer and create the pixmap and possibly its mask *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmCreatePixmapFromBuffer(display, d, buffer, pixmap_return,
+ shapemask_return, attributes)
+ Display *display;
+ Drawable d;
+ char *buffer;
+ Pixmap *pixmap_return;
+ Pixmap *shapemask_return;
+ XpmAttributes *attributes;
+{
+ XImage *ximage, *shapeimage;
+ int ErrorStatus;
+
+ /* initialize return values */
+ if (pixmap_return)
+ *pixmap_return = 0;
+ if (shapemask_return)
+ *shapemask_return = 0;
+
+ /* create the images */
+ ErrorStatus = XpmCreateImageFromBuffer(display, buffer,
+ (pixmap_return ? &ximage : NULL),
+ (shapemask_return ?
+ &shapeimage : NULL),
+ attributes);
+
+ if (ErrorStatus < 0) /* fatal error */
+ return (ErrorStatus);
+
+ /* create the pixmaps and destroy images */
+ if (pixmap_return && ximage) {
+ xpmCreatePixmapFromImage(display, d, ximage, pixmap_return);
+ XDestroyImage(ximage);
+ }
+ if (shapemask_return && shapeimage) {
+ xpmCreatePixmapFromImage(display, d, shapeimage, shapemask_return);
+ XDestroyImage(shapeimage);
+ }
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/CrPFrDat.c b/xc/extras/Xpm/lib/CrPFrDat.c
new file mode 100644
index 000000000..fcbe5f1c0
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrPFrDat.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrPFrData.c: *
+* *
+* XPM library *
+* Parse an Xpm array and create the pixmap and possibly its mask *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmCreatePixmapFromData(display, d, data, pixmap_return,
+ shapemask_return, attributes)
+ Display *display;
+ Drawable d;
+ char **data;
+ Pixmap *pixmap_return;
+ Pixmap *shapemask_return;
+ XpmAttributes *attributes;
+{
+ XImage *ximage, *shapeimage;
+ int ErrorStatus;
+
+ /* initialize return values */
+ if (pixmap_return)
+ *pixmap_return = 0;
+ if (shapemask_return)
+ *shapemask_return = 0;
+
+ /* create the images */
+ ErrorStatus = XpmCreateImageFromData(display, data,
+ (pixmap_return ? &ximage : NULL),
+ (shapemask_return ?
+ &shapeimage : NULL),
+ attributes);
+
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ if (ErrorStatus < 0) /* fatal error */
+ return (ErrorStatus);
+
+ /* create the pixmaps and destroy images */
+ if (pixmap_return && ximage) {
+ xpmCreatePixmapFromImage(display, d, ximage, pixmap_return);
+ XDestroyImage(ximage);
+ }
+ if (shapemask_return && shapeimage) {
+ xpmCreatePixmapFromImage(display, d, shapeimage, shapemask_return);
+ XDestroyImage(shapeimage);
+ }
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/CrPFrI.c b/xc/extras/Xpm/lib/CrPFrI.c
new file mode 100644
index 000000000..0661a4ed2
--- /dev/null
+++ b/xc/extras/Xpm/lib/CrPFrI.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* CrPFrI.c: *
+* *
+* XPM library *
+* Create the Pixmap related to the given XImage. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+void
+xpmCreatePixmapFromImage(display, d, ximage, pixmap_return)
+ Display *display;
+ Drawable d;
+ XImage *ximage;
+ Pixmap *pixmap_return;
+{
+ GC gc;
+ XGCValues values;
+
+ *pixmap_return = XCreatePixmap(display, d, ximage->width,
+ ximage->height, ximage->depth);
+ /* set fg and bg in case we have an XYBitmap */
+ values.foreground = 1;
+ values.background = 0;
+ gc = XCreateGC(display, *pixmap_return,
+ GCForeground | GCBackground, &values);
+
+ XPutImage(display, *pixmap_return, gc, ximage, 0, 0, 0, 0,
+ ximage->width, ximage->height);
+
+ XFreeGC(display, gc);
+}
diff --git a/xc/extras/Xpm/lib/Image.c b/xc/extras/Xpm/lib/Image.c
new file mode 100644
index 000000000..075362218
--- /dev/null
+++ b/xc/extras/Xpm/lib/Image.c
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* Image.c: *
+* *
+* XPM library *
+* Functions to init and free the XpmImage structure. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+/*
+ * Init returned data to free safely later on
+ */
+void
+xpmInitXpmImage(image)
+ XpmImage *image;
+{
+ image->ncolors = 0;
+ image->colorTable = NULL;
+ image->data = NULL;
+}
+
+/*
+ * Free the XpmImage data which have been allocated
+ */
+void
+XpmFreeXpmImage(image)
+ XpmImage *image;
+{
+ if (image->colorTable)
+ xpmFreeColorTable(image->colorTable, image->ncolors);
+ if (image->data)
+ XpmFree(image->data);
+ image->data = NULL;
+}
diff --git a/xc/extras/Xpm/lib/Imakefile b/xc/extras/Xpm/lib/Imakefile
new file mode 100644
index 000000000..e3991b625
--- /dev/null
+++ b/xc/extras/Xpm/lib/Imakefile
@@ -0,0 +1,186 @@
+XCOMM
+XCOMM Copyright (C) 1989-95 GROUPE BULL
+XCOMM
+XCOMM Permission is hereby granted, free of charge, to any person obtaining a
+XCOMM copy of this software and associated documentation files
+XCOMM (the "Software"), to deal in the Software without restriction, including
+XCOMM without limitation the rights to use, copy, modify, merge, publish,
+XCOMM distribute, sublicense, and/or sell copies of the Software, and to permit
+XCOMM persons to whom the Software is furnished to do so, subject to the
+XCOMM following conditions:
+XCOMM The above copyright notice and this permission notice shall be included
+XCOMM in all copies or substantial portions of the Software.
+XCOMM
+XCOMM THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+XCOMM OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+XCOMM MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+XCOMM IN NO EVENT SHALL GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+XCOMM LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+XCOMM FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+XCOMM DEALINGS IN THE SOFTWARE.
+XCOMM
+XCOMM Except as contained in this notice, the name of GROUPE BULL shall not be
+XCOMM used in advertising or otherwise to promote the sale, use or other
+XCOMM dealings in this Software without prior written authorization from
+XCOMM GROUPE BULL.
+XCOMM
+
+XCOMM
+XCOMM XPM Imakefile - Arnaud LE HORS
+XCOMM
+
+XCOMM default locations
+#ifndef XpmLibDir
+#define XpmLibDir $(USRLIBDIR)
+#endif
+#ifndef XpmIncDir
+#define XpmIncDir $(INCDIR)
+#endif
+
+XCOMM If not already set in top dir,
+XCOMM you can uncomment the following line to avoid building the shared lib
+XCOMM #define SharedLibXpm NO
+XCOMM SGI requires a specification file for shared library that we don't have
+#ifndef SharedLibXpm
+# define SharedLibXpm (HasSharedLibraries && \
+ !(defined(SGIArchitecture) && !SystemV4))
+#endif
+
+#ifndef NormalLibXpm
+#define NormalLibXpm (!SharedLibXpm || ForceNormalLib)
+#endif
+
+#if defined(RsArchitecture) || defined(Win32Architecture)
+REQUIREDLIBS = $(XLIB)
+#endif
+
+XCOMM on Dec Alpha we need to define the following to build the shared library
+#ifdef AlphaArchitecture
+REQUIREDLIBS = $(LDPRELIB) $(XLIB)
+SO_REQLIBS = -lX11 -lc
+#endif
+
+XCOMM If DEFINES has not been defined in top dir, this can be done here.
+XCOMM You may need to modify the following DEFINES variable as follows:
+XCOMM if your system doesn't provide strcasecmp add -DNEED_STRCASECMP
+XCOMM if your system doesn't provide strdup add -DNEED_STRDUP
+XCOMM if your system doesn't provide pipe add -DNO_ZPIPE
+XCOMM if on your system sprintf doesn't return the number of bytes transmitted
+XCOMM add -DVOID_SPRINTF
+
+#if defined(UltrixArchitecture) || \
+ (defined(MipsArchitecture) && !defined(SGIArchitecture))
+STRDUPDEF = -DNEED_STRDUP
+#else
+# if defined(Win32Architecture) || defined(USLArchitecture) || \
+ (defined(HasStrcasecmp) && !HasStrcasecmp)
+STRCASECMPDEF = -DNEED_STRCASECMP
+# else
+# if defined(SunArchitecture) && !defined(SVR4Architecture)
+SPRINTFDEF = -DVOID_SPRINTF
+# endif
+# endif
+#endif
+#if defined(Win32Architecture)
+ZPIPEDEF = -DNO_ZPIPE
+#endif
+
+DEFINES = $(STRDUPDEF) $(STRCASECMPDEF) $(SPRINTFDEF) $(ZPIPEDEF)
+
+XCOMM
+XCOMM Normally the following part should not need to be edited
+XCOMM
+
+XPMLIBDIR = XpmLibDir
+XPMINCDIR = XpmIncDir
+
+XCOMM get the version numbers from the xpm include file
+#define XPM_NUMBERS
+#include "xpm.h"
+SOXPMLIBREV = XpmVersion./**/XpmRevision
+
+HEADERS = xpm.h
+ SRCS = data.c create.c misc.c rgb.c scan.c parse.c hashtab.c \
+ CrBufFrI.c CrDatFrP.c CrPFrBuf.c RdFToI.c WrFFrI.c \
+ CrBufFrP.c CrIFrBuf.c CrPFrDat.c RdFToP.c WrFFrP.c \
+ CrDatFrI.c CrIFrDat.c RdFToDat.c WrFFrDat.c \
+ Attrib.c CrIFrP.c CrPFrI.c Image.c Info.c RdFToBuf.c WrFFrBuf.c
+
+ OBJS = data.o create.o misc.o rgb.o scan.o parse.o hashtab.o \
+ CrBufFrI.o CrDatFrP.o CrPFrBuf.o RdFToI.o WrFFrI.o \
+ CrBufFrP.o CrIFrBuf.o CrPFrDat.o RdFToP.o WrFFrP.o \
+ CrDatFrI.o CrIFrDat.o RdFToDat.o WrFFrDat.o \
+ Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o
+
+ INCLUDES = -I.
+ LINTLIBS = $(LINTXTOLL) $(LINTXLIB)
+
+#ifdef OsNameDefines
+OS_NAME_DEFINES = OsNameDefines
+#endif
+
+#define DoSharedLib SharedLibXpm
+#define DoNormalLib NormalLibXpm
+
+#if (ProjectX < 5)
+ STD_DEFINES = LibraryDefines
+ CDEBUGFLAGS = LibraryCDebugFlags
+#else
+#define LibName Xpm
+#define SoRev SOXPMLIBREV
+#define IncSubdir X11
+/* we have to cheat on Library.tmpl to get what we want... */
+#define INCDIR XPMINCDIR
+#define USRLIBDIR XPMLIBDIR
+#define SHLIBDIR XPMLIBDIR
+#include <Library.tmpl>
+#undef INCDIR
+#undef USRLIBDIR
+#undef SHLIBDIR
+#endif
+
+#if (ProjectX < 6)
+
+ INSTALLFLAGS = $(INSTINCFLAGS)
+
+#if (ProjectX < 5)
+
+#if DoSharedLib
+SharedLibraryObjectRule()
+NormalSharedLibraryTarget(Xpm,$(SOXPMLIBREV),$(OBJS))
+InstallSharedLibrary(Xpm,$(SOXPMLIBREV),$(XPMLIBDIR))
+#else
+NormalLibraryObjectRule()
+#endif
+NormalLibraryTarget(Xpm,$(OBJS))
+InstallLibrary(Xpm,$(XPMLIBDIR))
+
+#else /* (ProjectX < 5) */
+
+LibraryObjectRule()
+
+#if DoSharedLib
+# if DoNormalLib
+SharedLibraryTarget(Xpm,$(SOXPMLIBREV),$(OBJS),shared,..)
+# else
+SharedLibraryTarget(Xpm,$(SOXPMLIBREV),$(OBJS),.,.)
+#endif
+InstallSharedLibrary(Xpm,$(SOXPMLIBREV),$(XPMLIBDIR))
+#endif
+#if DoNormalLib
+NormalLibraryTarget(Xpm,$(OBJS))
+InstallLibrary(Xpm,$(XPMLIBDIR))
+#endif
+
+#endif /* (ProjectX < 5) */
+
+InstallMultiple($(HEADERS),$(XPMINCDIR))
+BuildIncludes($(HEADERS),.,.)
+
+LintLibraryTarget(Xpm,$(SRCS))
+InstallLintLibrary(Xpm,$(LINTLIBDIR))
+NormalLintTarget($(SRCS))
+
+#endif /* (ProjectX < 6) */
+
+DependTarget()
diff --git a/xc/extras/Xpm/lib/Info.c b/xc/extras/Xpm/lib/Info.c
new file mode 100644
index 000000000..9bc41c89e
--- /dev/null
+++ b/xc/extras/Xpm/lib/Info.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* Info.c: *
+* *
+* XPM library *
+* Functions related to the XpmInfo structure. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+/*
+ * Init returned data to free safely later on
+ */
+void
+xpmInitXpmInfo(info)
+ XpmInfo *info;
+{
+ if (info) {
+ info->hints_cmt = NULL;
+ info->colors_cmt = NULL;
+ info->pixels_cmt = NULL;
+ info->extensions = NULL;
+ info->nextensions = 0;
+ }
+}
+
+/*
+ * Free the XpmInfo data which have been allocated
+ */
+void
+XpmFreeXpmInfo(info)
+ XpmInfo *info;
+{
+ if (info) {
+ if (info->valuemask & XpmComments) {
+ if (info->hints_cmt) {
+ XpmFree(info->hints_cmt);
+ info->hints_cmt = NULL;
+ }
+ if (info->colors_cmt) {
+ XpmFree(info->colors_cmt);
+ info->colors_cmt = NULL;
+ }
+ if (info->pixels_cmt) {
+ XpmFree(info->pixels_cmt);
+ info->pixels_cmt = NULL;
+ }
+ }
+ if (info->valuemask & XpmReturnExtensions && info->nextensions) {
+ XpmFreeExtensions(info->extensions, info->nextensions);
+ info->extensions = NULL;
+ info->nextensions = 0;
+ }
+ info->valuemask = 0;
+ }
+}
+
+/*
+ * Set the XpmInfo valuemask to retrieve required info
+ */
+void
+xpmSetInfoMask(info, attributes)
+ XpmInfo *info;
+ XpmAttributes *attributes;
+{
+ info->valuemask = 0;
+ if (attributes->valuemask & XpmReturnInfos)
+ info->valuemask |= XpmReturnComments;
+ if (attributes->valuemask & XpmReturnExtensions)
+ info->valuemask |= XpmReturnExtensions;
+}
+
+/*
+ * Fill in the XpmInfo with the XpmAttributes
+ */
+void
+xpmSetInfo(info, attributes)
+ XpmInfo *info;
+ XpmAttributes *attributes;
+{
+ info->valuemask = 0;
+ if (attributes->valuemask & XpmInfos) {
+ info->valuemask |= XpmComments | XpmColorTable;
+ info->hints_cmt = attributes->hints_cmt;
+ info->colors_cmt = attributes->colors_cmt;
+ info->pixels_cmt = attributes->pixels_cmt;
+ }
+ if (attributes->valuemask & XpmExtensions) {
+ info->valuemask |= XpmExtensions;
+ info->extensions = attributes->extensions;
+ info->nextensions = attributes->nextensions;
+ }
+ if (attributes->valuemask & XpmHotspot) {
+ info->valuemask |= XpmHotspot;
+ info->x_hotspot = attributes->x_hotspot;
+ info->y_hotspot = attributes->y_hotspot;
+ }
+}
diff --git a/xc/extras/Xpm/lib/Makefile.AmigaGCC b/xc/extras/Xpm/lib/Makefile.AmigaGCC
new file mode 100644
index 000000000..b8aa50f8a
--- /dev/null
+++ b/xc/extras/Xpm/lib/Makefile.AmigaGCC
@@ -0,0 +1,92 @@
+#
+# Copyright (C) 1996 Lorens Younes
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# Lorens Younes BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of Lorens Younes shall not be
+# used in advertising or otherwise to promote the sale, use or other dealings
+# in this Software without prior written authorization from Lorens Younes.
+#
+
+#
+# XPM Amiga GCC Makefile - Lorens Younes (d93-hyo@nada.kth.se)
+#
+
+CC = gcc
+AR = ar r
+RANLIB = ranlib
+RM = rm -f
+INSTALL = install -c
+MKDIRHIER = mkdir
+LN = ln -s
+CHMOD = chmod
+
+CDEBUGFLAGS = -O
+DEFINES = -DNO_ZPIPE -DAMIGA
+
+DESTBINDIR= /projects/bin
+DESTLIBDIR= /projects/lib
+DESTINCLUDEDIR= /projects/include
+
+OBJS= data.o create.o misc.o rgb.o scan.o parse.o hashtab.o \
+ WrFFrI.o RdFToI.o CrIFrDat.o CrDatFrI.o \
+ CrIFrBuf.o CrBufFrI.o \
+ RdFToDat.o WrFFrDat.o \
+ Attrib.o Image.o Info.o RdFToBuf.o WrFFrBuf.o \
+ amigax.o
+
+CFLAGS = $(CDEBUGFLAGS) $(DEFINES)
+
+all: libXpm.a
+
+clean:
+ -$(RM) *.o libXpm.a
+
+libXpm.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+ $(RANLIB) $@
+
+install:
+ $(INSTALL) -m 0664 libXpm.a $(DESTLIBDIR)
+ cd $(DESTLIBDIR); $(RANLIB) libXpm.a
+ -$(MKDIRHIER) $(DESTINCLUDEDIR)
+ -$(CHMOD) ugo+rx $(DESTINCLUDEDIR)
+ $(INSTALL) -m 0444 xpm.h $(DESTINCLUDEDIR)
+
+# Other dependencies.
+CrBufFrI.o: XpmI.h xpm.h amigax.h
+CrDatFI.o: XpmI.h xpm.h amigax.h
+CrIFrBuf.o: XpmI.h xpm.h amigax.h
+CrIFrDat.o: XpmI.h xpm.h amigax.h
+RdFToDat.o: XpmI.h xpm.h amigax.h
+RdFToI.o: XpmI.h xpm.h amigax.h
+WrFFrDat.o: XpmI.h xpm.h amigax.h
+WrFFrI.o: XpmI.h xpm.h amigax.h
+create.o: XpmI.h xpm.h amigax.h
+data.o: XpmI.h xpm.h amigax.h
+hashtab.o: XpmI.h xpm.h amigax.h
+misc.o: XpmI.h xpm.h amigax.h
+parse.o: XpmI.h xpm.h amigax.h
+rgb.o: XpmI.h xpm.h amigax.h
+scan.o: XpmI.h xpm.h amigax.h
+Attrib.o: XpmI.h xpm.h amigax.h
+Image.o: XpmI.h xpm.h amigax.h
+Info.o: XpmI.h xpm.h amigax.h
+RdFToBuf.o: XpmI.h xpm.h amigax.h
+WrFFrBuf.o: XpmI.h xpm.h amigax.h
+amigax.o: XpmI.h xpm.h amigax.h
diff --git a/xc/extras/Xpm/lib/Makefile.noX b/xc/extras/Xpm/lib/Makefile.noX
new file mode 100644
index 000000000..89edfd78f
--- /dev/null
+++ b/xc/extras/Xpm/lib/Makefile.noX
@@ -0,0 +1,112 @@
+#
+# Copyright (C) 1989-95 GROUPE BULL
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of GROUPE BULL shall not be
+# used in advertising or otherwise to promote the sale, use or other dealings
+# in this Software without prior written authorization from GROUPE BULL.
+#
+
+#
+# XPM Makefile - Arnaud LE HORS
+#
+
+# if your system doesn't provide strcasecmp add -DNEED_STRCASECMP
+# if your system doesn't provide strdup add -DNEED_STRDUP
+# if your system doesn't provide pipe add -DNO_ZPIPE
+# if on your system sprintf doesn't return the number of bytes transmitted
+# add -DVOID_SPRINTF
+DEFINES =
+
+# where the library will be installed
+DESTLIBDIR=/usr/local/lib/X11
+# where the include file (pxm.h) will be installed
+DESTINCLUDEDIR=/usr/local/include/X11
+
+CC = cc
+AR = ar r
+RANLIB = ranlib
+RM = rm -f
+# on sysV, define this as cp.
+INSTALL = install -c
+MKDIRHIER = mkdir
+LN = ln -s
+
+CDEBUGFLAGS= -O
+
+OBJS= data.o create.o misc.o rgb.o scan.o parse.o hashtab.o \
+ WrFFrP.o RdFToP.o CrPFrDat.o CrDatFrP.o \
+ WrFFrI.o RdFToI.o CrIFrDat.o CrDatFrI.o \
+ CrIFrBuf.o CrPFrBuf.o CrBufFrI.o CrBufFrP.o \
+ RdFToDat.o WrFFrDat.o \
+ Attrib.o CrIFrP.o CrPFrI.o Image.o Info.o RdFToBuf.o WrFFrBuf.o
+
+CFLAGS= $(CDEBUGFLAGS) $(DEFINES) $(INCLUDES)
+
+all: ../X11/xpm.h libXpm.a
+
+clean:
+ $(RM) *.o libXpm.a
+
+libXpm.a: $(OBJS)
+ $(AR) libXpm.a $(OBJS)
+ $(RANLIB) libXpm.a
+
+install:
+ $(INSTALL) -m 0664 libXpm.a $(DESTLIBDIR)
+ cd $(DESTLIBDIR); $(RANLIB) libXpm.a
+ -mkdir $(DESTINCLUDEDIR)
+ -chmod ugo+rx $(DESTINCLUDEDIR)
+ $(INSTALL) -m 0444 xpm.h $(DESTINCLUDEDIR)
+
+../X11/xpm.h: xpm.h
+ @if [ -d ../X11 ]; then set +x; \
+ else (set -x; $(MKDIRHIER) ../X11); fi
+ $(RM) ../X11/xpm.h; \
+ $(LN) ../lib/xpm.h ../X11
+
+# Other dependencies.
+CrBufFrI.o: XpmI.h xpm.h
+CrBufFrP.o: XpmI.h xpm.h
+CrDatFI.o: XpmI.h xpm.h
+CrDatFP.o: XpmI.h xpm.h
+CrIFrBuf.o: XpmI.h xpm.h
+CrIFrDat.o: XpmI.h xpm.h
+CrPFrBuf.o: XpmI.h xpm.h
+CrPFrDat.o: XpmI.h xpm.h
+RdFToDat.o: XpmI.h xpm.h
+RdFToI.o: XpmI.h xpm.h
+RdFToP.o: XpmI.h xpm.h
+WrFFrDat.o: XpmI.h xpm.h
+WrFFrI.o: XpmI.h xpm.h
+WrFFrP.o: XpmI.h xpm.h
+create.o: XpmI.h xpm.h
+data.o: XpmI.h xpm.h
+hashtab.o: XpmI.h xpm.h
+misc.o: XpmI.h xpm.h
+parse.o: XpmI.h xpm.h
+rgb.o: XpmI.h xpm.h
+scan.o: XpmI.h xpm.h
+Attrib.o: XpmI.h xpm.h
+CrIFrP.o: XpmI.h xpm.h
+CrPFrI.o: XpmI.h xpm.h
+Image.o: XpmI.h xpm.h
+Info.o: XpmI.h xpm.h
+RdFToBuf.o: XpmI.h xpm.h
+WrFFrBuf.o: XpmI.h xpm.h
diff --git a/xc/extras/Xpm/lib/RdFToBuf.c b/xc/extras/Xpm/lib/RdFToBuf.c
new file mode 100644
index 000000000..898a9fc62
--- /dev/null
+++ b/xc/extras/Xpm/lib/RdFToBuf.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* RdFToBuf.c: *
+* *
+* XPM library *
+* Copy a file to a malloc'ed buffer, provided as a convenience. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to FOR_MSW has been added by
+ * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
+ */
+
+#include "XpmI.h"
+#include <sys/stat.h>
+#if !defined(FOR_MSW) && !defined(WIN32)
+#include <unistd.h>
+#endif
+#ifndef VAX11C
+#include <fcntl.h>
+#endif
+#if defined(FOR_MSW) || defined(WIN32)
+#include <io.h>
+#define stat _stat
+#define fstat _fstat
+#define fdopen _fdopen
+#define O_RDONLY _O_RDONLY
+#endif
+
+int
+XpmReadFileToBuffer(filename, buffer_return)
+ char *filename;
+ char **buffer_return;
+{
+ int fd, fcheck, len;
+ char *ptr;
+ struct stat stats;
+ FILE *fp;
+
+ *buffer_return = NULL;
+
+#ifndef VAX11C
+ fd = open(filename, O_RDONLY);
+#else
+ fd = open(filename, O_RDONLY, NULL);
+#endif
+ if (fd < 0)
+ return XpmOpenFailed;
+
+ if (fstat(fd, &stats)) {
+ close(fd);
+ return XpmOpenFailed;
+ }
+ fp = fdopen(fd, "r");
+ if (!fp) {
+ close(fd);
+ return XpmOpenFailed;
+ }
+ len = (int) stats.st_size;
+ ptr = (char *) XpmMalloc(len + 1);
+ if (!ptr) {
+ fclose(fp);
+ return XpmNoMemory;
+ }
+ fcheck = fread(ptr, 1, len, fp);
+ fclose(fp);
+#ifdef VMS
+ /* VMS often stores text files in a variable-length record format,
+ where there are two bytes of size followed by the record. fread
+ converts this so it looks like a record followed by a newline.
+ Unfortunately, the size reported by fstat() (and fseek/ftell)
+ counts the two bytes for the record terminator, while fread()
+ counts only one. So, fread() sees fewer bytes in the file (size
+ minus # of records) and thus when asked to read the amount
+ returned by stat(), it fails.
+ The best solution, suggested by DEC, seems to consider the length
+ returned from fstat() as an upper bound and call fread() with
+ a record length of 1. Then don't check the return value.
+ We'll check for 0 for gross error that's all.
+ */
+ len = fcheck;
+ if (fcheck == 0) {
+#else
+ if (fcheck != len) {
+#endif
+ XpmFree(ptr);
+ return XpmOpenFailed;
+ }
+ ptr[len] = '\0';
+ *buffer_return = ptr;
+ return XpmSuccess;
+}
diff --git a/xc/extras/Xpm/lib/RdFToDat.c b/xc/extras/Xpm/lib/RdFToDat.c
new file mode 100644
index 000000000..4bb28fce2
--- /dev/null
+++ b/xc/extras/Xpm/lib/RdFToDat.c
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* RdFToDat.c: *
+* *
+* XPM library *
+* Parse an XPM file and create an array of strings corresponding to it. *
+* *
+* Developed by Dan Greening dgreen@cs.ucla.edu / dgreen@sti.com *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmReadFileToData(filename, data_return)
+ char *filename;
+ char ***data_return;
+{
+ XpmImage image;
+ XpmInfo info;
+ int ErrorStatus;
+
+ info.valuemask = XpmReturnComments | XpmReturnExtensions;
+
+ /*
+ * initialize return value
+ */
+ if (data_return)
+ *data_return = NULL;
+
+ ErrorStatus = XpmReadFileToXpmImage(filename, &image, &info);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ ErrorStatus =
+ XpmCreateDataFromXpmImage(data_return, &image, &info);
+
+ XpmFreeXpmImage(&image);
+ XpmFreeXpmInfo(&info);
+
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/RdFToI.c b/xc/extras/Xpm/lib/RdFToI.c
new file mode 100644
index 000000000..5b8809f4e
--- /dev/null
+++ b/xc/extras/Xpm/lib/RdFToI.c
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* RdFToI.c: *
+* *
+* XPM library *
+* Parse an XPM file and create the image and possibly its mask *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+#include <sys/stat.h>
+#if !defined(NO_ZPIPE) && defined(WIN32)
+# define popen _popen
+# define pclose _pclose
+# if defined(STAT_ZFILE)
+# include <io.h>
+# define stat _stat
+# define fstat _fstat
+# endif
+#endif
+
+LFUNC(OpenReadFile, int, (char *filename, xpmData *mdata));
+LFUNC(xpmDataClose, void, (xpmData *mdata));
+
+#ifndef CXPMPROG
+int
+XpmReadFileToImage(display, filename,
+ image_return, shapeimage_return, attributes)
+ Display *display;
+ char *filename;
+ XImage **image_return;
+ XImage **shapeimage_return;
+ XpmAttributes *attributes;
+{
+ XpmImage image;
+ XpmInfo info;
+ int ErrorStatus;
+ xpmData mdata;
+
+ xpmInitXpmImage(&image);
+ xpmInitXpmInfo(&info);
+
+ /* open file to read */
+ if ((ErrorStatus = OpenReadFile(filename, &mdata)) != XpmSuccess)
+ return (ErrorStatus);
+
+ /* create the XImage from the XpmData */
+ if (attributes) {
+ xpmInitAttributes(attributes);
+ xpmSetInfoMask(&info, attributes);
+ ErrorStatus = xpmParseDataAndCreate(display, &mdata,
+ image_return, shapeimage_return,
+ &image, &info, attributes);
+ } else
+ ErrorStatus = xpmParseDataAndCreate(display, &mdata,
+ image_return, shapeimage_return,
+ &image, NULL, attributes);
+ if (attributes) {
+ if (ErrorStatus >= 0) /* no fatal error */
+ xpmSetAttributes(attributes, &image, &info);
+ XpmFreeXpmInfo(&info);
+ }
+
+ xpmDataClose(&mdata);
+ /* free the XpmImage */
+ XpmFreeXpmImage(&image);
+
+ return (ErrorStatus);
+}
+
+int
+XpmReadFileToXpmImage(filename, image, info)
+ char *filename;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ xpmData mdata;
+ int ErrorStatus;
+
+ /* init returned values */
+ xpmInitXpmImage(image);
+ xpmInitXpmInfo(info);
+
+ /* open file to read */
+ if ((ErrorStatus = OpenReadFile(filename, &mdata)) != XpmSuccess)
+ return (ErrorStatus);
+
+ /* create the XpmImage from the XpmData */
+ ErrorStatus = xpmParseData(&mdata, image, info);
+
+ xpmDataClose(&mdata);
+
+ return (ErrorStatus);
+}
+#endif /* CXPMPROG */
+
+/*
+ * open the given file to be read as an xpmData which is returned.
+ */
+static int
+OpenReadFile(filename, mdata)
+ char *filename;
+ xpmData *mdata;
+{
+#ifndef NO_ZPIPE
+ char *compressfile, buf[BUFSIZ];
+# ifdef STAT_ZFILE
+ struct stat status;
+# endif
+#endif
+
+ if (!filename) {
+ mdata->stream.file = (stdin);
+ mdata->type = XPMFILE;
+ } else {
+#ifndef NO_ZPIPE
+ int len = strlen(filename);
+ if ((len > 2) && !strcmp(".Z", filename + (len - 2))) {
+ mdata->type = XPMPIPE;
+ sprintf(buf, "uncompress -c \"%s\"", filename);
+ if (!(mdata->stream.file = popen(buf, "r")))
+ return (XpmOpenFailed);
+
+ } else if ((len > 3) && !strcmp(".gz", filename + (len - 3))) {
+ mdata->type = XPMPIPE;
+ sprintf(buf, "gunzip -qc \"%s\"", filename);
+ if (!(mdata->stream.file = popen(buf, "r")))
+ return (XpmOpenFailed);
+
+ } else {
+# ifdef STAT_ZFILE
+ if (!(compressfile = (char *) XpmMalloc(len + 4)))
+ return (XpmNoMemory);
+
+ sprintf(compressfile, "%s.Z", filename);
+ if (!stat(compressfile, &status)) {
+ sprintf(buf, "uncompress -c \"%s\"", compressfile);
+ if (!(mdata->stream.file = popen(buf, "r"))) {
+ XpmFree(compressfile);
+ return (XpmOpenFailed);
+ }
+ mdata->type = XPMPIPE;
+ } else {
+ sprintf(compressfile, "%s.gz", filename);
+ if (!stat(compressfile, &status)) {
+ sprintf(buf, "gunzip -c \"%s\"", compressfile);
+ if (!(mdata->stream.file = popen(buf, "r"))) {
+ XpmFree(compressfile);
+ return (XpmOpenFailed);
+ }
+ mdata->type = XPMPIPE;
+ } else {
+# endif
+#endif
+ if (!(mdata->stream.file = fopen(filename, "r"))) {
+#if !defined(NO_ZPIPE) && defined(STAT_ZFILE)
+ XpmFree(compressfile);
+#endif
+ return (XpmOpenFailed);
+ }
+ mdata->type = XPMFILE;
+#ifndef NO_ZPIPE
+# ifdef STAT_ZFILE
+ }
+ }
+ XpmFree(compressfile);
+# endif
+ }
+#endif
+ }
+ mdata->CommentLength = 0;
+#ifdef CXPMPROG
+ mdata->lineNum = 0;
+ mdata->charNum = 0;
+#endif
+ return (XpmSuccess);
+}
+
+/*
+ * close the file related to the xpmData if any
+ */
+static void
+xpmDataClose(mdata)
+ xpmData *mdata;
+{
+ switch (mdata->type) {
+ case XPMFILE:
+ if (mdata->stream.file != (stdin))
+ fclose(mdata->stream.file);
+ break;
+#ifndef NO_ZPIPE
+ case XPMPIPE:
+ pclose(mdata->stream.file);
+ break;
+#endif
+ }
+}
diff --git a/xc/extras/Xpm/lib/RdFToP.c b/xc/extras/Xpm/lib/RdFToP.c
new file mode 100644
index 000000000..212d26065
--- /dev/null
+++ b/xc/extras/Xpm/lib/RdFToP.c
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* RdFToP.c: *
+* *
+* XPM library *
+* Parse an XPM file and create the pixmap and possibly its mask *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmReadFileToPixmap(display, d, filename, pixmap_return,
+ shapemask_return, attributes)
+ Display *display;
+ Drawable d;
+ char *filename;
+ Pixmap *pixmap_return;
+ Pixmap *shapemask_return;
+ XpmAttributes *attributes;
+{
+ XImage *ximage, *shapeimage;
+ int ErrorStatus;
+
+ /* initialize return values */
+ if (pixmap_return)
+ *pixmap_return = 0;
+ if (shapemask_return)
+ *shapemask_return = 0;
+
+ /* create the images */
+ ErrorStatus = XpmReadFileToImage(display, filename,
+ (pixmap_return ? &ximage : NULL),
+ (shapemask_return ? &shapeimage : NULL),
+ attributes);
+
+ if (ErrorStatus < 0) /* fatal error */
+ return (ErrorStatus);
+
+ /* create the pixmaps and destroy images */
+ if (pixmap_return && ximage) {
+ xpmCreatePixmapFromImage(display, d, ximage, pixmap_return);
+ XDestroyImage(ximage);
+ }
+ if (shapemask_return && shapeimage) {
+ xpmCreatePixmapFromImage(display, d, shapeimage, shapemask_return);
+ XDestroyImage(shapeimage);
+ }
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/Smakefile b/xc/extras/Xpm/lib/Smakefile
new file mode 100644
index 000000000..3702680f4
--- /dev/null
+++ b/xc/extras/Xpm/lib/Smakefile
@@ -0,0 +1,89 @@
+#
+# Copyright (C) 1996 Lorens Younes
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# Lorens Younes BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of Lorens Younes shall not be
+# used in advertising or otherwise to promote the sale, use or other dealings
+# in this Software without prior written authorization from Lorens Younes.
+#
+
+#
+# XPM Makefile for SAS/C - Lorens Younes (d93-hyo@nada.kth.se)
+#
+
+CC= sc:c/sc
+OML= sc:c/oml
+RM= c:delete
+CP= c:copy
+MKDIR= c:makedir
+
+CDEBUGFLAGS= opt optsched utillib
+DEFINES= def=NO_ZPIPE def=NEED_STRCASECMP def=AMIGA
+
+DESTBINDIR= Projects:bin
+DESTLIBDIR= Projects:lib
+DESTINCLUDEDIR= Projects:include
+
+OBJS= data.o create.o misc.o rgb.o scan.o parse.o hashtab.o \
+ WrFFrI.o RdFToI.o CrIFrDat.o CrDatFrI.o \
+ CrIFrBuf.o CrBufFrI.o \
+ RdFToDat.o WrFFrDat.o \
+ Attrib.o Image.o Info.o RdFToBuf.o WrFFrBuf.o \
+ amigax.o
+
+CFLAGS= $(CDEBUGFLAGS) $(DEFINES) ansi nochkabort errrexx noicons nostkchk\
+ verbose ignore=85+100+154+161+304
+
+all: xpm.lib
+
+clean:
+ -$(RM) \#?.o \#?.lib \#?.lnk
+
+xpm.lib: $(OBJS)
+ $(OML) $@ r $(OBJS)
+
+install:
+ -$(MKDIR) $(DESTLIBDIR)
+ $(CP) xpm.lib $(DESTLIBDIR)
+ -$(MKDIR) $(DESTINCLUDEDIR)
+ $(CP) xpm.h $(DESTINCLUDEDIR)
+ $(CP) amigax.h $(DESTINCLUDEDIR)
+
+# Other dependencies.
+CrBufFrI.o: XpmI.h xpm.h amigax.h
+CrDatFI.o: XpmI.h xpm.h amigax.h
+CrIFrBuf.o: XpmI.h xpm.h amigax.h
+CrIFrDat.o: XpmI.h xpm.h amigax.h
+RdFToDat.o: XpmI.h xpm.h amigax.h
+RdFToI.o: XpmI.h xpm.h amigax.h
+WrFFrDat.o: XpmI.h xpm.h amigax.h
+WrFFrI.o: XpmI.h xpm.h amigax.h
+create.o: XpmI.h xpm.h amigax.h
+data.o: XpmI.h xpm.h amigax.h
+hashtab.o: XpmI.h xpm.h amigax.h
+misc.o: XpmI.h xpm.h amigax.h
+parse.o: XpmI.h xpm.h amigax.h
+rgb.o: XpmI.h xpm.h amigax.h
+scan.o: XpmI.h xpm.h amigax.h
+Attrib.o: XpmI.h xpm.h amigax.h
+Image.o: XpmI.h xpm.h amigax.h
+Info.o: XpmI.h xpm.h amigax.h
+RdFToBuf.o: XpmI.h xpm.h amigax.h
+WrFFrBuf.o: XpmI.h xpm.h amigax.h
+amigax.o: XpmI.h xpm.h amigax.h
diff --git a/xc/extras/Xpm/lib/WrFFrBuf.c b/xc/extras/Xpm/lib/WrFFrBuf.c
new file mode 100644
index 000000000..3ed6685ad
--- /dev/null
+++ b/xc/extras/Xpm/lib/WrFFrBuf.c
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* WrFFrBuf.c: *
+* *
+* XPM library *
+* Write a memory buffer to a file, provided as a convenience. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmWriteFileFromBuffer(filename, buffer)
+ char *filename;
+ char *buffer;
+{
+ int fcheck, len;
+ FILE *fp = fopen(filename, "w");
+
+ if (!fp)
+ return XpmOpenFailed;
+
+ len = strlen(buffer);
+ fcheck = fwrite(buffer, len, 1, fp);
+ fclose(fp);
+ if (fcheck != 1)
+ return XpmOpenFailed;
+
+ return XpmSuccess;
+}
diff --git a/xc/extras/Xpm/lib/WrFFrDat.c b/xc/extras/Xpm/lib/WrFFrDat.c
new file mode 100644
index 000000000..bfaa9097d
--- /dev/null
+++ b/xc/extras/Xpm/lib/WrFFrDat.c
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* WrFFrData.c: *
+* *
+* XPM library *
+* Parse an Xpm array and write a file that corresponds to it. *
+* *
+* Developed by Dan Greening dgreen@cs.ucla.edu / dgreen@sti.com *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmWriteFileFromData(filename, data)
+ char *filename;
+ char **data;
+{
+ XpmImage image;
+ XpmInfo info;
+ int ErrorStatus;
+
+ info.valuemask = XpmReturnComments | XpmReturnExtensions;
+
+ ErrorStatus = XpmCreateXpmImageFromData(data, &image, &info);
+
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ ErrorStatus = XpmWriteFileFromXpmImage(filename, &image, &info);
+
+ XpmFreeXpmImage(&image);
+ XpmFreeXpmInfo(&info);
+
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/WrFFrI.c b/xc/extras/Xpm/lib/WrFFrI.c
new file mode 100644
index 000000000..2b1e156cc
--- /dev/null
+++ b/xc/extras/Xpm/lib/WrFFrI.c
@@ -0,0 +1,359 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* WrFFrI.c: *
+* *
+* XPM library *
+* Write an image and possibly its mask to an XPM file *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to AMIGA has been added by
+ * Lorens Younes (d93-hyo@nada.kth.se) 4/96
+ */
+
+#include "XpmI.h"
+#if !defined(NO_ZPIPE) && defined(WIN32)
+# define popen _popen
+# define pclose _pclose
+#endif
+
+/* MS Windows define a function called WriteFile @#%#&!!! */
+LFUNC(xpmWriteFile, int, (FILE *file, XpmImage *image, char *name,
+ XpmInfo *info));
+
+LFUNC(WriteColors, void, (FILE *file, XpmColor *colors, unsigned int ncolors));
+
+LFUNC(WritePixels, int, (FILE *file, unsigned int width, unsigned int height,
+ unsigned int cpp, unsigned int *pixels,
+ XpmColor *colors));
+
+LFUNC(WriteExtensions, void, (FILE *file, XpmExtension *ext,
+ unsigned int num));
+
+LFUNC(OpenWriteFile, int, (char *filename, xpmData *mdata));
+LFUNC(xpmDataClose, void, (xpmData *mdata));
+
+int
+XpmWriteFileFromImage(display, filename, image, shapeimage, attributes)
+ Display *display;
+ char *filename;
+ XImage *image;
+ XImage *shapeimage;
+ XpmAttributes *attributes;
+{
+ XpmImage xpmimage;
+ XpmInfo info;
+ int ErrorStatus;
+
+ /* create an XpmImage from the image */
+ ErrorStatus = XpmCreateXpmImageFromImage(display, image, shapeimage,
+ &xpmimage, attributes);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /* write the file from the XpmImage */
+ if (attributes) {
+ xpmSetInfo(&info, attributes);
+ ErrorStatus = XpmWriteFileFromXpmImage(filename, &xpmimage, &info);
+ } else
+ ErrorStatus = XpmWriteFileFromXpmImage(filename, &xpmimage, NULL);
+
+ /* free the XpmImage */
+ XpmFreeXpmImage(&xpmimage);
+
+ return (ErrorStatus);
+}
+
+int
+XpmWriteFileFromXpmImage(filename, image, info)
+ char *filename;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ xpmData mdata;
+ char *name, *dot, *s, new_name[BUFSIZ];
+ int ErrorStatus;
+
+ /* open file to write */
+ if ((ErrorStatus = OpenWriteFile(filename, &mdata)) != XpmSuccess)
+ return (ErrorStatus);
+
+ /* figure out a name */
+ if (filename) {
+#ifdef VMS
+ name = filename;
+#else
+ if (!(name = rindex(filename, '/'))
+#ifdef AMIGA
+ && !(name = rindex(filename, ':'))
+#endif
+ )
+ name = filename;
+ else
+ name++;
+#endif
+ /* let's try to make a valid C syntax name */
+ if (dot = index(name, '.')) {
+ strcpy(new_name, name);
+ /* change '.' to '_' */
+ name = s = new_name;
+ while (dot = index(s, '.')) {
+ *dot = '_';
+ s = dot;
+ }
+ }
+ if (dot = index(name, '-')) {
+ if (name != new_name) {
+ strcpy(new_name, name);
+ name = new_name;
+ }
+ /* change '-' to '_' */
+ s = name;
+ while (dot = index(s, '-')) {
+ *dot = '_';
+ s = dot;
+ }
+ }
+ } else
+ name = "image_name";
+
+ /* write the XpmData from the XpmImage */
+ if (ErrorStatus == XpmSuccess)
+ ErrorStatus = xpmWriteFile(mdata.stream.file, image, name, info);
+
+ xpmDataClose(&mdata);
+
+ return (ErrorStatus);
+}
+
+static int
+xpmWriteFile(file, image, name, info)
+ FILE *file;
+ XpmImage *image;
+ char *name;
+ XpmInfo *info;
+{
+ /* calculation variables */
+ unsigned int cmts, extensions;
+ int ErrorStatus;
+
+ cmts = info && (info->valuemask & XpmComments);
+ extensions = info && (info->valuemask & XpmExtensions)
+ && info->nextensions;
+
+ /* print the header line */
+ fprintf(file, "/* XPM */\nstatic char * %s[] = {\n", name);
+
+ /* print the hints line */
+ if (cmts && info->hints_cmt)
+ fprintf(file, "/*%s*/\n", info->hints_cmt);
+
+ fprintf(file, "\"%d %d %d %d", image->width, image->height,
+ image->ncolors, image->cpp);
+
+ if (info && (info->valuemask & XpmHotspot))
+ fprintf(file, " %d %d", info->x_hotspot, info->y_hotspot);
+
+ if (extensions)
+ fprintf(file, " XPMEXT");
+
+ fprintf(file, "\",\n");
+
+ /* print colors */
+ if (cmts && info->colors_cmt)
+ fprintf(file, "/*%s*/\n", info->colors_cmt);
+
+ WriteColors(file, image->colorTable, image->ncolors);
+
+ /* print pixels */
+ if (cmts && info->pixels_cmt)
+ fprintf(file, "/*%s*/\n", info->pixels_cmt);
+
+ ErrorStatus = WritePixels(file, image->width, image->height, image->cpp,
+ image->data, image->colorTable);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /* print extensions */
+ if (extensions)
+ WriteExtensions(file, info->extensions, info->nextensions);
+
+ /* close the array */
+ fprintf(file, "};\n");
+
+ return (XpmSuccess);
+}
+
+static void
+WriteColors(file, colors, ncolors)
+ FILE *file;
+ XpmColor *colors;
+ unsigned int ncolors;
+{
+ unsigned int a, key;
+ char *s;
+ char **defaults;
+
+ for (a = 0; a < ncolors; a++, colors++) {
+
+ defaults = (char **) colors;
+ fprintf(file, "\"%s", *defaults++);
+
+ for (key = 1; key <= NKEYS; key++, defaults++) {
+ if (s = *defaults)
+ fprintf(file, "\t%s %s", xpmColorKeys[key - 1], s);
+ }
+ fprintf(file, "\",\n");
+ }
+}
+
+
+static int
+WritePixels(file, width, height, cpp, pixels, colors)
+ FILE *file;
+ unsigned int width;
+ unsigned int height;
+ unsigned int cpp;
+ unsigned int *pixels;
+ XpmColor *colors;
+{
+ char *s, *p, *buf;
+ unsigned int x, y, h;
+
+ h = height - 1;
+ p = buf = (char *) XpmMalloc(width * cpp + 3);
+ if (!buf)
+ return (XpmNoMemory);
+ *buf = '"';
+ p++;
+ for (y = 0; y < h; y++) {
+ s = p;
+ for (x = 0; x < width; x++, pixels++) {
+ strncpy(s, colors[*pixels].string, cpp);
+ s += cpp;
+ }
+ *s++ = '"';
+ *s = '\0';
+ fprintf(file, "%s,\n", buf);
+ }
+ /* duplicate some code to avoid a test in the loop */
+ s = p;
+ for (x = 0; x < width; x++, pixels++) {
+ strncpy(s, colors[*pixels].string, cpp);
+ s += cpp;
+ }
+ *s++ = '"';
+ *s = '\0';
+ fprintf(file, "%s", buf);
+
+ XpmFree(buf);
+ return (XpmSuccess);
+}
+
+static void
+WriteExtensions(file, ext, num)
+ FILE *file;
+ XpmExtension *ext;
+ unsigned int num;
+{
+ unsigned int x, y, n;
+ char **line;
+
+ for (x = 0; x < num; x++, ext++) {
+ fprintf(file, ",\n\"XPMEXT %s\"", ext->name);
+ n = ext->nlines;
+ for (y = 0, line = ext->lines; y < n; y++, line++)
+ fprintf(file, ",\n\"%s\"", *line);
+ }
+ fprintf(file, ",\n\"XPMENDEXT\"");
+}
+
+/*
+ * open the given file to be written as an xpmData which is returned
+ */
+static int
+OpenWriteFile(filename, mdata)
+ char *filename;
+ xpmData *mdata;
+{
+#ifndef NO_ZPIPE
+ char buf[BUFSIZ];
+
+#endif
+
+ if (!filename) {
+ mdata->stream.file = (stdout);
+ mdata->type = XPMFILE;
+ } else {
+#ifndef NO_ZPIPE
+ int len = strlen(filename);
+ if (len > 2 && !strcmp(".Z", filename + (len - 2))) {
+ sprintf(buf, "compress > \"%s\"", filename);
+ if (!(mdata->stream.file = popen(buf, "w")))
+ return (XpmOpenFailed);
+
+ mdata->type = XPMPIPE;
+ } else if (len > 3 && !strcmp(".gz", filename + (len - 3))) {
+ sprintf(buf, "gzip -q > \"%s\"", filename);
+ if (!(mdata->stream.file = popen(buf, "w")))
+ return (XpmOpenFailed);
+
+ mdata->type = XPMPIPE;
+ } else {
+#endif
+ if (!(mdata->stream.file = fopen(filename, "w")))
+ return (XpmOpenFailed);
+
+ mdata->type = XPMFILE;
+#ifndef NO_ZPIPE
+ }
+#endif
+ }
+ return (XpmSuccess);
+}
+
+/*
+ * close the file related to the xpmData if any
+ */
+static void
+xpmDataClose(mdata)
+ xpmData *mdata;
+{
+ switch (mdata->type) {
+ case XPMFILE:
+ if (mdata->stream.file != (stdout))
+ fclose(mdata->stream.file);
+ break;
+#ifndef NO_ZPIPE
+ case XPMPIPE:
+ pclose(mdata->stream.file);
+ break;
+#endif
+ }
+}
diff --git a/xc/extras/Xpm/lib/WrFFrP.c b/xc/extras/Xpm/lib/WrFFrP.c
new file mode 100644
index 000000000..b78ea0ca6
--- /dev/null
+++ b/xc/extras/Xpm/lib/WrFFrP.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* WrFFrP.c: *
+* *
+* XPM library *
+* Write a pixmap and possibly its mask to an XPM file *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+int
+XpmWriteFileFromPixmap(display, filename, pixmap, shapemask, attributes)
+ Display *display;
+ char *filename;
+ Pixmap pixmap;
+ Pixmap shapemask;
+ XpmAttributes *attributes;
+{
+ XImage *ximage = NULL;
+ XImage *shapeimage = NULL;
+ unsigned int width = 0;
+ unsigned int height = 0;
+ int ErrorStatus;
+
+ /* get geometry */
+ if (attributes && attributes->valuemask & XpmSize) {
+ width = attributes->width;
+ height = attributes->height;
+ }
+ /* get the ximages */
+ if (pixmap)
+ xpmCreateImageFromPixmap(display, pixmap, &ximage, &width, &height);
+ if (shapemask)
+ xpmCreateImageFromPixmap(display, shapemask, &shapeimage,
+ &width, &height);
+
+ /* write to the file */
+ ErrorStatus = XpmWriteFileFromImage(display, filename, ximage, shapeimage,
+ attributes);
+
+ /* destroy the ximages */
+ if (ximage)
+ XDestroyImage(ximage);
+ if (shapeimage)
+ XDestroyImage(shapeimage);
+
+ return (ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/Xpm-def.cpp b/xc/extras/Xpm/lib/Xpm-def.cpp
new file mode 100644
index 000000000..51802949d
--- /dev/null
+++ b/xc/extras/Xpm/lib/Xpm-def.cpp
@@ -0,0 +1,37 @@
+LIBRARY Xpm
+VERSION LIBRARY_VERSION
+EXPORTS
+ XpmAttributesSize
+ XpmCreateBufferFromImage
+ XpmCreateBufferFromPixmap
+ XpmCreateBufferFromXpmImage
+ XpmCreateDataFromImage
+ XpmCreateDataFromPixmap
+ XpmCreateDataFromXpmImage
+ XpmCreateImageFromBuffer
+ XpmCreateImageFromData
+ XpmCreateImageFromXpmImage
+ XpmCreatePixmapFromBuffer
+ XpmCreatePixmapFromData
+ XpmCreatePixmapFromXpmImage
+ XpmCreateXpmImageFromBuffer
+ XpmCreateXpmImageFromData
+ XpmCreateXpmImageFromImage
+ XpmCreateXpmImageFromPixmap
+ XpmFree
+ XpmFreeAttributes
+ XpmFreeExtensions
+ XpmFreeXpmImage
+ XpmFreeXpmInfo
+ XpmGetErrorString
+ XpmLibraryVersion
+ XpmReadFileToBuffer
+ XpmReadFileToData
+ XpmReadFileToImage
+ XpmReadFileToPixmap
+ XpmReadFileToXpmImage
+ XpmWriteFileFromBuffer
+ XpmWriteFileFromData
+ XpmWriteFileFromImage
+ XpmWriteFileFromPixmap
+ XpmWriteFileFromXpmImage
diff --git a/xc/extras/Xpm/lib/XpmI.h b/xc/extras/Xpm/lib/XpmI.h
new file mode 100644
index 000000000..e330bfc56
--- /dev/null
+++ b/xc/extras/Xpm/lib/XpmI.h
@@ -0,0 +1,343 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* XpmI.h: *
+* *
+* XPM library *
+* Internal Include file *
+* *
+* ** Everything defined here is subject to changes any time. ** *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to FOR_MSW has been added by
+ * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
+ */
+
+#ifndef XPMI_h
+#define XPMI_h
+
+#include "xpm.h"
+
+/*
+ * lets try to solve include files
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+/* stdio.h doesn't declare popen on a Sequent DYNIX OS */
+#ifdef sequent
+extern FILE *popen();
+#endif
+
+#if defined(SYSV) || defined(SVR4) || defined(VMS) || defined(WIN32)
+#include <string.h>
+
+#ifndef index
+#define index strchr
+#endif
+
+#ifndef rindex
+#define rindex strrchr
+#endif
+
+#else /* defined(SYSV) || defined(SVR4) || defined(VMS) */
+#include <strings.h>
+#endif
+
+
+
+#if defined(SYSV) || defined(SVR4) || defined(VMS) || defined(WIN32)
+#ifndef bcopy
+#define bcopy(source, dest, count) memcpy(dest, source, count)
+#endif
+#ifndef bzero
+#define bzero(b, len) memset(b, 0, len)
+#endif
+#endif
+
+/* the following is defined in X11R6 but not in previous versions */
+#ifdef __alpha
+#ifndef LONG64
+#define LONG64
+#endif
+#endif
+
+#ifdef VMS
+#include <unixio.h>
+#include <file.h>
+#endif
+
+/* The following should help people wanting to use their own memory allocation
+ * functions. To avoid the overhead of a function call when the standard
+ * functions are used these are all macros, even the XpmFree function which
+ * needs to be a real function for the outside world though.
+ * So if change these be sure to change the XpmFree function in misc.c
+ * accordingly.
+ */
+#define XpmFree(ptr) free(ptr)
+
+#ifndef FOR_MSW
+#define XpmMalloc(size) malloc((size))
+#define XpmRealloc(ptr, size) realloc((ptr), (size))
+#define XpmCalloc(nelem, elsize) calloc((nelem), (elsize))
+#else
+/* checks for mallocs bigger than 64K */
+#define XpmMalloc(size) boundCheckingMalloc((long)(size))/* in simx.[ch] */
+#define XpmRealloc(ptr, size) boundCheckingRealloc((ptr),(long)(size))
+#define XpmCalloc(nelem, elsize) \
+ boundCheckingCalloc((long)(nelem),(long) (elsize))
+#endif
+
+#define XPMMAXCMTLEN BUFSIZ
+typedef struct {
+ unsigned int type;
+ union {
+ FILE *file;
+ char **data;
+ } stream;
+ char *cptr;
+ unsigned int line;
+ int CommentLength;
+ char Comment[XPMMAXCMTLEN];
+ char *Bcmt, *Ecmt, Bos, Eos;
+ int format; /* 1 if XPM1, 0 otherwise */
+#ifdef CXPMPROG
+ int lineNum;
+ int charNum;
+#endif
+} xpmData;
+
+#define XPMARRAY 0
+#define XPMFILE 1
+#define XPMPIPE 2
+#define XPMBUFFER 3
+
+#define EOL '\n'
+#define TAB '\t'
+#define SPC ' '
+
+typedef struct {
+ char *type; /* key word */
+ char *Bcmt; /* string beginning comments */
+ char *Ecmt; /* string ending comments */
+ char Bos; /* character beginning strings */
+ char Eos; /* character ending strings */
+ char *Strs; /* strings separator */
+ char *Dec; /* data declaration string */
+ char *Boa; /* string beginning assignment */
+ char *Eoa; /* string ending assignment */
+} xpmDataType;
+
+extern xpmDataType xpmDataTypes[];
+
+/*
+ * rgb values and ascii names (from rgb text file) rgb values,
+ * range of 0 -> 65535 color mnemonic of rgb value
+ */
+typedef struct {
+ int r, g, b;
+ char *name;
+} xpmRgbName;
+
+/* Maximum number of rgb mnemonics allowed in rgb text file. */
+#define MAX_RGBNAMES 1024
+
+extern char *xpmColorKeys[];
+
+#define TRANSPARENT_COLOR "None" /* this must be a string! */
+
+/* number of xpmColorKeys */
+#define NKEYS 5
+
+/* XPM internal routines */
+
+FUNC(xpmParseData, int, (xpmData *data, XpmImage *image, XpmInfo *info));
+FUNC(xpmParseDataAndCreate, int, (Display *display, xpmData *data,
+ XImage **image_return,
+ XImage **shapeimage_return,
+ XpmImage *image, XpmInfo *info,
+ XpmAttributes *attributes));
+
+FUNC(xpmFreeColorTable, void, (XpmColor *colorTable, int ncolors));
+
+FUNC(xpmInitAttributes, void, (XpmAttributes *attributes));
+
+FUNC(xpmInitXpmImage, void, (XpmImage *image));
+
+FUNC(xpmInitXpmInfo, void, (XpmInfo *info));
+
+FUNC(xpmSetInfoMask, void, (XpmInfo *info, XpmAttributes *attributes));
+FUNC(xpmSetInfo, void, (XpmInfo *info, XpmAttributes *attributes));
+FUNC(xpmSetAttributes, void, (XpmAttributes *attributes, XpmImage *image,
+ XpmInfo *info));
+
+#if !defined(FOR_MSW) && !defined(AMIGA)
+FUNC(xpmCreatePixmapFromImage, void, (Display *display, Drawable d,
+ XImage *ximage, Pixmap *pixmap_return));
+
+FUNC(xpmCreateImageFromPixmap, void, (Display *display, Pixmap pixmap,
+ XImage **ximage_return,
+ unsigned int *width,
+ unsigned int *height));
+#endif
+
+/* structures and functions related to hastable code */
+
+typedef struct _xpmHashAtom {
+ char *name;
+ void *data;
+} *xpmHashAtom;
+
+typedef struct {
+ int size;
+ int limit;
+ int used;
+ xpmHashAtom *atomTable;
+} xpmHashTable;
+
+FUNC(xpmHashTableInit, int, (xpmHashTable *table));
+FUNC(xpmHashTableFree, void, (xpmHashTable *table));
+FUNC(xpmHashSlot, xpmHashAtom *, (xpmHashTable *table, char *s));
+FUNC(xpmHashIntern, int, (xpmHashTable *table, char *tag, void *data));
+
+#define HashAtomData(i) ((void *)i)
+#define HashColorIndex(slot) ((unsigned int)((*slot)->data))
+#define USE_HASHTABLE (cpp > 2 && ncolors > 4)
+
+/* I/O utility */
+
+FUNC(xpmNextString, int, (xpmData *mdata));
+FUNC(xpmNextUI, int, (xpmData *mdata, unsigned int *ui_return));
+FUNC(xpmGetString, int, (xpmData *mdata, char **sptr, unsigned int *l));
+
+#define xpmGetC(mdata) \
+ ((!mdata->type || mdata->type == XPMBUFFER) ? \
+ (*mdata->cptr++) : (getc(mdata->stream.file)))
+
+FUNC(xpmNextWord, unsigned int,
+ (xpmData *mdata, char *buf, unsigned int buflen));
+FUNC(xpmGetCmt, int, (xpmData *mdata, char **cmt));
+FUNC(xpmParseHeader, int, (xpmData *mdata));
+FUNC(xpmParseValues, int, (xpmData *data, unsigned int *width,
+ unsigned int *height, unsigned int *ncolors,
+ unsigned int *cpp, unsigned int *x_hotspot,
+ unsigned int *y_hotspot, unsigned int *hotspot,
+ unsigned int *extensions));
+
+FUNC(xpmParseColors, int, (xpmData *data, unsigned int ncolors,
+ unsigned int cpp, XpmColor **colorTablePtr,
+ xpmHashTable *hashtable));
+
+FUNC(xpmParseExtensions, int, (xpmData *data, XpmExtension **extensions,
+ unsigned int *nextensions));
+
+/* RGB utility */
+
+FUNC(xpmReadRgbNames, int, (char *rgb_fname, xpmRgbName *rgbn));
+FUNC(xpmGetRgbName, char *, (xpmRgbName *rgbn, int rgbn_max,
+ int red, int green, int blue));
+FUNC(xpmFreeRgbNames, void, (xpmRgbName *rgbn, int rgbn_max));
+#ifdef FOR_MSW
+FUNC(xpmGetRGBfromName,int, (char *name, int *r, int *g, int *b));
+#endif
+
+#ifndef AMIGA
+FUNC(xpm_xynormalizeimagebits, void, (register unsigned char *bp,
+ register XImage *img));
+FUNC(xpm_znormalizeimagebits, void, (register unsigned char *bp,
+ register XImage *img));
+
+/*
+ * Macros
+ *
+ * The XYNORMALIZE macro determines whether XY format data requires
+ * normalization and calls a routine to do so if needed. The logic in
+ * this module is designed for LSBFirst byte and bit order, so
+ * normalization is done as required to present the data in this order.
+ *
+ * The ZNORMALIZE macro performs byte and nibble order normalization if
+ * required for Z format data.
+ *
+ * The XYINDEX macro computes the index to the starting byte (char) boundary
+ * for a bitmap_unit containing a pixel with coordinates x and y for image
+ * data in XY format.
+ *
+ * The ZINDEX* macros compute the index to the starting byte (char) boundary
+ * for a pixel with coordinates x and y for image data in ZPixmap format.
+ *
+ */
+
+#define XYNORMALIZE(bp, img) \
+ if ((img->byte_order == MSBFirst) || (img->bitmap_bit_order == MSBFirst)) \
+ xpm_xynormalizeimagebits((unsigned char *)(bp), img)
+
+#define ZNORMALIZE(bp, img) \
+ if (img->byte_order == MSBFirst) \
+ xpm_znormalizeimagebits((unsigned char *)(bp), img)
+
+#define XYINDEX(x, y, img) \
+ ((y) * img->bytes_per_line) + \
+ (((x) + img->xoffset) / img->bitmap_unit) * (img->bitmap_unit >> 3)
+
+#define ZINDEX(x, y, img) ((y) * img->bytes_per_line) + \
+ (((x) * img->bits_per_pixel) >> 3)
+
+#define ZINDEX32(x, y, img) ((y) * img->bytes_per_line) + ((x) << 2)
+
+#define ZINDEX16(x, y, img) ((y) * img->bytes_per_line) + ((x) << 1)
+
+#define ZINDEX8(x, y, img) ((y) * img->bytes_per_line) + (x)
+
+#define ZINDEX1(x, y, img) ((y) * img->bytes_per_line) + ((x) >> 3)
+#endif /* not AMIGA */
+
+#ifdef __STDC__
+#define Const const
+#else
+#define Const /**/
+#endif
+
+#ifdef NEED_STRDUP
+FUNC(xpmstrdup, char *, (char *s1));
+#else
+#undef xpmstrdup
+#define xpmstrdup strdup
+#endif
+
+#ifdef NEED_STRCASECMP
+FUNC(xpmstrcasecmp, int, (char *s1, char *s2));
+#else
+#undef xpmstrcasecmp
+#define xpmstrcasecmp strcasecmp
+#endif
+
+FUNC(xpmatoui, unsigned int,
+ (char *p, unsigned int l, unsigned int *ui_return));
+
+#endif
diff --git a/xc/extras/Xpm/lib/amigax.c b/xc/extras/Xpm/lib/amigax.c
new file mode 100644
index 000000000..aa82d49ca
--- /dev/null
+++ b/xc/extras/Xpm/lib/amigax.c
@@ -0,0 +1,382 @@
+/*
+ * Copyright (C) 19896 Lorens Younes
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * Lorens Younes BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Lorens Younes shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from Lorens Younes.
+ */
+
+/*****************************************************************************\
+* amigax.c: *
+* *
+* XPM library *
+* Emulates some Xlib functionality for Amiga. *
+* *
+* Developed by Lorens Younes (d93-hyo@nada.kth.se) 7/95 *
+* Revised 4/96 *
+\*****************************************************************************/
+
+#include "XpmI.h"
+#include "amigax.h"
+
+#include <graphics/gfxbase.h>
+#include <intuition/screens.h>
+
+#include <proto/exec.h>
+
+
+static struct RastPort *
+AllocRastPort (unsigned int, unsigned int, unsigned int);
+static void
+FreeRastPort (struct RastPort *, unsigned int,unsigned int);
+
+
+static struct RastPort *
+AllocRastPort (
+ unsigned int width,
+ unsigned int height,
+ unsigned int depth)
+{
+ struct RastPort *rp;
+
+ rp = XpmMalloc (sizeof (*rp));
+ if (rp != NULL)
+ {
+ InitRastPort (rp);
+ if (GfxBase->LibNode.lib_Version >= 39)
+ {
+ rp->BitMap = AllocBitMap (width, height, depth, BMF_CLEAR, NULL);
+ if (rp->BitMap == NULL)
+ {
+ FreeRastPort (rp, width, height);
+ return NULL;
+ }
+ }
+ else
+ {
+ unsigned int i;
+
+ rp->BitMap = XpmMalloc (sizeof (*rp->BitMap));
+ if (rp->BitMap == NULL)
+ {
+ FreeRastPort (rp, width, height);
+ return NULL;
+ }
+
+ InitBitMap (rp->BitMap, depth, width, height);
+ for (i = 0; i < depth; ++i)
+ rp->BitMap->Planes[i] = NULL;
+ for (i = 0; i < depth; ++i)
+ {
+ rp->BitMap->Planes[i] = (PLANEPTR)AllocRaster (width, height);
+ if (rp->BitMap->Planes[i] == NULL)
+ {
+ FreeRastPort (rp, width, height);
+ return NULL;
+ }
+ }
+ }
+ }
+
+ return rp;
+}
+
+
+static void
+FreeRastPort (
+ struct RastPort *rp,
+ unsigned int width,
+ unsigned int height)
+{
+ if (rp != NULL)
+ {
+ if (rp->BitMap != NULL)
+ {
+ WaitBlit ();
+ if (GfxBase->LibNode.lib_Version >= 39)
+ FreeBitMap (rp->BitMap);
+ else
+ {
+ unsigned int i;
+
+ for (i = 0; i < rp->BitMap->Depth; ++i)
+ {
+ if (rp->BitMap->Planes[i] != NULL)
+ FreeRaster (rp->BitMap->Planes[i], width, height);
+ }
+ XpmFree (rp->BitMap);
+ }
+ }
+ XpmFree (rp);
+ }
+}
+
+
+XImage *
+AllocXImage (
+ unsigned int width,
+ unsigned int height,
+ unsigned int depth)
+{
+ XImage *img;
+
+ img = XpmMalloc (sizeof (*img));
+ if (img != NULL)
+ {
+ img->width = width;
+ img->height = height;
+ img->rp = AllocRastPort (img->width, img->height, depth);
+ if (img->rp == NULL)
+ {
+ FreeXImage (img);
+ return NULL;
+ }
+ }
+
+ return img;
+}
+
+
+int
+FreeXImage (
+ XImage *ximage)
+{
+ if (ximage != NULL)
+ {
+ FreeRastPort (ximage->rp, ximage->width, ximage->height);
+ XpmFree (ximage);
+ }
+
+ return Success;
+}
+
+
+int
+XPutPixel (
+ XImage *ximage,
+ int x,
+ int y,
+ unsigned long pixel)
+{
+ SetAPen (ximage->rp, pixel);
+ WritePixel (ximage->rp, x, y);
+
+ return Success;
+}
+
+
+Status
+AllocBestPen (
+ Colormap colormap,
+ XColor *screen_in_out,
+ unsigned long precision,
+ Bool fail_if_bad)
+{
+ if (GfxBase->LibNode.lib_Version >= 39)
+ {
+ unsigned long r, g, b;
+
+ r = screen_in_out->red * 0x00010001;
+ g = screen_in_out->green * 0x00010001;
+ b = screen_in_out->blue * 0x00010001;
+ screen_in_out->pixel = ObtainBestPen (colormap, r, g, b,
+ OBP_Precision, precision,
+ OBP_FailIfBad, fail_if_bad,
+ TAG_DONE);
+ if (screen_in_out->pixel == -1)
+ return False;
+
+ QueryColor (colormap, screen_in_out);
+ }
+ else
+ {
+ XColor nearest, trial;
+ long nearest_delta, trial_delta;
+ int num_cells, i;
+
+ num_cells = colormap->Count;
+ nearest.pixel = 0;
+ QueryColor (colormap, &nearest);
+ nearest_delta = ((((screen_in_out->red >> 8) - (nearest.red >> 8))
+ * ((screen_in_out->red >> 8) - (nearest.red >> 8)))
+ +
+ (((screen_in_out->green >> 8) - (nearest.green >> 8))
+ * ((screen_in_out->green >> 8) - (nearest.green >> 8)))
+ +
+ (((screen_in_out->blue >> 8) - (nearest.blue >> 8))
+ * ((screen_in_out->blue >> 8) - (nearest.blue >> 8))));
+ for (i = 1; i < num_cells; i++)
+ {
+ /* precision and fail_if_bad is ignored under pre V39 */
+ trial.pixel = i;
+ QueryColor (colormap, &trial);
+ trial_delta = ((((screen_in_out->red >> 8) - (trial.red >> 8))
+ * ((screen_in_out->red >> 8) - (trial.red >> 8)))
+ +
+ (((screen_in_out->green >> 8) - (trial.green >> 8))
+ * ((screen_in_out->green >> 8) - (trial.green >> 8)))
+ +
+ (((screen_in_out->blue >> 8) - (trial.blue >> 8))
+ * ((screen_in_out->blue >> 8) - (trial.blue >> 8))));
+ if (trial_delta < nearest_delta)
+ {
+ nearest = trial;
+ nearest_delta = trial_delta;
+ }
+ }
+ screen_in_out->pixel = nearest.pixel;
+ screen_in_out->red = nearest.red;
+ screen_in_out->green = nearest.green;
+ screen_in_out->blue = nearest.blue;
+ }
+
+ return True;
+}
+
+
+int
+FreePens (
+ Colormap colormap,
+ unsigned long *pixels,
+ int npixels)
+{
+ if (GfxBase->LibNode.lib_Version >= 39)
+ {
+ int i;
+
+ for (i = 0; i < npixels; i++)
+ ReleasePen (colormap, pixels[i]);
+ }
+
+ return Success;
+}
+
+
+Status
+ParseColor (
+ char *spec,
+ XColor *exact_def_return)
+{
+ int spec_length;
+
+ if (spec == 0)
+ return False;
+
+ spec_length = strlen(spec);
+ if (spec[0] == '#')
+ {
+ int hexlen;
+ char hexstr[10];
+
+ hexlen = (spec_length - 1) / 3;
+ if (hexlen < 1 || hexlen > 4 || hexlen * 3 != spec_length - 1)
+ return False;
+
+ hexstr[hexlen] = '\0';
+ strncpy (hexstr, spec + 1, hexlen);
+ exact_def_return->red = strtoul (hexstr, NULL, 16) << (16 - 4*hexlen);
+ strncpy (hexstr, spec + 1 + hexlen, hexlen);
+ exact_def_return->green = strtoul (hexstr, NULL, 16) << (16 - 4*hexlen);
+ strncpy (hexstr, spec + 1 + 2 * hexlen, hexlen);
+ exact_def_return->blue = strtoul (hexstr, NULL, 16) << (16 - 4*hexlen);
+
+ return True;
+ }
+ else
+ {
+ FILE *rgbf;
+ int items, red, green, blue;
+ char line[512], name[512];
+ Bool success = False;
+
+ rgbf = fopen ("LIBS:rgb.txt", "r");
+ if (rgbf == NULL)
+ return False;
+
+ while (fgets(line, sizeof (line), rgbf) && !success)
+ {
+ items = sscanf (line, "%d %d %d %[^\n]\n",
+ &red, &green, &blue, name);
+ if (items != 4)
+ continue;
+
+ if (red < 0 || red > 0xFF
+ || green < 0 || green > 0xFF
+ || blue < 0 || blue > 0xFF)
+ {
+ continue;
+ }
+
+ if (0 == xpmstrcasecmp (spec, name))
+ {
+ exact_def_return->red = red * 0x0101;
+ exact_def_return->green = green * 0x0101;
+ exact_def_return->blue = blue * 0x0101;
+ success = True;
+ }
+ }
+ fclose (rgbf);
+
+ return success;
+ }
+}
+
+
+int
+QueryColor (
+ Colormap colormap,
+ XColor *def_in_out)
+{
+ if (GfxBase->LibNode.lib_Version >= 39)
+ {
+ unsigned long rgb[3];
+
+ GetRGB32 (colormap, def_in_out->pixel, 1, rgb);
+ def_in_out->red = rgb[0] >> 16;
+ def_in_out->green = rgb[1] >> 16;
+ def_in_out->blue = rgb[2] >> 16;
+ }
+ else
+ {
+ unsigned short rgb;
+
+ rgb = GetRGB4 (colormap, def_in_out->pixel);
+ def_in_out->red = ((rgb >> 8) & 0xF) * 0x1111;
+ def_in_out->green = ((rgb >> 4) & 0xF) * 0x1111;
+ def_in_out->blue = (rgb & 0xF) * 0x1111;
+ }
+
+ return Success;
+}
+
+
+int
+QueryColors (
+ Colormap colormap,
+ XColor *defs_in_out,
+ int ncolors)
+{
+ int i;
+
+ for (i = 0; i < ncolors; i++)
+ QueryColor (colormap, &defs_in_out[i]);
+
+ return Success;
+}
diff --git a/xc/extras/Xpm/lib/amigax.h b/xc/extras/Xpm/lib/amigax.h
new file mode 100644
index 000000000..213ed7619
--- /dev/null
+++ b/xc/extras/Xpm/lib/amigax.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 1996 Lorens Younes
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * Lorens Younes BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Lorens Younes shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from Lorens Younes.
+ */
+
+/*****************************************************************************\
+* amigax.h: *
+* *
+* XPM library *
+* Emulates some Xlib functionality for Amiga. *
+* *
+* Developed by Lorens Younes (d93-hyo@nada.kth.se) 7/95 *
+* Revised 4/96 *
+\*****************************************************************************/
+
+#ifndef AMIGA_X
+#define AMIGA_X
+
+
+#include <intuition/screens.h>
+
+#include <proto/exec.h>
+#include <proto/graphics.h>
+
+
+#define Success 0
+
+/* really never used */
+#define ZPixmap 2
+
+#define Bool int
+#define Status int
+#define True 1
+#define False 0
+
+typedef struct ColorMap *Colormap;
+
+typedef void *Visual;
+
+typedef struct {
+ int width, height;
+ struct RastPort *rp;
+} XImage;
+
+typedef struct {
+ unsigned long pixel;
+ unsigned short red, green, blue;
+} XColor;
+
+typedef struct Screen Display;
+
+
+#define XGrabServer(dpy) (Forbid ())
+#define XUngrabServer(dpy) (Permit ())
+
+#define XDefaultScreen(dpy) (0)
+#define XDefaultVisual(dpy, scr) (NULL)
+#define XDefaultColormap(dpy, scr) (dpy->ViewPort.ColorMap)
+#define XDefaultDepth(dpy, scr) (dpy->RastPort.BitMap->Depth)
+
+#define XCreateImage(dpy, vi, depth, format, offset, data, width, height, pad, bpl) \
+ (AllocXImage (width, height, depth))
+#define XDestroyImage(img) (FreeXImage (img))
+
+#define XAllocColor(dpy, cm, xc) \
+ (AllocBestPen (cm, xc, PRECISION_EXACT, True))
+#define XFreeColors(dpy, cm, pixels, npixels, planes) \
+ (FreePens (cm, pixels, npixels))
+#define XParseColor(dpy, cm, spec, exact_def_return) \
+ (ParseColor (spec, exact_def_return))
+#define XQueryColor(dpy, cm, def_in_out) \
+ (QueryColor(cm, def_in_out))
+#define XQueryColors(dpy, cm, defs_in_out, ncolors) \
+ (QueryColors(cm, defs_in_out, ncolors))
+
+
+XImage *
+AllocXImage (
+ unsigned int width,
+ unsigned int height,
+ unsigned int depth);
+
+
+int
+FreeXImage (
+ XImage *ximage);
+
+
+int
+XPutPixel (
+ XImage *ximage,
+ int x,
+ int y,
+ unsigned long pixel);
+
+
+Status
+AllocBestPen (
+ Colormap colormap,
+ XColor *screen_in_out,
+ unsigned long precision,
+ Bool fail_if_bad);
+
+
+int
+FreePens (
+ Colormap colormap,
+ unsigned long *pixels,
+ int npixels);
+
+
+Status
+ParseColor (
+ char *spec,
+ XColor *exact_def_return);
+
+
+int
+QueryColor (
+ Colormap colormap,
+ XColor *def_in_out);
+
+
+int
+QueryColors (
+ Colormap colormap,
+ XColor *defs_in_out,
+ int ncolors);
+
+
+#endif /* AMIGA_X */
diff --git a/xc/extras/Xpm/lib/create.c b/xc/extras/Xpm/lib/create.c
new file mode 100644
index 000000000..ebd695130
--- /dev/null
+++ b/xc/extras/Xpm/lib/create.c
@@ -0,0 +1,2486 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* create.c: *
+* *
+* XPM library *
+* Create an X image and possibly its related shape mask *
+* from the given XpmImage. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to FOR_MSW has been added by
+ * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
+ */
+
+/*
+ * The code related to AMIGA has been added by
+ * Lorens Younes (d93-hyo@nada.kth.se) 4/96
+ */
+
+#include "XpmI.h"
+#include <ctype.h>
+
+LFUNC(xpmVisualType, int, (Visual *visual));
+
+LFUNC(AllocColor, int, (Display *display, Colormap colormap,
+ char *colorname, XColor *xcolor, void *closure));
+LFUNC(FreeColors, int, (Display *display, Colormap colormap,
+ Pixel *pixels, int n, void *closure));
+
+#ifndef FOR_MSW
+LFUNC(SetCloseColor, int, (Display *display, Colormap colormap,
+ Visual *visual, XColor *col,
+ Pixel *image_pixel, Pixel *mask_pixel,
+ Pixel *alloc_pixels, unsigned int *nalloc_pixels,
+ XpmAttributes *attributes, XColor *cols, int ncols,
+ XpmAllocColorFunc allocColor, void *closure));
+#else
+/* let the window system take care of close colors */
+#endif
+
+LFUNC(SetColor, int, (Display *display, Colormap colormap, Visual *visual,
+ char *colorname, unsigned int color_index,
+ Pixel *image_pixel, Pixel *mask_pixel,
+ unsigned int *mask_pixel_index,
+ Pixel *alloc_pixels, unsigned int *nalloc_pixels,
+ Pixel *used_pixels, unsigned int *nused_pixels,
+ XpmAttributes *attributes, XColor *cols, int ncols,
+ XpmAllocColorFunc allocColor, void *closure));
+
+LFUNC(CreateXImage, int, (Display *display, Visual *visual,
+ unsigned int depth, int format, unsigned int width,
+ unsigned int height, XImage **image_return));
+
+LFUNC(CreateColors, int, (Display *display, XpmAttributes *attributes,
+ XpmColor *colors, unsigned int ncolors,
+ Pixel *image_pixels, Pixel *mask_pixels,
+ unsigned int *mask_pixel_index,
+ Pixel *alloc_pixels, unsigned int *nalloc_pixels,
+ Pixel *used_pixels, unsigned int *nused_pixels));
+
+#ifndef FOR_MSW
+LFUNC(ParseAndPutPixels, int, (xpmData *data, unsigned int width,
+ unsigned int height, unsigned int ncolors,
+ unsigned int cpp, XpmColor *colorTable,
+ xpmHashTable *hashtable,
+ XImage *image, Pixel *image_pixels,
+ XImage *mask, Pixel *mask_pixels));
+#else /* FOR_MSW */
+LFUNC(ParseAndPutPixels, int, (Display *dc, xpmData *data, unsigned int width,
+ unsigned int height, unsigned int ncolors,
+ unsigned int cpp, XpmColor *colorTable,
+ xpmHashTable *hashtable,
+ XImage *image, Pixel *image_pixels,
+ XImage *mask, Pixel *mask_pixels));
+#endif
+
+#ifndef FOR_MSW
+# ifndef AMIGA
+/* XImage pixel routines */
+LFUNC(PutImagePixels, void, (XImage *image, unsigned int width,
+ unsigned int height, unsigned int *pixelindex,
+ Pixel *pixels));
+
+LFUNC(PutImagePixels32, void, (XImage *image, unsigned int width,
+ unsigned int height, unsigned int *pixelindex,
+ Pixel *pixels));
+
+LFUNC(PutImagePixels16, void, (XImage *image, unsigned int width,
+ unsigned int height, unsigned int *pixelindex,
+ Pixel *pixels));
+
+LFUNC(PutImagePixels8, void, (XImage *image, unsigned int width,
+ unsigned int height, unsigned int *pixelindex,
+ Pixel *pixels));
+
+LFUNC(PutImagePixels1, void, (XImage *image, unsigned int width,
+ unsigned int height, unsigned int *pixelindex,
+ Pixel *pixels));
+
+LFUNC(PutPixel1, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel32, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel32MSB, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel32LSB, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel16MSB, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel16LSB, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel8, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel1MSB, int, (XImage *ximage, int x, int y, unsigned long pixel));
+LFUNC(PutPixel1LSB, int, (XImage *ximage, int x, int y, unsigned long pixel));
+
+# else /* AMIGA */
+LFUNC(APutImagePixels, void, (XImage *ximage, unsigned int width,
+ unsigned int height, unsigned int *pixelindex,
+ Pixel *pixels));
+# endif/* AMIGA */
+#else /* FOR_MSW */
+/* FOR_MSW pixel routine */
+LFUNC(MSWPutImagePixels, void, (Display *dc, XImage *image,
+ unsigned int width, unsigned int height,
+ unsigned int *pixelindex, Pixel *pixels));
+#endif /* FOR_MSW */
+
+#ifdef NEED_STRCASECMP
+FUNC(xpmstrcasecmp, int, (char *s1, char *s2));
+
+/*
+ * in case strcasecmp is not provided by the system here is one
+ * which does the trick
+ */
+int
+xpmstrcasecmp(s1, s2)
+ register char *s1, *s2;
+{
+ register int c1, c2;
+
+ while (*s1 && *s2) {
+ c1 = tolower(*s1);
+ c2 = tolower(*s2);
+ if (c1 != c2)
+ return (c1 - c2);
+ s1++;
+ s2++;
+ }
+ return (int) (*s1 - *s2);
+}
+
+#endif
+
+/*
+ * return the default color key related to the given visual
+ */
+static int
+xpmVisualType(visual)
+ Visual *visual;
+{
+#ifndef FOR_MSW
+# ifndef AMIGA
+ switch (visual->class) {
+ case StaticGray:
+ case GrayScale:
+ switch (visual->map_entries) {
+ case 2:
+ return (XPM_MONO);
+ case 4:
+ return (XPM_GRAY4);
+ default:
+ return (XPM_GRAY);
+ }
+ default:
+ return (XPM_COLOR);
+ }
+# else
+ /* set the key explicitly in the XpmAttributes to override this */
+ return (XPM_COLOR);
+# endif
+#else
+ /* there should be a similar switch for MSW */
+ return (XPM_COLOR);
+#endif
+}
+
+
+typedef struct {
+ int cols_index;
+ long closeness;
+} CloseColor;
+
+static int
+closeness_cmp(a, b)
+ Const void *a, *b;
+{
+ CloseColor *x = (CloseColor *) a, *y = (CloseColor *) b;
+
+ /* cast to int as qsort requires */
+ return (int) (x->closeness - y->closeness);
+}
+
+
+/* default AllocColor function:
+ * call XParseColor if colorname is given, return negative value if failure
+ * call XAllocColor and return 0 if failure, positive otherwise
+ */
+static int
+AllocColor(display, colormap, colorname, xcolor, closure)
+ Display *display;
+ Colormap colormap;
+ char *colorname;
+ XColor *xcolor;
+ void *closure; /* not used */
+{
+ int status;
+ if (colorname)
+ if (!XParseColor(display, colormap, colorname, xcolor))
+ return -1;
+ status = XAllocColor(display, colormap, xcolor);
+ return status != 0 ? 1 : 0;
+}
+
+
+#ifndef FOR_MSW
+/*
+ * set a close color in case the exact one can't be set
+ * return 0 if success, 1 otherwise.
+ */
+
+static int
+SetCloseColor(display, colormap, visual, col, image_pixel, mask_pixel,
+ alloc_pixels, nalloc_pixels, attributes, cols, ncols,
+ allocColor, closure)
+ Display *display;
+ Colormap colormap;
+ Visual *visual;
+ XColor *col;
+ Pixel *image_pixel, *mask_pixel;
+ Pixel *alloc_pixels;
+ unsigned int *nalloc_pixels;
+ XpmAttributes *attributes;
+ XColor *cols;
+ int ncols;
+ XpmAllocColorFunc allocColor;
+ void *closure;
+{
+
+ /*
+ * Allocation failed, so try close colors. To get here the visual must
+ * be GreyScale, PseudoColor or DirectColor (or perhaps StaticColor?
+ * What about sharing systems like QDSS?). Beware: we have to treat
+ * DirectColor differently.
+ */
+
+
+ long int red_closeness, green_closeness, blue_closeness;
+ int n;
+ Bool alloc_color;
+
+ if (attributes && (attributes->valuemask & XpmCloseness))
+ red_closeness = green_closeness = blue_closeness =
+ attributes->closeness;
+ else {
+ red_closeness = attributes->red_closeness;
+ green_closeness = attributes->green_closeness;
+ blue_closeness = attributes->blue_closeness;
+ }
+ if (attributes && (attributes->valuemask & XpmAllocCloseColors))
+ alloc_color = attributes->alloc_close_colors;
+ else
+ alloc_color = True;
+
+ /*
+ * We sort the colormap by closeness and try to allocate the color
+ * closest to the target. If the allocation of this close color fails,
+ * which almost never happens, then one of two scenarios is possible.
+ * Either the colormap must have changed (since the last close color
+ * allocation or possibly while we were sorting the colormap), or the
+ * color is allocated as Read/Write by some other client. (Note: X
+ * _should_ allow clients to check if a particular color is Read/Write,
+ * but it doesn't! :-( ). We cannot determine which of these scenarios
+ * occurred, so we try the next closest color, and so on, until no more
+ * colors are within closeness of the target. If we knew that the
+ * colormap had changed, we could skip this sequence.
+ *
+ * If _none_ of the colors within closeness of the target can be allocated,
+ * then we can finally be pretty sure that the colormap has actually
+ * changed. In this case we try to allocate the original color (again),
+ * then try the closecolor stuff (again)...
+ *
+ * In theory it would be possible for an infinite loop to occur if another
+ * process kept changing the colormap every time we sorted it, so we set
+ * a maximum on the number of iterations. After this many tries, we use
+ * XGrabServer() to ensure that the colormap remains unchanged.
+ *
+ * This approach gives particularly bad worst case performance - as many as
+ * <MaximumIterations> colormap reads and sorts may be needed, and as
+ * many as <MaximumIterations> * <ColormapSize> attempted allocations
+ * may fail. On an 8-bit system, this means as many as 3 colormap reads,
+ * 3 sorts and 768 failed allocations per execution of this code!
+ * Luckily, my experiments show that in general use in a typical 8-bit
+ * color environment only about 1 in every 10000 allocations fails to
+ * succeed in the fastest possible time. So virtually every time what
+ * actually happens is a single sort followed by a successful allocate.
+ * The very first allocation also costs a colormap read, but no further
+ * reads are usually necessary.
+ */
+
+#define ITERATIONS 2 /* more than one is almost never
+ * necessary */
+
+ for (n = 0; n <= ITERATIONS; ++n) {
+ CloseColor *closenesses =
+ (CloseColor *) XpmCalloc(ncols, sizeof(CloseColor));
+ int i, c;
+
+ for (i = 0; i < ncols; ++i) { /* build & sort closenesses table */
+#define COLOR_FACTOR 3
+#define BRIGHTNESS_FACTOR 1
+
+ closenesses[i].cols_index = i;
+ closenesses[i].closeness =
+ COLOR_FACTOR * (abs((long) col->red - (long) cols[i].red)
+ + abs((long) col->green - (long) cols[i].green)
+ + abs((long) col->blue - (long) cols[i].blue))
+ + BRIGHTNESS_FACTOR * abs(((long) col->red +
+ (long) col->green +
+ (long) col->blue)
+ - ((long) cols[i].red +
+ (long) cols[i].green +
+ (long) cols[i].blue));
+ }
+ qsort(closenesses, ncols, sizeof(CloseColor), closeness_cmp);
+
+ i = 0;
+ c = closenesses[i].cols_index;
+ while ((long) cols[c].red >= (long) col->red - red_closeness &&
+ (long) cols[c].red <= (long) col->red + red_closeness &&
+ (long) cols[c].green >= (long) col->green - green_closeness &&
+ (long) cols[c].green <= (long) col->green + green_closeness &&
+ (long) cols[c].blue >= (long) col->blue - blue_closeness &&
+ (long) cols[c].blue <= (long) col->blue + blue_closeness) {
+ if (alloc_color) {
+ if ((*allocColor)(display, colormap, NULL, &cols[c], closure)){
+ if (n == ITERATIONS)
+ XUngrabServer(display);
+ XpmFree(closenesses);
+ *image_pixel = cols[c].pixel;
+ *mask_pixel = 1;
+ alloc_pixels[(*nalloc_pixels)++] = cols[c].pixel;
+ return (0);
+ } else {
+ ++i;
+ if (i == ncols)
+ break;
+ c = closenesses[i].cols_index;
+ }
+ } else {
+ if (n == ITERATIONS)
+ XUngrabServer(display);
+ XpmFree(closenesses);
+ *image_pixel = cols[c].pixel;
+ *mask_pixel = 1;
+ return (0);
+ }
+ }
+
+ /* Couldn't allocate _any_ of the close colors! */
+
+ if (n == ITERATIONS)
+ XUngrabServer(display);
+ XpmFree(closenesses);
+
+ if (i == 0 || i == ncols) /* no color close enough or cannot */
+ return (1); /* alloc any color (full of r/w's) */
+
+ if ((*allocColor)(display, colormap, NULL, col, closure)) {
+ *image_pixel = col->pixel;
+ *mask_pixel = 1;
+ alloc_pixels[(*nalloc_pixels)++] = col->pixel;
+ return (0);
+ } else { /* colormap has probably changed, so
+ * re-read... */
+ if (n == ITERATIONS - 1)
+ XGrabServer(display);
+
+#if 0
+ if (visual->class == DirectColor) {
+ /* TODO */
+ } else
+#endif
+ XQueryColors(display, colormap, cols, ncols);
+ }
+ }
+ return (1);
+}
+
+#define USE_CLOSECOLOR attributes && \
+(((attributes->valuemask & XpmCloseness) && attributes->closeness != 0) \
+ || ((attributes->valuemask & XpmRGBCloseness) && \
+ (attributes->red_closeness != 0 \
+ || attributes->green_closeness != 0 \
+ || attributes->blue_closeness != 0)))
+
+#else
+ /* FOR_MSW part */
+ /* nothing to do here, the window system does it */
+#endif
+
+/*
+ * set the color pixel related to the given colorname,
+ * return 0 if success, 1 otherwise.
+ */
+
+static int
+SetColor(display, colormap, visual, colorname, color_index,
+ image_pixel, mask_pixel, mask_pixel_index,
+ alloc_pixels, nalloc_pixels, used_pixels, nused_pixels,
+ attributes, cols, ncols, allocColor, closure)
+ Display *display;
+ Colormap colormap;
+ Visual *visual;
+ char *colorname;
+ unsigned int color_index;
+ Pixel *image_pixel, *mask_pixel;
+ unsigned int *mask_pixel_index;
+ Pixel *alloc_pixels;
+ unsigned int *nalloc_pixels;
+ Pixel *used_pixels;
+ unsigned int *nused_pixels;
+ XpmAttributes *attributes;
+ XColor *cols;
+ int ncols;
+ XpmAllocColorFunc allocColor;
+ void *closure;
+{
+ XColor xcolor;
+ int status;
+
+ if (xpmstrcasecmp(colorname, TRANSPARENT_COLOR)) {
+ status = (*allocColor)(display, colormap, colorname, &xcolor, closure);
+ if (status < 0) /* parse color failed */
+ return (1);
+
+ if (status == 0) {
+#ifndef FOR_MSW
+ if (USE_CLOSECOLOR)
+ return (SetCloseColor(display, colormap, visual, &xcolor,
+ image_pixel, mask_pixel,
+ alloc_pixels, nalloc_pixels,
+ attributes, cols, ncols,
+ allocColor, closure));
+ else
+#endif /* ndef FOR_MSW */
+ return (1);
+ } else
+ alloc_pixels[(*nalloc_pixels)++] = xcolor.pixel;
+ *image_pixel = xcolor.pixel;
+#ifndef FOR_MSW
+ *mask_pixel = 1;
+#else
+ *mask_pixel = RGB(0,0,0);
+#endif
+ used_pixels[(*nused_pixels)++] = xcolor.pixel;
+ } else {
+ *image_pixel = 0;
+#ifndef FOR_MSW
+ *mask_pixel = 0;
+#else
+ *mask_pixel = RGB(255,255,255);
+#endif
+ /* store the color table index */
+ *mask_pixel_index = color_index;
+ }
+ return (0);
+}
+
+
+static int
+CreateColors(display, attributes, colors, ncolors, image_pixels, mask_pixels,
+ mask_pixel_index, alloc_pixels, nalloc_pixels,
+ used_pixels, nused_pixels)
+ Display *display;
+ XpmAttributes *attributes;
+ XpmColor *colors;
+ unsigned int ncolors;
+ Pixel *image_pixels;
+ Pixel *mask_pixels;
+ unsigned int *mask_pixel_index;
+ Pixel *alloc_pixels;
+ unsigned int *nalloc_pixels;
+ Pixel *used_pixels;
+ unsigned int *nused_pixels;
+{
+ /* variables stored in the XpmAttributes structure */
+ Visual *visual;
+ Colormap colormap;
+ XpmColorSymbol *colorsymbols;
+ unsigned int numsymbols;
+ XpmAllocColorFunc allocColor;
+ void *closure;
+
+ char *colorname;
+ unsigned int color, key;
+ Bool pixel_defined;
+ XpmColorSymbol *symbol;
+ char **defaults;
+ int ErrorStatus = XpmSuccess;
+ char *s;
+ int default_index;
+
+ XColor *cols = NULL;
+ unsigned int ncols = 0;
+
+ /*
+ * retrieve information from the XpmAttributes
+ */
+ if (attributes && attributes->valuemask & XpmColorSymbols) {
+ colorsymbols = attributes->colorsymbols;
+ numsymbols = attributes->numsymbols;
+ } else
+ numsymbols = 0;
+
+ if (attributes && attributes->valuemask & XpmVisual)
+ visual = attributes->visual;
+ else
+ visual = XDefaultVisual(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmColormap))
+ colormap = attributes->colormap;
+ else
+ colormap = XDefaultColormap(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmColorKey))
+ key = attributes->color_key;
+ else
+ key = xpmVisualType(visual);
+
+ if (attributes && (attributes->valuemask & XpmAllocColor))
+ allocColor = attributes->alloc_color;
+ else
+ allocColor = AllocColor;
+ if (attributes && (attributes->valuemask & XpmColorClosure))
+ closure = attributes->color_closure;
+ else
+ closure = NULL;
+
+#ifndef FOR_MSW
+ if (USE_CLOSECOLOR) {
+ /* originally from SetCloseColor */
+#if 0
+ if (visual->class == DirectColor) {
+
+ /*
+ * TODO: Implement close colors for DirectColor visuals. This is
+ * difficult situation. Chances are that we will never get here,
+ * because any machine that supports DirectColor will probably
+ * also support TrueColor (and probably PseudoColor). Also,
+ * DirectColor colormaps can be very large, so looking for close
+ * colors may be too slow.
+ */
+ } else {
+#endif
+ int i;
+
+#ifndef AMIGA
+ ncols = visual->map_entries;
+#else
+ ncols = colormap->Count;
+#endif
+ cols = (XColor *) XpmCalloc(ncols, sizeof(XColor));
+ for (i = 0; i < ncols; ++i)
+ cols[i].pixel = i;
+ XQueryColors(display, colormap, cols, ncols);
+#if 0
+ }
+#endif
+ }
+#endif /* ndef FOR_MSW */
+
+ switch (key) {
+ case XPM_MONO:
+ default_index = 2;
+ break;
+ case XPM_GRAY4:
+ default_index = 3;
+ break;
+ case XPM_GRAY:
+ default_index = 4;
+ break;
+ case XPM_COLOR:
+ default:
+ default_index = 5;
+ break;
+ }
+
+ for (color = 0; color < ncolors; color++, colors++,
+ image_pixels++, mask_pixels++) {
+ colorname = NULL;
+ pixel_defined = False;
+ defaults = (char **) colors;
+
+ /*
+ * look for a defined symbol
+ */
+ if (numsymbols) {
+
+ unsigned int n;
+
+ s = defaults[1];
+ for (n = 0, symbol = colorsymbols; n < numsymbols; n++, symbol++) {
+ if (symbol->name && s && !strcmp(symbol->name, s))
+ /* override name */
+ break;
+ if (!symbol->name && symbol->value) { /* override value */
+ int def_index = default_index;
+
+ while (defaults[def_index] == NULL) /* find defined
+ * colorname */
+ --def_index;
+ if (def_index < 2) {/* nothing towards mono, so try
+ * towards color */
+ def_index = default_index + 1;
+ while (def_index <= 5 && defaults[def_index] == NULL)
+ ++def_index;
+ }
+ if (def_index >= 2 && defaults[def_index] != NULL &&
+ !xpmstrcasecmp(symbol->value, defaults[def_index]))
+ break;
+ }
+ }
+ if (n != numsymbols) {
+ if (symbol->name && symbol->value)
+ colorname = symbol->value;
+ else
+ pixel_defined = True;
+ }
+ }
+ if (!pixel_defined) { /* pixel not given as symbol value */
+
+ unsigned int k;
+
+ if (colorname) { /* colorname given as symbol value */
+ if (!SetColor(display, colormap, visual, colorname, color,
+ image_pixels, mask_pixels, mask_pixel_index,
+ alloc_pixels, nalloc_pixels, used_pixels,
+ nused_pixels, attributes, cols, ncols,
+ allocColor, closure))
+ pixel_defined = True;
+ else
+ ErrorStatus = XpmColorError;
+ }
+ k = key;
+ while (!pixel_defined && k > 1) {
+ if (defaults[k]) {
+ if (!SetColor(display, colormap, visual, defaults[k],
+ color, image_pixels, mask_pixels,
+ mask_pixel_index, alloc_pixels,
+ nalloc_pixels, used_pixels, nused_pixels,
+ attributes, cols, ncols,
+ allocColor, closure)) {
+ pixel_defined = True;
+ break;
+ } else
+ ErrorStatus = XpmColorError;
+ }
+ k--;
+ }
+ k = key + 1;
+ while (!pixel_defined && k < NKEYS + 1) {
+ if (defaults[k]) {
+ if (!SetColor(display, colormap, visual, defaults[k],
+ color, image_pixels, mask_pixels,
+ mask_pixel_index, alloc_pixels,
+ nalloc_pixels, used_pixels, nused_pixels,
+ attributes, cols, ncols,
+ allocColor, closure)) {
+ pixel_defined = True;
+ break;
+ } else
+ ErrorStatus = XpmColorError;
+ }
+ k++;
+ }
+ if (!pixel_defined) {
+ if (cols)
+ XpmFree(cols);
+ return (XpmColorFailed);
+ }
+ } else {
+ /* simply use the given pixel */
+ *image_pixels = symbol->pixel;
+ /* the following makes the mask to be built even if none
+ is given a particular pixel */
+ if (symbol->value
+ && !xpmstrcasecmp(symbol->value, TRANSPARENT_COLOR)) {
+ *mask_pixels = 0;
+ *mask_pixel_index = color;
+ } else
+ *mask_pixels = 1;
+ used_pixels[(*nused_pixels)++] = *image_pixels;
+ }
+ }
+ if (cols)
+ XpmFree(cols);
+ return (ErrorStatus);
+}
+
+
+/* default FreeColors function, simply call XFreeColors */
+static int
+FreeColors(display, colormap, pixels, n, closure)
+ Display *display;
+ Colormap colormap;
+ Pixel *pixels;
+ int n;
+ void *closure; /* not used */
+{
+ return XFreeColors(display, colormap, pixels, n, 0);
+}
+
+
+/* function call in case of error */
+#undef RETURN
+#define RETURN(status) \
+{ \
+ ErrorStatus = status; \
+ goto error; \
+}
+
+int
+XpmCreateImageFromXpmImage(display, image,
+ image_return, shapeimage_return, attributes)
+ Display *display;
+ XpmImage *image;
+ XImage **image_return;
+ XImage **shapeimage_return;
+ XpmAttributes *attributes;
+{
+ /* variables stored in the XpmAttributes structure */
+ Visual *visual;
+ Colormap colormap;
+ unsigned int depth;
+ int bitmap_format;
+ XpmFreeColorsFunc freeColors;
+ void *closure;
+
+ /* variables to return */
+ XImage *ximage = NULL;
+ XImage *shapeimage = NULL;
+ unsigned int mask_pixel_index = XpmUndefPixel;
+ int ErrorStatus;
+
+ /* calculation variables */
+ Pixel *image_pixels = NULL;
+ Pixel *mask_pixels = NULL;
+ Pixel *alloc_pixels = NULL;
+ Pixel *used_pixels = NULL;
+ unsigned int nalloc_pixels = 0;
+ unsigned int nused_pixels = 0;
+
+ /* initialize return values */
+ if (image_return)
+ *image_return = NULL;
+ if (shapeimage_return)
+ *shapeimage_return = NULL;
+
+ /* retrieve information from the XpmAttributes */
+ if (attributes && (attributes->valuemask & XpmVisual))
+ visual = attributes->visual;
+ else
+ visual = XDefaultVisual(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmColormap))
+ colormap = attributes->colormap;
+ else
+ colormap = XDefaultColormap(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmDepth))
+ depth = attributes->depth;
+ else
+ depth = XDefaultDepth(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmBitmapFormat))
+ bitmap_format = attributes->bitmap_format;
+ else
+ bitmap_format = ZPixmap;
+
+ if (attributes && (attributes->valuemask & XpmFreeColors))
+ freeColors = attributes->free_colors;
+ else
+ freeColors = FreeColors;
+ if (attributes && (attributes->valuemask & XpmColorClosure))
+ closure = attributes->color_closure;
+ else
+ closure = NULL;
+
+ ErrorStatus = XpmSuccess;
+
+ /* malloc pixels index tables */
+ image_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * image->ncolors);
+ if (!image_pixels)
+ return (XpmNoMemory);
+
+ mask_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * image->ncolors);
+ if (!mask_pixels)
+ RETURN(XpmNoMemory);
+
+ /* maximum of allocated pixels will be the number of colors */
+ alloc_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * image->ncolors);
+ if (!alloc_pixels)
+ RETURN(XpmNoMemory);
+
+ /* maximum of allocated pixels will be the number of colors */
+ used_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * image->ncolors);
+ if (!used_pixels)
+ RETURN(XpmNoMemory);
+
+ /* get pixel colors, store them in index tables */
+ ErrorStatus = CreateColors(display, attributes, image->colorTable,
+ image->ncolors, image_pixels, mask_pixels,
+ &mask_pixel_index, alloc_pixels, &nalloc_pixels,
+ used_pixels, &nused_pixels);
+
+ if (ErrorStatus != XpmSuccess
+ && (ErrorStatus < 0 || (attributes
+ && (attributes->valuemask & XpmExactColors)
+ && attributes->exactColors)))
+ RETURN(ErrorStatus);
+
+ /* create the ximage */
+ if (image_return) {
+ ErrorStatus = CreateXImage(display, visual, depth,
+ (depth == 1 ? bitmap_format : ZPixmap),
+ image->width, image->height, &ximage);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+#ifndef FOR_MSW
+# ifndef AMIGA
+
+ /*
+ * set the ximage data using optimized functions for ZPixmap
+ */
+
+ if (ximage->bits_per_pixel == 8)
+ PutImagePixels8(ximage, image->width, image->height,
+ image->data, image_pixels);
+ else if (((ximage->bits_per_pixel | ximage->depth) == 1) &&
+ (ximage->byte_order == ximage->bitmap_bit_order))
+ PutImagePixels1(ximage, image->width, image->height,
+ image->data, image_pixels);
+ else if (ximage->bits_per_pixel == 16)
+ PutImagePixels16(ximage, image->width, image->height,
+ image->data, image_pixels);
+ else if (ximage->bits_per_pixel == 32)
+ PutImagePixels32(ximage, image->width, image->height,
+ image->data, image_pixels);
+ else
+ PutImagePixels(ximage, image->width, image->height,
+ image->data, image_pixels);
+# else /* AMIGA */
+ APutImagePixels(ximage, image->width, image->height,
+ image->data, image_pixels);
+# endif
+#else /* FOR_MSW */
+ MSWPutImagePixels(display, ximage, image->width, image->height,
+ image->data, image_pixels);
+#endif
+ }
+ /* create the shape mask image */
+ if (mask_pixel_index != XpmUndefPixel && shapeimage_return) {
+ ErrorStatus = CreateXImage(display, visual, 1, bitmap_format,
+ image->width, image->height, &shapeimage);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+#ifndef FOR_MSW
+# ifndef AMIGA
+ PutImagePixels1(shapeimage, image->width, image->height,
+ image->data, mask_pixels);
+# else /* AMIGA */
+ APutImagePixels(shapeimage, image->width, image->height,
+ image->data, mask_pixels);
+# endif
+#else /* FOR_MSW */
+ MSWPutImagePixels(display, shapeimage, image->width, image->height,
+ image->data, mask_pixels);
+#endif
+
+ }
+ XpmFree(image_pixels);
+ XpmFree(mask_pixels);
+
+ /* if requested return used pixels in the XpmAttributes structure */
+ if (attributes && (attributes->valuemask & XpmReturnPixels ||
+/* 3.2 backward compatibility code */
+ attributes->valuemask & XpmReturnInfos)) {
+/* end 3.2 bc */
+ attributes->pixels = used_pixels;
+ attributes->npixels = nused_pixels;
+ attributes->mask_pixel = mask_pixel_index;
+ } else
+ XpmFree(used_pixels);
+
+ /* if requested return alloc'ed pixels in the XpmAttributes structure */
+ if (attributes && (attributes->valuemask & XpmReturnAllocPixels)) {
+ attributes->alloc_pixels = alloc_pixels;
+ attributes->nalloc_pixels = nalloc_pixels;
+ } else
+ XpmFree(alloc_pixels);
+
+ /* return created images */
+ if (image_return)
+ *image_return = ximage;
+ if (shapeimage_return)
+ *shapeimage_return = shapeimage;
+
+ return (ErrorStatus);
+
+/* exit point in case of error, free only locally allocated variables */
+error:
+ if (ximage)
+ XDestroyImage(ximage);
+ if (shapeimage)
+ XDestroyImage(shapeimage);
+ if (image_pixels)
+ XpmFree(image_pixels);
+ if (mask_pixels)
+ XpmFree(mask_pixels);
+ if (nalloc_pixels)
+ (*freeColors)(display, colormap, alloc_pixels, nalloc_pixels, NULL);
+ if (alloc_pixels)
+ XpmFree(alloc_pixels);
+ if (used_pixels)
+ XpmFree(used_pixels);
+
+ return (ErrorStatus);
+}
+
+
+/*
+ * Create an XImage with its data
+ */
+static int
+CreateXImage(display, visual, depth, format, width, height, image_return)
+ Display *display;
+ Visual *visual;
+ unsigned int depth;
+ int format;
+ unsigned int width;
+ unsigned int height;
+ XImage **image_return;
+{
+ int bitmap_pad;
+
+ /* first get bitmap_pad */
+ if (depth > 16)
+ bitmap_pad = 32;
+ else if (depth > 8)
+ bitmap_pad = 16;
+ else
+ bitmap_pad = 8;
+
+ /* then create the XImage with data = NULL and bytes_per_line = 0 */
+ *image_return = XCreateImage(display, visual, depth, format, 0, 0,
+ width, height, bitmap_pad, 0);
+ if (!*image_return)
+ return (XpmNoMemory);
+
+#if !defined(FOR_MSW) && !defined(AMIGA)
+ /* now that bytes_per_line must have been set properly alloc data */
+ (*image_return)->data =
+ (char *) XpmMalloc((*image_return)->bytes_per_line * height);
+
+ if (!(*image_return)->data) {
+ XDestroyImage(*image_return);
+ *image_return = NULL;
+ return (XpmNoMemory);
+ }
+#else
+ /* under FOR_MSW and AMIGA XCreateImage has done it all */
+#endif
+ return (XpmSuccess);
+}
+
+#ifndef FOR_MSW
+# ifndef AMIGA
+/*
+ * The functions below are written from X11R5 MIT's code (XImUtil.c)
+ *
+ * The idea is to have faster functions than the standard XPutPixel function
+ * to build the image data. Indeed we can speed up things by suppressing tests
+ * performed for each pixel. We do the same tests but at the image level.
+ * We also assume that we use only ZPixmap images with null offsets.
+ */
+
+LFUNC(_putbits, void, (register char *src, int dstoffset,
+ register int numbits, register char *dst));
+
+LFUNC(_XReverse_Bytes, int, (register unsigned char *bpt, register int nb));
+
+static unsigned char Const _reverse_byte[0x100] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+static int
+_XReverse_Bytes(bpt, nb)
+ register unsigned char *bpt;
+ register int nb;
+{
+ do {
+ *bpt = _reverse_byte[*bpt];
+ bpt++;
+ } while (--nb > 0);
+ return 0;
+}
+
+
+void
+xpm_xynormalizeimagebits(bp, img)
+ register unsigned char *bp;
+ register XImage *img;
+{
+ register unsigned char c;
+
+ if (img->byte_order != img->bitmap_bit_order) {
+ switch (img->bitmap_unit) {
+
+ case 16:
+ c = *bp;
+ *bp = *(bp + 1);
+ *(bp + 1) = c;
+ break;
+
+ case 32:
+ c = *(bp + 3);
+ *(bp + 3) = *bp;
+ *bp = c;
+ c = *(bp + 2);
+ *(bp + 2) = *(bp + 1);
+ *(bp + 1) = c;
+ break;
+ }
+ }
+ if (img->bitmap_bit_order == MSBFirst)
+ _XReverse_Bytes(bp, img->bitmap_unit >> 3);
+}
+
+void
+xpm_znormalizeimagebits(bp, img)
+ register unsigned char *bp;
+ register XImage *img;
+{
+ register unsigned char c;
+
+ switch (img->bits_per_pixel) {
+
+ case 2:
+ _XReverse_Bytes(bp, 1);
+ break;
+
+ case 4:
+ *bp = ((*bp >> 4) & 0xF) | ((*bp << 4) & ~0xF);
+ break;
+
+ case 16:
+ c = *bp;
+ *bp = *(bp + 1);
+ *(bp + 1) = c;
+ break;
+
+ case 24:
+ c = *(bp + 2);
+ *(bp + 2) = *bp;
+ *bp = c;
+ break;
+
+ case 32:
+ c = *(bp + 3);
+ *(bp + 3) = *bp;
+ *bp = c;
+ c = *(bp + 2);
+ *(bp + 2) = *(bp + 1);
+ *(bp + 1) = c;
+ break;
+ }
+}
+
+static unsigned char Const _lomask[0x09] = {
+0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff};
+static unsigned char Const _himask[0x09] = {
+0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80, 0x00};
+
+static void
+_putbits(src, dstoffset, numbits, dst)
+ register char *src; /* address of source bit string */
+ int dstoffset; /* bit offset into destination;
+ * range is 0-31 */
+ register int numbits; /* number of bits to copy to
+ * destination */
+ register char *dst; /* address of destination bit string */
+{
+ register unsigned char chlo, chhi;
+ int hibits;
+
+ dst = dst + (dstoffset >> 3);
+ dstoffset = dstoffset & 7;
+ hibits = 8 - dstoffset;
+ chlo = *dst & _lomask[dstoffset];
+ for (;;) {
+ chhi = (*src << dstoffset) & _himask[dstoffset];
+ if (numbits <= hibits) {
+ chhi = chhi & _lomask[dstoffset + numbits];
+ *dst = (*dst & _himask[dstoffset + numbits]) | chlo | chhi;
+ break;
+ }
+ *dst = chhi | chlo;
+ dst++;
+ numbits = numbits - hibits;
+ chlo = (unsigned char) (*src & _himask[hibits]) >> hibits;
+ src++;
+ if (numbits <= dstoffset) {
+ chlo = chlo & _lomask[numbits];
+ *dst = (*dst & _himask[numbits]) | chlo;
+ break;
+ }
+ numbits = numbits - dstoffset;
+ }
+}
+
+/*
+ * Default method to write pixels into a Z image data structure.
+ * The algorithm used is:
+ *
+ * copy the destination bitmap_unit or Zpixel to temp
+ * normalize temp if needed
+ * copy the pixel bits into the temp
+ * renormalize temp if needed
+ * copy the temp back into the destination image data
+ */
+
+static void
+PutImagePixels(image, width, height, pixelindex, pixels)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ unsigned int *pixelindex;
+ Pixel *pixels;
+{
+ register char *src;
+ register char *dst;
+ register unsigned int *iptr;
+ register int x, y, i;
+ register char *data;
+ Pixel pixel, px;
+ int nbytes, depth, ibu, ibpp;
+
+ data = image->data;
+ iptr = pixelindex;
+ depth = image->depth;
+ if (depth == 1) {
+ ibu = image->bitmap_unit;
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ pixel = pixels[*iptr];
+ for (i = 0, px = pixel; i < sizeof(unsigned long);
+ i++, px >>= 8)
+ ((unsigned char *) &pixel)[i] = px;
+ src = &data[XYINDEX(x, y, image)];
+ dst = (char *) &px;
+ px = 0;
+ nbytes = ibu >> 3;
+ for (i = nbytes; --i >= 0;)
+ *dst++ = *src++;
+ XYNORMALIZE(&px, image);
+ _putbits((char *) &pixel, (x % ibu), 1, (char *) &px);
+ XYNORMALIZE(&px, image);
+ src = (char *) &px;
+ dst = &data[XYINDEX(x, y, image)];
+ for (i = nbytes; --i >= 0;)
+ *dst++ = *src++;
+ }
+ } else {
+ ibpp = image->bits_per_pixel;
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ pixel = pixels[*iptr];
+ if (depth == 4)
+ pixel &= 0xf;
+ for (i = 0, px = pixel; i < sizeof(unsigned long); i++,
+ px >>= 8)
+ ((unsigned char *) &pixel)[i] = px;
+ src = &data[ZINDEX(x, y, image)];
+ dst = (char *) &px;
+ px = 0;
+ nbytes = (ibpp + 7) >> 3;
+ for (i = nbytes; --i >= 0;)
+ *dst++ = *src++;
+ ZNORMALIZE(&px, image);
+ _putbits((char *) &pixel, (x * ibpp) & 7, ibpp, (char *) &px);
+ ZNORMALIZE(&px, image);
+ src = (char *) &px;
+ dst = &data[ZINDEX(x, y, image)];
+ for (i = nbytes; --i >= 0;)
+ *dst++ = *src++;
+ }
+ }
+}
+
+/*
+ * write pixels into a 32-bits Z image data structure
+ */
+
+#if !defined(WORD64) && !defined(LONG64)
+/* this item is static but deterministic so let it slide; doesn't
+ * hurt re-entrancy of this library. Note if it is actually const then would
+ * be OK under rules of ANSI-C but probably not C++ which may not
+ * want to allocate space for it.
+ */
+static unsigned long byteorderpixel = MSBFirst << 24;
+
+#endif
+
+/*
+ WITHOUT_SPEEDUPS is a flag to be turned on if you wish to use the original
+ 3.2e code - by default you get the speeded-up version.
+*/
+
+static void
+PutImagePixels32(image, width, height, pixelindex, pixels)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ unsigned int *pixelindex;
+ Pixel *pixels;
+{
+ unsigned char *data;
+ unsigned int *iptr;
+ int y;
+ Pixel pixel;
+
+#ifdef WITHOUT_SPEEDUPS
+
+ int x;
+ unsigned char *addr;
+
+ data = (unsigned char *) image->data;
+ iptr = pixelindex;
+#if !defined(WORD64) && !defined(LONG64)
+ if (*((char *) &byteorderpixel) == image->byte_order) {
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX32(x, y, image)];
+ *((unsigned long *) addr) = pixels[*iptr];
+ }
+ } else
+#endif
+ if (image->byte_order == MSBFirst)
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX32(x, y, image)];
+ pixel = pixels[*iptr];
+ addr[0] = pixel >> 24;
+ addr[1] = pixel >> 16;
+ addr[2] = pixel >> 8;
+ addr[3] = pixel;
+ }
+ else
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX32(x, y, image)];
+ pixel = pixels[*iptr];
+ addr[0] = pixel;
+ addr[1] = pixel >> 8;
+ addr[2] = pixel >> 16;
+ addr[3] = pixel >> 24;
+ }
+
+#else /* WITHOUT_SPEEDUPS */
+
+ int bpl = image->bytes_per_line;
+ unsigned char *data_ptr, *max_data;
+
+ data = (unsigned char *) image->data;
+ iptr = pixelindex;
+#if !defined(WORD64) && !defined(LONG64)
+ if (*((char *) &byteorderpixel) == image->byte_order) {
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + (width << 2);
+
+ while (data_ptr < max_data) {
+ *((unsigned long *) data_ptr) = pixels[*(iptr++)];
+ data_ptr += (1 << 2);
+ }
+ data += bpl;
+ }
+ } else
+#endif
+ if (image->byte_order == MSBFirst)
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + (width << 2);
+
+ while (data_ptr < max_data) {
+ pixel = pixels[*(iptr++)];
+
+ *data_ptr++ = pixel >> 24;
+ *data_ptr++ = pixel >> 16;
+ *data_ptr++ = pixel >> 8;
+ *data_ptr++ = pixel;
+
+ }
+ data += bpl;
+ }
+ else
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + (width << 2);
+
+ while (data_ptr < max_data) {
+ pixel = pixels[*(iptr++)];
+
+ *data_ptr++ = pixel;
+ *data_ptr++ = pixel >> 8;
+ *data_ptr++ = pixel >> 16;
+ *data_ptr++ = pixel >> 24;
+ }
+ data += bpl;
+ }
+
+#endif /* WITHOUT_SPEEDUPS */
+}
+
+/*
+ * write pixels into a 16-bits Z image data structure
+ */
+
+static void
+PutImagePixels16(image, width, height, pixelindex, pixels)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ unsigned int *pixelindex;
+ Pixel *pixels;
+{
+ unsigned char *data;
+ unsigned int *iptr;
+ int y;
+
+#ifdef WITHOUT_SPEEDUPS
+
+ int x;
+ unsigned char *addr;
+
+ data = (unsigned char *) image->data;
+ iptr = pixelindex;
+ if (image->byte_order == MSBFirst)
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX16(x, y, image)];
+ addr[0] = pixels[*iptr] >> 8;
+ addr[1] = pixels[*iptr];
+ }
+ else
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX16(x, y, image)];
+ addr[0] = pixels[*iptr];
+ addr[1] = pixels[*iptr] >> 8;
+ }
+
+#else /* WITHOUT_SPEEDUPS */
+
+ Pixel pixel;
+
+ int bpl = image->bytes_per_line;
+ unsigned char *data_ptr, *max_data;
+
+ data = (unsigned char *) image->data;
+ iptr = pixelindex;
+ if (image->byte_order == MSBFirst)
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + (width << 1);
+
+ while (data_ptr < max_data) {
+ pixel = pixels[*(iptr++)];
+
+ data_ptr[0] = pixel >> 8;
+ data_ptr[1] = pixel;
+
+ data_ptr += (1 << 1);
+ }
+ data += bpl;
+ }
+ else
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + (width << 1);
+
+ while (data_ptr < max_data) {
+ pixel = pixels[*(iptr++)];
+
+ data_ptr[0] = pixel;
+ data_ptr[1] = pixel >> 8;
+
+ data_ptr += (1 << 1);
+ }
+ data += bpl;
+ }
+
+#endif /* WITHOUT_SPEEDUPS */
+}
+
+/*
+ * write pixels into a 8-bits Z image data structure
+ */
+
+static void
+PutImagePixels8(image, width, height, pixelindex, pixels)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ unsigned int *pixelindex;
+ Pixel *pixels;
+{
+ char *data;
+ unsigned int *iptr;
+ int y;
+
+#ifdef WITHOUT_SPEEDUPS
+
+ int x;
+
+ data = image->data;
+ iptr = pixelindex;
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++)
+ data[ZINDEX8(x, y, image)] = pixels[*iptr];
+
+#else /* WITHOUT_SPEEDUPS */
+
+ int bpl = image->bytes_per_line;
+ char *data_ptr, *max_data;
+
+ data = image->data;
+ iptr = pixelindex;
+
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + width;
+
+ while (data_ptr < max_data)
+ *(data_ptr++) = pixels[*(iptr++)];
+
+ data += bpl;
+ }
+
+#endif /* WITHOUT_SPEEDUPS */
+}
+
+/*
+ * write pixels into a 1-bit depth image data structure and **offset null**
+ */
+
+static void
+PutImagePixels1(image, width, height, pixelindex, pixels)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ unsigned int *pixelindex;
+ Pixel *pixels;
+{
+ if (image->byte_order != image->bitmap_bit_order)
+ PutImagePixels(image, width, height, pixelindex, pixels);
+ else {
+ unsigned int *iptr;
+ int y;
+ char *data;
+
+#ifdef WITHOUT_SPEEDUPS
+
+ int x;
+
+ data = image->data;
+ iptr = pixelindex;
+ if (image->bitmap_bit_order == MSBFirst)
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ if (pixels[*iptr] & 1)
+ data[ZINDEX1(x, y, image)] |= 0x80 >> (x & 7);
+ else
+ data[ZINDEX1(x, y, image)] &= ~(0x80 >> (x & 7));
+ }
+ else
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ if (pixels[*iptr] & 1)
+ data[ZINDEX1(x, y, image)] |= 1 << (x & 7);
+ else
+ data[ZINDEX1(x, y, image)] &= ~(1 << (x & 7));
+ }
+
+#else /* WITHOUT_SPEEDUPS */
+
+ char value;
+ char *data_ptr, *max_data;
+ int bpl = image->bytes_per_line;
+ int diff, count;
+
+ data = image->data;
+ iptr = pixelindex;
+
+ diff = width & 7;
+ width >>= 3;
+
+ if (image->bitmap_bit_order == MSBFirst)
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + width;
+ while (data_ptr < max_data) {
+ value = 0;
+
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+ value = (value << 1) | (pixels[*(iptr++)] & 1);
+
+ *(data_ptr++) = value;
+ }
+ if (diff) {
+ value = 0;
+ for (count = 0; count < diff; count++) {
+ if (pixels[*(iptr++)] & 1)
+ value |= (0x80 >> count);
+ }
+ *(data_ptr) = value;
+ }
+ data += bpl;
+ }
+ else
+ for (y = 0; y < height; y++) {
+ data_ptr = data;
+ max_data = data_ptr + width;
+ while (data_ptr < max_data) {
+ value = 0;
+ iptr += 8;
+
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+ value = (value << 1) | (pixels[*(--iptr)] & 1);
+
+ iptr += 8;
+ *(data_ptr++) = value;
+ }
+ if (diff) {
+ value = 0;
+ for (count = 0; count < diff; count++) {
+ if (pixels[*(iptr++)] & 1)
+ value |= (1 << count);
+ }
+ *(data_ptr) = value;
+ }
+ data += bpl;
+ }
+
+#endif /* WITHOUT_SPEEDUPS */
+ }
+}
+
+int
+XpmCreatePixmapFromXpmImage(display, d, image,
+ pixmap_return, shapemask_return, attributes)
+ Display *display;
+ Drawable d;
+ XpmImage *image;
+ Pixmap *pixmap_return;
+ Pixmap *shapemask_return;
+ XpmAttributes *attributes;
+{
+ XImage *ximage, *shapeimage;
+ int ErrorStatus;
+
+ /* initialize return values */
+ if (pixmap_return)
+ *pixmap_return = 0;
+ if (shapemask_return)
+ *shapemask_return = 0;
+
+ /* create the ximages */
+ ErrorStatus = XpmCreateImageFromXpmImage(display, image,
+ (pixmap_return ? &ximage : NULL),
+ (shapemask_return ?
+ &shapeimage : NULL),
+ attributes);
+ if (ErrorStatus < 0)
+ return (ErrorStatus);
+
+ /* create the pixmaps and destroy images */
+ if (pixmap_return && ximage) {
+ xpmCreatePixmapFromImage(display, d, ximage, pixmap_return);
+ XDestroyImage(ximage);
+ }
+ if (shapemask_return && shapeimage) {
+ xpmCreatePixmapFromImage(display, d, shapeimage, shapemask_return);
+ XDestroyImage(shapeimage);
+ }
+ return (ErrorStatus);
+}
+
+# else /* AMIGA */
+
+static void
+APutImagePixels (
+ XImage *image,
+ unsigned int width,
+ unsigned int height,
+ unsigned int *pixelindex,
+ Pixel *pixels)
+{
+ unsigned int *data = pixelindex;
+ unsigned int x, y;
+ unsigned char *array;
+ XImage *tmp_img;
+ BOOL success = FALSE;
+
+ array = XpmMalloc ((((width+15)>>4)<<4)*sizeof (*array));
+ if (array != NULL)
+ {
+ tmp_img = AllocXImage ((((width+15)>>4)<<4), 1,
+ image->rp->BitMap->Depth);
+ if (tmp_img != NULL)
+ {
+ for (y = 0; y < height; ++y)
+ {
+ for (x = 0; x < width; ++x)
+ array[x] = pixels[*(data++)];
+ WritePixelLine8 (image->rp, 0, y, width, array, tmp_img->rp);
+ }
+ FreeXImage (tmp_img);
+ success = TRUE;
+ }
+ XpmFree (array);
+ }
+
+ if (!success)
+ {
+ for (y = 0; y < height; ++y)
+ for (x = 0; x < width; ++x)
+ XPutPixel (image, x, y, pixels[*(data++)]);
+ }
+}
+
+# endif/* AMIGA */
+#else /* FOR_MSW part follows */
+static void
+MSWPutImagePixels(dc, image, width, height, pixelindex, pixels)
+ Display *dc;
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ unsigned int *pixelindex;
+ Pixel *pixels;
+{
+ unsigned int *data = pixelindex;
+ unsigned int x, y;
+ HBITMAP obm;
+
+ obm = SelectObject(*dc, image->bitmap);
+ for (y = 0; y < height; y++) {
+ for (x = 0; x < width; x++) {
+ SetPixel(*dc, x, y, pixels[*(data++)]); /* data is [x+y*width] */
+ }
+ }
+ SelectObject(*dc, obm);
+}
+
+#endif /* FOR_MSW */
+
+
+
+#if !defined(FOR_MSW) && !defined(AMIGA)
+
+static int
+PutPixel1(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ register char *src;
+ register char *dst;
+ register int i;
+ register char *data;
+ Pixel px;
+ int nbytes;
+
+ for (i=0, px=pixel; i<sizeof(unsigned long); i++, px>>=8)
+ ((unsigned char *)&pixel)[i] = px;
+ src = &ximage->data[XYINDEX(x, y, ximage)];
+ dst = (char *)&px;
+ px = 0;
+ nbytes = ximage->bitmap_unit >> 3;
+ for (i = nbytes; --i >= 0; ) *dst++ = *src++;
+ XYNORMALIZE(&px, ximage);
+ i = ((x + ximage->xoffset) % ximage->bitmap_unit);
+ _putbits ((char *)&pixel, i, 1, (char *)&px);
+ XYNORMALIZE(&px, ximage);
+ src = (char *) &px;
+ dst = &ximage->data[XYINDEX(x, y, ximage)];
+ for (i = nbytes; --i >= 0; )
+ *dst++ = *src++;
+
+ return 1;
+}
+
+static int
+PutPixel(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ register char *src;
+ register char *dst;
+ register int i;
+ register char *data;
+ Pixel px;
+ int nbytes, ibpp;
+
+ ibpp = ximage->bits_per_pixel;
+ if (ximage->depth == 4)
+ pixel &= 0xf;
+ for (i = 0, px = pixel; i < sizeof(unsigned long); i++, px >>= 8)
+ ((unsigned char *) &pixel)[i] = px;
+ src = &ximage->data[ZINDEX(x, y, ximage)];
+ dst = (char *) &px;
+ px = 0;
+ nbytes = (ibpp + 7) >> 3;
+ for (i = nbytes; --i >= 0;)
+ *dst++ = *src++;
+ ZNORMALIZE(&px, ximage);
+ _putbits((char *) &pixel, (x * ibpp) & 7, ibpp, (char *) &px);
+ ZNORMALIZE(&px, ximage);
+ src = (char *) &px;
+ dst = &ximage->data[ZINDEX(x, y, ximage)];
+ for (i = nbytes; --i >= 0;)
+ *dst++ = *src++;
+
+ return 1;
+}
+
+static int
+PutPixel32(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ unsigned char *addr;
+
+ addr = &((unsigned char *)ximage->data) [ZINDEX32(x, y, ximage)];
+ *((unsigned long *)addr) = pixel;
+ return 1;
+}
+
+static int
+PutPixel32MSB(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ unsigned char *addr;
+
+ addr = &((unsigned char *)ximage->data) [ZINDEX32(x, y, ximage)];
+ addr[0] = pixel >> 24;
+ addr[1] = pixel >> 16;
+ addr[2] = pixel >> 8;
+ addr[3] = pixel;
+ return 1;
+}
+
+static int
+PutPixel32LSB(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ unsigned char *addr;
+
+ addr = &((unsigned char *)ximage->data) [ZINDEX32(x, y, ximage)];
+ addr[3] = pixel >> 24;
+ addr[2] = pixel >> 16;
+ addr[1] = pixel >> 8;
+ addr[0] = pixel;
+ return 1;
+}
+
+static int
+PutPixel16MSB(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ unsigned char *addr;
+
+ addr = &((unsigned char *)ximage->data) [ZINDEX16(x, y, ximage)];
+ addr[0] = pixel >> 8;
+ addr[1] = pixel;
+ return 1;
+}
+
+static int
+PutPixel16LSB(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ unsigned char *addr;
+
+ addr = &((unsigned char *)ximage->data) [ZINDEX16(x, y, ximage)];
+ addr[1] = pixel >> 8;
+ addr[0] = pixel;
+ return 1;
+}
+
+static int
+PutPixel8(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ ximage->data[ZINDEX8(x, y, ximage)] = pixel;
+ return 1;
+}
+
+static int
+PutPixel1MSB(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ if (pixel & 1)
+ ximage->data[ZINDEX1(x, y, ximage)] |= 0x80 >> (x & 7);
+ else
+ ximage->data[ZINDEX1(x, y, ximage)] &= ~(0x80 >> (x & 7));
+ return 1;
+}
+
+static int
+PutPixel1LSB(ximage, x, y, pixel)
+ register XImage *ximage;
+ int x;
+ int y;
+ unsigned long pixel;
+{
+ if (pixel & 1)
+ ximage->data[ZINDEX1(x, y, ximage)] |= 1 << (x & 7);
+ else
+ ximage->data[ZINDEX1(x, y, ximage)] &= ~(1 << (x & 7));
+ return 1;
+}
+
+#endif /* not FOR_MSW && not AMIGA */
+
+/*
+ * This function parses an Xpm file or data and directly create an XImage
+ */
+int
+xpmParseDataAndCreate(display, data, image_return, shapeimage_return,
+ image, info, attributes)
+ Display *display;
+ xpmData *data;
+ XImage **image_return;
+ XImage **shapeimage_return;
+ XpmImage *image;
+ XpmInfo *info;
+ XpmAttributes *attributes;
+{
+ /* variables stored in the XpmAttributes structure */
+ Visual *visual;
+ Colormap colormap;
+ unsigned int depth;
+ int bitmap_format;
+ XpmFreeColorsFunc freeColors;
+ void *closure;
+
+ /* variables to return */
+ XImage *ximage = NULL;
+ XImage *shapeimage = NULL;
+ unsigned int mask_pixel_index = XpmUndefPixel;
+
+ /* calculation variables */
+ Pixel *image_pixels = NULL;
+ Pixel *mask_pixels = NULL;
+ Pixel *alloc_pixels = NULL;
+ Pixel *used_pixels = NULL;
+ unsigned int nalloc_pixels = 0;
+ unsigned int nused_pixels = 0;
+ unsigned int width, height, ncolors, cpp;
+ unsigned int x_hotspot, y_hotspot, hotspot = 0, extensions = 0;
+ XpmColor *colorTable = NULL;
+ char *hints_cmt = NULL;
+ char *colors_cmt = NULL;
+ char *pixels_cmt = NULL;
+
+ unsigned int cmts;
+ int ErrorStatus;
+ xpmHashTable hashtable;
+
+
+ /* initialize return values */
+ if (image_return)
+ *image_return = NULL;
+ if (shapeimage_return)
+ *shapeimage_return = NULL;
+
+
+ /* retrieve information from the XpmAttributes */
+ if (attributes && (attributes->valuemask & XpmVisual))
+ visual = attributes->visual;
+ else
+ visual = XDefaultVisual(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmColormap))
+ colormap = attributes->colormap;
+ else
+ colormap = XDefaultColormap(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmDepth))
+ depth = attributes->depth;
+ else
+ depth = XDefaultDepth(display, XDefaultScreen(display));
+
+ if (attributes && (attributes->valuemask & XpmBitmapFormat))
+ bitmap_format = attributes->bitmap_format;
+ else
+ bitmap_format = ZPixmap;
+
+ if (attributes && (attributes->valuemask & XpmFreeColors))
+ freeColors = attributes->free_colors;
+ else
+ freeColors = FreeColors;
+ if (attributes && (attributes->valuemask & XpmColorClosure))
+ closure = attributes->color_closure;
+ else
+ closure = NULL;
+
+ cmts = info && (info->valuemask & XpmReturnComments);
+
+ /*
+ * parse the header
+ */
+ ErrorStatus = xpmParseHeader(data);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /*
+ * read values
+ */
+ ErrorStatus = xpmParseValues(data, &width, &height, &ncolors, &cpp,
+ &x_hotspot, &y_hotspot, &hotspot,
+ &extensions);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /*
+ * store the hints comment line
+ */
+ if (cmts)
+ xpmGetCmt(data, &hints_cmt);
+
+ /*
+ * init the hastable
+ */
+ if (USE_HASHTABLE) {
+ ErrorStatus = xpmHashTableInit(&hashtable);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+ }
+
+ /*
+ * read colors
+ */
+ ErrorStatus = xpmParseColors(data, ncolors, cpp, &colorTable, &hashtable);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+ /*
+ * store the colors comment line
+ */
+ if (cmts)
+ xpmGetCmt(data, &colors_cmt);
+
+ /* malloc pixels index tables */
+ image_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * ncolors);
+ if (!image_pixels)
+ RETURN(XpmNoMemory);
+
+ mask_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * ncolors);
+ if (!mask_pixels)
+ RETURN(XpmNoMemory);
+
+ /* maximum of allocated pixels will be the number of colors */
+ alloc_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * ncolors);
+ if (!alloc_pixels)
+ RETURN(XpmNoMemory);
+
+ /* maximum of allocated pixels will be the number of colors */
+ used_pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * ncolors);
+ if (!used_pixels)
+ RETURN(XpmNoMemory);
+
+ /* get pixel colors, store them in index tables */
+ ErrorStatus = CreateColors(display, attributes, colorTable, ncolors,
+ image_pixels, mask_pixels, &mask_pixel_index,
+ alloc_pixels, &nalloc_pixels, used_pixels,
+ &nused_pixels);
+
+ if (ErrorStatus != XpmSuccess
+ && (ErrorStatus < 0 || (attributes
+ && (attributes->valuemask & XpmExactColors)
+ && attributes->exactColors)))
+ RETURN(ErrorStatus);
+
+ /* now create the ximage */
+ if (image_return) {
+ ErrorStatus = CreateXImage(display, visual, depth,
+ (depth == 1 ? bitmap_format : ZPixmap),
+ width, height, &ximage);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+#if !defined(FOR_MSW) && !defined(AMIGA)
+
+ /*
+ * set the XImage pointer function, to be used with XPutPixel,
+ * to an internal optimized function
+ */
+
+ if (ximage->bits_per_pixel == 8)
+ ximage->f.put_pixel = PutPixel8;
+ else if (((ximage->bits_per_pixel | ximage->depth) == 1) &&
+ (ximage->byte_order == ximage->bitmap_bit_order))
+ if (ximage->bitmap_bit_order == MSBFirst)
+ ximage->f.put_pixel = PutPixel1MSB;
+ else
+ ximage->f.put_pixel = PutPixel1LSB;
+ else if (ximage->bits_per_pixel == 16)
+ if (ximage->bitmap_bit_order == MSBFirst)
+ ximage->f.put_pixel = PutPixel16MSB;
+ else
+ ximage->f.put_pixel = PutPixel16LSB;
+ else if (ximage->bits_per_pixel == 32)
+#if !defined(WORD64) && !defined(LONG64)
+ if (*((char *)&byteorderpixel) == ximage->byte_order)
+ ximage->f.put_pixel = PutPixel32;
+ else
+#endif
+ if (ximage->bitmap_bit_order == MSBFirst)
+ ximage->f.put_pixel = PutPixel32MSB;
+ else
+ ximage->f.put_pixel = PutPixel32LSB;
+ else if ((ximage->bits_per_pixel | ximage->depth) == 1)
+ ximage->f.put_pixel = PutPixel1;
+ else
+ ximage->f.put_pixel = PutPixel;
+#endif /* not FOR_MSW && not AMIGA */
+ }
+
+ /* create the shape mask image */
+ if (mask_pixel_index != XpmUndefPixel && shapeimage_return) {
+ ErrorStatus = CreateXImage(display, visual, 1, bitmap_format,
+ width, height, &shapeimage);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+#if !defined(FOR_MSW) && !defined(AMIGA)
+ if (shapeimage->bitmap_bit_order == MSBFirst)
+ shapeimage->f.put_pixel = PutPixel1MSB;
+ else
+ shapeimage->f.put_pixel = PutPixel1LSB;
+#endif
+ }
+
+ /*
+ * read pixels and put them in the XImage
+ */
+ ErrorStatus = ParseAndPutPixels(
+#ifdef FOR_MSW
+ display,
+#endif
+ data, width, height, ncolors, cpp,
+ colorTable, &hashtable,
+ ximage, image_pixels,
+ shapeimage, mask_pixels);
+ XpmFree(image_pixels);
+ image_pixels = NULL;
+ XpmFree(mask_pixels);
+ mask_pixels = NULL;
+
+ /*
+ * free the hastable
+ */
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus)
+ else if (USE_HASHTABLE)
+ xpmHashTableFree(&hashtable);
+
+ /*
+ * store the pixels comment line
+ */
+ if (cmts)
+ xpmGetCmt(data, &pixels_cmt);
+
+ /*
+ * parse extensions
+ */
+ if (info && (info->valuemask & XpmReturnExtensions))
+ if (extensions) {
+ ErrorStatus = xpmParseExtensions(data, &info->extensions,
+ &info->nextensions);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+ } else {
+ info->extensions = NULL;
+ info->nextensions = 0;
+ }
+
+ /*
+ * store found informations in the XpmImage structure
+ */
+ image->width = width;
+ image->height = height;
+ image->cpp = cpp;
+ image->ncolors = ncolors;
+ image->colorTable = colorTable;
+ image->data = NULL;
+
+ if (info) {
+ if (cmts) {
+ info->hints_cmt = hints_cmt;
+ info->colors_cmt = colors_cmt;
+ info->pixels_cmt = pixels_cmt;
+ }
+ if (hotspot) {
+ info->x_hotspot = x_hotspot;
+ info->y_hotspot = y_hotspot;
+ info->valuemask |= XpmHotspot;
+ }
+ }
+ /* if requested return used pixels in the XpmAttributes structure */
+ if (attributes && (attributes->valuemask & XpmReturnPixels ||
+/* 3.2 backward compatibility code */
+ attributes->valuemask & XpmReturnInfos)) {
+/* end 3.2 bc */
+ attributes->pixels = used_pixels;
+ attributes->npixels = nused_pixels;
+ attributes->mask_pixel = mask_pixel_index;
+ } else
+ XpmFree(used_pixels);
+
+ /* if requested return alloc'ed pixels in the XpmAttributes structure */
+ if (attributes && (attributes->valuemask & XpmReturnAllocPixels)) {
+ attributes->alloc_pixels = alloc_pixels;
+ attributes->nalloc_pixels = nalloc_pixels;
+ } else
+ XpmFree(alloc_pixels);
+
+ /* return created images */
+ if (image_return)
+ *image_return = ximage;
+ if (shapeimage_return)
+ *shapeimage_return = shapeimage;
+
+ return (XpmSuccess);
+
+/* exit point in case of error, free only locally allocated variables */
+error:
+ if (USE_HASHTABLE)
+ xpmHashTableFree(&hashtable);
+ if (colorTable)
+ xpmFreeColorTable(colorTable, ncolors);
+ if (hints_cmt)
+ XpmFree(hints_cmt);
+ if (colors_cmt)
+ XpmFree(colors_cmt);
+ if (pixels_cmt)
+ XpmFree(pixels_cmt);
+ if (ximage)
+ XDestroyImage(ximage);
+ if (shapeimage)
+ XDestroyImage(shapeimage);
+ if (image_pixels)
+ XpmFree(image_pixels);
+ if (mask_pixels)
+ XpmFree(mask_pixels);
+ if (nalloc_pixels)
+ (*freeColors)(display, colormap, alloc_pixels, nalloc_pixels, NULL);
+ if (alloc_pixels)
+ XpmFree(alloc_pixels);
+ if (used_pixels)
+ XpmFree(used_pixels);
+
+ return (ErrorStatus);
+}
+
+static int
+ParseAndPutPixels(
+#ifdef FOR_MSW
+ dc,
+#endif
+ data, width, height, ncolors, cpp, colorTable, hashtable,
+ image, image_pixels, shapeimage, shape_pixels)
+#ifdef FOR_MSW
+ Display *dc;
+#endif
+ xpmData *data;
+ unsigned int width;
+ unsigned int height;
+ unsigned int ncolors;
+ unsigned int cpp;
+ XpmColor *colorTable;
+ xpmHashTable *hashtable;
+ XImage *image;
+ Pixel *image_pixels;
+ XImage *shapeimage;
+ Pixel *shape_pixels;
+{
+ unsigned int a, x, y;
+
+ switch (cpp) {
+
+ case (1): /* Optimize for single character
+ * colors */
+ {
+ unsigned short colidx[256];
+#ifdef FOR_MSW
+ HDC shapedc;
+ HBITMAP obm, sobm;
+
+ if ( shapeimage ) {
+ shapedc = CreateCompatibleDC(*dc);
+ sobm = SelectObject(shapedc, shapeimage->bitmap);
+ } else {
+ shapedc = NULL;
+ }
+ obm = SelectObject(*dc, image->bitmap);
+#endif
+
+
+ bzero((char *)colidx, 256 * sizeof(short));
+ for (a = 0; a < ncolors; a++)
+ colidx[(unsigned char)colorTable[a].string[0]] = a + 1;
+
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++) {
+ int c = xpmGetC(data);
+
+ if (c > 0 && c < 256 && colidx[c] != 0) {
+#ifndef FOR_MSW
+ XPutPixel(image, x, y, image_pixels[colidx[c] - 1]);
+ if (shapeimage)
+ XPutPixel(shapeimage, x, y,
+ shape_pixels[colidx[c] - 1]);
+#else
+ SetPixel(*dc, x, y, image_pixels[colidx[c] - 1]);
+ if (shapedc) {
+ SetPixel(shapedc, x, y, shape_pixels[colidx[c] - 1]);
+ }
+#endif
+ } else
+ return (XpmFileInvalid);
+ }
+ }
+#ifdef FOR_MSW
+ if ( shapedc ) {
+ SelectObject(shapedc, sobm);
+ DeleteDC(shapedc);
+ }
+ SelectObject(*dc, obm);
+#endif
+ }
+ break;
+
+ case (2): /* Optimize for double character
+ * colors */
+ {
+
+/* free all allocated pointers at all exits */
+#define FREE_CIDX {int f; for (f = 0; f < 256; f++) \
+if (cidx[f]) XpmFree(cidx[f]);}
+
+ /* array of pointers malloced by need */
+ unsigned short *cidx[256];
+ int char1;
+
+ bzero((char *)cidx, 256 * sizeof(unsigned short *)); /* init */
+ for (a = 0; a < ncolors; a++) {
+ char1 = colorTable[a].string[0];
+ if (cidx[char1] == NULL) { /* get new memory */
+ cidx[char1] = (unsigned short *)
+ XpmCalloc(256, sizeof(unsigned short));
+ if (cidx[char1] == NULL) { /* new block failed */
+ FREE_CIDX;
+ return (XpmNoMemory);
+ }
+ }
+ cidx[char1][(unsigned char)colorTable[a].string[1]] = a + 1;
+ }
+
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++) {
+ int cc1 = xpmGetC(data);
+ if (cc1 > 0 && cc1 < 256) {
+ int cc2 = xpmGetC(data);
+ if (cc2 > 0 && cc2 < 256 &&
+ cidx[cc1] && cidx[cc1][cc2] != 0) {
+#ifndef FOR_MSW
+ XPutPixel(image, x, y,
+ image_pixels[cidx[cc1][cc2] - 1]);
+ if (shapeimage)
+ XPutPixel(shapeimage, x, y,
+ shape_pixels[cidx[cc1][cc2] - 1]);
+#else
+ SelectObject(*dc, image->bitmap);
+ SetPixel(*dc, x, y, image_pixels[cidx[cc1][cc2] - 1]);
+ if (shapeimage) {
+ SelectObject(*dc, shapeimage->bitmap);
+ SetPixel(*dc, x, y,
+ shape_pixels[cidx[cc1][cc2] - 1]);
+ }
+#endif
+ } else {
+ FREE_CIDX;
+ return (XpmFileInvalid);
+ }
+ } else {
+ FREE_CIDX;
+ return (XpmFileInvalid);
+ }
+ }
+ }
+ FREE_CIDX;
+ }
+ break;
+
+ default: /* Non-optimized case of long color
+ * names */
+ {
+ char *s;
+ char buf[BUFSIZ];
+
+ buf[cpp] = '\0';
+ if (USE_HASHTABLE) {
+ xpmHashAtom *slot;
+
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++) {
+ for (a = 0, s = buf; a < cpp; a++, s++)
+ *s = xpmGetC(data);
+ slot = xpmHashSlot(hashtable, buf);
+ if (!*slot) /* no color matches */
+ return (XpmFileInvalid);
+#ifndef FOR_MSW
+ XPutPixel(image, x, y,
+ image_pixels[HashColorIndex(slot)]);
+ if (shapeimage)
+ XPutPixel(shapeimage, x, y,
+ shape_pixels[HashColorIndex(slot)]);
+#else
+ SelectObject(*dc, image->bitmap);
+ SetPixel(*dc, x, y,
+ image_pixels[HashColorIndex(slot)]);
+ if (shapeimage) {
+ SelectObject(*dc, shapeimage->bitmap);
+ SetPixel(*dc, x, y,
+ shape_pixels[HashColorIndex(slot)]);
+ }
+#endif
+ }
+ }
+ } else {
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++) {
+ for (a = 0, s = buf; a < cpp; a++, s++)
+ *s = xpmGetC(data);
+ for (a = 0; a < ncolors; a++)
+ if (!strcmp(colorTable[a].string, buf))
+ break;
+ if (a == ncolors) /* no color matches */
+ return (XpmFileInvalid);
+#ifndef FOR_MSW
+ XPutPixel(image, x, y, image_pixels[a]);
+ if (shapeimage)
+ XPutPixel(shapeimage, x, y, shape_pixels[a]);
+#else
+ SelectObject(*dc, image->bitmap);
+ SetPixel(*dc, x, y, image_pixels[a]);
+ if (shapeimage) {
+ SelectObject(*dc, shapeimage->bitmap);
+ SetPixel(*dc, x, y, shape_pixels[a]);
+ }
+#endif
+ }
+ }
+ }
+ }
+ break;
+ }
+ return (XpmSuccess);
+}
diff --git a/xc/extras/Xpm/lib/data.c b/xc/extras/Xpm/lib/data.c
new file mode 100644
index 000000000..e7d15f8a2
--- /dev/null
+++ b/xc/extras/Xpm/lib/data.c
@@ -0,0 +1,479 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* data.c: *
+* *
+* XPM library *
+* IO utilities *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#ifndef CXPMPROG
+/* Official version number */
+static char *RCS_Version = "$XpmVersion: 3.4k $";
+
+/* Internal version number */
+static char *RCS_Id = "$Id: data.c,v 1.1.1.1 1999/12/05 01:23:41 daryll Exp $";
+
+#include "XpmI.h"
+#endif
+#include <ctype.h>
+
+#ifndef CXPMPROG
+#define Getc(data, file) getc(file)
+#define Ungetc(data, c, file) ungetc(c, file)
+#endif
+
+static int
+ParseComment(data)
+ xpmData *data;
+{
+ if (data->type == XPMBUFFER) {
+ register char c;
+ register unsigned int n = 0;
+ unsigned int notend;
+ char *s, *s2;
+
+ s = data->Comment;
+ *s = data->Bcmt[0];
+
+ /* skip the string beginning comment */
+ s2 = data->Bcmt;
+ do {
+ c = *data->cptr++;
+ *++s = c;
+ n++;
+ s2++;
+ } while (c == *s2 && *s2 != '\0' && c);
+
+ if (*s2 != '\0') {
+ /* this wasn't the beginning of a comment */
+ data->cptr -= n;
+ return 0;
+ }
+ /* store comment */
+ data->Comment[0] = *s;
+ s = data->Comment;
+ notend = 1;
+ n = 0;
+ while (notend) {
+ s2 = data->Ecmt;
+ while (*s != *s2 && c) {
+ c = *data->cptr++;
+ if (n == XPMMAXCMTLEN - 1) { /* forget it */
+ s = data->Comment;
+ n = 0;
+ }
+ *++s = c;
+ n++;
+ }
+ data->CommentLength = n;
+ do {
+ c = *data->cptr++;
+ if (n == XPMMAXCMTLEN - 1) { /* forget it */
+ s = data->Comment;
+ n = 0;
+ }
+ *++s = c;
+ n++;
+ s2++;
+ } while (c == *s2 && *s2 != '\0' && c);
+ if (*s2 == '\0') {
+ /* this is the end of the comment */
+ notend = 0;
+ data->cptr--;
+ }
+ }
+ return 0;
+ } else {
+ FILE *file = data->stream.file;
+ register int c;
+ register unsigned int n = 0, a;
+ unsigned int notend;
+ char *s, *s2;
+
+ s = data->Comment;
+ *s = data->Bcmt[0];
+
+ /* skip the string beginning comment */
+ s2 = data->Bcmt;
+ do {
+ c = Getc(data, file);
+ *++s = c;
+ n++;
+ s2++;
+ } while (c == *s2 && *s2 != '\0' && c != EOF);
+
+ if (*s2 != '\0') {
+ /* this wasn't the beginning of a comment */
+ /* put characters back in the order that we got them */
+ for (a = n; a > 0; a--, s--)
+ Ungetc(data, *s, file);
+ return 0;
+ }
+ /* store comment */
+ data->Comment[0] = *s;
+ s = data->Comment;
+ notend = 1;
+ n = 0;
+ while (notend) {
+ s2 = data->Ecmt;
+ while (*s != *s2 && c != EOF) {
+ c = Getc(data, file);
+ if (n == XPMMAXCMTLEN - 1) { /* forget it */
+ s = data->Comment;
+ n = 0;
+ }
+ *++s = c;
+ n++;
+ }
+ data->CommentLength = n;
+ do {
+ c = Getc(data, file);
+ if (n == XPMMAXCMTLEN - 1) { /* forget it */
+ s = data->Comment;
+ n = 0;
+ }
+ *++s = c;
+ n++;
+ s2++;
+ } while (c == *s2 && *s2 != '\0' && c != EOF);
+ if (*s2 == '\0') {
+ /* this is the end of the comment */
+ notend = 0;
+ Ungetc(data, *s, file);
+ }
+ }
+ return 0;
+ }
+}
+
+/*
+ * skip to the end of the current string and the beginning of the next one
+ */
+int
+xpmNextString(data)
+ xpmData *data;
+{
+ if (!data->type)
+ data->cptr = (data->stream.data)[++data->line];
+ else if (data->type == XPMBUFFER) {
+ register char c;
+
+ /* get to the end of the current string */
+ if (data->Eos)
+ while ((c = *data->cptr++) && c != data->Eos);
+
+ /*
+ * then get to the beginning of the next string looking for possible
+ * comment
+ */
+ if (data->Bos) {
+ while ((c = *data->cptr++) && c != data->Bos)
+ if (data->Bcmt && c == data->Bcmt[0])
+ ParseComment(data);
+ } else if (data->Bcmt) { /* XPM2 natural */
+ while ((c = *data->cptr++) == data->Bcmt[0])
+ ParseComment(data);
+ data->cptr--;
+ }
+ } else {
+ register int c;
+ FILE *file = data->stream.file;
+
+ /* get to the end of the current string */
+ if (data->Eos)
+ while ((c = Getc(data, file)) != data->Eos && c != EOF);
+
+ /*
+ * then get to the beginning of the next string looking for possible
+ * comment
+ */
+ if (data->Bos) {
+ while ((c = Getc(data, file)) != data->Bos && c != EOF)
+ if (data->Bcmt && c == data->Bcmt[0])
+ ParseComment(data);
+
+ } else if (data->Bcmt) { /* XPM2 natural */
+ while ((c = Getc(data, file)) == data->Bcmt[0])
+ ParseComment(data);
+ Ungetc(data, c, file);
+ }
+ }
+ return 0;
+}
+
+
+/*
+ * skip whitespace and return the following word
+ */
+unsigned int
+xpmNextWord(data, buf, buflen)
+ xpmData *data;
+ char *buf;
+ unsigned int buflen;
+{
+ register unsigned int n = 0;
+ int c;
+
+ if (!data->type || data->type == XPMBUFFER) {
+ while (isspace(c = *data->cptr) && c != data->Eos)
+ data->cptr++;
+ do {
+ c = *data->cptr++;
+ *buf++ = c;
+ n++;
+ } while (!isspace(c) && c != data->Eos && n < buflen);
+ n--;
+ data->cptr--;
+ } else {
+ FILE *file = data->stream.file;
+
+ while ((c = Getc(data, file)) != EOF && isspace(c) && c != data->Eos);
+ while (!isspace(c) && c != data->Eos && c != EOF && n < buflen) {
+ *buf++ = c;
+ n++;
+ c = Getc(data, file);
+ }
+ Ungetc(data, c, file);
+ }
+ return (n);
+}
+
+/*
+ * skip whitespace and compute the following unsigned int,
+ * returns 1 if one is found and 0 if not
+ */
+int
+xpmNextUI(data, ui_return)
+ xpmData *data;
+ unsigned int *ui_return;
+{
+ char buf[BUFSIZ];
+ int l;
+
+ l = xpmNextWord(data, buf, BUFSIZ);
+ return xpmatoui(buf, l, ui_return);
+}
+
+/*
+ * return end of string - WARNING: malloc!
+ */
+int
+xpmGetString(data, sptr, l)
+ xpmData *data;
+ char **sptr;
+ unsigned int *l;
+{
+ unsigned int i, n = 0;
+ int c;
+ char *p = NULL, *q, buf[BUFSIZ];
+
+ if (!data->type || data->type == XPMBUFFER) {
+ if (data->cptr) {
+ char *start = data->cptr;
+ while ((c = *data->cptr) && c != data->Eos)
+ data->cptr++;
+ n = data->cptr - start + 1;
+ p = (char *) XpmMalloc(n);
+ if (!p)
+ return (XpmNoMemory);
+ strncpy(p, start, n);
+ if (data->type) /* XPMBUFFER */
+ p[n - 1] = '\0';
+ }
+ } else {
+ FILE *file = data->stream.file;
+
+ if ((c = Getc(data, file)) == EOF)
+ return (XpmFileInvalid);
+
+ i = 0;
+ q = buf;
+ p = (char *) XpmMalloc(1);
+ while (c != data->Eos && c != EOF) {
+ if (i == BUFSIZ) {
+ /* get to the end of the buffer */
+ /* malloc needed memory */
+ q = (char *) XpmRealloc(p, n + i);
+ if (!q) {
+ XpmFree(p);
+ return (XpmNoMemory);
+ }
+ p = q;
+ q += n;
+ /* and copy what we already have */
+ strncpy(q, buf, i);
+ n += i;
+ i = 0;
+ q = buf;
+ }
+ *q++ = c;
+ i++;
+ c = Getc(data, file);
+ }
+ if (c == EOF) {
+ XpmFree(p);
+ return (XpmFileInvalid);
+ }
+ if (n + i != 0) {
+ /* malloc needed memory */
+ q = (char *) XpmRealloc(p, n + i + 1);
+ if (!q) {
+ XpmFree(p);
+ return (XpmNoMemory);
+ }
+ p = q;
+ q += n;
+ /* and copy the buffer */
+ strncpy(q, buf, i);
+ n += i;
+ p[n++] = '\0';
+ } else {
+ *p = '\0';
+ n = 1;
+ }
+ Ungetc(data, c, file);
+ }
+ *sptr = p;
+ *l = n;
+ return (XpmSuccess);
+}
+
+/*
+ * get the current comment line
+ */
+int
+xpmGetCmt(data, cmt)
+ xpmData *data;
+ char **cmt;
+{
+ if (!data->type)
+ *cmt = NULL;
+ else if (data->CommentLength) {
+ *cmt = (char *) XpmMalloc(data->CommentLength + 1);
+ strncpy(*cmt, data->Comment, data->CommentLength);
+ (*cmt)[data->CommentLength] = '\0';
+ data->CommentLength = 0;
+ } else
+ *cmt = NULL;
+ return 0;
+}
+
+xpmDataType xpmDataTypes[] =
+{
+ "", "!", "\n", '\0', '\n', "", "", "", "", /* Natural type */
+ "C", "/*", "*/", '"', '"', ",\n", "static char *", "[] = {\n", "};\n",
+ "Lisp", ";", "\n", '"', '"', "\n", "(setq ", " '(\n", "))\n",
+#ifdef VMS
+ NULL
+#else
+ NULL, NULL, NULL, 0, 0, NULL, NULL, NULL, NULL
+#endif
+};
+
+/*
+ * parse xpm header
+ */
+int
+xpmParseHeader(data)
+ xpmData *data;
+{
+ char buf[BUFSIZ];
+ int l, n = 0;
+
+ if (data->type) {
+ data->Bos = '\0';
+ data->Eos = '\n';
+ data->Bcmt = data->Ecmt = NULL;
+ l = xpmNextWord(data, buf, BUFSIZ);
+ if (l == 7 && !strncmp("#define", buf, 7)) {
+ /* this maybe an XPM 1 file */
+ char *ptr;
+
+ l = xpmNextWord(data, buf, BUFSIZ);
+ if (!l)
+ return (XpmFileInvalid);
+ buf[l] = '\0';
+ ptr = rindex(buf, '_');
+ if (!ptr || strncmp("_format", ptr, l - (ptr - buf)))
+ return XpmFileInvalid;
+ /* this is definitely an XPM 1 file */
+ data->format = 1;
+ n = 1; /* handle XPM1 as mainly XPM2 C */
+ } else {
+
+ /*
+ * skip the first word, get the second one, and see if this is
+ * XPM 2 or 3
+ */
+ l = xpmNextWord(data, buf, BUFSIZ);
+ if ((l == 3 && !strncmp("XPM", buf, 3)) ||
+ (l == 4 && !strncmp("XPM2", buf, 4))) {
+ if (l == 3)
+ n = 1; /* handle XPM as XPM2 C */
+ else {
+ /* get the type key word */
+ l = xpmNextWord(data, buf, BUFSIZ);
+
+ /*
+ * get infos about this type
+ */
+ while (xpmDataTypes[n].type
+ && strncmp(xpmDataTypes[n].type, buf, l))
+ n++;
+ }
+ data->format = 0;
+ } else
+ /* nope this is not an XPM file */
+ return XpmFileInvalid;
+ }
+ if (xpmDataTypes[n].type) {
+ if (n == 0) { /* natural type */
+ data->Bcmt = xpmDataTypes[n].Bcmt;
+ data->Ecmt = xpmDataTypes[n].Ecmt;
+ xpmNextString(data); /* skip the end of the headerline */
+ data->Bos = xpmDataTypes[n].Bos;
+ data->Eos = xpmDataTypes[n].Eos;
+ } else {
+ data->Bcmt = xpmDataTypes[n].Bcmt;
+ data->Ecmt = xpmDataTypes[n].Ecmt;
+ if (!data->format) { /* XPM 2 or 3 */
+ data->Bos = xpmDataTypes[n].Bos;
+ data->Eos = '\0';
+ /* get to the beginning of the first string */
+ xpmNextString(data);
+ data->Eos = xpmDataTypes[n].Eos;
+ } else /* XPM 1 skip end of line */
+ xpmNextString(data);
+ }
+ } else
+ /* we don't know about that type of XPM file... */
+ return XpmFileInvalid;
+ }
+ return XpmSuccess;
+}
diff --git a/xc/extras/Xpm/lib/descrip.mms b/xc/extras/Xpm/lib/descrip.mms
new file mode 100644
index 000000000..701884e73
--- /dev/null
+++ b/xc/extras/Xpm/lib/descrip.mms
@@ -0,0 +1,82 @@
+cc_defs = /define=(NEED_STRCASECMP,NEED_STRDUP,NO_ZPIPE)
+c_deb =
+
+.ifdef __DECC__
+pref = /prefix=all
+.endif
+
+OBJS=\
+data.obj,\
+create.obj,\
+misc.obj,\
+rgb.obj,\
+scan.obj,\
+parse.obj,\
+hashtab.obj,\
+WrFFrP.obj,\
+RdFToP.obj,\
+CrPFrDat.obj,\
+CrDatFrP.obj,\
+WrFFrI.obj,\
+RdFToI,\
+CrIFrDat.obj,\
+CrDatFrI.obj,\
+CrIFrBuf.obj,\
+CrPFrBuf.obj,\
+CrBufFrI.obj,\
+CrBufFrP.obj,\
+RdFToDat.obj,\
+WrFFrDat.obj,\
+Attrib.obj,\
+CrIFrP.obj,\
+CrPFrI.obj,\
+Image.obj,\
+Info.obj,\
+RdFToBuf.obj,\
+WrFFrBuf.obj
+
+CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF)
+
+all : libXpm.olb sxpm.exe
+ @ library/compress libxpm.olb
+
+libXpm.olb : libXpm.olb($(OBJS))
+ @ write sys$output " Libxpm available"
+
+sxpm.exe : sxpm.obj libXpm.olb
+ @ link sxpm,sxpm/opt
+clean :
+ delete *.obj;*,libXpm.olb;*
+
+
+# Other dependencies.
+CrBufFrI.obj : XpmI.h xpm.h
+CrBufFrP.obj : XpmI.h xpm.h
+CrDatFI.obj : XpmI.h xpm.h
+CrDatFP.obj : XpmI.h xpm.h
+CrIFrBuf.obj : XpmI.h xpm.h
+CrIFrDat.obj : XpmI.h xpm.h
+CrPFrBuf.obj : XpmI.h xpm.h
+CrPFrDat.obj : XpmI.h xpm.h
+RdFToDat.obj : XpmI.h xpm.h
+RdFToI.obj : XpmI.h xpm.h
+RdFToP.obj : XpmI.h xpm.h
+WrFFrDat.obj : XpmI.h xpm.h
+WrFFrI.obj : XpmI.h xpm.h
+WrFFrP.obj : XpmI.h xpm.h
+create.obj : XpmI.h xpm.h
+data.obj : XpmI.h xpm.h
+hashtab.obj : XpmI.h xpm.h
+misc.obj : XpmI.h xpm.h
+parse.obj : XpmI.h xpm.h
+rgb.obj : XpmI.h xpm.h
+scan.obj : XpmI.h xpm.h
+Attrib.obj : XpmI.h xpm.h
+CrIFrP.obj : XpmI.h xpm.h
+CrPFrI.obj : XpmI.h xpm.h
+Image.obj : XpmI.h xpm.h
+Info.obj : XpmI.h xpm.h
+RdFToBuf.obj : XpmI.h xpm.h
+WrFFrBuf.obj : XpmI.h xpm.h
+
+sxpm.obj : [-.sxpm]sxpm.c xpm.h
diff --git a/xc/extras/Xpm/lib/hashtab.c b/xc/extras/Xpm/lib/hashtab.c
new file mode 100644
index 000000000..7d596ec42
--- /dev/null
+++ b/xc/extras/Xpm/lib/hashtab.c
@@ -0,0 +1,234 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* hashtab.c: *
+* *
+* XPM library *
+* *
+* Developed by Arnaud Le Hors *
+* this originaly comes from Colas Nahaboo as a part of Wool *
+* *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+LFUNC(AtomMake, xpmHashAtom, (char *name, void *data));
+LFUNC(HashTableGrows, int, (xpmHashTable * table));
+
+static xpmHashAtom
+AtomMake(name, data) /* makes an atom */
+ char *name; /* WARNING: is just pointed to */
+ void *data;
+{
+ xpmHashAtom object = (xpmHashAtom) XpmMalloc(sizeof(struct _xpmHashAtom));
+
+ if (object) {
+ object->name = name;
+ object->data = data;
+ }
+ return object;
+}
+
+/************************\
+* *
+* hash table routines *
+* *
+\************************/
+
+/*
+ * Hash function definition:
+ * HASH_FUNCTION: hash function, hash = hashcode, hp = pointer on char,
+ * hash2 = temporary for hashcode.
+ * INITIAL_TABLE_SIZE in slots
+ * HASH_TABLE_GROWS how hash table grows.
+ */
+
+/* Mock lisp function */
+#define HASH_FUNCTION hash = (hash << 5) - hash + *hp++;
+/* #define INITIAL_HASH_SIZE 2017 */
+#define INITIAL_HASH_SIZE 256 /* should be enough for colors */
+#define HASH_TABLE_GROWS size = size * 2;
+
+/* aho-sethi-ullman's HPJ (sizes should be primes)*/
+#ifdef notdef
+#define HASH_FUNCTION hash <<= 4; hash += *hp++; \
+ if(hash2 = hash & 0xf0000000) hash ^= (hash2 >> 24) ^ hash2;
+#define INITIAL_HASH_SIZE 4095 /* should be 2^n - 1 */
+#define HASH_TABLE_GROWS size = size << 1 + 1;
+#endif
+
+/* GNU emacs function */
+/*
+#define HASH_FUNCTION hash = (hash << 3) + (hash >> 28) + *hp++;
+#define INITIAL_HASH_SIZE 2017
+#define HASH_TABLE_GROWS size = size * 2;
+*/
+
+/* end of hash functions */
+
+/*
+ * The hash table is used to store atoms via their NAME:
+ *
+ * NAME --hash--> ATOM |--name--> "foo"
+ * |--data--> any value which has to be stored
+ *
+ */
+
+/*
+ * xpmHashSlot gives the slot (pointer to xpmHashAtom) of a name
+ * (slot points to NULL if it is not defined)
+ *
+ */
+
+xpmHashAtom *
+xpmHashSlot(table, s)
+ xpmHashTable *table;
+ char *s;
+{
+ xpmHashAtom *atomTable = table->atomTable;
+ unsigned int hash;
+ xpmHashAtom *p;
+ char *hp = s;
+ char *ns;
+
+ hash = 0;
+ while (*hp) { /* computes hash function */
+ HASH_FUNCTION
+ }
+ p = atomTable + hash % table->size;
+ while (*p) {
+ ns = (*p)->name;
+ if (ns[0] == s[0] && strcmp(ns, s) == 0)
+ break;
+ p--;
+ if (p < atomTable)
+ p = atomTable + table->size - 1;
+ }
+ return p;
+}
+
+static int
+HashTableGrows(table)
+ xpmHashTable *table;
+{
+ xpmHashAtom *atomTable = table->atomTable;
+ int size = table->size;
+ xpmHashAtom *t, *p;
+ int i;
+ int oldSize = size;
+
+ t = atomTable;
+ HASH_TABLE_GROWS
+ table->size = size;
+ table->limit = size / 3;
+ atomTable = (xpmHashAtom *) XpmMalloc(size * sizeof(*atomTable));
+ if (!atomTable)
+ return (XpmNoMemory);
+ table->atomTable = atomTable;
+ for (p = atomTable + size; p > atomTable;)
+ *--p = NULL;
+ for (i = 0, p = t; i < oldSize; i++, p++)
+ if (*p) {
+ xpmHashAtom *ps = xpmHashSlot(table, (*p)->name);
+
+ *ps = *p;
+ }
+ XpmFree(t);
+ return (XpmSuccess);
+}
+
+/*
+ * xpmHashIntern(table, name, data)
+ * an xpmHashAtom is created if name doesn't exist, with the given data.
+ */
+
+int
+xpmHashIntern(table, tag, data)
+ xpmHashTable *table;
+ char *tag;
+ void *data;
+{
+ xpmHashAtom *slot;
+
+ if (!*(slot = xpmHashSlot(table, tag))) {
+ /* undefined, make a new atom with the given data */
+ if (!(*slot = AtomMake(tag, data)))
+ return (XpmNoMemory);
+ if (table->used >= table->limit) {
+ int ErrorStatus;
+
+ if ((ErrorStatus = HashTableGrows(table)) != XpmSuccess)
+ return (ErrorStatus);
+ table->used++;
+ return (XpmSuccess);
+ }
+ table->used++;
+ }
+ return (XpmSuccess);
+}
+
+/*
+ * must be called before allocating any atom
+ */
+
+int
+xpmHashTableInit(table)
+ xpmHashTable *table;
+{
+ xpmHashAtom *p;
+ xpmHashAtom *atomTable;
+
+ table->size = INITIAL_HASH_SIZE;
+ table->limit = table->size / 3;
+ table->used = 0;
+ atomTable = (xpmHashAtom *) XpmMalloc(table->size * sizeof(*atomTable));
+ if (!atomTable)
+ return (XpmNoMemory);
+ for (p = atomTable + table->size; p > atomTable;)
+ *--p = NULL;
+ table->atomTable = atomTable;
+ return (XpmSuccess);
+}
+
+/*
+ * frees a hashtable and all the stored atoms
+ */
+
+void
+xpmHashTableFree(table)
+ xpmHashTable *table;
+{
+ xpmHashAtom *p;
+ xpmHashAtom *atomTable = table->atomTable;
+
+ if (!atomTable)
+ return;
+ for (p = atomTable + table->size; p > atomTable;)
+ if (*--p)
+ XpmFree(*p);
+ XpmFree(atomTable);
+ table->atomTable = NULL;
+}
diff --git a/xc/extras/Xpm/lib/make.com b/xc/extras/Xpm/lib/make.com
new file mode 100644
index 000000000..db70cc2c0
--- /dev/null
+++ b/xc/extras/Xpm/lib/make.com
@@ -0,0 +1,169 @@
+$!---------------make.com for xpmlib----------------------------------------
+$! make xpmlib under VMS
+$!
+$ Make = ""
+$!
+$! Where are we?
+$!
+$ here = f$directory()
+$ disk = f$trnlnm("SYS$DISK")
+$ path = "''disk'"+ "''here'"
+$ xpath = "''path'" - "SXPM]" + "lib]"
+$ if f$trnlnm("X11").eqs."" then define x11 decw$include,'xpath
+$!
+$! Check for MMK/MMS
+$!
+$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS"
+$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK"
+$!
+$! Look for the compiler used
+$!
+$ ccopt = "/define=(NEED_STRCASECMP,NEED_STRDUP,NO_ZPIPE)"
+$ if f$getsyi("HW_MODEL").ge.1024
+$ then
+$ ccopt = "/prefix=all"+ccopt
+$ comp = "__decc__=1"
+$ if f$trnlnm("SYS").eqs."" then define sys sys$library:
+$ else
+$ if f$search("SYS$SYSTEM:DECC$COMPILER.EXE").eqs.""
+$ then
+$ comp = "__vaxc__=1"
+$ if f$trnlnm("SYS").eqs."" then define sys sys$library:
+$ else
+$ if f$trnlnm("SYS").eqs."" then define sys decc$library_include:
+$ ccopt = "/decc/prefix=all"+ccopt
+$ comp = "__decc__=1"
+$ endif
+$ endif
+$!
+$! Produce linker-options file according to X-Release and compiler used
+$!
+$ open/write optf sxpm.opt
+$ write optf "libxpm.olb/lib"
+$ write optf "sys$share:decw$xextlibshr.exe/share"
+$ write optf "sys$share:decw$xlibshr.exe/share"
+$ @sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.1"
+$ then
+$ write optf "sys$share:decw$xtshr.exe/share"
+$ endif
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$ write optf "sys$share:decw$xtlibshrr5.exe/share"
+$ endif
+$ close optf
+$!
+$! Build the thing plain or with 'Make'
+$!
+$ write sys$output "Compiling XPMlib sources ..."
+$ if (Make .eqs. "")
+$ then
+$ 'Make'/Macro = ('comp')
+$ else
+$ CALL MAKE CrBufFrI.OBJ "CC ''CCOPT' CrBufFrI" -
+ CrBufFrI.c XpmI.h xpm.h
+$ CALL MAKE CrBufFrP.OBJ "CC ''CCOPT' CrBufFrP" -
+ CrBufFrP.c XpmI.h xpm.h
+$ CALL MAKE CrDatFI.OBJ "CC ''CCOPT' CrDatFrI" -
+ CrDatFrI.c XpmI.h xpm.h
+$ CALL MAKE CrDatFP.OBJ "CC ''CCOPT' CrDatFrP" -
+ CrDatFrP.c XpmI.h xpm.h
+$ CALL MAKE CrIFrBuf.OBJ "CC ''CCOPT' CrIFrBuf" -
+ CrIFrBuf.c XpmI.h xpm.h
+$ CALL MAKE CrIFrDat.OBJ "CC ''CCOPT' CrIFrDat" -
+ CrIFrDat.c XpmI.h xpm.h
+$ CALL MAKE CrPFrBuf.OBJ "CC ''CCOPT' CrPFrBuf" -
+ CrPFrBuf.c XpmI.h xpm.h
+$ CALL MAKE CrPFrDat.OBJ "CC ''CCOPT' CrPFrDat" -
+ CrPFrDat.c XpmI.h xpm.h
+$ CALL MAKE RdFToDat.OBJ "CC ''CCOPT' RdFToDat" -
+ RdFToDat.c XpmI.h xpm.h
+$ CALL MAKE RdFToI.OBJ "CC ''CCOPT' RdFToI" -
+ RdFToI.c XpmI.h xpm.h
+$ CALL MAKE RdFToP.OBJ "CC ''CCOPT' RdFToP" -
+ RdFToP.c XpmI.h xpm.h
+$ CALL MAKE WrFFrDat.OBJ "CC ''CCOPT' WrFFrDat" -
+ WrFFrDat.c XpmI.h xpm.h
+$ CALL MAKE WrFFrI.OBJ "CC ''CCOPT' WrFFrI" -
+ WrFFrI.c XpmI.h xpm.h
+$ CALL MAKE WrFFrP.OBJ "CC ''CCOPT' WrFFrP" -
+ WrFFrP.c XpmI.h xpm.h
+$ CALL MAKE create.OBJ "CC ''CCOPT' create" -
+ create.c XpmI.h xpm.h
+$ CALL MAKE data.OBJ "CC ''CCOPT' data" -
+ data.c XpmI.h xpm.h
+$ CALL MAKE hashtab.OBJ "CC ''CCOPT' hashtab" -
+ hashtab.c XpmI.h xpm.h
+$ CALL MAKE misc.OBJ "CC ''CCOPT' misc" -
+ misc.c XpmI.h xpm.h
+$ CALL MAKE parse.OBJ "CC ''CCOPT' parse" -
+ parse.c XpmI.h xpm.h
+$ CALL MAKE rgb.OBJ "CC ''CCOPT' rgb" -
+ rgb.c XpmI.h xpm.h
+$ CALL MAKE scan.OBJ "CC ''CCOPT' scan" -
+ scan.c XpmI.h xpm.h
+$ CALL MAKE Attrib.OBJ "CC ''CCOPT' Attrib" -
+ Attrib.c XpmI.h xpm.h
+$ CALL MAKE CrIFrP.OBJ "CC ''CCOPT' CrIFrP" -
+ CrIFrP.c XpmI.h xpm.h
+$ CALL MAKE CrPFrI.OBJ "CC ''CCOPT' CrPFrI" -
+ CrPFrI.c XpmI.h xpm.h
+$ CALL MAKE Image.OBJ "CC ''CCOPT' Image" -
+ Image.c XpmI.h xpm.h
+$ CALL MAKE Info.OBJ "CC ''CCOPT' Info" -
+ Info.c XpmI.h xpm.h
+$ CALL MAKE RdFToBuf.OBJ "CC ''CCOPT' RdFToBuf" -
+ RdFToBuf.c XpmI.h xpm.h
+$ CALL MAKE WrFFrBuf.OBJ "CC ''CCOPT' WrFFrBuf" -
+ WrFFrBuf.c XpmI.h xpm.h
+$ write sys$output "Building XPMlib ..."
+$ CALL MAKE LIBXPM.OLB "lib/crea libxpm.olb *.obj" *.OBJ
+$ CALL MAKE SXPM.OBJ "CC ''CCOPT' [-.sxpm]sxpm" -
+ [-.sxpm]sxpm.c xpm.h
+$ write sys$output "Linking SXPM ..."
+$ CALL MAKE SXPM.EXE "LINK sxpm,sxpm.opt/OPT" sxpm.OBJ
+$ endif
+$ write sys$output "XPMlib build completed"
+$ sxpm :=="$''path'sxpm.exe"
+$ exit
+$!
+$!
+$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES
+$ V = 'F$Verify(0)
+$! P1 = What we are trying to make
+$! P2 = Command to make it
+$! P3 - P8 What it depends on
+$
+$ If F$Search(P1) .Eqs. "" Then Goto Makeit
+$ Time = F$CvTime(F$File(P1,"RDT"))
+$arg=3
+$Loop:
+$ Argument = P'arg
+$ If Argument .Eqs. "" Then Goto Exit
+$ El=0
+$Loop2:
+$ File = F$Element(El," ",Argument)
+$ If File .Eqs. " " Then Goto Endl
+$ AFile = ""
+$Loop3:
+$ OFile = AFile
+$ AFile = F$Search(File)
+$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
+$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
+$ Goto Loop3
+$NextEL:
+$ El = El + 1
+$ Goto Loop2
+$EndL:
+$ arg=arg+1
+$ If arg .Le. 8 Then Goto Loop
+$ Goto Exit
+$
+$Makeit:
+$ VV=F$VERIFY(0)
+$ write sys$output P2
+$ 'P2
+$ VV='F$Verify(VV)
+$Exit:
+$ If V Then Set Verify
+$ENDSUBROUTINE
diff --git a/xc/extras/Xpm/lib/misc.c b/xc/extras/Xpm/lib/misc.c
new file mode 100644
index 000000000..7a9ecb58a
--- /dev/null
+++ b/xc/extras/Xpm/lib/misc.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* misc.c: *
+* *
+* XPM library *
+* Miscellaneous utilities *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "XpmI.h"
+
+#ifdef NEED_STRDUP
+/*
+ * in case strdup is not provided by the system here is one
+ * which does the trick
+ */
+char *
+xpmstrdup(s1)
+ char *s1;
+{
+ char *s2;
+ int l = strlen(s1) + 1;
+
+ if (s2 = (char *) XpmMalloc(l))
+ strcpy(s2, s1);
+ return s2;
+}
+
+#endif
+
+unsigned int
+xpmatoui(p, l, ui_return)
+ register char *p;
+ unsigned int l;
+ unsigned int *ui_return;
+{
+ register unsigned int n, i;
+
+ n = 0;
+ for (i = 0; i < l; i++)
+ if (*p >= '0' && *p <= '9')
+ n = n * 10 + *p++ - '0';
+ else
+ break;
+
+ if (i != 0 && i == l) {
+ *ui_return = n;
+ return 1;
+ } else
+ return 0;
+}
+
+/*
+ * Function returning a character string related to an error code.
+ */
+char *
+XpmGetErrorString(errcode)
+ int errcode;
+{
+ switch (errcode) {
+ case XpmColorError:
+ return ("XpmColorError");
+ case XpmSuccess:
+ return ("XpmSuccess");
+ case XpmOpenFailed:
+ return ("XpmOpenFailed");
+ case XpmFileInvalid:
+ return ("XpmFileInvalid");
+ case XpmNoMemory:
+ return ("XpmNoMemory");
+ case XpmColorFailed:
+ return ("XpmColorFailed");
+ default:
+ return ("Invalid XpmError");
+ }
+}
+
+/*
+ * The following function provides a way to figure out if the linked library is
+ * newer or older than the one with which a program has been first compiled.
+ */
+int
+XpmLibraryVersion()
+{
+ return XpmIncludeVersion;
+}
+
+
+/* The following should help people wanting to use their own functions */
+#ifdef XpmFree
+#undef XpmFree
+#endif
+
+void
+XpmFree(ptr)
+ void *ptr;
+{
+ free(ptr);
+}
diff --git a/xc/extras/Xpm/lib/parse.c b/xc/extras/Xpm/lib/parse.c
new file mode 100644
index 000000000..815f27964
--- /dev/null
+++ b/xc/extras/Xpm/lib/parse.c
@@ -0,0 +1,745 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* parse.c: *
+* *
+* XPM library *
+* Parse an XPM file or array and store the found informations *
+* in the given XpmImage structure. *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to FOR_MSW has been added by
+ * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
+ */
+
+#include "XpmI.h"
+#include <ctype.h>
+
+LFUNC(ParsePixels, int, (xpmData *data, unsigned int width,
+ unsigned int height, unsigned int ncolors,
+ unsigned int cpp, XpmColor *colorTable,
+ xpmHashTable *hashtable, unsigned int **pixels));
+
+char *xpmColorKeys[] = {
+ "s", /* key #1: symbol */
+ "m", /* key #2: mono visual */
+ "g4", /* key #3: 4 grays visual */
+ "g", /* key #4: gray visual */
+ "c", /* key #5: color visual */
+};
+
+int
+xpmParseValues(data, width, height, ncolors, cpp,
+ x_hotspot, y_hotspot, hotspot, extensions)
+ xpmData *data;
+ unsigned int *width, *height, *ncolors, *cpp;
+ unsigned int *x_hotspot, *y_hotspot, *hotspot;
+ unsigned int *extensions;
+{
+ unsigned int l;
+ char buf[BUFSIZ];
+
+ if (!data->format) { /* XPM 2 or 3 */
+
+ /*
+ * read values: width, height, ncolors, chars_per_pixel
+ */
+ if (!(xpmNextUI(data, width) && xpmNextUI(data, height)
+ && xpmNextUI(data, ncolors) && xpmNextUI(data, cpp)))
+ return (XpmFileInvalid);
+
+ /*
+ * read optional information (hotspot and/or XPMEXT) if any
+ */
+ l = xpmNextWord(data, buf, BUFSIZ);
+ if (l) {
+ *extensions = (l == 6 && !strncmp("XPMEXT", buf, 6));
+ if (*extensions)
+ *hotspot = (xpmNextUI(data, x_hotspot)
+ && xpmNextUI(data, y_hotspot));
+ else {
+ *hotspot = (xpmatoui(buf, l, x_hotspot)
+ && xpmNextUI(data, y_hotspot));
+ l = xpmNextWord(data, buf, BUFSIZ);
+ *extensions = (l == 6 && !strncmp("XPMEXT", buf, 6));
+ }
+ }
+ } else {
+
+ /*
+ * XPM 1 file read values: width, height, ncolors, chars_per_pixel
+ */
+ int i;
+ char *ptr;
+ Bool got_one, saw_width = False, saw_height = False;
+ Bool saw_ncolors = False, saw_chars_per_pixel = False;
+
+ for (i = 0; i < 4; i++) {
+ l = xpmNextWord(data, buf, BUFSIZ);
+ if (l != 7 || strncmp("#define", buf, 7))
+ return (XpmFileInvalid);
+ l = xpmNextWord(data, buf, BUFSIZ);
+ if (!l)
+ return (XpmFileInvalid);
+ buf[l] = '\0';
+ ptr = buf;
+ got_one = False;
+ while (!got_one) {
+ ptr = index(ptr, '_');
+ if (!ptr)
+ return (XpmFileInvalid);
+ switch (l - (ptr - buf)) {
+ case 6:
+ if (saw_width || strncmp("_width", ptr, 6)
+ || !xpmNextUI(data, width))
+ return (XpmFileInvalid);
+ else
+ saw_width = True;
+ got_one = True;
+ break;
+ case 7:
+ if (saw_height || strncmp("_height", ptr, 7)
+ || !xpmNextUI(data, height))
+ return (XpmFileInvalid);
+ else
+ saw_height = True;
+ got_one = True;
+ break;
+ case 8:
+ if (saw_ncolors || strncmp("_ncolors", ptr, 8)
+ || !xpmNextUI(data, ncolors))
+ return (XpmFileInvalid);
+ else
+ saw_ncolors = True;
+ got_one = True;
+ break;
+ case 16:
+ if (saw_chars_per_pixel
+ || strncmp("_chars_per_pixel", ptr, 16)
+ || !xpmNextUI(data, cpp))
+ return (XpmFileInvalid);
+ else
+ saw_chars_per_pixel = True;
+ got_one = True;
+ break;
+ default:
+ ptr++;
+ }
+ }
+ /* skip the end of line */
+ xpmNextString(data);
+ }
+ if (!saw_width || !saw_height || !saw_ncolors || !saw_chars_per_pixel)
+ return (XpmFileInvalid);
+
+ *hotspot = 0;
+ *extensions = 0;
+ }
+ return (XpmSuccess);
+}
+
+int
+xpmParseColors(data, ncolors, cpp, colorTablePtr, hashtable)
+ xpmData *data;
+ unsigned int ncolors;
+ unsigned int cpp;
+ XpmColor **colorTablePtr;
+ xpmHashTable *hashtable;
+{
+ unsigned int key, l, a, b;
+ unsigned int curkey; /* current color key */
+ unsigned int lastwaskey; /* key read */
+ char buf[BUFSIZ];
+ char curbuf[BUFSIZ]; /* current buffer */
+ char **sptr, *s;
+ XpmColor *color;
+ XpmColor *colorTable;
+ char **defaults;
+ int ErrorStatus;
+
+ colorTable = (XpmColor *) XpmCalloc(ncolors, sizeof(XpmColor));
+ if (!colorTable)
+ return (XpmNoMemory);
+
+ if (!data->format) { /* XPM 2 or 3 */
+ for (a = 0, color = colorTable; a < ncolors; a++, color++) {
+ xpmNextString(data); /* skip the line */
+
+ /*
+ * read pixel value
+ */
+ color->string = (char *) XpmMalloc(cpp + 1);
+ if (!color->string) {
+ xpmFreeColorTable(colorTable, ncolors);
+ return (XpmNoMemory);
+ }
+ for (b = 0, s = color->string; b < cpp; b++, s++)
+ *s = xpmGetC(data);
+ *s = '\0';
+
+ /*
+ * store the string in the hashtable with its color index number
+ */
+ if (USE_HASHTABLE) {
+ ErrorStatus =
+ xpmHashIntern(hashtable, color->string, HashAtomData(a));
+ if (ErrorStatus != XpmSuccess) {
+ xpmFreeColorTable(colorTable, ncolors);
+ return (ErrorStatus);
+ }
+ }
+
+ /*
+ * read color keys and values
+ */
+ defaults = (char **) color;
+ curkey = 0;
+ lastwaskey = 0;
+ *curbuf = '\0'; /* init curbuf */
+ while (l = xpmNextWord(data, buf, BUFSIZ)) {
+ if (!lastwaskey) {
+ for (key = 0, sptr = xpmColorKeys; key < NKEYS; key++,
+ sptr++)
+ if ((strlen(*sptr) == l) && (!strncmp(*sptr, buf, l)))
+ break;
+ }
+ if (!lastwaskey && key < NKEYS) { /* open new key */
+ if (curkey) { /* flush string */
+ s = (char *) XpmMalloc(strlen(curbuf) + 1);
+ if (!s) {
+ xpmFreeColorTable(colorTable, ncolors);
+ return (XpmNoMemory);
+ }
+ defaults[curkey] = s;
+ strcpy(s, curbuf);
+ }
+ curkey = key + 1; /* set new key */
+ *curbuf = '\0'; /* reset curbuf */
+ lastwaskey = 1;
+ } else {
+ if (!curkey) { /* key without value */
+ xpmFreeColorTable(colorTable, ncolors);
+ return (XpmFileInvalid);
+ }
+ if (!lastwaskey)
+ strcat(curbuf, " "); /* append space */
+ buf[l] = '\0';
+ strcat(curbuf, buf);/* append buf */
+ lastwaskey = 0;
+ }
+ }
+ if (!curkey) { /* key without value */
+ xpmFreeColorTable(colorTable, ncolors);
+ return (XpmFileInvalid);
+ }
+ s = defaults[curkey] = (char *) XpmMalloc(strlen(curbuf) + 1);
+ if (!s) {
+ xpmFreeColorTable(colorTable, ncolors);
+ return (XpmNoMemory);
+ }
+ strcpy(s, curbuf);
+ }
+ } else { /* XPM 1 */
+ /* get to the beginning of the first string */
+ data->Bos = '"';
+ data->Eos = '\0';
+ xpmNextString(data);
+ data->Eos = '"';
+ for (a = 0, color = colorTable; a < ncolors; a++, color++) {
+
+ /*
+ * read pixel value
+ */
+ color->string = (char *) XpmMalloc(cpp + 1);
+ if (!color->string) {
+ xpmFreeColorTable(colorTable, ncolors);
+ return (XpmNoMemory);
+ }
+ for (b = 0, s = color->string; b < cpp; b++, s++)
+ *s = xpmGetC(data);
+ *s = '\0';
+
+ /*
+ * store the string in the hashtable with its color index number
+ */
+ if (USE_HASHTABLE) {
+ ErrorStatus =
+ xpmHashIntern(hashtable, color->string, HashAtomData(a));
+ if (ErrorStatus != XpmSuccess) {
+ xpmFreeColorTable(colorTable, ncolors);
+ return (ErrorStatus);
+ }
+ }
+
+ /*
+ * read color values
+ */
+ xpmNextString(data); /* get to the next string */
+ *curbuf = '\0'; /* init curbuf */
+ while (l = xpmNextWord(data, buf, BUFSIZ)) {
+ if (*curbuf != '\0')
+ strcat(curbuf, " ");/* append space */
+ buf[l] = '\0';
+ strcat(curbuf, buf); /* append buf */
+ }
+ s = (char *) XpmMalloc(strlen(curbuf) + 1);
+ if (!s) {
+ xpmFreeColorTable(colorTable, ncolors);
+ return (XpmNoMemory);
+ }
+ strcpy(s, curbuf);
+ color->c_color = s;
+ *curbuf = '\0'; /* reset curbuf */
+ if (a < ncolors - 1)
+ xpmNextString(data); /* get to the next string */
+ }
+ }
+ *colorTablePtr = colorTable;
+ return (XpmSuccess);
+}
+
+static int
+ParsePixels(data, width, height, ncolors, cpp, colorTable, hashtable, pixels)
+ xpmData *data;
+ unsigned int width;
+ unsigned int height;
+ unsigned int ncolors;
+ unsigned int cpp;
+ XpmColor *colorTable;
+ xpmHashTable *hashtable;
+ unsigned int **pixels;
+{
+ unsigned int *iptr, *iptr2;
+ unsigned int a, x, y;
+
+#ifndef FOR_MSW
+ iptr2 = (unsigned int *) XpmMalloc(sizeof(unsigned int) * width * height);
+#else
+
+ /*
+ * special treatment to trick DOS malloc(size_t) where size_t is 16 bit!!
+ * XpmMalloc is defined to longMalloc(long) and checks the 16 bit boundary
+ */
+ iptr2 = (unsigned int *)
+ XpmMalloc((long) sizeof(unsigned int) * (long) width * (long) height);
+#endif
+ if (!iptr2)
+ return (XpmNoMemory);
+
+ iptr = iptr2;
+
+ switch (cpp) {
+
+ case (1): /* Optimize for single character
+ * colors */
+ {
+ unsigned short colidx[256];
+
+ bzero((char *)colidx, 256 * sizeof(short));
+ for (a = 0; a < ncolors; a++)
+ colidx[(unsigned char)colorTable[a].string[0]] = a + 1;
+
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++, iptr++) {
+ int c = xpmGetC(data);
+
+ if (c > 0 && c < 256 && colidx[c] != 0)
+ *iptr = colidx[c] - 1;
+ else {
+ XpmFree(iptr2);
+ return (XpmFileInvalid);
+ }
+ }
+ }
+ }
+ break;
+
+ case (2): /* Optimize for double character
+ * colors */
+ {
+
+/* free all allocated pointers at all exits */
+#define FREE_CIDX {int f; for (f = 0; f < 256; f++) \
+if (cidx[f]) XpmFree(cidx[f]);}
+
+ /* array of pointers malloced by need */
+ unsigned short *cidx[256];
+ int char1;
+
+ bzero((char *)cidx, 256 * sizeof(unsigned short *)); /* init */
+ for (a = 0; a < ncolors; a++) {
+ char1 = colorTable[a].string[0];
+ if (cidx[char1] == NULL) { /* get new memory */
+ cidx[char1] = (unsigned short *)
+ XpmCalloc(256, sizeof(unsigned short));
+ if (cidx[char1] == NULL) { /* new block failed */
+ FREE_CIDX;
+ XpmFree(iptr2);
+ return (XpmNoMemory);
+ }
+ }
+ cidx[char1][(unsigned char)colorTable[a].string[1]] = a + 1;
+ }
+
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++, iptr++) {
+ int cc1 = xpmGetC(data);
+ if (cc1 > 0 && cc1 < 256) {
+ int cc2 = xpmGetC(data);
+ if (cc2 > 0 && cc2 < 256 &&
+ cidx[cc1] && cidx[cc1][cc2] != 0)
+ *iptr = cidx[cc1][cc2] - 1;
+ else {
+ FREE_CIDX;
+ XpmFree(iptr2);
+ return (XpmFileInvalid);
+ }
+ } else {
+ FREE_CIDX;
+ XpmFree(iptr2);
+ return (XpmFileInvalid);
+ }
+ }
+ }
+ FREE_CIDX;
+ }
+ break;
+
+ default: /* Non-optimized case of long color
+ * names */
+ {
+ char *s;
+ char buf[BUFSIZ];
+
+ buf[cpp] = '\0';
+ if (USE_HASHTABLE) {
+ xpmHashAtom *slot;
+
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++, iptr++) {
+ for (a = 0, s = buf; a < cpp; a++, s++)
+ *s = xpmGetC(data);
+ slot = xpmHashSlot(hashtable, buf);
+ if (!*slot) { /* no color matches */
+ XpmFree(iptr2);
+ return (XpmFileInvalid);
+ }
+ *iptr = HashColorIndex(slot);
+ }
+ }
+ } else {
+ for (y = 0; y < height; y++) {
+ xpmNextString(data);
+ for (x = 0; x < width; x++, iptr++) {
+ for (a = 0, s = buf; a < cpp; a++, s++)
+ *s = xpmGetC(data);
+ for (a = 0; a < ncolors; a++)
+ if (!strcmp(colorTable[a].string, buf))
+ break;
+ if (a == ncolors) { /* no color matches */
+ XpmFree(iptr2);
+ return (XpmFileInvalid);
+ }
+ *iptr = a;
+ }
+ }
+ }
+ }
+ break;
+ }
+ *pixels = iptr2;
+ return (XpmSuccess);
+}
+
+int
+xpmParseExtensions(data, extensions, nextensions)
+ xpmData *data;
+ XpmExtension **extensions;
+ unsigned int *nextensions;
+{
+ XpmExtension *exts = NULL, *ext;
+ unsigned int num = 0;
+ unsigned int nlines, a, l, notstart, notend = 0;
+ int status;
+ char *string, *s, *s2, **sp;
+
+ xpmNextString(data);
+ exts = (XpmExtension *) XpmMalloc(sizeof(XpmExtension));
+ /* get the whole string */
+ status = xpmGetString(data, &string, &l);
+ if (status != XpmSuccess) {
+ XpmFree(exts);
+ return (status);
+ }
+ /* look for the key word XPMEXT, skip lines before this */
+ while ((notstart = strncmp("XPMEXT", string, 6))
+ && (notend = strncmp("XPMENDEXT", string, 9))) {
+ XpmFree(string);
+ xpmNextString(data);
+ status = xpmGetString(data, &string, &l);
+ if (status != XpmSuccess) {
+ XpmFree(exts);
+ return (status);
+ }
+ }
+ if (!notstart)
+ notend = strncmp("XPMENDEXT", string, 9);
+ while (!notstart && notend) {
+ /* there starts an extension */
+ ext = (XpmExtension *)
+ XpmRealloc(exts, (num + 1) * sizeof(XpmExtension));
+ if (!ext) {
+ XpmFree(string);
+ XpmFreeExtensions(exts, num);
+ return (XpmNoMemory);
+ }
+ exts = ext;
+ ext += num;
+ /* skip whitespace and store its name */
+ s2 = s = string + 6;
+ while (isspace(*s2))
+ s2++;
+ a = s2 - s;
+ ext->name = (char *) XpmMalloc(l - a - 6);
+ if (!ext->name) {
+ XpmFree(string);
+ ext->lines = NULL;
+ ext->nlines = 0;
+ XpmFreeExtensions(exts, num + 1);
+ return (XpmNoMemory);
+ }
+ strncpy(ext->name, s + a, l - a - 6);
+ XpmFree(string);
+ /* now store the related lines */
+ xpmNextString(data);
+ status = xpmGetString(data, &string, &l);
+ if (status != XpmSuccess) {
+ ext->lines = NULL;
+ ext->nlines = 0;
+ XpmFreeExtensions(exts, num + 1);
+ return (status);
+ }
+ ext->lines = (char **) XpmMalloc(sizeof(char *));
+ nlines = 0;
+ while ((notstart = strncmp("XPMEXT", string, 6))
+ && (notend = strncmp("XPMENDEXT", string, 9))) {
+ sp = (char **)
+ XpmRealloc(ext->lines, (nlines + 1) * sizeof(char *));
+ if (!sp) {
+ XpmFree(string);
+ ext->nlines = nlines;
+ XpmFreeExtensions(exts, num + 1);
+ return (XpmNoMemory);
+ }
+ ext->lines = sp;
+ ext->lines[nlines] = string;
+ nlines++;
+ xpmNextString(data);
+ status = xpmGetString(data, &string, &l);
+ if (status != XpmSuccess) {
+ ext->nlines = nlines;
+ XpmFreeExtensions(exts, num + 1);
+ return (status);
+ }
+ }
+ if (!nlines) {
+ XpmFree(ext->lines);
+ ext->lines = NULL;
+ }
+ ext->nlines = nlines;
+ num++;
+ }
+ if (!num) {
+ XpmFree(string);
+ XpmFree(exts);
+ exts = NULL;
+ } else if (!notend)
+ XpmFree(string);
+ *nextensions = num;
+ *extensions = exts;
+ return (XpmSuccess);
+}
+
+
+/* function call in case of error */
+#undef RETURN
+#define RETURN(status) \
+{ \
+ goto error; \
+}
+
+/*
+ * This function parses an Xpm file or data and store the found informations
+ * in an an XpmImage structure which is returned.
+ */
+int
+xpmParseData(data, image, info)
+ xpmData *data;
+ XpmImage *image;
+ XpmInfo *info;
+{
+ /* variables to return */
+ unsigned int width, height, ncolors, cpp;
+ unsigned int x_hotspot, y_hotspot, hotspot = 0, extensions = 0;
+ XpmColor *colorTable = NULL;
+ unsigned int *pixelindex = NULL;
+ char *hints_cmt = NULL;
+ char *colors_cmt = NULL;
+ char *pixels_cmt = NULL;
+
+ unsigned int cmts;
+ int ErrorStatus;
+ xpmHashTable hashtable;
+
+ cmts = info && (info->valuemask & XpmReturnComments);
+
+ /*
+ * parse the header
+ */
+ ErrorStatus = xpmParseHeader(data);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /*
+ * read values
+ */
+ ErrorStatus = xpmParseValues(data, &width, &height, &ncolors, &cpp,
+ &x_hotspot, &y_hotspot, &hotspot,
+ &extensions);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+
+ /*
+ * store the hints comment line
+ */
+ if (cmts)
+ xpmGetCmt(data, &hints_cmt);
+
+ /*
+ * init the hastable
+ */
+ if (USE_HASHTABLE) {
+ ErrorStatus = xpmHashTableInit(&hashtable);
+ if (ErrorStatus != XpmSuccess)
+ return (ErrorStatus);
+ }
+
+ /*
+ * read colors
+ */
+ ErrorStatus = xpmParseColors(data, ncolors, cpp, &colorTable, &hashtable);
+ if (ErrorStatus != XpmSuccess) {
+ if (USE_HASHTABLE)
+ xpmHashTableFree(&hashtable);
+ RETURN(ErrorStatus);
+ }
+
+ /*
+ * store the colors comment line
+ */
+ if (cmts)
+ xpmGetCmt(data, &colors_cmt);
+
+ /*
+ * read pixels and index them on color number
+ */
+ ErrorStatus = ParsePixels(data, width, height, ncolors, cpp, colorTable,
+ &hashtable, &pixelindex);
+
+ /*
+ * free the hastable
+ */
+ if (USE_HASHTABLE)
+ xpmHashTableFree(&hashtable);
+
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+ /*
+ * store the pixels comment line
+ */
+ if (cmts)
+ xpmGetCmt(data, &pixels_cmt);
+
+ /*
+ * parse extensions
+ */
+ if (info && (info->valuemask & XpmReturnExtensions))
+ if (extensions) {
+ ErrorStatus = xpmParseExtensions(data, &info->extensions,
+ &info->nextensions);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+ } else {
+ info->extensions = NULL;
+ info->nextensions = 0;
+ }
+
+ /*
+ * store found informations in the XpmImage structure
+ */
+ image->width = width;
+ image->height = height;
+ image->cpp = cpp;
+ image->ncolors = ncolors;
+ image->colorTable = colorTable;
+ image->data = pixelindex;
+
+ if (info) {
+ if (cmts) {
+ info->hints_cmt = hints_cmt;
+ info->colors_cmt = colors_cmt;
+ info->pixels_cmt = pixels_cmt;
+ }
+ if (hotspot) {
+ info->x_hotspot = x_hotspot;
+ info->y_hotspot = y_hotspot;
+ info->valuemask |= XpmHotspot;
+ }
+ }
+ return (XpmSuccess);
+
+/* exit point in case of error, free only locally allocated variables */
+error:
+ if (colorTable)
+ xpmFreeColorTable(colorTable, ncolors);
+ if (pixelindex)
+ XpmFree(pixelindex);
+ if (hints_cmt)
+ XpmFree(hints_cmt);
+ if (colors_cmt)
+ XpmFree(colors_cmt);
+ if (pixels_cmt)
+ XpmFree(pixels_cmt);
+
+ return(ErrorStatus);
+}
diff --git a/xc/extras/Xpm/lib/rgb.c b/xc/extras/Xpm/lib/rgb.c
new file mode 100644
index 000000000..b26ee3f2d
--- /dev/null
+++ b/xc/extras/Xpm/lib/rgb.c
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* rgb.c: *
+* *
+* XPM library *
+* Rgb file utilities *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to FOR_MSW has been added by
+ * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
+ */
+
+/*
+ * Part of this code has been taken from the ppmtoxpm.c file written by Mark
+ * W. Snitily but has been modified for my special need
+ */
+
+#include "XpmI.h"
+#include <ctype.h>
+
+#ifndef FOR_MSW /* normal part first, MSW part at
+ * the end, (huge ifdef!) */
+/*
+ * Read a rgb text file. It stores the rgb values (0->65535)
+ * and the rgb mnemonics (malloc'ed) into the "rgbn" array. Returns the
+ * number of entries stored.
+ */
+int
+xpmReadRgbNames(rgb_fname, rgbn)
+ char *rgb_fname;
+ xpmRgbName rgbn[];
+
+{
+ FILE *rgbf;
+ int n, items, red, green, blue;
+ char line[512], name[512], *rgbname, *s1, *s2;
+ xpmRgbName *rgb;
+
+ /* Open the rgb text file. Abort if error. */
+ if ((rgbf = fopen(rgb_fname, "r")) == NULL)
+ return 0;
+
+ /* Loop reading each line in the file. */
+ n = 0;
+ rgb = rgbn;
+ /* Quit if rgb text file has too many entries. */
+ while (fgets(line, sizeof(line), rgbf) && n < MAX_RGBNAMES) {
+
+ /* Skip silently if line is bad. */
+ items = sscanf(line, "%d %d %d %[^\n]\n", &red, &green, &blue, name);
+ if (items != 4)
+ continue;
+
+ /*
+ * Make sure rgb values are within 0->255 range. Skip silently if
+ * bad.
+ */
+ if (red < 0 || red > 0xFF ||
+ green < 0 || green > 0xFF ||
+ blue < 0 || blue > 0xFF)
+ continue;
+
+ /* Allocate memory for ascii name. If error give up here. */
+ if (!(rgbname = (char *) XpmMalloc(strlen(name) + 1)))
+ break;
+
+ /* Copy string to ascii name and lowercase it. */
+ for (s1 = name, s2 = rgbname; *s1; s1++)
+ *s2++ = tolower(*s1);
+ *s2 = '\0';
+
+ /* Save the rgb values and ascii name in the array. */
+ rgb->r = red * 257; /* 65535/255 = 257 */
+ rgb->g = green * 257;
+ rgb->b = blue * 257;
+ rgb->name = rgbname;
+ rgb++;
+ n++;
+ }
+
+ fclose(rgbf);
+
+ /* Return the number of read rgb names. */
+ return n < 0 ? 0 : n;
+}
+
+/*
+ * Return the color name corresponding to the given rgb values
+ */
+char *
+xpmGetRgbName(rgbn, rgbn_max, red, green, blue)
+ xpmRgbName rgbn[]; /* rgb mnemonics from rgb text file */
+ int rgbn_max; /* number of rgb mnemonics in table */
+ int red, green, blue; /* rgb values */
+
+{
+ int i;
+ xpmRgbName *rgb;
+
+ /*
+ * Just perform a dumb linear search over the rgb values of the color
+ * mnemonics. One could speed things up by sorting the rgb values and
+ * using a binary search, or building a hash table, etc...
+ */
+ for (i = 0, rgb = rgbn; i < rgbn_max; i++, rgb++)
+ if (red == rgb->r && green == rgb->g && blue == rgb->b)
+ return rgb->name;
+
+ /* if not found return NULL */
+ return NULL;
+}
+
+/*
+ * Free the strings which have been malloc'ed in xpmReadRgbNames
+ */
+void
+xpmFreeRgbNames(rgbn, rgbn_max)
+ xpmRgbName rgbn[];
+ int rgbn_max;
+
+{
+ int i;
+ xpmRgbName *rgb;
+
+ for (i = 0, rgb = rgbn; i < rgbn_max; i++, rgb++)
+ XpmFree(rgb->name);
+}
+
+#else /* here comes the MSW part, the
+ * second part of the huge ifdef */
+
+#include "rgbtab.h" /* hard coded rgb.txt table */
+
+int
+xpmReadRgbNames(rgb_fname, rgbn)
+ char *rgb_fname;
+ xpmRgbName rgbn[];
+{
+ /*
+ * check for consistency???
+ * table has to be sorted for calls on strcasecmp
+ */
+ return (numTheRGBRecords);
+}
+
+/*
+ * MSW rgb values are made from 3 BYTEs, this is different from X XColor.red,
+ * which has something like #0303 for one color
+ */
+char *
+xpmGetRgbName(rgbn, rgbn_max, red, green, blue)
+ xpmRgbName rgbn[]; /* rgb mnemonics from rgb text file
+ * not used */
+ int rgbn_max; /* not used */
+ int red, green, blue; /* rgb values */
+
+{
+ int i;
+ unsigned long rgbVal;
+
+ i = 0;
+ while (i < numTheRGBRecords) {
+ rgbVal = theRGBRecords[i].rgb;
+ if (GetRValue(rgbVal) == red &&
+ GetGValue(rgbVal) == green &&
+ GetBValue(rgbVal) == blue)
+ return (theRGBRecords[i].name);
+ i++;
+ }
+ return (NULL);
+}
+
+/* used in XParseColor in simx.c */
+int
+xpmGetRGBfromName(inname, r, g, b)
+ char *inname;
+ int *r, *g, *b;
+{
+ int left, right, middle;
+ int cmp;
+ unsigned long rgbVal;
+ char *name;
+ char *grey, *p;
+
+ name = xpmstrdup(inname);
+
+ /*
+ * the table in rgbtab.c has no names with spaces, and no grey, but a
+ * lot of gray
+ */
+ /* so first extract ' ' */
+ while (p = strchr(name, ' ')) {
+ while (*(p)) { /* till eof of string */
+ *p = *(p + 1); /* copy to the left */
+ p++;
+ }
+ }
+ /* fold to lower case */
+ p = name;
+ while (*p) {
+ *p = tolower(*p);
+ p++;
+ }
+
+ /*
+ * substitute Grey with Gray, else rgbtab.h would have more than 100
+ * 'duplicate' entries
+ */
+ if (grey = strstr(name, "grey"))
+ grey[2] = 'a';
+
+ /* binary search */
+ left = 0;
+ right = numTheRGBRecords - 1;
+ do {
+ middle = (left + right) / 2;
+ cmp = xpmstrcasecmp(name, theRGBRecords[middle].name);
+ if (cmp == 0) {
+ rgbVal = theRGBRecords[middle].rgb;
+ *r = GetRValue(rgbVal);
+ *g = GetGValue(rgbVal);
+ *b = GetBValue(rgbVal);
+ free(name);
+ return (1);
+ } else if (cmp < 0) {
+ right = middle - 1;
+ } else { /* > 0 */
+ left = middle + 1;
+ }
+ } while (left <= right);
+
+ /*
+ * I don't like to run in a ColorInvalid error and to see no pixmap at
+ * all, so simply return a red pixel. Should be wrapped in an #ifdef
+ * HeDu
+ */
+
+ *r = 255;
+ *g = 0;
+ *b = 0; /* red error pixel */
+
+ free(name);
+ return (1);
+}
+
+void
+xpmFreeRgbNames(rgbn, rgbn_max)
+ xpmRgbName rgbn[];
+ int rgbn_max;
+
+{
+ /* nothing to do */
+}
+
+#endif /* MSW part */
diff --git a/xc/extras/Xpm/lib/rgbtab.h b/xc/extras/Xpm/lib/rgbtab.h
new file mode 100644
index 000000000..3b7518491
--- /dev/null
+++ b/xc/extras/Xpm/lib/rgbtab.h
@@ -0,0 +1,292 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* rgbtab.h *
+* *
+* A hard coded rgb.txt. To keep it short I removed all colornames with *
+* trailing numbers, Blue3 etc, except the GrayXX. Sorry Grey-lovers I prefer *
+* Gray ;-). But Grey is recognized on lookups, only on save Gray will be *
+* used, maybe you want to do some substitue there too. *
+* *
+* To save memory the RGBs are coded in one long value, as done by the RGB *
+* macro. *
+* *
+* Developed by HeDu 3/94 (hedu@cul-ipn.uni-kiel.de) *
+\*****************************************************************************/
+
+
+typedef struct {
+ char *name;
+ COLORREF rgb; /* it's unsigned long */
+} rgbRecord;
+
+/*
+#define myRGB(r,g,b) \
+ ((unsigned long)r<<16|(unsigned long)g<<8|(unsigned long)b)
+*/
+#define myRGB(r,g,b) RGB(r,g,b) /* MSW has this macro */
+
+
+static rgbRecord theRGBRecords[] =
+{
+ {"AliceBlue", myRGB(240, 248, 255)},
+ {"AntiqueWhite", myRGB(250, 235, 215)},
+ {"Aquamarine", myRGB(50, 191, 193)},
+ {"Azure", myRGB(240, 255, 255)},
+ {"Beige", myRGB(245, 245, 220)},
+ {"Bisque", myRGB(255, 228, 196)},
+ {"Black", myRGB(0, 0, 0)},
+ {"BlanchedAlmond", myRGB(255, 235, 205)},
+ {"Blue", myRGB(0, 0, 255)},
+ {"BlueViolet", myRGB(138, 43, 226)},
+ {"Brown", myRGB(165, 42, 42)},
+ {"burlywood", myRGB(222, 184, 135)},
+ {"CadetBlue", myRGB(95, 146, 158)},
+ {"chartreuse", myRGB(127, 255, 0)},
+ {"chocolate", myRGB(210, 105, 30)},
+ {"Coral", myRGB(255, 114, 86)},
+ {"CornflowerBlue", myRGB(34, 34, 152)},
+ {"cornsilk", myRGB(255, 248, 220)},
+ {"Cyan", myRGB(0, 255, 255)},
+ {"DarkGoldenrod", myRGB(184, 134, 11)},
+ {"DarkGreen", myRGB(0, 86, 45)},
+ {"DarkKhaki", myRGB(189, 183, 107)},
+ {"DarkOliveGreen", myRGB(85, 86, 47)},
+ {"DarkOrange", myRGB(255, 140, 0)},
+ {"DarkOrchid", myRGB(139, 32, 139)},
+ {"DarkSalmon", myRGB(233, 150, 122)},
+ {"DarkSeaGreen", myRGB(143, 188, 143)},
+ {"DarkSlateBlue", myRGB(56, 75, 102)},
+ {"DarkSlateGray", myRGB(47, 79, 79)},
+ {"DarkTurquoise", myRGB(0, 166, 166)},
+ {"DarkViolet", myRGB(148, 0, 211)},
+ {"DeepPink", myRGB(255, 20, 147)},
+ {"DeepSkyBlue", myRGB(0, 191, 255)},
+ {"DimGray", myRGB(84, 84, 84)},
+ {"DodgerBlue", myRGB(30, 144, 255)},
+ {"Firebrick", myRGB(142, 35, 35)},
+ {"FloralWhite", myRGB(255, 250, 240)},
+ {"ForestGreen", myRGB(80, 159, 105)},
+ {"gainsboro", myRGB(220, 220, 220)},
+ {"GhostWhite", myRGB(248, 248, 255)},
+ {"Gold", myRGB(218, 170, 0)},
+ {"Goldenrod", myRGB(239, 223, 132)},
+ {"Gray", myRGB(126, 126, 126)},
+ {"Gray0", myRGB(0, 0, 0)},
+ {"Gray1", myRGB(3, 3, 3)},
+ {"Gray10", myRGB(26, 26, 26)},
+ {"Gray100", myRGB(255, 255, 255)},
+ {"Gray11", myRGB(28, 28, 28)},
+ {"Gray12", myRGB(31, 31, 31)},
+ {"Gray13", myRGB(33, 33, 33)},
+ {"Gray14", myRGB(36, 36, 36)},
+ {"Gray15", myRGB(38, 38, 38)},
+ {"Gray16", myRGB(41, 41, 41)},
+ {"Gray17", myRGB(43, 43, 43)},
+ {"Gray18", myRGB(46, 46, 46)},
+ {"Gray19", myRGB(48, 48, 48)},
+ {"Gray2", myRGB(5, 5, 5)},
+ {"Gray20", myRGB(51, 51, 51)},
+ {"Gray21", myRGB(54, 54, 54)},
+ {"Gray22", myRGB(56, 56, 56)},
+ {"Gray23", myRGB(59, 59, 59)},
+ {"Gray24", myRGB(61, 61, 61)},
+ {"Gray25", myRGB(64, 64, 64)},
+ {"Gray26", myRGB(66, 66, 66)},
+ {"Gray27", myRGB(69, 69, 69)},
+ {"Gray28", myRGB(71, 71, 71)},
+ {"Gray29", myRGB(74, 74, 74)},
+ {"Gray3", myRGB(8, 8, 8)},
+ {"Gray30", myRGB(77, 77, 77)},
+ {"Gray31", myRGB(79, 79, 79)},
+ {"Gray32", myRGB(82, 82, 82)},
+ {"Gray33", myRGB(84, 84, 84)},
+ {"Gray34", myRGB(87, 87, 87)},
+ {"Gray35", myRGB(89, 89, 89)},
+ {"Gray36", myRGB(92, 92, 92)},
+ {"Gray37", myRGB(94, 94, 94)},
+ {"Gray38", myRGB(97, 97, 97)},
+ {"Gray39", myRGB(99, 99, 99)},
+ {"Gray4", myRGB(10, 10, 10)},
+ {"Gray40", myRGB(102, 102, 102)},
+ {"Gray41", myRGB(105, 105, 105)},
+ {"Gray42", myRGB(107, 107, 107)},
+ {"Gray43", myRGB(110, 110, 110)},
+ {"Gray44", myRGB(112, 112, 112)},
+ {"Gray45", myRGB(115, 115, 115)},
+ {"Gray46", myRGB(117, 117, 117)},
+ {"Gray47", myRGB(120, 120, 120)},
+ {"Gray48", myRGB(122, 122, 122)},
+ {"Gray49", myRGB(125, 125, 125)},
+ {"Gray5", myRGB(13, 13, 13)},
+ {"Gray50", myRGB(127, 127, 127)},
+ {"Gray51", myRGB(130, 130, 130)},
+ {"Gray52", myRGB(133, 133, 133)},
+ {"Gray53", myRGB(135, 135, 135)},
+ {"Gray54", myRGB(138, 138, 138)},
+ {"Gray55", myRGB(140, 140, 140)},
+ {"Gray56", myRGB(143, 143, 143)},
+ {"Gray57", myRGB(145, 145, 145)},
+ {"Gray58", myRGB(148, 148, 148)},
+ {"Gray59", myRGB(150, 150, 150)},
+ {"Gray6", myRGB(15, 15, 15)},
+ {"Gray60", myRGB(153, 153, 153)},
+ {"Gray61", myRGB(156, 156, 156)},
+ {"Gray62", myRGB(158, 158, 158)},
+ {"Gray63", myRGB(161, 161, 161)},
+ {"Gray64", myRGB(163, 163, 163)},
+ {"Gray65", myRGB(166, 166, 166)},
+ {"Gray66", myRGB(168, 168, 168)},
+ {"Gray67", myRGB(171, 171, 171)},
+ {"Gray68", myRGB(173, 173, 173)},
+ {"Gray69", myRGB(176, 176, 176)},
+ {"Gray7", myRGB(18, 18, 18)},
+ {"Gray70", myRGB(179, 179, 179)},
+ {"Gray71", myRGB(181, 181, 181)},
+ {"Gray72", myRGB(184, 184, 184)},
+ {"Gray73", myRGB(186, 186, 186)},
+ {"Gray74", myRGB(189, 189, 189)},
+ {"Gray75", myRGB(191, 191, 191)},
+ {"Gray76", myRGB(194, 194, 194)},
+ {"Gray77", myRGB(196, 196, 196)},
+ {"Gray78", myRGB(199, 199, 199)},
+ {"Gray79", myRGB(201, 201, 201)},
+ {"Gray8", myRGB(20, 20, 20)},
+ {"Gray80", myRGB(204, 204, 204)},
+ {"Gray81", myRGB(207, 207, 207)},
+ {"Gray82", myRGB(209, 209, 209)},
+ {"Gray83", myRGB(212, 212, 212)},
+ {"Gray84", myRGB(214, 214, 214)},
+ {"Gray85", myRGB(217, 217, 217)},
+ {"Gray86", myRGB(219, 219, 219)},
+ {"Gray87", myRGB(222, 222, 222)},
+ {"Gray88", myRGB(224, 224, 224)},
+ {"Gray89", myRGB(227, 227, 227)},
+ {"Gray9", myRGB(23, 23, 23)},
+ {"Gray90", myRGB(229, 229, 229)},
+ {"Gray91", myRGB(232, 232, 232)},
+ {"Gray92", myRGB(235, 235, 235)},
+ {"Gray93", myRGB(237, 237, 237)},
+ {"Gray94", myRGB(240, 240, 240)},
+ {"Gray95", myRGB(242, 242, 242)},
+ {"Gray96", myRGB(245, 245, 245)},
+ {"Gray97", myRGB(247, 247, 247)},
+ {"Gray98", myRGB(250, 250, 250)},
+ {"Gray99", myRGB(252, 252, 252)},
+ {"Green", myRGB(0, 255, 0)},
+ {"GreenYellow", myRGB(173, 255, 47)},
+ {"honeydew", myRGB(240, 255, 240)},
+ {"HotPink", myRGB(255, 105, 180)},
+ {"IndianRed", myRGB(107, 57, 57)},
+ {"ivory", myRGB(255, 255, 240)},
+ {"Khaki", myRGB(179, 179, 126)},
+ {"lavender", myRGB(230, 230, 250)},
+ {"LavenderBlush", myRGB(255, 240, 245)},
+ {"LawnGreen", myRGB(124, 252, 0)},
+ {"LemonChiffon", myRGB(255, 250, 205)},
+ {"LightBlue", myRGB(176, 226, 255)},
+ {"LightCoral", myRGB(240, 128, 128)},
+ {"LightCyan", myRGB(224, 255, 255)},
+ {"LightGoldenrod", myRGB(238, 221, 130)},
+ {"LightGoldenrodYellow", myRGB(250, 250, 210)},
+ {"LightGray", myRGB(168, 168, 168)},
+ {"LightPink", myRGB(255, 182, 193)},
+ {"LightSalmon", myRGB(255, 160, 122)},
+ {"LightSeaGreen", myRGB(32, 178, 170)},
+ {"LightSkyBlue", myRGB(135, 206, 250)},
+ {"LightSlateBlue", myRGB(132, 112, 255)},
+ {"LightSlateGray", myRGB(119, 136, 153)},
+ {"LightSteelBlue", myRGB(124, 152, 211)},
+ {"LightYellow", myRGB(255, 255, 224)},
+ {"LimeGreen", myRGB(0, 175, 20)},
+ {"linen", myRGB(250, 240, 230)},
+ {"Magenta", myRGB(255, 0, 255)},
+ {"Maroon", myRGB(143, 0, 82)},
+ {"MediumAquamarine", myRGB(0, 147, 143)},
+ {"MediumBlue", myRGB(50, 50, 204)},
+ {"MediumForestGreen", myRGB(50, 129, 75)},
+ {"MediumGoldenrod", myRGB(209, 193, 102)},
+ {"MediumOrchid", myRGB(189, 82, 189)},
+ {"MediumPurple", myRGB(147, 112, 219)},
+ {"MediumSeaGreen", myRGB(52, 119, 102)},
+ {"MediumSlateBlue", myRGB(106, 106, 141)},
+ {"MediumSpringGreen", myRGB(35, 142, 35)},
+ {"MediumTurquoise", myRGB(0, 210, 210)},
+ {"MediumVioletRed", myRGB(213, 32, 121)},
+ {"MidnightBlue", myRGB(47, 47, 100)},
+ {"MintCream", myRGB(245, 255, 250)},
+ {"MistyRose", myRGB(255, 228, 225)},
+ {"moccasin", myRGB(255, 228, 181)},
+ {"NavajoWhite", myRGB(255, 222, 173)},
+ {"Navy", myRGB(35, 35, 117)},
+ {"NavyBlue", myRGB(35, 35, 117)},
+ {"OldLace", myRGB(253, 245, 230)},
+ {"OliveDrab", myRGB(107, 142, 35)},
+ {"Orange", myRGB(255, 135, 0)},
+ {"OrangeRed", myRGB(255, 69, 0)},
+ {"Orchid", myRGB(239, 132, 239)},
+ {"PaleGoldenrod", myRGB(238, 232, 170)},
+ {"PaleGreen", myRGB(115, 222, 120)},
+ {"PaleTurquoise", myRGB(175, 238, 238)},
+ {"PaleVioletRed", myRGB(219, 112, 147)},
+ {"PapayaWhip", myRGB(255, 239, 213)},
+ {"PeachPuff", myRGB(255, 218, 185)},
+ {"peru", myRGB(205, 133, 63)},
+ {"Pink", myRGB(255, 181, 197)},
+ {"Plum", myRGB(197, 72, 155)},
+ {"PowderBlue", myRGB(176, 224, 230)},
+ {"purple", myRGB(160, 32, 240)},
+ {"Red", myRGB(255, 0, 0)},
+ {"RosyBrown", myRGB(188, 143, 143)},
+ {"RoyalBlue", myRGB(65, 105, 225)},
+ {"SaddleBrown", myRGB(139, 69, 19)},
+ {"Salmon", myRGB(233, 150, 122)},
+ {"SandyBrown", myRGB(244, 164, 96)},
+ {"SeaGreen", myRGB(82, 149, 132)},
+ {"seashell", myRGB(255, 245, 238)},
+ {"Sienna", myRGB(150, 82, 45)},
+ {"SkyBlue", myRGB(114, 159, 255)},
+ {"SlateBlue", myRGB(126, 136, 171)},
+ {"SlateGray", myRGB(112, 128, 144)},
+ {"snow", myRGB(255, 250, 250)},
+ {"SpringGreen", myRGB(65, 172, 65)},
+ {"SteelBlue", myRGB(84, 112, 170)},
+ {"Tan", myRGB(222, 184, 135)},
+ {"Thistle", myRGB(216, 191, 216)},
+ {"tomato", myRGB(255, 99, 71)},
+ {"Transparent", myRGB(0, 0, 1)},
+ {"Turquoise", myRGB(25, 204, 223)},
+ {"Violet", myRGB(156, 62, 206)},
+ {"VioletRed", myRGB(243, 62, 150)},
+ {"Wheat", myRGB(245, 222, 179)},
+ {"White", myRGB(255, 255, 255)},
+ {"WhiteSmoke", myRGB(245, 245, 245)},
+ {"Yellow", myRGB(255, 255, 0)},
+ {"YellowGreen", myRGB(50, 216, 56)},
+ NULL
+};
+
+static int numTheRGBRecords = 234;
diff --git a/xc/extras/Xpm/lib/scan.c b/xc/extras/Xpm/lib/scan.c
new file mode 100644
index 000000000..eabbde115
--- /dev/null
+++ b/xc/extras/Xpm/lib/scan.c
@@ -0,0 +1,1003 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* scan.c: *
+* *
+* XPM library *
+* Scanning utility for XPM file format *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to FOR_MSW has been added by
+ * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
+ */
+
+/*
+ * The code related to AMIGA has been added by
+ * Lorens Younes (d93-hyo@nada.kth.se) 4/96
+ */
+
+#include "XpmI.h"
+
+#define MAXPRINTABLE 92 /* number of printable ascii chars
+ * minus \ and " for string compat
+ * and ? to avoid ANSI trigraphs. */
+
+static char *printable =
+" .XoO+@#$%&*=-;:>,<1234567890qwertyuipasdfghjklzxcvbnmMNBVCZ\
+ASDFGHJKLPIUYTREWQ!~^/()_`'][{}|";
+
+/*
+ * printable begin with a space, so in most case, due to my algorithm, when
+ * the number of different colors is less than MAXPRINTABLE, it will give a
+ * char follow by "nothing" (a space) in the readable xpm file
+ */
+
+
+typedef struct {
+ Pixel *pixels;
+ unsigned int *pixelindex;
+ unsigned int size;
+ unsigned int ncolors;
+ unsigned int mask_pixel; /* whether there is or not */
+} PixelsMap;
+
+LFUNC(storePixel, int, (Pixel pixel, PixelsMap *pmap,
+ unsigned int *index_return));
+
+LFUNC(storeMaskPixel, int, (Pixel pixel, PixelsMap *pmap,
+ unsigned int *index_return));
+
+#ifndef FOR_MSW
+# ifndef AMIGA
+LFUNC(GetImagePixels, int, (XImage *image, unsigned int width,
+ unsigned int height, PixelsMap *pmap));
+
+LFUNC(GetImagePixels32, int, (XImage *image, unsigned int width,
+ unsigned int height, PixelsMap *pmap));
+
+LFUNC(GetImagePixels16, int, (XImage *image, unsigned int width,
+ unsigned int height, PixelsMap *pmap));
+
+LFUNC(GetImagePixels8, int, (XImage *image, unsigned int width,
+ unsigned int height, PixelsMap *pmap));
+
+LFUNC(GetImagePixels1, int, (XImage *image, unsigned int width,
+ unsigned int height, PixelsMap *pmap,
+ int (*storeFunc) ()));
+# else /* AMIGA */
+LFUNC(AGetImagePixels, int, (XImage *image, unsigned int width,
+ unsigned int height, PixelsMap *pmap,
+ int (*storeFunc) ()));
+# endif/* AMIGA */
+#else /* ndef FOR_MSW */
+LFUNC(MSWGetImagePixels, int, (Display *d, XImage *image, unsigned int width,
+ unsigned int height, PixelsMap *pmap,
+ int (*storeFunc) ()));
+#endif
+LFUNC(ScanTransparentColor, int, (XpmColor *color, unsigned int cpp,
+ XpmAttributes *attributes));
+
+LFUNC(ScanOtherColors, int, (Display *display, XpmColor *colors, int ncolors,
+ Pixel *pixels, unsigned int mask,
+ unsigned int cpp, XpmAttributes *attributes));
+
+/*
+ * This function stores the given pixel in the given arrays which are grown
+ * if not large enough.
+ */
+static int
+storePixel(pixel, pmap, index_return)
+ Pixel pixel;
+ PixelsMap *pmap;
+ unsigned int *index_return;
+{
+ unsigned int i;
+ Pixel *p;
+ unsigned int ncolors;
+
+ if (*index_return) { /* this is a transparent pixel! */
+ *index_return = 0;
+ return 0;
+ }
+ ncolors = pmap->ncolors;
+ p = pmap->pixels + pmap->mask_pixel;
+ for (i = pmap->mask_pixel; i < ncolors; i++, p++)
+ if (*p == pixel)
+ break;
+ if (i == ncolors) {
+ if (ncolors >= pmap->size) {
+ pmap->size *= 2;
+ p = (Pixel *) XpmRealloc(pmap->pixels, sizeof(Pixel) * pmap->size);
+ if (!p)
+ return (1);
+ pmap->pixels = p;
+
+ }
+ (pmap->pixels)[ncolors] = pixel;
+ pmap->ncolors++;
+ }
+ *index_return = i;
+ return 0;
+}
+
+static int
+storeMaskPixel(pixel, pmap, index_return)
+ Pixel pixel;
+ PixelsMap *pmap;
+ unsigned int *index_return;
+{
+ if (!pixel) {
+ if (!pmap->ncolors) {
+ pmap->ncolors = 1;
+ (pmap->pixels)[0] = 0;
+ pmap->mask_pixel = 1;
+ }
+ *index_return = 1;
+ } else
+ *index_return = 0;
+ return 0;
+}
+
+/* function call in case of error */
+#undef RETURN
+#define RETURN(status) \
+{ \
+ ErrorStatus = status; \
+ goto error; \
+}
+
+/*
+ * This function scans the given image and stores the found informations in
+ * the given XpmImage structure.
+ */
+int
+XpmCreateXpmImageFromImage(display, image, shapeimage,
+ xpmimage, attributes)
+ Display *display;
+ XImage *image;
+ XImage *shapeimage;
+ XpmImage *xpmimage;
+ XpmAttributes *attributes;
+{
+ /* variables stored in the XpmAttributes structure */
+ unsigned int cpp;
+
+ /* variables to return */
+ PixelsMap pmap;
+ XpmColor *colorTable = NULL;
+ int ErrorStatus;
+
+ /* calculation variables */
+ unsigned int width = 0;
+ unsigned int height = 0;
+ unsigned int cppm; /* minimum chars per pixel */
+ unsigned int c;
+
+ /* initialize pmap */
+ pmap.pixels = NULL;
+ pmap.pixelindex = NULL;
+ pmap.size = 256; /* should be enough most of the time */
+ pmap.ncolors = 0;
+ pmap.mask_pixel = 0;
+
+ /*
+ * get geometry
+ */
+ if (image) {
+ width = image->width;
+ height = image->height;
+ } else if (shapeimage) {
+ width = shapeimage->width;
+ height = shapeimage->height;
+ }
+
+ /*
+ * retrieve information from the XpmAttributes
+ */
+ if (attributes && (attributes->valuemask & XpmCharsPerPixel
+/* 3.2 backward compatibility code */
+ || attributes->valuemask & XpmInfos))
+/* end 3.2 bc */
+ cpp = attributes->cpp;
+ else
+ cpp = 0;
+
+ pmap.pixelindex =
+ (unsigned int *) XpmCalloc(width * height, sizeof(unsigned int));
+ if (!pmap.pixelindex)
+ RETURN(XpmNoMemory);
+
+ pmap.pixels = (Pixel *) XpmMalloc(sizeof(Pixel) * pmap.size);
+ if (!pmap.pixels)
+ RETURN(XpmNoMemory);
+
+ /*
+ * scan shape mask if any
+ */
+ if (shapeimage) {
+#ifndef FOR_MSW
+# ifndef AMIGA
+ ErrorStatus = GetImagePixels1(shapeimage, width, height, &pmap,
+ storeMaskPixel);
+# else
+ ErrorStatus = AGetImagePixels(shapeimage, width, height, &pmap,
+ storeMaskPixel);
+# endif
+#else
+ ErrorStatus = MSWGetImagePixels(display, shapeimage, width, height,
+ &pmap, storeMaskPixel);
+#endif
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+ }
+
+ /*
+ * scan the image data
+ *
+ * In case depth is 1 or bits_per_pixel is 4, 6, 8, 24 or 32 use optimized
+ * functions, otherwise use slower but sure general one.
+ *
+ */
+
+ if (image) {
+#ifndef FOR_MSW
+# ifndef AMIGA
+ if (((image->bits_per_pixel | image->depth) == 1) &&
+ (image->byte_order == image->bitmap_bit_order))
+ ErrorStatus = GetImagePixels1(image, width, height, &pmap,
+ storePixel);
+ else if (image->format == ZPixmap) {
+ if (image->bits_per_pixel == 8)
+ ErrorStatus = GetImagePixels8(image, width, height, &pmap);
+ else if (image->bits_per_pixel == 16)
+ ErrorStatus = GetImagePixels16(image, width, height, &pmap);
+ else if (image->bits_per_pixel == 32)
+ ErrorStatus = GetImagePixels32(image, width, height, &pmap);
+ } else
+ ErrorStatus = GetImagePixels(image, width, height, &pmap);
+# else
+ ErrorStatus = AGetImagePixels(image, width, height, &pmap,
+ storePixel);
+# endif
+#else
+ ErrorStatus = MSWGetImagePixels(display, image, width, height, &pmap,
+ storePixel);
+#endif
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+ }
+
+ /*
+ * get rgb values and a string of char, and possibly a name for each
+ * color
+ */
+
+ colorTable = (XpmColor *) XpmCalloc(pmap.ncolors, sizeof(XpmColor));
+ if (!colorTable)
+ RETURN(XpmNoMemory);
+
+ /* compute the minimal cpp */
+ for (cppm = 1, c = MAXPRINTABLE; pmap.ncolors > c; cppm++)
+ c *= MAXPRINTABLE;
+ if (cpp < cppm)
+ cpp = cppm;
+
+ if (pmap.mask_pixel) {
+ ErrorStatus = ScanTransparentColor(colorTable, cpp, attributes);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+ }
+
+ ErrorStatus = ScanOtherColors(display, colorTable, pmap.ncolors,
+ pmap.pixels, pmap.mask_pixel, cpp,
+ attributes);
+ if (ErrorStatus != XpmSuccess)
+ RETURN(ErrorStatus);
+
+ /*
+ * store found informations in the XpmImage structure
+ */
+ xpmimage->width = width;
+ xpmimage->height = height;
+ xpmimage->cpp = cpp;
+ xpmimage->ncolors = pmap.ncolors;
+ xpmimage->colorTable = colorTable;
+ xpmimage->data = pmap.pixelindex;
+
+ XpmFree(pmap.pixels);
+ return (XpmSuccess);
+
+/* exit point in case of error, free only locally allocated variables */
+error:
+ if (pmap.pixelindex)
+ XpmFree(pmap.pixelindex);
+ if (pmap.pixels)
+ XpmFree(pmap.pixels);
+ if (colorTable)
+ xpmFreeColorTable(colorTable, pmap.ncolors);
+
+ return (ErrorStatus);
+}
+
+static int
+ScanTransparentColor(color, cpp, attributes)
+ XpmColor *color;
+ unsigned int cpp;
+ XpmAttributes *attributes;
+{
+ char *s;
+ unsigned int a, b, c;
+
+ /* first get a character string */
+ a = 0;
+ if (!(s = color->string = (char *) XpmMalloc(cpp + 1)))
+ return (XpmNoMemory);
+ *s++ = printable[c = a % MAXPRINTABLE];
+ for (b = 1; b < cpp; b++, s++)
+ *s = printable[c = ((a - c) / MAXPRINTABLE) % MAXPRINTABLE];
+ *s = '\0';
+
+ /* then retreive related info from the attributes if any */
+ if (attributes && (attributes->valuemask & XpmColorTable
+/* 3.2 backward compatibility code */
+ || attributes->valuemask & XpmInfos)
+/* end 3.2 bc */
+ && attributes->mask_pixel != XpmUndefPixel) {
+
+ unsigned int key;
+ char **defaults = (char **) color;
+ char **mask_defaults;
+
+/* 3.2 backward compatibility code */
+ if (attributes->valuemask & XpmColorTable)
+/* end 3.2 bc */
+ mask_defaults = (char **) (
+ attributes->colorTable + attributes->mask_pixel);
+/* 3.2 backward compatibility code */
+ else
+ mask_defaults = (char **)
+ ((XpmColor **) attributes->colorTable)[attributes->mask_pixel];
+/* end 3.2 bc */
+ for (key = 1; key <= NKEYS; key++) {
+ if (s = mask_defaults[key]) {
+ defaults[key] = (char *) xpmstrdup(s);
+ if (!defaults[key])
+ return (XpmNoMemory);
+ }
+ }
+ } else {
+ color->c_color = (char *) xpmstrdup(TRANSPARENT_COLOR);
+ if (!color->c_color)
+ return (XpmNoMemory);
+ }
+ return (XpmSuccess);
+}
+
+static int
+ScanOtherColors(display, colors, ncolors, pixels, mask, cpp, attributes)
+ Display *display;
+ XpmColor *colors;
+ int ncolors;
+ Pixel *pixels;
+ unsigned int mask;
+ unsigned int cpp;
+ XpmAttributes *attributes;
+{
+ /* variables stored in the XpmAttributes structure */
+ Colormap colormap;
+ char *rgb_fname;
+
+#ifndef FOR_MSW
+ xpmRgbName rgbn[MAX_RGBNAMES];
+#else
+ xpmRgbName *rgbn = NULL;
+#endif
+ int rgbn_max = 0;
+ unsigned int i, j, c, i2;
+ XpmColor *color;
+ XColor *xcolors = NULL, *xcolor;
+ char *colorname, *s;
+ XpmColor *colorTable, **oldColorTable = NULL;
+ unsigned int ancolors = 0;
+ Pixel *apixels;
+ unsigned int mask_pixel;
+ Bool found;
+
+ /* retrieve information from the XpmAttributes */
+ if (attributes && (attributes->valuemask & XpmColormap))
+ colormap = attributes->colormap;
+ else
+ colormap = XDefaultColormap(display, XDefaultScreen(display));
+ if (attributes && (attributes->valuemask & XpmRgbFilename))
+ rgb_fname = attributes->rgb_fname;
+ else
+ rgb_fname = NULL;
+
+ /* start from the right element */
+ if (mask) {
+ colors++;
+ ncolors--;
+ pixels++;
+ }
+
+ /* first get character strings and rgb values */
+ xcolors = (XColor *) XpmMalloc(sizeof(XColor) * ncolors);
+ if (!xcolors)
+ return (XpmNoMemory);
+
+ for (i = 0, i2 = mask, color = colors, xcolor = xcolors;
+ i < ncolors; i++, i2++, color++, xcolor++, pixels++) {
+
+ if (!(s = color->string = (char *) XpmMalloc(cpp + 1))) {
+ XpmFree(xcolors);
+ return (XpmNoMemory);
+ }
+ *s++ = printable[c = i2 % MAXPRINTABLE];
+ for (j = 1; j < cpp; j++, s++)
+ *s = printable[c = ((i2 - c) / MAXPRINTABLE) % MAXPRINTABLE];
+ *s = '\0';
+
+ xcolor->pixel = *pixels;
+ }
+ XQueryColors(display, colormap, xcolors, ncolors);
+
+#ifndef FOR_MSW
+ /* read the rgb file if any was specified */
+ if (rgb_fname)
+ rgbn_max = xpmReadRgbNames(attributes->rgb_fname, rgbn);
+#else
+ /* FOR_MSW: rgb names and values are hardcoded in rgbtab.h */
+ rgbn_max = xpmReadRgbNames(NULL, NULL);
+#endif
+
+ if (attributes && attributes->valuemask & XpmColorTable) {
+ colorTable = attributes->colorTable;
+ ancolors = attributes->ncolors;
+ apixels = attributes->pixels;
+ mask_pixel = attributes->mask_pixel;
+ }
+/* 3.2 backward compatibility code */
+ else if (attributes && attributes->valuemask & XpmInfos) {
+ oldColorTable = (XpmColor **) attributes->colorTable;
+ ancolors = attributes->ncolors;
+ apixels = attributes->pixels;
+ mask_pixel = attributes->mask_pixel;
+ }
+/* end 3.2 bc */
+
+ for (i = 0, color = colors, xcolor = xcolors; i < ncolors;
+ i++, color++, xcolor++) {
+
+ /* look for related info from the attributes if any */
+ found = False;
+ if (ancolors) {
+ unsigned int offset = 0;
+
+ for (j = 0; j < ancolors; j++) {
+ if (j == mask_pixel) {
+ offset = 1;
+ continue;
+ }
+ if (apixels[j - offset] == xcolor->pixel)
+ break;
+ }
+ if (j != ancolors) {
+ unsigned int key;
+ char **defaults = (char **) color;
+ char **adefaults;
+
+/* 3.2 backward compatibility code */
+ if (oldColorTable)
+ adefaults = (char **) oldColorTable[j];
+ else
+/* end 3.2 bc */
+ adefaults = (char **) (colorTable + j);
+
+ found = True;
+ for (key = 1; key <= NKEYS; key++) {
+ if (s = adefaults[key])
+ defaults[key] = (char *) xpmstrdup(s);
+ }
+ }
+ }
+ if (!found) {
+ /* if nothing found look for a color name */
+ colorname = NULL;
+ if (rgbn_max)
+ colorname = xpmGetRgbName(rgbn, rgbn_max, xcolor->red,
+ xcolor->green, xcolor->blue);
+ if (colorname)
+ color->c_color = (char *) xpmstrdup(colorname);
+ else {
+ /* at last store the rgb value */
+ char buf[BUFSIZ];
+#ifndef FOR_MSW
+ sprintf(buf, "#%04X%04X%04X",
+ xcolor->red, xcolor->green, xcolor->blue);
+#else
+ sprintf(buf, "#%02x%02x%02x",
+ xcolor->red, xcolor->green, xcolor->blue);
+#endif
+ color->c_color = (char *) xpmstrdup(buf);
+ }
+ if (!color->c_color) {
+ XpmFree(xcolors);
+ xpmFreeRgbNames(rgbn, rgbn_max);
+ return (XpmNoMemory);
+ }
+ }
+ }
+
+ XpmFree(xcolors);
+ xpmFreeRgbNames(rgbn, rgbn_max);
+ return (XpmSuccess);
+}
+
+#ifndef FOR_MSW
+# ifndef AMIGA
+/*
+ * The functions below are written from X11R5 MIT's code (XImUtil.c)
+ *
+ * The idea is to have faster functions than the standard XGetPixel function
+ * to scan the image data. Indeed we can speed up things by suppressing tests
+ * performed for each pixel. We do exactly the same tests but at the image
+ * level.
+ */
+
+static unsigned long Const low_bits_table[] = {
+ 0x00000000, 0x00000001, 0x00000003, 0x00000007,
+ 0x0000000f, 0x0000001f, 0x0000003f, 0x0000007f,
+ 0x000000ff, 0x000001ff, 0x000003ff, 0x000007ff,
+ 0x00000fff, 0x00001fff, 0x00003fff, 0x00007fff,
+ 0x0000ffff, 0x0001ffff, 0x0003ffff, 0x0007ffff,
+ 0x000fffff, 0x001fffff, 0x003fffff, 0x007fffff,
+ 0x00ffffff, 0x01ffffff, 0x03ffffff, 0x07ffffff,
+ 0x0fffffff, 0x1fffffff, 0x3fffffff, 0x7fffffff,
+ 0xffffffff
+};
+
+/*
+ * Default method to scan pixels of an image data structure.
+ * The algorithm used is:
+ *
+ * copy the source bitmap_unit or Zpixel into temp
+ * normalize temp if needed
+ * extract the pixel bits into return value
+ *
+ */
+
+static int
+GetImagePixels(image, width, height, pmap)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ PixelsMap *pmap;
+{
+ char *src;
+ char *dst;
+ unsigned int *iptr;
+ char *data;
+ int x, y, i;
+ int bits, depth, ibu, ibpp, offset;
+ unsigned long lbt;
+ Pixel pixel, px;
+
+ data = image->data;
+ iptr = pmap->pixelindex;
+ depth = image->depth;
+ lbt = low_bits_table[depth];
+ ibpp = image->bits_per_pixel;
+ offset = image->xoffset;
+
+ if ((image->bits_per_pixel | image->depth) == 1) {
+ ibu = image->bitmap_unit;
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ src = &data[XYINDEX(x, y, image)];
+ dst = (char *) &pixel;
+ pixel = 0;
+ for (i = ibu >> 3; --i >= 0;)
+ *dst++ = *src++;
+ XYNORMALIZE(&pixel, image);
+ bits = (x + offset) % ibu;
+ pixel = ((((char *) &pixel)[bits >> 3]) >> (bits & 7)) & 1;
+ if (ibpp != depth)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ } else if (image->format == XYPixmap) {
+ int nbytes, bpl, j;
+ long plane = 0;
+ ibu = image->bitmap_unit;
+ nbytes = ibu >> 3;
+ bpl = image->bytes_per_line;
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ pixel = 0;
+ plane = 0;
+ for (i = depth; --i >= 0;) {
+ src = &data[XYINDEX(x, y, image) + plane];
+ dst = (char *) &px;
+ px = 0;
+ for (j = nbytes; --j >= 0;)
+ *dst++ = *src++;
+ XYNORMALIZE(&px, image);
+ bits = (x + offset) % ibu;
+ pixel = (pixel << 1) |
+ (((((char *) &px)[bits >> 3]) >> (bits & 7)) & 1);
+ plane = plane + (bpl * height);
+ }
+ if (ibpp != depth)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ } else if (image->format == ZPixmap) {
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ src = &data[ZINDEX(x, y, image)];
+ dst = (char *) &px;
+ px = 0;
+ for (i = (ibpp + 7) >> 3; --i >= 0;)
+ *dst++ = *src++;
+ ZNORMALIZE(&px, image);
+ pixel = 0;
+ for (i = sizeof(unsigned long); --i >= 0;)
+ pixel = (pixel << 8) | ((unsigned char *) &px)[i];
+ if (ibpp == 4) {
+ if (x & 1)
+ pixel >>= 4;
+ else
+ pixel &= 0xf;
+ }
+ if (ibpp != depth)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ } else
+ return (XpmColorError); /* actually a bad image */
+ return (XpmSuccess);
+}
+
+/*
+ * scan pixels of a 32-bits Z image data structure
+ */
+
+#if !defined(WORD64) && !defined(LONG64)
+static unsigned long byteorderpixel = MSBFirst << 24;
+#endif
+
+static int
+GetImagePixels32(image, width, height, pmap)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ PixelsMap *pmap;
+{
+ unsigned char *addr;
+ unsigned char *data;
+ unsigned int *iptr;
+ int x, y;
+ unsigned long lbt;
+ Pixel pixel;
+ int depth;
+
+ data = (unsigned char *) image->data;
+ iptr = pmap->pixelindex;
+ depth = image->depth;
+ lbt = low_bits_table[depth];
+#if !defined(WORD64) && !defined(LONG64)
+ if (*((char *) &byteorderpixel) == image->byte_order) {
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX32(x, y, image)];
+ pixel = *((unsigned long *) addr);
+ if (depth != 32)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ } else
+#endif
+ if (image->byte_order == MSBFirst)
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX32(x, y, image)];
+ pixel = ((unsigned long) addr[0] << 24 |
+ (unsigned long) addr[1] << 16 |
+ (unsigned long) addr[2] << 8 |
+ addr[3]);
+ if (depth != 32)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ else
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX32(x, y, image)];
+ pixel = (addr[0] |
+ (unsigned long) addr[1] << 8 |
+ (unsigned long) addr[2] << 16 |
+ (unsigned long) addr[3] << 24);
+ if (depth != 32)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ return (XpmSuccess);
+}
+
+/*
+ * scan pixels of a 16-bits Z image data structure
+ */
+
+static int
+GetImagePixels16(image, width, height, pmap)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ PixelsMap *pmap;
+{
+ unsigned char *addr;
+ unsigned char *data;
+ unsigned int *iptr;
+ int x, y;
+ unsigned long lbt;
+ Pixel pixel;
+ int depth;
+
+ data = (unsigned char *) image->data;
+ iptr = pmap->pixelindex;
+ depth = image->depth;
+ lbt = low_bits_table[depth];
+ if (image->byte_order == MSBFirst)
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX16(x, y, image)];
+ pixel = addr[0] << 8 | addr[1];
+ if (depth != 16)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ else
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ addr = &data[ZINDEX16(x, y, image)];
+ pixel = addr[0] | addr[1] << 8;
+ if (depth != 16)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ return (XpmSuccess);
+}
+
+/*
+ * scan pixels of a 8-bits Z image data structure
+ */
+
+static int
+GetImagePixels8(image, width, height, pmap)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ PixelsMap *pmap;
+{
+ unsigned int *iptr;
+ unsigned char *data;
+ int x, y;
+ unsigned long lbt;
+ Pixel pixel;
+ int depth;
+
+ data = (unsigned char *) image->data;
+ iptr = pmap->pixelindex;
+ depth = image->depth;
+ lbt = low_bits_table[depth];
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ pixel = data[ZINDEX8(x, y, image)];
+ if (depth != 8)
+ pixel &= lbt;
+ if (storePixel(pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ return (XpmSuccess);
+}
+
+/*
+ * scan pixels of a 1-bit depth Z image data structure
+ */
+
+static int
+GetImagePixels1(image, width, height, pmap, storeFunc)
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ PixelsMap *pmap;
+ int (*storeFunc) ();
+{
+ unsigned int *iptr;
+ int x, y;
+ char *data;
+ Pixel pixel;
+ int xoff, yoff, offset, bpl;
+
+ data = image->data;
+ iptr = pmap->pixelindex;
+ offset = image->xoffset;
+ bpl = image->bytes_per_line;
+
+ if (image->bitmap_bit_order == MSBFirst)
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ xoff = x + offset;
+ yoff = y * bpl + (xoff >> 3);
+ xoff &= 7;
+ pixel = (data[yoff] & (0x80 >> xoff)) ? 1 : 0;
+ if ((*storeFunc) (pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ else
+ for (y = 0; y < height; y++)
+ for (x = 0; x < width; x++, iptr++) {
+ xoff = x + offset;
+ yoff = y * bpl + (xoff >> 3);
+ xoff &= 7;
+ pixel = (data[yoff] & (1 << xoff)) ? 1 : 0;
+ if ((*storeFunc) (pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ return (XpmSuccess);
+}
+
+# else /* AMIGA */
+
+#define CLEAN_UP(status) \
+{\
+ if (pixels) XpmFree (pixels);\
+ if (tmp_img) FreeXImage (tmp_img);\
+ return (status);\
+}
+
+static int
+AGetImagePixels (
+ XImage *image,
+ unsigned int width,
+ unsigned int height,
+ PixelsMap *pmap,
+ int (*storeFunc) ())
+{
+ unsigned int *iptr;
+ unsigned int x, y;
+ unsigned char *pixels;
+ XImage *tmp_img;
+
+ pixels = XpmMalloc ((((width+15)>>4)<<4)*sizeof (*pixels));
+ if (pixels == NULL)
+ return XpmNoMemory;
+
+ tmp_img = AllocXImage ((((width+15)>>4)<<4), 1, image->rp->BitMap->Depth);
+ if (tmp_img == NULL)
+ CLEAN_UP (XpmNoMemory)
+
+ iptr = pmap->pixelindex;
+ for (y = 0; y < height; ++y)
+ {
+ ReadPixelLine8 (image->rp, 0, y, width, pixels, tmp_img->rp);
+ for (x = 0; x < width; ++x, ++iptr)
+ {
+ if ((*storeFunc) (pixels[x], pmap, iptr))
+ CLEAN_UP (XpmNoMemory)
+ }
+ }
+
+ CLEAN_UP (XpmSuccess)
+}
+
+#undef CLEAN_UP
+
+# endif/* AMIGA */
+#else /* ndef FOR_MSW */
+static int
+MSWGetImagePixels(display, image, width, height, pmap, storeFunc)
+ Display *display;
+ XImage *image;
+ unsigned int width;
+ unsigned int height;
+ PixelsMap *pmap;
+ int (*storeFunc) ();
+{
+ unsigned int *iptr;
+ unsigned int x, y;
+ Pixel pixel;
+
+ iptr = pmap->pixelindex;
+
+ SelectObject(*display, image->bitmap);
+ for (y = 0; y < height; y++) {
+ for (x = 0; x < width; x++, iptr++) {
+ pixel = GetPixel(*display, x, y);
+ if ((*storeFunc) (pixel, pmap, iptr))
+ return (XpmNoMemory);
+ }
+ }
+ return (XpmSuccess);
+}
+
+#endif
+
+#ifndef FOR_MSW
+# ifndef AMIGA
+int
+XpmCreateXpmImageFromPixmap(display, pixmap, shapemask,
+ xpmimage, attributes)
+ Display *display;
+ Pixmap pixmap;
+ Pixmap shapemask;
+ XpmImage *xpmimage;
+ XpmAttributes *attributes;
+{
+ XImage *ximage = NULL;
+ XImage *shapeimage = NULL;
+ unsigned int width = 0;
+ unsigned int height = 0;
+ int ErrorStatus;
+
+ /* get geometry */
+ if (attributes && attributes->valuemask & XpmSize) {
+ width = attributes->width;
+ height = attributes->height;
+ }
+ /* get the ximages */
+ if (pixmap)
+ xpmCreateImageFromPixmap(display, pixmap, &ximage, &width, &height);
+ if (shapemask)
+ xpmCreateImageFromPixmap(display, shapemask, &shapeimage,
+ &width, &height);
+
+ /* create the related XpmImage */
+ ErrorStatus = XpmCreateXpmImageFromImage(display, ximage, shapeimage,
+ xpmimage, attributes);
+
+ /* destroy the ximages */
+ if (ximage)
+ XDestroyImage(ximage);
+ if (shapeimage)
+ XDestroyImage(shapeimage);
+
+ return (ErrorStatus);
+}
+
+# endif/* not AMIGA */
+#endif /* ndef FOR_MSW */
diff --git a/xc/extras/Xpm/lib/simx.c b/xc/extras/Xpm/lib/simx.c
new file mode 100644
index 000000000..5e5537d1c
--- /dev/null
+++ b/xc/extras/Xpm/lib/simx.c
@@ -0,0 +1,290 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* simx.c: 0.1a *
+* *
+* This emulates some Xlib functionality for MSW. It's not a general solution, *
+* it is close related to XPM-lib. It is only intended to satisfy what is need *
+* there. Thus allowing to read XPM files under MS windows. *
+* *
+* Developed by HeDu 3/94 (hedu@cul-ipn.uni-kiel.de) *
+\*****************************************************************************/
+
+#ifdef FOR_MSW
+
+#include "xpm.h"
+#include "xpmi.h" /* for XpmMalloc */
+
+/*
+ * On DOS size_t is only 2 bytes, thus malloc(size_t s) can only malloc
+ * 64K. BUT an expression data=malloc(width*height) may result in an
+ * overflow. So this function takes a long as input, and returns NULL if the
+ * request is larger than 64K, is size_t is only 2 bytes.
+ *
+ * This requires casts like XpmMalloc( (long)width*(long(height)), else it
+ * might have no effect at all.
+ */
+
+void *
+boundCheckingMalloc(long s)
+{
+ if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
+ return (malloc((size_t) s));
+ } else {
+ if (sizeof(size_t) == 2) {
+ if (s > 0xFFFF)
+ return (NULL); /* to large, size_t with 2 bytes
+ * only allows 16 bits */
+ else
+ return (malloc((size_t) s));
+ } else { /* it's not a long, not 2 bytes,
+ * what is it ??? */
+ return (malloc((size_t) s));
+ }
+ }
+}
+void *
+boundCheckingCalloc(long num, long s)
+{
+ if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
+ return (calloc((size_t) num, (size_t) s));
+ } else {
+ if (sizeof(size_t) == 2) {
+ if (s > 0xFFFF || num * s > 0xFFFF)
+ return (NULL); /* to large, size_t with 2 bytes
+ * only allows 16 bits */
+ else
+ return (calloc((size_t) num, (size_t) s));
+ } else { /* it's not a long, not 2 bytes,
+ * what is it ??? */
+ return (calloc((size_t) num, (size_t) s));
+ }
+ }
+}
+void *
+boundCheckingRealloc(void *p, long s)
+{
+ if (sizeof(size_t) == sizeof(long)) { /* same size, just do it */
+ return (realloc(p, (size_t) s));
+ } else {
+ if (sizeof(size_t) == 2) {
+ if (s > 0xFFFF)
+ return (NULL); /* to large, size_t with 2 bytes
+ * only allows 16 bits */
+ else
+ return (realloc(p, (size_t) s));
+ } else { /* it's not a long, not 2 bytes,
+ * what is it ??? */
+ return (realloc(p, (size_t) s));
+ }
+ }
+}
+
+/* static Visual theVisual = { 0 }; */
+Visual *
+XDefaultVisual(Display *display, Screen *screen)
+{
+ return (NULL); /* struct could contain info about
+ * MONO, GRAY, COLOR */
+}
+
+Screen *
+XDefaultScreen(Display *d)
+{
+ return (NULL);
+}
+
+/* I get only 1 plane but 8 bits per pixel,
+ so I think BITSPIXEL should be depth */
+int
+XDefaultDepth(Display *display, Screen *screen)
+{
+ int d, b;
+
+ b = GetDeviceCaps(*display, BITSPIXEL);
+ d = GetDeviceCaps(*display, PLANES);
+ return (b);
+}
+
+Colormap *
+XDefaultColormap(Display *display, Screen *screen)
+{
+ return (NULL);
+}
+
+/* convert hex color names,
+ wrong digits (not a-f,A-F,0-9) are treated as zero */
+static int
+hexCharToInt(c)
+{
+ int r;
+
+ if (c >= '0' && c <= '9')
+ r = c - '0';
+ else if (c >= 'a' && c <= 'f')
+ r = c - 'a' + 10;
+ else if (c >= 'A' && c <= 'F')
+ r = c - 'A' + 10;
+ else
+ r = 0;
+
+ return (r);
+}
+
+static int
+rgbFromHex(char *hex, int *r, int *g, int *b)
+{
+ int len;
+
+ if (hex == NULL || hex[0] != '#')
+ return (0);
+
+ len = strlen(hex);
+ if (len == 3 + 1) {
+ *r = hexCharToInt(hex[1]);
+ *g = hexCharToInt(hex[2]);
+ *b = hexCharToInt(hex[3]);
+ } else if (len == 6 + 1) {
+ *r = hexCharToInt(hex[1]) * 16 + hexCharToInt(hex[2]);
+ *g = hexCharToInt(hex[3]) * 16 + hexCharToInt(hex[4]);
+ *b = hexCharToInt(hex[5]) * 16 + hexCharToInt(hex[6]);
+ } else if (len == 12 + 1) {
+ /* it's like c #32329999CCCC */
+ /* so for now only take two digits */
+ *r = hexCharToInt(hex[1]) * 16 + hexCharToInt(hex[2]);
+ *g = hexCharToInt(hex[5]) * 16 + hexCharToInt(hex[6]);
+ *b = hexCharToInt(hex[9]) * 16 + hexCharToInt(hex[10]);
+ } else
+ return (0);
+
+ return (1);
+}
+
+/* Color related functions */
+int
+XParseColor(Display *d, Colormap *cmap, char *name, XColor *color)
+{
+ int r, g, b; /* only 8 bit values used */
+ int okay;
+
+/* TODO: use colormap via PALETTE */
+ /* parse name either in table or #RRGGBB #RGB */
+ if (name == NULL)
+ return (0);
+
+ if (name[0] == '#') { /* a hex string */
+ okay = rgbFromHex(name, &r, &g, &b);
+ } else {
+ okay = xpmGetRGBfromName(name, &r, &g, &b);
+ }
+
+ if (okay) {
+ color->pixel = RGB(r, g, b);
+ color->red = (BYTE) r;
+ color->green = (BYTE) g;
+ color->blue = (BYTE) b;
+ return (1);
+ } else
+ return (0); /* --> ColorError */
+}
+
+
+int
+XAllocColor(Display *d, Colormap cmap, XColor *color)
+{
+/* colormap not used yet so color->pixel is the real COLORREF (RBG) and not an
+ index in some colormap as in X */
+ return (1);
+}
+void
+XQueryColors(Display *display, Colormap *colormap,
+ XColor *xcolors, int ncolors)
+{
+/* under X this fills the rgb values to given .pixel */
+/* since there no colormap use FOR_MSW (not yet!!), rgb is plain encoded */
+ XColor *xc = xcolors;
+ int i;
+
+ for (i = 0; i < ncolors; i++, xc++) {
+ xc->red = GetRValue(xc->pixel);
+ xc->green = GetGValue(xc->pixel);
+ xc->blue = GetBValue(xc->pixel);
+ }
+ return;
+}
+int
+XFreeColors(Display *d, Colormap cmap,
+ unsigned long pixels[], int npixels, unsigned long planes)
+{
+ /* no colormap yet */
+ return (0); /* correct ??? */
+}
+
+/* XImage functions */
+XImage *
+XCreateImage(Display *d, Visual *v,
+ int depth, int format,
+ int x, int y, int width, int height,
+ int pad, int foo)
+{
+ XImage *img = (XImage *) XpmMalloc(sizeof(XImage));
+
+ if (img) {
+ /*JW: This is what it should be, but the picture comes out
+ just black!? It appears to be doing monochrome reduction,
+ but I've got no clue why. Using CreateBitmap() is supposed
+ to be slower, but otherwise ok
+ if ( depth == GetDeviceCaps(*d, BITSPIXEL) ) {
+ img->bitmap = CreateCompatibleBitmap(*d, width, height);
+ } else*/ {
+ img->bitmap = CreateBitmap(width, height, 1 /* plane */ ,
+ depth /* bits per pixel */ , NULL);
+ }
+ img->width = width;
+ img->height = height;
+ img->depth = depth;
+ }
+ return (img);
+
+}
+
+void
+XImageFree(XImage *img)
+{
+ if (img) {
+ XpmFree(img);
+ }
+}
+void
+XDestroyImage(XImage *img)
+{
+ if (img) {
+ DeleteObject(img->bitmap); /* check return ??? */
+ XImageFree(img);
+ }
+}
+
+#endif
diff --git a/xc/extras/Xpm/lib/simx.h b/xc/extras/Xpm/lib/simx.h
new file mode 100644
index 000000000..001cfdb4e
--- /dev/null
+++ b/xc/extras/Xpm/lib/simx.h
@@ -0,0 +1,139 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* simx.h: 0.1a *
+* *
+* This emulates some Xlib functionality for MSW. It's not a general solution, *
+* it is close related to XPM-lib. It is only intended to satisfy what is need *
+* there. Thus allowing to read XPM files under MS windows. *
+* *
+* Developed by HeDu 3/94 (hedu@cul-ipn.uni-kiel.de) *
+\*****************************************************************************/
+
+
+#ifndef _SIMX_H
+#define _SIMX_H
+
+#ifdef FOR_MSW
+
+#include "windows.h" /* MS windows GDI types */
+
+/*
+ * minimal portability layer between ansi and KR C
+ */
+/* this comes from xpm.h, and is here again, to avoid complicated
+ includes, since this is included from xpm.h */
+/* these defines get undefed at the end of this file */
+#if __STDC__ || defined(__cplusplus) || defined(c_plusplus)
+ /* ANSI || C++ */
+#define FUNC(f, t, p) extern t f p
+#define LFUNC(f, t, p) static t f p
+#else /* k&R */
+#define FUNC(f, t, p) extern t f()
+#define LFUNC(f, t, p) static t f()
+#endif
+
+
+FUNC(boundCheckingMalloc, void *, (long s));
+FUNC(boundCheckingCalloc, void *, (long num, long s));
+FUNC(boundCheckingRealloc, void *, (void *p, long s));
+
+/* define MSW types for X window types,
+ I don't know much about MSW, but the following defines do the job */
+
+typedef HDC Display; /* this should be similar */
+typedef void *Screen; /* not used */
+typedef void *Visual; /* not used yet, is for GRAY, COLOR,
+ * MONO */
+
+typedef void *Colormap; /* should be COLORPALETTE, not done
+ * yet */
+
+typedef COLORREF Pixel;
+
+#define PIXEL_ALREADY_TYPEDEFED /* to let xpm.h know about it */
+
+typedef struct {
+ Pixel pixel;
+ BYTE red, green, blue;
+} XColor;
+
+typedef struct {
+ HBITMAP bitmap;
+ unsigned int width;
+ unsigned int height;
+ unsigned int depth;
+} XImage;
+
+#if defined(__cplusplus) || defined(c_plusplus)
+extern "C" {
+#endif
+/* some replacements for X... functions */
+
+/* XDefaultXXX */
+ FUNC(XDefaultVisual, Visual *, (Display *display, Screen *screen));
+ FUNC(XDefaultScreen, Screen *, (Display *d));
+ FUNC(XDefaultColormap, Colormap *, (Display *display, Screen *screen));
+ FUNC(XDefaultDepth, int, (Display *d, Screen *s));
+
+/* color related */
+ FUNC(XParseColor, int, (Display *, Colormap *, char *, XColor *));
+ FUNC(XAllocColor, int, (Display *, Colormap *, XColor *));
+ FUNC(XQueryColors, void, (Display *display, Colormap *colormap,
+ XColor *xcolors, int ncolors));
+ FUNC(XFreeColors, int, (Display *d, Colormap cmap,
+ unsigned long pixels[],
+ int npixels, unsigned long planes));
+/* XImage */
+ FUNC(XCreateImage, XImage *, (Display *, Visual *, int depth, int format,
+ int x, int y, int width, int height,
+ int pad, int foo));
+
+/* free and destroy bitmap */
+ FUNC(XDestroyImage, void /* ? */ , (XImage *));
+/* free only, bitmap remains */
+ FUNC(XImageFree, void, (XImage *));
+#if defined(__cplusplus) || defined(c_plusplus)
+} /* end of extern "C" */
+#endif /* cplusplus */
+
+#define ZPixmap 1 /* not really used */
+#define XYBitmap 1 /* not really used */
+
+#ifndef True
+#define True 1
+#define False 0
+#endif
+#ifndef Bool
+typedef BOOL Bool; /* take MSW bool */
+#endif
+/* make these local here, simx.c gets the same from xpm.h */
+#undef LFUNC
+#undef FUNC
+
+#endif /* def FOR_MSW */
+
+#endif /* _SIMX_H */
diff --git a/xc/extras/Xpm/lib/xpm.h b/xc/extras/Xpm/lib/xpm.h
new file mode 100644
index 000000000..0e9969b47
--- /dev/null
+++ b/xc/extras/Xpm/lib/xpm.h
@@ -0,0 +1,501 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* xpm.h: *
+* *
+* XPM library *
+* Include file *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+/*
+ * The code related to FOR_MSW has been added by
+ * HeDu (hedu@cul-ipn.uni-kiel.de) 4/94
+ */
+
+/*
+ * The code related to AMIGA has been added by
+ * Lorens Younes (d93-hyo@nada.kth.se) 4/96
+ */
+
+#ifndef XPM_h
+#define XPM_h
+
+/*
+ * first some identification numbers:
+ * the version and revision numbers are determined with the following rule:
+ * SO Major number = LIB minor version number.
+ * SO Minor number = LIB sub-minor version number.
+ * e.g: Xpm version 3.2f
+ * we forget the 3 which is the format number, 2 gives 2, and f gives 6.
+ * thus we have XpmVersion = 2 and XpmRevision = 6
+ * which gives SOXPMLIBREV = 2.6
+ *
+ * Then the XpmIncludeVersion number is built from these numbers.
+ */
+#define XpmFormat 3
+#define XpmVersion 4
+#define XpmRevision 11
+#define XpmIncludeVersion ((XpmFormat * 100 + XpmVersion) * 100 + XpmRevision)
+
+#ifndef XPM_NUMBERS
+
+#ifdef FOR_MSW
+# define SYSV /* uses memcpy string.h etc. */
+# include <malloc.h>
+# include "simx.h" /* defines some X stuff using MSW types */
+#define NEED_STRCASECMP /* at least for MSVC++ */
+#else /* FOR_MSW */
+# ifdef AMIGA
+# include "amigax.h"
+# else /* not AMIGA */
+# include <X11/Xlib.h>
+# include <X11/Xutil.h>
+# endif /* not AMIGA */
+#endif /* FOR_MSW */
+
+/* let's define Pixel if it is not done yet */
+#if ! defined(_XtIntrinsic_h) && ! defined(PIXEL_ALREADY_TYPEDEFED)
+typedef unsigned long Pixel; /* Index into colormap */
+# define PIXEL_ALREADY_TYPEDEFED
+#endif
+
+/* make sure we know whether function prototypes are needed or not */
+#ifndef NeedFunctionPrototypes
+# if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
+# define NeedFunctionPrototypes 1
+# else
+# define NeedFunctionPrototypes 0
+# endif
+#endif
+
+
+/* Return ErrorStatus codes:
+ * null if full success
+ * positive if partial success
+ * negative if failure
+ */
+
+#define XpmColorError 1
+#define XpmSuccess 0
+#define XpmOpenFailed -1
+#define XpmFileInvalid -2
+#define XpmNoMemory -3
+#define XpmColorFailed -4
+
+typedef struct {
+ char *name; /* Symbolic color name */
+ char *value; /* Color value */
+ Pixel pixel; /* Color pixel */
+} XpmColorSymbol;
+
+typedef struct {
+ char *name; /* name of the extension */
+ unsigned int nlines; /* number of lines in this extension */
+ char **lines; /* pointer to the extension array of strings */
+} XpmExtension;
+
+typedef struct {
+ char *string; /* characters string */
+ char *symbolic; /* symbolic name */
+ char *m_color; /* monochrom default */
+ char *g4_color; /* 4 level grayscale default */
+ char *g_color; /* other level grayscale default */
+ char *c_color; /* color default */
+} XpmColor;
+
+typedef struct {
+ unsigned int width; /* image width */
+ unsigned int height; /* image height */
+ unsigned int cpp; /* number of characters per pixel */
+ unsigned int ncolors; /* number of colors */
+ XpmColor *colorTable; /* list of related colors */
+ unsigned int *data; /* image data */
+} XpmImage;
+
+typedef struct {
+ unsigned long valuemask; /* Specifies which attributes are defined */
+ char *hints_cmt; /* Comment of the hints section */
+ char *colors_cmt; /* Comment of the colors section */
+ char *pixels_cmt; /* Comment of the pixels section */
+ unsigned int x_hotspot; /* Returns the x hotspot's coordinate */
+ unsigned int y_hotspot; /* Returns the y hotspot's coordinate */
+ unsigned int nextensions; /* number of extensions */
+ XpmExtension *extensions; /* pointer to array of extensions */
+} XpmInfo;
+
+typedef int (*XpmAllocColorFunc)(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ Colormap /* colormap */,
+ char* /* colorname */,
+ XColor* /* xcolor */,
+ void* /* closure */
+#endif
+);
+
+typedef int (*XpmFreeColorsFunc)(
+#if NeedFunctionPrototypes
+ Display* /* display */,
+ Colormap /* colormap */,
+ Pixel* /* pixels */,
+ int /* npixels */,
+ void* /* closure */
+#endif
+);
+
+typedef struct {
+ unsigned long valuemask; /* Specifies which attributes are
+ defined */
+
+ Visual *visual; /* Specifies the visual to use */
+ Colormap colormap; /* Specifies the colormap to use */
+ unsigned int depth; /* Specifies the depth */
+ unsigned int width; /* Returns the width of the created
+ pixmap */
+ unsigned int height; /* Returns the height of the created
+ pixmap */
+ unsigned int x_hotspot; /* Returns the x hotspot's
+ coordinate */
+ unsigned int y_hotspot; /* Returns the y hotspot's
+ coordinate */
+ unsigned int cpp; /* Specifies the number of char per
+ pixel */
+ Pixel *pixels; /* List of used color pixels */
+ unsigned int npixels; /* Number of used pixels */
+ XpmColorSymbol *colorsymbols; /* List of color symbols to override */
+ unsigned int numsymbols; /* Number of symbols */
+ char *rgb_fname; /* RGB text file name */
+ unsigned int nextensions; /* Number of extensions */
+ XpmExtension *extensions; /* List of extensions */
+
+ unsigned int ncolors; /* Number of colors */
+ XpmColor *colorTable; /* List of colors */
+/* 3.2 backward compatibility code */
+ char *hints_cmt; /* Comment of the hints section */
+ char *colors_cmt; /* Comment of the colors section */
+ char *pixels_cmt; /* Comment of the pixels section */
+/* end 3.2 bc */
+ unsigned int mask_pixel; /* Color table index of transparent
+ color */
+
+ /* Color Allocation Directives */
+ Bool exactColors; /* Only use exact colors for visual */
+ unsigned int closeness; /* Allowable RGB deviation */
+ unsigned int red_closeness; /* Allowable red deviation */
+ unsigned int green_closeness; /* Allowable green deviation */
+ unsigned int blue_closeness; /* Allowable blue deviation */
+ int color_key; /* Use colors from this color set */
+
+ Pixel *alloc_pixels; /* Returns the list of alloc'ed color
+ pixels */
+ int nalloc_pixels; /* Returns the number of alloc'ed
+ color pixels */
+
+ Bool alloc_close_colors; /* Specify whether close colors should
+ be allocated using XAllocColor
+ or not */
+ int bitmap_format; /* Specify the format of 1bit depth
+ images: ZPixmap or XYBitmap */
+
+ /* Color functions */
+ XpmAllocColorFunc alloc_color; /* Application color allocator */
+ XpmFreeColorsFunc free_colors; /* Application color de-allocator */
+ void *color_closure; /* Application private data to pass to
+ alloc_color and free_colors */
+
+} XpmAttributes;
+
+/* XpmAttributes value masks bits */
+#define XpmVisual (1L<<0)
+#define XpmColormap (1L<<1)
+#define XpmDepth (1L<<2)
+#define XpmSize (1L<<3) /* width & height */
+#define XpmHotspot (1L<<4) /* x_hotspot & y_hotspot */
+#define XpmCharsPerPixel (1L<<5)
+#define XpmColorSymbols (1L<<6)
+#define XpmRgbFilename (1L<<7)
+/* 3.2 backward compatibility code */
+#define XpmInfos (1L<<8)
+#define XpmReturnInfos XpmInfos
+/* end 3.2 bc */
+#define XpmReturnPixels (1L<<9)
+#define XpmExtensions (1L<<10)
+#define XpmReturnExtensions XpmExtensions
+
+#define XpmExactColors (1L<<11)
+#define XpmCloseness (1L<<12)
+#define XpmRGBCloseness (1L<<13)
+#define XpmColorKey (1L<<14)
+
+#define XpmColorTable (1L<<15)
+#define XpmReturnColorTable XpmColorTable
+
+#define XpmReturnAllocPixels (1L<<16)
+#define XpmAllocCloseColors (1L<<17)
+#define XpmBitmapFormat (1L<<18)
+
+#define XpmAllocColor (1L<<19)
+#define XpmFreeColors (1L<<20)
+#define XpmColorClosure (1L<<21)
+
+
+/* XpmInfo value masks bits */
+#define XpmComments XpmInfos
+#define XpmReturnComments XpmComments
+
+/* XpmAttributes mask_pixel value when there is no mask */
+#ifndef FOR_MSW
+#define XpmUndefPixel 0x80000000
+#else
+/* int is only 16 bit for MSW */
+#define XpmUndefPixel 0x8000
+#endif
+
+/*
+ * color keys for visual type, they must fit along with the number key of
+ * each related element in xpmColorKeys[] defined in XpmI.h
+ */
+#define XPM_MONO 2
+#define XPM_GREY4 3
+#define XPM_GRAY4 3
+#define XPM_GREY 4
+#define XPM_GRAY 4
+#define XPM_COLOR 5
+
+
+/* macros for forward declarations of functions with prototypes */
+#if NeedFunctionPrototypes
+#define FUNC(f, t, p) extern t f p
+#define LFUNC(f, t, p) static t f p
+#else
+#define FUNC(f, t, p) extern t f()
+#define LFUNC(f, t, p) static t f()
+#endif
+
+
+/*
+ * functions declarations
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* FOR_MSW, all ..Pixmap.. are excluded, only the ..XImage.. are used */
+/* Same for Amiga! */
+
+#if !defined(FOR_MSW) && !defined(AMIGA)
+ FUNC(XpmCreatePixmapFromData, int, (Display *display,
+ Drawable d,
+ char **data,
+ Pixmap *pixmap_return,
+ Pixmap *shapemask_return,
+ XpmAttributes *attributes));
+
+ FUNC(XpmCreateDataFromPixmap, int, (Display *display,
+ char ***data_return,
+ Pixmap pixmap,
+ Pixmap shapemask,
+ XpmAttributes *attributes));
+
+ FUNC(XpmReadFileToPixmap, int, (Display *display,
+ Drawable d,
+ char *filename,
+ Pixmap *pixmap_return,
+ Pixmap *shapemask_return,
+ XpmAttributes *attributes));
+
+ FUNC(XpmWriteFileFromPixmap, int, (Display *display,
+ char *filename,
+ Pixmap pixmap,
+ Pixmap shapemask,
+ XpmAttributes *attributes));
+#endif
+
+ FUNC(XpmCreateImageFromData, int, (Display *display,
+ char **data,
+ XImage **image_return,
+ XImage **shapemask_return,
+ XpmAttributes *attributes));
+
+ FUNC(XpmCreateDataFromImage, int, (Display *display,
+ char ***data_return,
+ XImage *image,
+ XImage *shapeimage,
+ XpmAttributes *attributes));
+
+ FUNC(XpmReadFileToImage, int, (Display *display,
+ char *filename,
+ XImage **image_return,
+ XImage **shapeimage_return,
+ XpmAttributes *attributes));
+
+ FUNC(XpmWriteFileFromImage, int, (Display *display,
+ char *filename,
+ XImage *image,
+ XImage *shapeimage,
+ XpmAttributes *attributes));
+
+ FUNC(XpmCreateImageFromBuffer, int, (Display *display,
+ char *buffer,
+ XImage **image_return,
+ XImage **shapemask_return,
+ XpmAttributes *attributes));
+#if !defined(FOR_MSW) && !defined(AMIGA)
+ FUNC(XpmCreatePixmapFromBuffer, int, (Display *display,
+ Drawable d,
+ char *buffer,
+ Pixmap *pixmap_return,
+ Pixmap *shapemask_return,
+ XpmAttributes *attributes));
+
+ FUNC(XpmCreateBufferFromImage, int, (Display *display,
+ char **buffer_return,
+ XImage *image,
+ XImage *shapeimage,
+ XpmAttributes *attributes));
+
+ FUNC(XpmCreateBufferFromPixmap, int, (Display *display,
+ char **buffer_return,
+ Pixmap pixmap,
+ Pixmap shapemask,
+ XpmAttributes *attributes));
+#endif
+ FUNC(XpmReadFileToBuffer, int, (char *filename, char **buffer_return));
+ FUNC(XpmWriteFileFromBuffer, int, (char *filename, char *buffer));
+
+ FUNC(XpmReadFileToData, int, (char *filename, char ***data_return));
+ FUNC(XpmWriteFileFromData, int, (char *filename, char **data));
+
+ FUNC(XpmAttributesSize, int, ());
+ FUNC(XpmFreeAttributes, void, (XpmAttributes *attributes));
+ FUNC(XpmFreeExtensions, void, (XpmExtension *extensions,
+ int nextensions));
+
+ FUNC(XpmFreeXpmImage, void, (XpmImage *image));
+ FUNC(XpmFreeXpmInfo, void, (XpmInfo *info));
+ FUNC(XpmGetErrorString, char *, (int errcode));
+ FUNC(XpmLibraryVersion, int, ());
+
+ /* XpmImage functions */
+ FUNC(XpmReadFileToXpmImage, int, (char *filename,
+ XpmImage *image,
+ XpmInfo *info));
+
+ FUNC(XpmWriteFileFromXpmImage, int, (char *filename,
+ XpmImage *image,
+ XpmInfo *info));
+#if !defined(FOR_MSW) && !defined(AMIGA)
+ FUNC(XpmCreatePixmapFromXpmImage, int, (Display *display,
+ Drawable d,
+ XpmImage *image,
+ Pixmap *pixmap_return,
+ Pixmap *shapemask_return,
+ XpmAttributes *attributes));
+#endif
+ FUNC(XpmCreateImageFromXpmImage, int, (Display *display,
+ XpmImage *image,
+ XImage **image_return,
+ XImage **shapeimage_return,
+ XpmAttributes *attributes));
+
+ FUNC(XpmCreateXpmImageFromImage, int, (Display *display,
+ XImage *image,
+ XImage *shapeimage,
+ XpmImage *xpmimage,
+ XpmAttributes *attributes));
+#if !defined(FOR_MSW) && !defined(AMIGA)
+ FUNC(XpmCreateXpmImageFromPixmap, int, (Display *display,
+ Pixmap pixmap,
+ Pixmap shapemask,
+ XpmImage *xpmimage,
+ XpmAttributes *attributes));
+#endif
+ FUNC(XpmCreateDataFromXpmImage, int, (char ***data_return,
+ XpmImage *image,
+ XpmInfo *info));
+
+ FUNC(XpmCreateXpmImageFromData, int, (char **data,
+ XpmImage *image,
+ XpmInfo *info));
+
+ FUNC(XpmCreateXpmImageFromBuffer, int, (char *buffer,
+ XpmImage *image,
+ XpmInfo *info));
+
+ FUNC(XpmCreateBufferFromXpmImage, int, (char **buffer_return,
+ XpmImage *image,
+ XpmInfo *info));
+
+ FUNC(XpmGetParseError, int, (char *filename,
+ int *linenum_return,
+ int *charnum_return));
+
+ FUNC(XpmFree, void, (void *ptr));
+
+#ifdef __cplusplus
+} /* for C++ V2.0 */
+#endif
+
+
+/* backward compatibility */
+
+/* for version 3.0c */
+#define XpmPixmapColorError XpmColorError
+#define XpmPixmapSuccess XpmSuccess
+#define XpmPixmapOpenFailed XpmOpenFailed
+#define XpmPixmapFileInvalid XpmFileInvalid
+#define XpmPixmapNoMemory XpmNoMemory
+#define XpmPixmapColorFailed XpmColorFailed
+
+#define XpmReadPixmapFile(dpy, d, file, pix, mask, att) \
+ XpmReadFileToPixmap(dpy, d, file, pix, mask, att)
+#define XpmWritePixmapFile(dpy, file, pix, mask, att) \
+ XpmWriteFileFromPixmap(dpy, file, pix, mask, att)
+
+/* for version 3.0b */
+#define PixmapColorError XpmColorError
+#define PixmapSuccess XpmSuccess
+#define PixmapOpenFailed XpmOpenFailed
+#define PixmapFileInvalid XpmFileInvalid
+#define PixmapNoMemory XpmNoMemory
+#define PixmapColorFailed XpmColorFailed
+
+#define ColorSymbol XpmColorSymbol
+
+#define XReadPixmapFile(dpy, d, file, pix, mask, att) \
+ XpmReadFileToPixmap(dpy, d, file, pix, mask, att)
+#define XWritePixmapFile(dpy, file, pix, mask, att) \
+ XpmWriteFileFromPixmap(dpy, file, pix, mask, att)
+#define XCreatePixmapFromData(dpy, d, data, pix, mask, att) \
+ XpmCreatePixmapFromData(dpy, d, data, pix, mask, att)
+#define XCreateDataFromPixmap(dpy, data, pix, mask, att) \
+ XpmCreateDataFromPixmap(dpy, data, pix, mask, att)
+
+#endif /* XPM_NUMBERS */
+#endif
diff --git a/xc/extras/Xpm/namecvt b/xc/extras/Xpm/namecvt
new file mode 100755
index 000000000..0bb610406
--- /dev/null
+++ b/xc/extras/Xpm/namecvt
@@ -0,0 +1,60 @@
+#!/bin/sh
+#
+# create two scripts to convert the filenames of the XPM distribution
+# run this in the xpm toplevel directory
+# after that you have the following two scripts
+# cvtux2dos will copy the files into fordos/
+# cvtdos2ux will copy from fromdos/ to new/
+#
+# Written by HeDu 5/94 (hedu@cul-ipn.uni-kiel.de)
+#
+
+echo "Making cvtux2dos and cvtdos2ux..."
+
+cp /dev/null cvtux2dos
+echo "#!/bin/sh" > cvtux2dos
+echo "echo Making dos hierarchy..." >> cvtux2dos
+echo "mkdir fordos" >> cvtux2dos
+echo "mkdir fordos/lib" >> cvtux2dos
+echo "mkdir fordos/doc" >> cvtux2dos
+
+cp /dev/null cvtdos2ux
+echo "#!/bin/sh" > cvtdos2ux
+echo "echo Making unix hierarchy..." >> cvtdos2ux
+echo "mkdir new" >> cvtdos2ux
+echo "mkdir new/lib" >> cvtdos2ux
+echo "mkdir new/doc" >> cvtdos2ux
+
+for i in CHANGES FAQ FILES README README.MSW \
+ lib/CrBufFrI.c lib/CrBufFrP.c lib/CrDatFrI.c \
+ lib/CrDatFrP.c lib/CrIFrBuf.c lib/CrIFrDat.c \
+ lib/CrPFrBuf.c lib/CrPFrDat.c lib/RdFToDat.c \
+ lib/RdFToI.c lib/RdFToP.c lib/WrFFrDat.c \
+ lib/WrFFrI.c lib/WrFFrP.c \
+ lib/create.c lib/data.c lib/misc.c lib/parse.c \
+ lib/rgb.c lib/rgbtab.h lib/scan.c lib/hashtab.c \
+ lib/simx.h lib/simx.c lib/xpm.h lib/XpmI.h \
+ lib/Attrib.c lib/Image.c lib/Info.c \
+ lib/CrIFrP.c lib/CrPFrI.c lib/RdFToBuf.c lib/WrFFrBuf.c \
+ namecvt
+do
+ # fold to lower case
+ # so they are fine for DOS, sigh
+ new=`echo $i | tr '[A-Z]' '[a-z]'`
+ echo "cp $i fordos/$new" >> cvtux2dos
+ echo "cp fromdos/$new new/$i" >> cvtdos2ux
+done
+
+# special ones
+echo "cp COPYRIGHT fordos/copyrigh.t" >> cvtux2dos
+echo "cp fromdos/copyrigh.t new/COPYRIGHT" >> cvtdos2ux
+echo "cp doc/xpm.PS.gz fordos/doc/xpm_ps.gz" >> cvtux2dos
+echo "cp fromdos/doc/xpm_ps.gz new/doc/xpm.PS.gz" >> cvtdos2ux
+#
+echo "echo done." >> cvtux2dos
+echo "echo done." >> cvtdos2ux
+
+chmod +x cvtux2dos
+chmod +x cvtdos2ux
+
+echo "done."
diff --git a/xc/extras/Xpm/sxpm/Imakefile b/xc/extras/Xpm/sxpm/Imakefile
new file mode 100644
index 000000000..5474c777a
--- /dev/null
+++ b/xc/extras/Xpm/sxpm/Imakefile
@@ -0,0 +1,98 @@
+XCOMM
+XCOMM
+XCOMM Copyright (C) 1989-95 GROUPE BULL
+XCOMM
+XCOMM Permission is hereby granted, free of charge, to any person obtaining a
+XCOMM copy of this software and associated documentation files
+XCOMM (the "Software"), to deal in the Software without restriction, including
+XCOMM without limitation the rights to use, copy, modify, merge, publish,
+XCOMM distribute, sublicense, and/or sell copies of the Software, and to permit
+XCOMM persons to whom the Software is furnished to do so, subject to the
+XCOMM following conditions:
+XCOMM The above copyright notice and this permission notice shall be included
+XCOMM in all copies or substantial portions of the Software.
+XCOMM
+XCOMM THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+XCOMM OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+XCOMM MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+XCOMM IN NO EVENT SHALL GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+XCOMM LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+XCOMM FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+XCOMM DEALINGS IN THE SOFTWARE.
+XCOMM
+XCOMM Except as contained in this notice, the name of GROUPE BULL shall not be
+XCOMM used in advertising or otherwise to promote the sale, use or other
+XCOMM dealings in this Software without prior written authorization from
+XCOMM GROUPE BULL.
+XCOMM
+
+XCOMM
+XCOMM XPM Imakefile - Arnaud LE HORS
+XCOMM
+
+XCOMM default locations
+#ifndef XpmLibDir
+#define XpmLibDir $(USRLIBDIR)
+#endif
+#ifndef XpmBinDir
+#define XpmBinDir $(BINDIR)
+#endif
+#ifndef XpmManDir
+#define XpmManDir $(MANDIR)
+#endif
+#ifndef XpmIncDir
+#define XpmIncDir $(BUILDINCTOP)
+#endif
+
+ XPMLIBDIR = XpmLibDir
+ XPMBINDIR = XpmBinDir
+ XPMMANDIR = XpmManDir
+ XPMINCDIR = XpmIncDir
+
+ XPMLIB = -lXpm
+ INCLUDES = -I$(BUILDINCDIR) -I$(XPMINCDIR)
+ DEPLIBS = $(DEPXTOOLLIB) $(DEPXLIB)
+
+#ifdef Win32Architecture
+LOCAL_LIBRARIES = ../lib/Xpm.lib $(XTOOLLIB) $(XLIB)
+#else
+LOCAL_LIBRARIES = -L../lib -L$(XPMLIBDIR) $(XPMLIB) $(XTOOLLIB) $(XLIB)
+#endif
+
+XCOMM try hard to set things so we'll find the shared lib once installed
+LD_RUN_PATH = $(USRLIBDIR):$(XPMLIBDIR)
+USRLIBDIRPATH = $(USRLIBDIR):$(XPMLIBDIR)
+
+#if ProjectX < 603
+# ifdef HPArchitecture
+EXTRA_LOAD_FLAGS = -Wl,+s,+b,$(USRLIBDIRPATH)
+# endif
+# if defined(SunArchitecture) && defined(SVR4Architecture)
+EXTRA_LOAD_FLAGS = -R$(USRLIBDIRPATH)
+# endif
+# if defined(AlphaArchitecture) || defined (SGIArchitecture)
+EXTRA_LOAD_FLAGS = -Wl,-rpath,$(USRLIBDIRPATH)
+# endif
+#endif
+
+#ifdef OsNameDefines
+OS_NAME_DEFINES = OsNameDefines
+#endif
+
+ SRCS = sxpm.c
+ OBJS = sxpm.o
+
+#if (ProjectX < 6)
+AllTarget(sxpm)
+#else
+AllTarget(ProgramTargetName(sxpm))
+#endif
+NormalProgramTarget(sxpm,$(OBJS),$(DEPLIB),$(LOCAL_LIBRARIES),)
+InstallProgram(sxpm,$(XPMBINDIR))
+InstallManPage(sxpm,$(XPMMANDIR))
+DependTarget()
+LintTarget()
+
+clean::
+ $(RM) sxpmout.xpm
+
diff --git a/xc/extras/Xpm/sxpm/Makefile.noX b/xc/extras/Xpm/sxpm/Makefile.noX
new file mode 100644
index 000000000..74847e666
--- /dev/null
+++ b/xc/extras/Xpm/sxpm/Makefile.noX
@@ -0,0 +1,69 @@
+#
+# Copyright (C) 1989-95 GROUPE BULL
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of GROUPE BULL shall not be
+# used in advertising or otherwise to promote the sale, use or other dealings
+# in this Software without prior written authorization from GROUPE BULL.
+#
+
+#
+# XPM Makefile - Arnaud LE HORS
+#
+
+# where the program will be installed
+DESTBINDIR=/usr/local/bin/X11
+# where the man page will be installed
+MANDIR=/usr/local/man/manl
+
+# where the X11 libs are
+XLIBDIRS= -L/usr/X11/lib
+
+LIBDIRS= -L../lib
+LIBS= -lXpm -lXext -lXt -lX11
+
+CC = cc
+RM = rm -f
+# on sysV, define this as cp.
+INSTALL = install -c
+
+CDEBUGFLAGS= -O
+
+INCLUDES= -I..
+
+OBJS= sxpm.o
+
+CFLAGS= $(CDEBUGFLAGS) $(INCLUDES) $(DEFINES)
+
+all: sxpm
+
+clean:
+ $(RM) *.o sxpm
+
+sxpm: sxpm.o
+ $(CC) $(CFLAGS) sxpm.o $(LIBDIRS) $(XLIBDIRS) $(LIBS) -o sxpm
+
+install:
+ $(INSTALL) -m 0755 sxpm $(DESTBINDIR)
+
+install.man:
+ $(INSTALL) -m 0644 sxpm.man $(MANDIR)/sxpm.l
+
+# Other dependencies.
+sxpm.o: ../lib/xpm.h
diff --git a/xc/extras/Xpm/sxpm/plaid.xpm b/xc/extras/Xpm/sxpm/plaid.xpm
new file mode 100644
index 000000000..b0e9200fe
--- /dev/null
+++ b/xc/extras/Xpm/sxpm/plaid.xpm
@@ -0,0 +1,34 @@
+/* XPM */
+static char * plaid[] = {
+/* plaid pixmap
+ * width height ncolors chars_per_pixel */
+"22 22 4 2 ",
+/* colors */
+" c red m white s light_color ",
+"Y c green m black s lines_in_mix ",
+"+ c yellow m white s lines_in_dark ",
+"x m black s dark_color ",
+/* pixels */
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x ",
+"x x x x x x x x x x x x x x x x x x x x x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x "
+} ;
diff --git a/xc/extras/Xpm/sxpm/plaid_ext.xpm b/xc/extras/Xpm/sxpm/plaid_ext.xpm
new file mode 100644
index 000000000..8538952ea
--- /dev/null
+++ b/xc/extras/Xpm/sxpm/plaid_ext.xpm
@@ -0,0 +1,43 @@
+/* XPM */
+static char * plaid[] = {
+/* plaid pixmap
+ * width height ncolors chars_per_pixel */
+"22 22 4 2 XPMEXT",
+/* colors */
+" c red m white s light_color ",
+"Y c green m black s lines_in_mix ",
+"+ c yellow m white s lines_in_dark ",
+"x m black s dark_color ",
+/* pixels */
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+"Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x x x x x x x x x x x x x ",
+"x x x x x x x x x x x x + x x x x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x ",
+"x x x x x x x x x x x x x x x x x x x x x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x ",
+" x x x Y x x ",
+" x x x x Y x x x ",
+"XPMEXT ext1 data1",
+"XPMEXT ext2",
+"data2_1",
+"data2_2",
+"XPMEXT ext3",
+"data3",
+"XPMEXT",
+"data4",
+"XPMENDEXT"
+} ;
diff --git a/xc/extras/Xpm/sxpm/plaid_mask.xpm b/xc/extras/Xpm/sxpm/plaid_mask.xpm
new file mode 100644
index 000000000..167d33857
--- /dev/null
+++ b/xc/extras/Xpm/sxpm/plaid_mask.xpm
@@ -0,0 +1,35 @@
+/* XPM */
+static char * plaid[] = {
+/* plaid pixmap
+ * width height ncolors chars_per_pixel */
+"22 22 5 2",
+/* colors */
+". c red m white s light_color ",
+"Y c green m black s lines_in_mix ",
+"+ c yellow m white s lines_in_dark ",
+"x m black s dark_color ",
+" c none s mask ",
+/* pixels */
+" x x x x x + x x x x x ",
+" . x x x x x x x x x x x ",
+" . x x x x x x + x x x x x ",
+" . x . x x x x x x x x x x x ",
+" . x . x x x x x x + x x x x x ",
+" Y Y Y Y Y + x + x + x + x + x + ",
+" x x . x . x x x x x x + x x x x x ",
+" . x . x . x . x x x x x x x x x x x ",
+" . x x x . x . x x x x x x + x x x x x ",
+" . x . x . x . x . x x x x x x x x x x x ",
+" . x . x x x . x . x x x x x x + x x x x x ",
+". . . . . x . . . . . x . x . x Y x . x . x ",
+". . . . . x . . . . . . x . x . Y . x . x . ",
+". . . . . x . . . . . x . x . x Y x . x . x ",
+". . . . . x . . . . . . x . x . Y . x . x . ",
+". . . . . x . . . . . x . x . x Y x . x . x ",
+"x x x x x x x x x x x x x x x x x x x x x x ",
+". . . . . x . . . . . x . x . x Y x . x . x ",
+". . . . . x . . . . . . x . x . Y . x . x . ",
+". . . . . x . . . . . x . x . x Y x . x . x ",
+". . . . . x . . . . . . x . x . Y . x . x . ",
+". . . . . x . . . . . x . x . x Y x . x . x "
+} ;
diff --git a/xc/extras/Xpm/sxpm/sxpm.c b/xc/extras/Xpm/sxpm/sxpm.c
new file mode 100644
index 000000000..693e9e160
--- /dev/null
+++ b/xc/extras/Xpm/sxpm/sxpm.c
@@ -0,0 +1,705 @@
+/*
+ * Copyright (C) 1989-95 GROUPE BULL
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of GROUPE BULL shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from GROUPE BULL.
+ */
+
+/*****************************************************************************\
+* sxpm.c: *
+* *
+* Show XPM File program *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <X11/StringDefs.h>
+#include <X11/Intrinsic.h>
+#include <X11/IntrinsicP.h>
+#include <X11/Shell.h>
+
+#ifdef VMS
+#include <X11/shape.h>
+#else
+#include <X11/extensions/shape.h>
+#endif
+
+#include <X11/xpm.h>
+
+/* XPM */
+/* plaid pixmap */
+static char *plaid[] = {
+ /* width height ncolors chars_per_pixel */
+ "22 22 4 2 XPMEXT",
+ /* colors */
+ " c red m white s light_color",
+ "Y c green m black s lines_in_mix",
+ "+ c yellow m white s lines_in_dark",
+ "x m black s dark_color",
+ /* pixels */
+ "x x x x x x x x x x x x + x x x x x ",
+ " x x x x x x x x x x x x x x x x ",
+ "x x x x x x x x x x x x + x x x x x ",
+ " x x x x x x x x x x x x x x x x ",
+ "x x x x x x x x x x x x + x x x x x ",
+ "Y Y Y Y Y x Y Y Y Y Y + x + x + x + x + x + ",
+ "x x x x x x x x x x x x + x x x x x ",
+ " x x x x x x x x x x x x x x x x ",
+ "x x x x x x x x x x x x + x x x x x ",
+ " x x x x x x x x x x x x x x x x ",
+ "x x x x x x x x x x x x + x x x x x ",
+ " x x x x Y x x x ",
+ " x x x Y x x ",
+ " x x x x Y x x x ",
+ " x x x Y x x ",
+ " x x x x Y x x x ",
+ "x x x x x x x x x x x x x x x x x x x x x x ",
+ " x x x x Y x x x ",
+ " x x x Y x x ",
+ " x x x x Y x x x ",
+ " x x x Y x x ",
+ " x x x x Y x x x ",
+ "bullshit",
+ "XPMEXT ext1 data1",
+ "XPMEXT ext2",
+ "data2_1",
+ "data2_2",
+ "XPMEXT",
+ "foo",
+ "",
+ "XPMEXT ext3",
+ "data3",
+ "XPMENDEXT"
+};
+
+#define win XtWindow(topw)
+#define dpy XtDisplay(topw)
+#define root XRootWindowOfScreen(XtScreen(topw))
+#define xrdb XtDatabase(dpy)
+static Colormap colormap;
+
+void Usage();
+void ErrorMessage();
+void Punt();
+void VersionInfo();
+
+#ifdef __STDC__
+void kinput(Widget widget, char *tag, XEvent *xe, Boolean *b);
+#else
+void kinput();
+#endif
+
+#define IWIDTH 50
+#define IHEIGHT 50
+
+typedef struct _XpmIcon {
+ Pixmap pixmap;
+ Pixmap mask;
+ XpmAttributes attributes;
+} XpmIcon;
+
+static char **command;
+static Widget topw;
+static XpmIcon view, icon;
+static XrmOptionDescRec options[] = {
+ {"-hints", ".hints", XrmoptionNoArg, (XtPointer) "True"},
+ {"-icon", ".icon", XrmoptionSepArg, (XtPointer) NULL},
+};
+
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ int ErrorStatus;
+ unsigned int verbose = 0; /* performs verbose output */
+ unsigned int stdinf = 1; /* read from stdin */
+ unsigned int stdoutf = 0; /* write to stdout */
+ unsigned int nod = 0; /* no display */
+ unsigned int nom = 0; /* no mask display */
+ unsigned int incResize = 0;
+ unsigned int resize = 0;
+ unsigned int w_rtn;
+ unsigned int h_rtn;
+ char *input = NULL;
+ char *output = NULL;
+ char *iconFile = NULL;
+ unsigned int numsymbols = 0;
+ XpmColorSymbol symbols[10];
+ char *stype;
+ XrmValue val;
+ unsigned long valuemask = 0;
+ int n;
+ Arg args[4];
+
+#ifdef Debug
+ char **data;
+ char *buffer;
+#endif
+
+ topw = XtInitialize(argv[0], "Sxpm",
+ options, XtNumber(options), &argc, argv);
+
+ if (!topw) {
+ fprintf(stderr, "Sxpm Error... [ Undefined DISPLAY ]\n");
+ exit(1);
+ }
+ colormap = XDefaultColormapOfScreen(XtScreen(topw));
+
+ /*
+ * geometry management
+ */
+
+ if (XrmGetResource(xrdb, NULL, "sxpm.geometry", &stype, &val)
+ || XrmGetResource(xrdb, NULL, "Sxpm.geometry", &stype, &val)) {
+
+ int flags;
+ int x_rtn;
+ int y_rtn;
+ char *geo = NULL;
+
+ geo = (char *) val.addr;
+ flags = XParseGeometry(geo, &x_rtn, &y_rtn,
+ (unsigned int *) &w_rtn,
+ (unsigned int *) &h_rtn);
+
+ if (!((WidthValue & flags) && (HeightValue & flags)))
+ resize = 1;
+
+ } else
+ resize = 1;
+
+ n = 0;
+ if (resize) {
+ w_rtn = 0;
+ h_rtn = 0;
+ XtSetArg(args[n], XtNwidth, 1);
+ n++;
+ XtSetArg(args[n], XtNheight, 1);
+ n++;
+ }
+ XtSetArg(args[n], XtNmappedWhenManaged, False);
+ n++;
+ XtSetArg(args[n], XtNinput, True);
+ n++;
+ XtSetValues(topw, args, n);
+
+ if ((XrmGetResource(xrdb, "sxpm.hints", "", &stype, &val)
+ || XrmGetResource(xrdb, "Sxpm.hints", "", &stype, &val))
+ && !strcmp((char *) val.addr, "True")) {
+ /* gotcha */
+ incResize = 1;
+ resize = 1;
+ }
+
+ /*
+ * icon management
+ */
+
+ if (XrmGetResource(xrdb, "sxpm.icon", "", &stype, &val)
+ || XrmGetResource(xrdb, "Sxpm.icon", "", &stype, &val)) {
+ iconFile = (char *) val.addr;
+ }
+ if (iconFile) {
+
+ XColor color, junk;
+ Pixel bpix;
+ Window iconW;
+
+ if (XAllocNamedColor(dpy, colormap, "black", &color, &junk))
+ bpix = color.pixel;
+ else
+ bpix = XBlackPixelOfScreen(XtScreen(topw));
+
+ iconW = XCreateSimpleWindow(dpy, root, 0, 0,
+ IWIDTH, IHEIGHT, 1, bpix, bpix);
+
+ icon.attributes.valuemask = XpmReturnAllocPixels;
+ ErrorStatus = XpmReadFileToPixmap(dpy, root, iconFile, &icon.pixmap,
+ &icon.mask, &icon.attributes);
+ ErrorMessage(ErrorStatus, "Icon");
+
+ XSetWindowBackgroundPixmap(dpy, iconW, icon.pixmap);
+
+ n = 0;
+ XtSetArg(args[n], XtNbackground, bpix);
+ n++;
+ XtSetArg(args[n], XtNiconWindow, iconW);
+ n++;
+ XtSetValues(topw, args, n);
+ }
+
+ /*
+ * arguments parsing
+ */
+
+ command = argv;
+ for (n = 1; n < argc; n++) {
+ if (strcmp(argv[n], "-plaid") == 0) {
+ stdinf = 0;
+ continue;
+ }
+ if (argv[n][0] != '-') {
+ stdinf = 0;
+ input = argv[n];
+ continue;
+ }
+ if ((strlen(argv[n]) == 1) && (argv[n][0] == '-'))
+ /* stdin */
+ continue;
+ if (strcmp(argv[n], "-o") == 0) {
+ if (n < argc - 1) {
+ if ((strlen(argv[n + 1]) == 1) && (argv[n + 1][0] == '-'))
+ stdoutf = 1;
+ else
+ output = argv[n + 1];
+ n++;
+ continue;
+ } else
+ Usage();
+ }
+ if (strcmp(argv[n], "-nod") == 0) {
+ nod = 1;
+ continue;
+ }
+ if (strcmp(argv[n], "-nom") == 0) {
+ nom = 1;
+ continue;
+ }
+ if (strcmp(argv[n], "-sc") == 0) {
+ if (n < argc - 2) {
+ valuemask |= XpmColorSymbols;
+ symbols[numsymbols].name = argv[++n];
+ symbols[numsymbols++].value = argv[++n];
+ continue;
+ } else
+ Usage();
+ }
+ if (strcmp(argv[n], "-sp") == 0) {
+ if (n < argc - 2) {
+ valuemask |= XpmColorSymbols;
+ symbols[numsymbols].name = argv[++n];
+ symbols[numsymbols].value = NULL;
+ symbols[numsymbols++].pixel = atol(argv[++n]);
+ continue;
+ }
+ }
+ if (strcmp(argv[n], "-cp") == 0) {
+ if (n < argc - 2) {
+ valuemask |= XpmColorSymbols;
+ symbols[numsymbols].name = NULL;
+ symbols[numsymbols].value = argv[++n];
+ symbols[numsymbols++].pixel = atol(argv[++n]);
+ continue;
+ }
+ }
+ if (strcmp(argv[n], "-mono") == 0) {
+ valuemask |= XpmColorKey;
+ view.attributes.color_key = XPM_MONO;
+ continue;
+ }
+ if (strcmp(argv[n], "-gray4") == 0 || strcmp(argv[n], "-grey4") == 0) {
+ valuemask |= XpmColorKey;
+ view.attributes.color_key = XPM_GRAY4;
+ continue;
+ }
+ if (strcmp(argv[n], "-gray") == 0 || strcmp(argv[n], "-grey") == 0) {
+ valuemask |= XpmColorKey;
+ view.attributes.color_key = XPM_GRAY;
+ continue;
+ }
+ if (strcmp(argv[n], "-color") == 0) {
+ valuemask |= XpmColorKey;
+ view.attributes.color_key = XPM_COLOR;
+ continue;
+ }
+ if (strncmp(argv[n], "-closecolors", 6) == 0) {
+ valuemask |= XpmCloseness;
+ view.attributes.closeness = 40000;
+ continue;
+ }
+ if (strcmp(argv[n], "-rgb") == 0) {
+ if (n < argc - 1) {
+ valuemask |= XpmRgbFilename;
+ view.attributes.rgb_fname = argv[++n];
+ continue;
+ } else
+ Usage();
+
+ }
+ if (strncmp(argv[n], "-version", 4) == 0) {
+ VersionInfo();
+ exit(0);
+ }
+ if (strcmp(argv[n], "-v") == 0) {
+ verbose = 1;
+ continue;
+ }
+ if (strcmp(argv[n], "-pcmap") == 0) {
+ valuemask |= XpmColormap;
+ continue;
+ }
+ Usage();
+ }
+
+ XtRealizeWidget(topw);
+ if (valuemask & XpmColormap) {
+ colormap = XCreateColormap(dpy, win,
+ DefaultVisual(dpy, DefaultScreen(dpy)),
+ AllocNone);
+ view.attributes.colormap = colormap;
+ XSetWindowColormap(dpy, win, colormap);
+ }
+ view.attributes.colorsymbols = symbols;
+ view.attributes.numsymbols = numsymbols;
+ view.attributes.valuemask = valuemask;
+
+#ifdef Debug
+ /* this is just to test the XpmCreateDataFromPixmap function */
+
+ view.attributes.valuemask |= XpmReturnAllocPixels;
+ view.attributes.valuemask |= XpmReturnExtensions;
+ ErrorStatus = XpmCreatePixmapFromData(dpy, win, plaid,
+ &view.pixmap, &view.mask,
+ &view.attributes);
+ ErrorMessage(ErrorStatus, "Plaid");
+
+ ErrorStatus = XpmCreateDataFromPixmap(dpy, &data, view.pixmap, view.mask,
+ &view.attributes);
+ ErrorMessage(ErrorStatus, "Data");
+ if (verbose && view.attributes.nextensions) {
+ unsigned int i, j;
+
+ for (i = 0; i < view.attributes.nextensions; i++) {
+ fprintf(stderr, "Xpm extension : %s\n",
+ view.attributes.extensions[i].name);
+ for (j = 0; j < view.attributes.extensions[i].nlines; j++)
+ fprintf(stderr, "\t\t%s\n",
+ view.attributes.extensions[i].lines[j]);
+ }
+ }
+ XFreePixmap(dpy, view.pixmap);
+ if (view.mask)
+ XFreePixmap(dpy, view.mask);
+
+ XFreeColors(dpy, colormap,
+ view.attributes.alloc_pixels,
+ view.attributes.nalloc_pixels, 0);
+
+ XpmFreeAttributes(&view.attributes);
+ view.attributes.valuemask = valuemask;
+#endif
+
+ if (input || stdinf) {
+ view.attributes.valuemask |= XpmReturnInfos;
+ view.attributes.valuemask |= XpmReturnAllocPixels;
+ view.attributes.valuemask |= XpmReturnExtensions;
+
+#ifdef Debug
+ XpmFree(data);
+
+ /*
+ * this is just to test the XpmCreatePixmapFromBuffer and
+ * XpmCreateBufferFromPixmap functions
+ */
+ ErrorStatus = XpmReadFileToBuffer(input, &buffer);
+ ErrorMessage(ErrorStatus, "CreateBufferFromFile");
+
+ ErrorStatus = XpmCreatePixmapFromBuffer(dpy, win, buffer,
+ &view.pixmap, &view.mask,
+ &view.attributes);
+ ErrorMessage(ErrorStatus, "CreatePixmapFromBuffer");
+ XpmFree(buffer);
+ ErrorStatus = XpmCreateBufferFromPixmap(dpy, &buffer,
+ view.pixmap, view.mask,
+ &view.attributes);
+ ErrorMessage(ErrorStatus, "CreateBufferFromPixmap");
+ ErrorStatus = XpmWriteFileFromBuffer("buffer_output", buffer);
+ ErrorMessage(ErrorStatus, "WriteFileFromBuffer");
+ XpmFree(buffer);
+ if (view.pixmap) {
+ XFreePixmap(dpy, view.pixmap);
+ if (view.mask)
+ XFreePixmap(dpy, view.mask);
+
+ XFreeColors(dpy, colormap, view.attributes.alloc_pixels,
+ view.attributes.nalloc_pixels, 0);
+
+ XpmFreeAttributes(&view.attributes);
+ }
+ ErrorStatus = XpmReadFileToData(input, &data);
+ ErrorMessage(ErrorStatus, "ReadFileToData");
+ ErrorStatus = XpmCreatePixmapFromData(dpy, win, data,
+ &view.pixmap, &view.mask,
+ &view.attributes);
+ ErrorMessage(ErrorStatus, "CreatePixmapFromData");
+ ErrorStatus = XpmWriteFileFromData("sxpmout.xpm", data);
+ ErrorMessage(ErrorStatus, "WriteFileFromData");
+ XpmFree(data);
+ XpmFreeAttributes(&view.attributes);
+#endif
+ ErrorStatus = XpmReadFileToPixmap(dpy, win, input,
+ &view.pixmap, &view.mask,
+ &view.attributes);
+ ErrorMessage(ErrorStatus, "Read");
+ if (verbose && view.attributes.nextensions) {
+ unsigned int i, j;
+
+ for (i = 0; i < view.attributes.nextensions; i++) {
+ fprintf(stderr, "Xpm extension : %s\n",
+ view.attributes.extensions[i].name);
+ for (j = 0; j < view.attributes.extensions[i].nlines; j++)
+ fprintf(stderr, "\t\t%s\n",
+ view.attributes.extensions[i].lines[j]);
+ }
+ }
+ } else {
+#ifdef Debug
+ ErrorStatus = XpmCreatePixmapFromData(dpy, win, data,
+ &view.pixmap, &view.mask,
+ &view.attributes);
+ XpmFree(data);
+#else
+ ErrorStatus = XpmCreatePixmapFromData(dpy, win, plaid,
+ &view.pixmap, &view.mask,
+ &view.attributes);
+#endif
+ ErrorMessage(ErrorStatus, "Plaid");
+ }
+ if (output || stdoutf) {
+ ErrorStatus = XpmWriteFileFromPixmap(dpy, output, view.pixmap,
+ view.mask, &view.attributes);
+ ErrorMessage(ErrorStatus, "Write");
+ }
+ if (!nod) {
+
+ /*
+ * manage display if requested
+ */
+
+ XSizeHints size_hints;
+ char *xString = NULL;
+
+ if (w_rtn && h_rtn
+ && ((w_rtn < view.attributes.width)
+ || h_rtn < view.attributes.height)) {
+ resize = 1;
+ }
+ if (resize) {
+ XtResizeWidget(topw,
+ view.attributes.width, view.attributes.height, 1);
+ }
+ if (incResize) {
+ size_hints.flags = USSize | PMinSize | PResizeInc;
+ size_hints.height = view.attributes.height;
+ size_hints.width = view.attributes.width;
+ size_hints.height_inc = view.attributes.height;
+ size_hints.width_inc = view.attributes.width;
+ } else
+ size_hints.flags = PMinSize;
+
+ size_hints.min_height = view.attributes.height;
+ size_hints.min_width = view.attributes.width;
+ XSetWMNormalHints(dpy, win, &size_hints);
+
+ if (input) {
+ xString = (char *) XtMalloc((sizeof(char) * strlen(input)) + 20);
+ sprintf(xString, "Sxpm: %s", input);
+ XStoreName(dpy, win, xString);
+ XSetIconName(dpy, win, xString);
+ } else if (stdinf) {
+ XStoreName(dpy, win, "Sxpm: stdin");
+ XSetIconName(dpy, win, "Sxpm: stdin");
+ } else {
+ XStoreName(dpy, win, "Sxpm");
+ XSetIconName(dpy, win, "Sxpm");
+ }
+
+ XtAddEventHandler(topw, KeyPressMask, False,
+ (XtEventHandler) kinput, NULL);
+ XSetWindowBackgroundPixmap(dpy, win, view.pixmap);
+
+ if (view.mask && !nom)
+ XShapeCombineMask(dpy, win, ShapeBounding, 0, 0,
+ view.mask, ShapeSet);
+
+ XClearWindow(dpy, win);
+ XtMapWidget(topw);
+ if (xString)
+ XtFree(xString);
+ XtMainLoop();
+ }
+ Punt(0);
+}
+
+void
+Usage()
+{
+ fprintf(stderr, "\nUsage: %s [options...]\n", command[0]);
+ fprintf(stderr, "Where options are:\n\
+\n\
+[-d host:display] Display to connect to.\n\
+[-g geom] Geometry of window.\n\
+[-hints] Set ResizeInc for window.\n\
+[-icon filename] Set pixmap for iconWindow.\n\
+[-plaid] Read the included plaid pixmap.\n\
+[filename] Read from file 'filename', and from standard\n\
+ input if 'filename' is '-'.\n\
+[-o filename] Write to file 'filename', and to standard\n\
+ output if 'filename' is '-'.\n\
+[-pcmap] Use a private colormap.\n\
+[-closecolors] Try to use `close' colors.\n\
+[-nod] Don't display in window.\n\
+[-nom] Don't use clip mask if any.\n\
+[-mono] Use the colors specified for a monochrome visual.\n\
+[-grey4] Use the colors specified for a 4 greyscale visual.\n\
+[-grey] Use the colors specified for a greyscale visual.\n\
+[-color] Use the colors specified for a color visual.\n\
+[-sc symbol color] Override color defaults.\n\
+[-sp symbol pixel] Override color defaults.\n\
+[-cp color pixel] Override color defaults.\n\
+[-rgb filename] Search color names in the rgb text file 'filename'.\n\
+[-v] Verbose - print out extensions.\n\
+[-version] Print out program's version number\n\
+ and library's version number if different.\n\
+if no input is specified sxpm reads from standard input.\n\
+\n");
+ exit(0);
+}
+
+
+void
+ErrorMessage(ErrorStatus, tag)
+ int ErrorStatus;
+ char *tag;
+{
+ char *error = NULL;
+ char *warning = NULL;
+
+ switch (ErrorStatus) {
+ case XpmSuccess:
+ return;
+ case XpmColorError:
+ warning = "Could not parse or alloc requested color";
+ break;
+ case XpmOpenFailed:
+ error = "Cannot open file";
+ break;
+ case XpmFileInvalid:
+ error = "Invalid XPM file";
+ break;
+ case XpmNoMemory:
+ error = "Not enough memory";
+ break;
+ case XpmColorFailed:
+ error = "Failed to parse or alloc some color";
+ break;
+ }
+
+ if (warning)
+ fprintf(stderr, "%s Xpm Warning: %s.\n", tag, warning);
+
+ if (error) {
+ fprintf(stderr, "%s Xpm Error: %s.\n", tag, error);
+ Punt(1);
+ }
+}
+
+void
+Punt(i)
+ int i;
+{
+ if (icon.pixmap) {
+ XFreePixmap(dpy, icon.pixmap);
+ if (icon.mask)
+ XFreePixmap(dpy, icon.mask);
+
+ XFreeColors(dpy, colormap,
+ icon.attributes.alloc_pixels,
+ icon.attributes.nalloc_pixels, 0);
+
+ XpmFreeAttributes(&icon.attributes);
+ }
+ if (view.pixmap) {
+ XFreePixmap(dpy, view.pixmap);
+ if (view.mask)
+ XFreePixmap(dpy, view.mask);
+
+ XFreeColors(dpy, colormap,
+ view.attributes.alloc_pixels,
+ view.attributes.nalloc_pixels, 0);
+
+ XpmFreeAttributes(&view.attributes);
+ }
+ exit(i);
+}
+
+void
+kinput(widget, tag, xe, b)
+ Widget widget;
+ char *tag;
+ XEvent *xe;
+ Boolean *b;
+{
+ char c = '\0';
+
+ XLookupString(&(xe->xkey), &c, 1, NULL, NULL);
+ if (c == 'q' || c == 'Q')
+ Punt(0);
+}
+
+/*
+ * small function to extract various version numbers from the given global
+ * number (following the rule described in xpm.h).
+ */
+void
+GetNumbers(num, format_return, libmajor_return, libminor_return)
+ int num;
+ int *format_return;
+ int *libmajor_return;
+ char *libminor_return;
+{
+ *format_return = num / 10000;
+ *libmajor_return = (num % 10000) / 100;
+ *libminor_return = 'a' + (num % 10000) % 100 - 1;
+}
+
+void
+VersionInfo()
+{
+ int num;
+ int format, libmajor;
+ char libminor;
+
+ GetNumbers(XpmIncludeVersion, &format, &libmajor, &libminor);
+ fprintf(stderr, "sxpm version: %d.%d%c\n",
+ format, libmajor, libminor);
+ /*
+ * if we are linked to an XPM library different from the one we've been
+ * compiled with, print its own number too.
+ */
+ if (XpmIncludeVersion != XpmLibraryVersion()) {
+ GetNumbers(XpmLibraryVersion(), &format, &libmajor, &libminor);
+ fprintf(stderr, "using the XPM library version: %d.%d%c\n",
+ format, libmajor, libminor);
+ }
+}
diff --git a/xc/extras/Xpm/sxpm/sxpm.man b/xc/extras/Xpm/sxpm/sxpm.man
new file mode 100644
index 000000000..8e5d593ca
--- /dev/null
+++ b/xc/extras/Xpm/sxpm/sxpm.man
@@ -0,0 +1,131 @@
+.\"Copyright (C) 1989-95 GROUPE BULL
+.\"
+.\"Permission is hereby granted, free of charge, to any person obtaining a copy
+.\"of this software and associated documentation files (the "Software"), to
+.\"deal in the Software without restriction, including without limitation the
+.\"rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+.\"sell copies of the Software, and to permit persons to whom the Software is
+.\"furnished to do so, subject to the following conditions:
+.\"
+.\"The above copyright notice and this permission notice shall be included in
+.\"all copies or substantial portions of the Software.
+.\"
+.\"THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+.\"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+.\"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+.\"GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+.\"AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+.\"CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\"Except as contained in this notice, the name of GROUPE BULL shall not be
+.\"used in advertising or otherwise to promote the sale, use or other dealings
+.\"in this Software without prior written authorization from GROUPE BULL.
+.\"
+.nr )S 12
+.TH SXPM 1
+.PD
+.ad b
+.SH NAME
+sxpm \- Show an XPM (X PixMap) file and/or convert XPM 1 or 2 files to XPM 3.
+.SH SYNOPSIS
+\fBsxpm\fR
+[\|\fB-d\fR displayname\|]
+[\|\fB-g\fR geometry\|]
+[\|\fB-hints\fR\|]
+[\|\fB-icon\fR filename\|]
+[\|\fB-plaid\| | \|\fRfilename\| | \|-\|]
+[\|\fB-o\fR filename\| | \|\fB-o\fR -\|]
+[\|\fB-pcmap\fR\|]
+[\|\fB-closecolors\fR\|]
+[\|\fB-nod\fR\|]
+[\|\fB-nom\fR\|]
+[\|\fB-mono | -grey4 | -grey | -color\fR\|]
+[\|\fB-sc\fR symbol color\|]
+[\|\fB-sp\fR symbol pixel\|]
+[\|\fB-cp\fR color pixel\|]
+[\|\fB-rgb\fR filename\|]
+[\|\fB-v\fR\|]
+.SH DESCRIPTION
+.PP
+The \fIsxpm\fP program can be used to view any XPM (version 1, 2, or 3) file
+and/or to convert a file from XPM1 or XPM2 to XPM version 3. If \fIsxpm\fP is
+run with any dummy option specified, the usage is displayed. If no geometry is
+specified, the show window will have the size of the read pixmap. Pressing the
+key Q in the window will quit the program.
+.SH OPTIONS
+.TP 8
+.B \-d \fIdisplay\fP
+Specifies the display to connect to.
+.TP 8
+.B \-g \fIgeom\fP
+Window geometry (default is pixmap's size).
+.TP 8
+.B \-hints
+Set ResizeInc for window.
+.TP 8
+.B \-icon \fIfilename\fP
+Set icon to pixmap created from the file \fIfilename\fP.
+.TP 8
+.B \-plaid
+Show the plaid pixmap which is stored as data\fP.
+.TP 8
+.B \fIfilename\fP
+Read from the file \fIfilename\fP and from standard input if \fIfilename\fP is '-'.
+If no input is specified sxpm reads from standard input.
+.TP 8
+.B \-o \fIfilename\fP
+Write to the file \fIfilename\fP (overwrite if it already exists) and to
+standard output if \fIfilename\fP is '-'.
+.TP 8
+.B \-mono
+Use the colors specified for a monochrome visual.
+.TP 8
+.B \-grey4
+Use the colors specified for a 4 color greyscale visual.
+.TP 8
+.B \-grey
+Use the colors specified for a greyscale visual.
+.TP 8
+.B \-color
+Use the colors specified for a color visual.
+.TP 8
+.B \-pcmap
+Use a private colormap.
+.TP 8
+.B \-closecolors
+Try to use "close colors" before reverting to other visuals.
+.TP 8
+.B \-nod
+Do not display the pixmap in a window. (Useful when using as converter)
+.TP 8
+.B \-nom
+Do not use the clipmask if there is any.
+.TP 8
+.B \-sc \fIsymbol colorname\fP
+Override default color to \fIsymbol\fP to \fIcolorname\fp.
+.TP 8
+.B \-sp \fIsymbol pixelvalue\fP
+Override default color to \fIsymbol\fP to \fIpixelvalue\fp.
+.TP 8
+.B \-cp \fIcolorname pixelvalue\fP
+Override default color to \fIcolorname\fP to \fIpixelvalue\fp.
+.TP 8
+.B \-rgb \fIfilename\fP
+Search color names in the file \fIfilename\fP and write them out instead of
+the rgb values.
+.TP 8
+.B \-v
+Verbose - to print out extensions (stderr).
+
+
+.SH KNOWN BUGS
+Some window managers may not accept a pixmap which is not a bitmap as icon
+because this does not respect ICCCM, many of the well known ones will accept
+it though.
+
+.SH AUTHOR
+Arnaud Le Hors (lehors@sophia.inria.fr)
+.br
+Bull Research France
+.br
+Copyright (C) 1989-95 by Groupe Bull.
diff --git a/xc/extras/fonts/ClearlyU/README b/xc/extras/fonts/ClearlyU/README
new file mode 100644
index 000000000..4074bed22
--- /dev/null
+++ b/xc/extras/fonts/ClearlyU/README
@@ -0,0 +1,190 @@
+#
+# From: Id: README,v 1.8 1999/04/22 18:39:50 mleisher Exp $
+#
+# Copyright 1996, 1997, 1998, 1999 Computing Research Lab,
+# New Mexico State University
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+# THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+Version: 1.7
+22 April 1999
+
+This set of fonts provides a 12pt, 100dpi proportional font with many of
+the glyphs needed for Unicode text. I call the typeface "ClearlyU" and
+it was influenced by Donald Knuth's Computer Modern.
+
+The fonts together contain 4270 glyphs at the moment.
+
+Information about this font and samples, are located at:
+
+ http://crl.nmsu.edu/~mleisher/cu.html
+
+ACKNOWLEDGEMENTS
+================
+Thanks to Otto Stolz <Otto.Stolz@uni-konstanz.de> for finding spelling errors
+in one of the Greek samples.
+
+AUTHOR
+======
+Mark Leisher <mleisher@crl.nmsu.edu>
+
+CHANGES
+=======
+
+CHANGES FROM 1.6
+----------------
+
+ o Fixed some more spacing problems with Greek glyphs.
+
+ o Fixed some problems with two alternate Greek glyphs.
+
+ o Fixed a spacing problem with an Armenian glyph.
+
+ o Fixed advance width problems with the Klingon.
+
+ o Added an alternate "No." glyph at 0x2116.
+
+ o Changed the spacing on the basic Latin upper-case letters to make them
+ look better in natural text.
+
+ o Lowered the dot above the the lower case "i" and "j" letters to make them
+ blend in more with the surrounding letters.
+
+ o Added some Greek block glyphs.
+
+ o Replaced the small letter d-caron (U+010F) with the preferred typesetting
+ form and moved the caron form to the alternate page.
+
+ o Replaced the small letter l-caron (U+013E) with the preferred typesetting
+ form and moved the caron form to the alternate page.
+
+ o Added U+01F6 through U+01F9, U+021C and U+021D, U+0222 through U+0225,
+ U+02A9 through U+02AD, U+02EA through U+02EE, U+0346 through U+034E,
+ U+0362, U+2139 and U+213A, U+2183, U+21EB through U+21F3, U+2425 and
+ U+2426, U+25F0 through U+25F7,
+
+ for Unicode 3.0 support.
+
+ o Lightened the weight of the "w" shape a little.
+
+ o Added a couple glyphs to the Private Use Area font for Navajo (U+E12E and
+ U+E12F).
+
+ o Added glyphs at U+FFFE for use as an X11 DEFAULT_CHAR entry.
+
+ o Added the _XFREE86_GLYPH_RANGES properties.
+
+ o Updated the copyright notice year.
+
+CHANGES FROM 1.5
+----------------
+
+ o Fixed up the Coptic SMALL LETTER FEI shape.
+
+ o Changed the default shape of the Greek KOPPA to the O shape and added a
+ lower case KOPPA in the unassigned slot after the KOPPA.
+
+ o Added some glyphs to the Private Use Area font: dotless lower j, upper
+ and lower g with tilde, upper j with caron, final Hebrew kaf with
+ qamats, upper and lower Xucuri letter he, alternate forms of the Greek
+ koppa.
+
+ o Some minor improvements made to a few Xucuri glyphs.
+
+ o Spacing adjustments to Armenian, Georgian, Lao, and Thai.
+
+ o Added some more Cyrillic and Latin glyphs.
+
+ o Renamed all the glyphs to 4-digit hexadecimal codes of the form 0xUUUU.
+
+ o Added alternate Greek glyphs that use the curved PERISPOMENI instead of
+ the one that looks like a tilde.
+
+CHANGES FROM 1.4
+----------------
+
+ o Fixed the tone marks in the Greek block.
+
+ o Adjusted the spacing on the lower case Greek letters.
+
+ o Added the missing micro sign at U+00B5.
+
+ o Adjusted spacing on more Latin, Greek, and Cyrillic letters.
+
+ o Added a different Franc symbol to the alternate font.
+
+ o Added the Macedonian I with grave, U+040D, U+045D.
+
+ o Added Cyrillic letter IE with grave at U+0400, U+0450.
+
+ o Added the Armenian hyphen at U+058A.
+
+ o Fixed spacings on glyphs shaped like the capital C and R, and lightened
+ the capital K a bit.
+
+ o Lightened the "small k shape" found in Cyrillic and Greek.
+
+ o Adjusted some spacing problems with Greek alphas.
+
+ o Fixed Cyrillic glyphs UPRIGHT U and UPRIGHT U WITH BAR.
+
+ o Adjusted the Cyrillic letters U WITH DOUBLE ACUTE.
+
+CHANGES FROM 1.3
+----------------
+
+ o Lightened the lower case "k" and "t" shapes to be more consistent with
+ the weight of the other glyphs.
+
+ o Adjusted the spacing of the letter "x" yet again.
+
+ o Adjusted spacing of the letter "y".
+
+ o Changed the Greek capital "Y" shape to something more modern, in the
+ diatonic block as well.
+
+ o Adjusted many spacings.
+
+ o Adjusted spacing on Georgian Xutsuri lower case alternate glyphs.
+
+ o Added consistent CAP_HEIGHT and X_HEIGHT to all fonts.
+
+CHANGES
+-------
+20 October 1998 - Cleaned up some more spacing problems and added the floor
+ and ceiling glyphs.
+
+15 October 1998 - Cleaned up some spacing problems with digits.
+ Added Klingon to the PUA font.
+
+02 October 1998 - Changed U+0123 to the preferred Latvian form.
+ Cleaned up some of the Arabic digits.
+ Made the alternate Georgian font into a general alternate
+ glyph font. Added some alternate Arabic glyphs for Urdu
+ digits and letters. Added the g-cedilla as an alternate
+ glyph.
+
+03 September 1998 - Fixed some math character metrics.
+
+09 September 1998 - Finished the Arabic blocks.
+
+12 July 1998 - Added proposed Cyrillic glyphs for Kildin Sámi.
+
+12 July 1998 - Borrowed the Ethiopic glyphs from ethiomx12-uni.bdf.
diff --git a/xc/extras/fonts/ClearlyU/cu-alt12.bdf b/xc/extras/fonts/ClearlyU/cu-alt12.bdf
new file mode 100644
index 000000000..3004cdaa7
--- /dev/null
+++ b/xc/extras/fonts/ClearlyU/cu-alt12.bdf
@@ -0,0 +1,2768 @@
+STARTFONT 2.1
+COMMENT
+COMMENT From: Id: cu-alt12.bdf,v 1.8 1999/04/22 18:39:51 mleisher Exp $
+COMMENT
+COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State
+COMMENT University
+COMMENT
+COMMENT Permission is hereby granted, free of charge, to any person
+COMMENT obtaining a copy of this software and associated documentation
+COMMENT files (the "Software"), to deal in the Software without
+COMMENT restriction, including without limitation the rights to use,
+COMMENT copy, modify, merge, publish, distribute, sublicense, and/or
+COMMENT sell copies of the Software, and to permit persons to whom the
+COMMENT Software is furnished to do so, subject to the following
+COMMENT conditions:
+COMMENT
+COMMENT The above copyright notice and this permission notice shall be
+COMMENT included in all copies or substantial portions of the Software.
+COMMENT
+COMMENT THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+COMMENT EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+COMMENT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+COMMENT NONINFRINGEMENT. IN NO EVENT SHALL THE COMPUTING RESEARCH LAB
+COMMENT OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY CLAIM, DAMAGES
+COMMENT OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+COMMENT OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+COMMENT SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+COMMENT
+COMMENT This font contains alternate glyphs for Arabic and Georgian blocks.
+COMMENT Some have been added to the Private Use Area as well.
+COMMENT
+FONT -MUTT-ClearlyU Alternate Glyphs-Medium-R-Normal--17-120-100-100-P-91-ISO10646-1
+SIZE 12 100 100
+FONTBOUNDINGBOX 18 24 -1 -7
+STARTPROPERTIES 23
+COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University."
+POINT_SIZE 120
+PIXEL_SIZE 17
+RESOLUTION_X 100
+RESOLUTION_Y 100
+FONT_ASCENT 12
+FONT_DESCENT 6
+AVERAGE_WIDTH 91
+SPACING "P"
+FOUNDRY "MUTT"
+FAMILY_NAME "ClearlyU Alternate Glyphs"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+_XMBDFED_INFO "Edited with xmbdfed 3.8."
+CAP_HEIGHT 11
+X_HEIGHT 7
+DEFAULT_CHAR 65534
+_XFREE86_GLYPH_RANGES "271 291 318 990_991 1729_1731 1780 1782_1783 4256_4294 4304_4341 7942_7943 7950_7951 7974_7975 7982_7983 7990_7991 7998_7999 8022_8023 8031 8038_8039 8046_8047 8070_8071 8078_8079 8086_8087 8094_8095 8102_8103 8110_8111 8118_8119 8128_8129 8134_8135 8143 8150_8151 8159 8166_8167"
+_XFREE86_GLYPH_RANGES "8182_8183 8355 8470 61638 61687_61688 64424 65260 65533_65534"
+ENDPROPERTIES
+CHARS 142
+STARTCHAR 0x010F
+ENCODING 271
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 0
+BITMAP
+88
+70
+20
+00
+18
+08
+08
+08
+08
+78
+48
+88
+88
+88
+48
+7C
+ENDCHAR
+STARTCHAR 0x0123
+ENCODING 291
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 0 -7
+BITMAP
+3E
+48
+48
+48
+70
+40
+7C
+82
+82
+C6
+38
+10
+08
+38
+ENDCHAR
+STARTCHAR 0x013E
+ENCODING 318
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 16 0 0
+BITMAP
+88
+70
+20
+00
+60
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x03DE
+ENCODING 990
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+C0
+20
+20
+20
+20
+3F
+02
+02
+04
+04
+08
+ENDCHAR
+STARTCHAR 0x03DF
+ENCODING 991
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+20
+20
+40
+40
+FC
+08
+08
+10
+10
+20
+ENDCHAR
+STARTCHAR 0x06C1
+ENCODING 1729
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 6 1 0
+BITMAP
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x06C2
+ENCODING 1730
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 11 1 0
+BITMAP
+30
+40
+30
+40
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x06C3
+ENCODING 1731
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 10 1 0
+BITMAP
+50
+50
+00
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x06F4
+ENCODING 1780
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 2 0
+BITMAP
+F2
+EC
+C8
+60
+60
+20
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x06F6
+ENCODING 1782
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 0
+BITMAP
+04
+DC
+74
+04
+04
+06
+02
+03
+03
+01
+ENDCHAR
+STARTCHAR 0x06F7
+ENCODING 1783
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 2
+BITMAP
+04
+18
+60
+80
+60
+18
+04
+ENDCHAR
+STARTCHAR 0x10A0
+ENCODING 4256
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 8 1 -1
+BITMAP
+92
+FE
+92
+10
+10
+10
+1E
+02
+ENDCHAR
+STARTCHAR 0x10A1
+ENCODING 4257
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -4
+BITMAP
+EE
+44
+44
+44
+44
+3C
+04
+42
+82
+7C
+ENDCHAR
+STARTCHAR 0x10A2
+ENCODING 4258
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 -4
+BITMAP
+80
+EC
+32
+22
+22
+22
+72
+02
+21
+41
+3E
+ENDCHAR
+STARTCHAR 0x10A3
+ENCODING 4259
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FE
+92
+10
+10
+10
+38
+44
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x10A4
+ENCODING 4260
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 10 1 -3
+BITMAP
+80
+EC
+32
+22
+22
+22
+72
+02
+02
+07
+ENDCHAR
+STARTCHAR 0x10A5
+ENCODING 4261
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 10 1 -3
+BITMAP
+8000
+ECC0
+3320
+2220
+2220
+2220
+7270
+0200
+0200
+0700
+ENDCHAR
+STARTCHAR 0x10A6
+ENCODING 4262
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+80
+E0
+20
+20
+20
+3C
+22
+22
+22
+22
+3C
+ENDCHAR
+STARTCHAR 0x10A7
+ENCODING 4263
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 6 1 0
+BITMAP
+D980
+6640
+4440
+4440
+4440
+EEE0
+ENDCHAR
+STARTCHAR 0x10A8
+ENCODING 4264
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 0
+BITMAP
+80
+E0
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x10A9
+ENCODING 4265
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -3
+BITMAP
+E0
+40
+40
+40
+78
+44
+44
+44
+44
+3C
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x10AA
+ENCODING 4266
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 7 1 0
+BITMAP
+8000
+ECC0
+3320
+2220
+2220
+2220
+7770
+ENDCHAR
+STARTCHAR 0x10AB
+ENCODING 4267
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+38
+08
+08
+08
+18
+68
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10AC
+ENCODING 4268
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+F8
+48
+40
+40
+40
+78
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x10AD
+ENCODING 4269
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 6 1 0
+BITMAP
+EEE0
+4440
+4440
+4440
+4CC0
+3360
+ENDCHAR
+STARTCHAR 0x10AE
+ENCODING 4270
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+80
+E7
+22
+22
+22
+26
+1B
+ENDCHAR
+STARTCHAR 0x10AF
+ENCODING 4271
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -3
+BITMAP
+80
+FC
+22
+22
+22
+22
+1E
+02
+02
+07
+ENDCHAR
+STARTCHAR 0x10B0
+ENCODING 4272
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 0
+BITMAP
+0E00
+0400
+0400
+E580
+4640
+4440
+4440
+4C40
+34E0
+ENDCHAR
+STARTCHAR 0x10B1
+ENCODING 4273
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+E0
+40
+40
+40
+4E
+44
+44
+44
+4C
+36
+ENDCHAR
+STARTCHAR 0x10B2
+ENCODING 4274
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 10 1 -4
+BITMAP
+F0
+88
+88
+88
+88
+F0
+80
+80
+84
+78
+ENDCHAR
+STARTCHAR 0x10B3
+ENCODING 4275
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 9 1 -3
+BITMAP
+EEEE
+4444
+4444
+4444
+4CCC
+3334
+0004
+0004
+000E
+ENDCHAR
+STARTCHAR 0x10B4
+ENCODING 4276
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 1 -3
+BITMAP
+7C
+92
+92
+92
+92
+7C
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x10B5
+ENCODING 4277
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 13 1 -3
+BITMAP
+0800
+0800
+0800
+C800
+4900
+4F00
+7900
+4900
+0980
+0800
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x10B6
+ENCODING 4278
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+80
+EC
+32
+22
+22
+22
+77
+ENDCHAR
+STARTCHAR 0x10B7
+ENCODING 4279
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -3
+BITMAP
+80
+EC
+32
+22
+22
+22
+72
+02
+02
+07
+ENDCHAR
+STARTCHAR 0x10B8
+ENCODING 4280
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 1 -4
+BITMAP
+EE
+44
+44
+44
+44
+3C
+04
+44
+84
+78
+ENDCHAR
+STARTCHAR 0x10B9
+ENCODING 4281
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -3
+BITMAP
+E0
+40
+40
+40
+58
+64
+44
+44
+44
+4E
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x10BA
+ENCODING 4282
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -4
+BITMAP
+D8
+64
+44
+44
+44
+4E
+40
+40
+44
+38
+ENDCHAR
+STARTCHAR 0x10BB
+ENCODING 4283
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 9 1 0
+BITMAP
+0E00
+0400
+0400
+DD80
+6640
+4440
+4440
+4440
+EEE0
+ENDCHAR
+STARTCHAR 0x10BC
+ENCODING 4284
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 9 1 -3
+BITMAP
+D980
+6640
+4440
+4440
+4440
+4EE0
+4000
+4000
+E000
+ENDCHAR
+STARTCHAR 0x10BD
+ENCODING 4285
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -4
+BITMAP
+FC
+44
+44
+4E
+40
+7C
+02
+82
+7C
+ENDCHAR
+STARTCHAR 0x10BE
+ENCODING 4286
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 1 -4
+BITMAP
+EE
+44
+44
+44
+44
+78
+40
+40
+42
+3C
+ENDCHAR
+STARTCHAR 0x10BF
+ENCODING 4287
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+84
+EA
+32
+14
+08
+14
+22
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x10C0
+ENCODING 4288
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 7 1 0
+BITMAP
+8000
+E770
+2220
+2220
+2220
+2660
+19A0
+ENDCHAR
+STARTCHAR 0x10C1
+ENCODING 4289
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 13 1 -3
+BITMAP
+78
+48
+40
+40
+78
+44
+44
+44
+44
+4E
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x10C2
+ENCODING 4290
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 0
+BITMAP
+08
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10C3
+ENCODING 4291
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -3
+BITMAP
+0E
+04
+04
+04
+E4
+44
+44
+44
+44
+3C
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x10C4
+ENCODING 4292
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 9 1 -3
+BITMAP
+E380
+4100
+4100
+4100
+4900
+3E00
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x10C5
+ENCODING 4293
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+1E00
+0900
+0E00
+0800
+0B00
+0D00
+1900
+6900
+8900
+8900
+7180
+ENDCHAR
+STARTCHAR 0x10C6
+ENCODING 4294
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -3
+BITMAP
+1C00
+0800
+0800
+6B00
+9C80
+8880
+8880
+9C80
+6B00
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x10D0
+ENCODING 4304
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+20
+20
+20
+20
+10
+08
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10D1
+ENCODING 4305
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+40
+E0
+10
+10
+10
+38
+44
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x10D2
+ENCODING 4306
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 0
+BITMAP
+70
+88
+C8
+08
+1C
+22
+41
+41
+41
+41
+22
+1C
+ENDCHAR
+STARTCHAR 0x10D3
+ENCODING 4307
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 0
+BITMAP
+7780
+8840
+8840
+8840
+8840
+8780
+4000
+3000
+CC00
+8300
+0080
+0040
+ENDCHAR
+STARTCHAR 0x10D4
+ENCODING 4308
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+78
+84
+C4
+04
+04
+04
+44
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10D5
+ENCODING 4309
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+78
+84
+C4
+04
+18
+04
+44
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10D6
+ENCODING 4310
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 0
+BITMAP
+7000
+8800
+8800
+8800
+78C0
+0B00
+0F80
+0C40
+0820
+0820
+0820
+0440
+0380
+ENDCHAR
+STARTCHAR 0x10D7
+ENCODING 4311
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 1 0
+BITMAP
+38E0
+4510
+8208
+8208
+8208
+8208
+8208
+8208
+8208
+8208
+4410
+3820
+ENDCHAR
+STARTCHAR 0x10D8
+ENCODING 4312
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+38
+44
+82
+82
+82
+82
+82
+82
+82
+82
+44
+28
+ENDCHAR
+STARTCHAR 0x10D9
+ENCODING 4313
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+10
+08
+04
+04
+04
+18
+44
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10DA
+ENCODING 4314
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 1 0
+BITMAP
+7770
+8888
+8888
+8888
+8008
+8010
+4000
+3800
+C700
+80C0
+0020
+0010
+ENDCHAR
+STARTCHAR 0x10DB
+ENCODING 4315
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+78
+84
+84
+04
+04
+74
+8C
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10DC
+ENCODING 4316
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+64
+9C
+80
+80
+80
+B8
+C4
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10DD
+ENCODING 4317
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+7700
+8880
+8880
+8880
+8880
+8080
+8080
+8080
+8080
+8080
+C180
+4100
+ENDCHAR
+STARTCHAR 0x10DE
+ENCODING 4318
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+20
+18
+04
+04
+18
+04
+44
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10DF
+ENCODING 4319
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+04
+1C
+D4
+94
+94
+64
+04
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10E0
+ENCODING 4320
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+0200
+0200
+0C00
+3000
+4000
+7700
+8880
+8880
+8880
+8080
+8080
+C180
+ENDCHAR
+STARTCHAR 0x10E1
+ENCODING 4321
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+80
+80
+80
+80
+88
+90
+98
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10E2
+ENCODING 4322
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+0800
+1400
+1400
+0800
+5600
+9100
+9280
+8E80
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x10E3
+ENCODING 4323
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 0
+BITMAP
+4D80
+9240
+6240
+0240
+0040
+0040
+0840
+1040
+1040
+1040
+0880
+0700
+ENDCHAR
+STARTCHAR 0x10E4
+ENCODING 4324
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+7700
+8880
+8880
+8880
+7080
+0300
+0080
+3080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x10E5
+ENCODING 4325
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+04
+04
+34
+4C
+44
+04
+04
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10E6
+ENCODING 4326
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+7700
+8880
+8880
+8880
+8080
+8100
+4000
+3000
+CC00
+8200
+0100
+0080
+ENDCHAR
+STARTCHAR 0x10E7
+ENCODING 4327
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+64
+84
+84
+84
+7C
+04
+04
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10E8
+ENCODING 4328
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+6C
+92
+92
+02
+02
+3A
+46
+42
+42
+42
+42
+3C
+ENDCHAR
+STARTCHAR 0x10E9
+ENCODING 4329
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+70
+88
+88
+90
+E0
+80
+F8
+84
+84
+84
+84
+88
+ENDCHAR
+STARTCHAR 0x10EA
+ENCODING 4330
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+28
+44
+42
+82
+82
+9C
+82
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x10EB
+ENCODING 4331
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+04
+04
+04
+04
+74
+8C
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10EC
+ENCODING 4332
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+6C
+92
+92
+82
+40
+7C
+44
+44
+28
+28
+10
+10
+ENDCHAR
+STARTCHAR 0x10ED
+ENCODING 4333
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 0
+BITMAP
+04
+04
+05
+35
+4E
+35
+05
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10EE
+ENCODING 4334
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 0
+BITMAP
+60
+A0
+20
+2C
+30
+3E
+21
+21
+21
+21
+1E
+ENDCHAR
+STARTCHAR 0x10EF
+ENCODING 4335
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+6060
+9050
+8810
+4420
+05C0
+0600
+0A00
+3220
+4110
+2110
+90E0
+6000
+ENDCHAR
+STARTCHAR 0x10F0
+ENCODING 4336
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+20
+18
+04
+04
+18
+04
+04
+18
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10F1
+ENCODING 4337
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+50
+4C
+42
+82
+8C
+82
+82
+8C
+82
+82
+42
+3C
+ENDCHAR
+STARTCHAR 0x10F2
+ENCODING 4338
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+30
+48
+84
+84
+84
+84
+84
+84
+84
+84
+48
+FC
+ENDCHAR
+STARTCHAR 0x10F3
+ENCODING 4339
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+7C
+04
+08
+10
+38
+04
+44
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10F4
+ENCODING 4340
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 0
+BITMAP
+10
+20
+18
+04
+04
+18
+04
+44
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10F5
+ENCODING 4341
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+78
+84
+84
+84
+84
+7E
+04
+7E
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x1F06
+ENCODING 7942
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 0
+BITMAP
+3C
+42
+18
+18
+08
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F07
+ENCODING 7943
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 0
+BITMAP
+78
+84
+30
+30
+20
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F0E
+ENCODING 7950
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 15 -1 0
+BITMAP
+7800
+8400
+3000
+3000
+1200
+2200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F0F
+ENCODING 7951
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 15 -1 0
+BITMAP
+7800
+8400
+3000
+3000
+2200
+1200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F26
+ENCODING 7974
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 18 1 -4
+BITMAP
+78
+84
+30
+30
+10
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F27
+ENCODING 7975
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 18 1 -4
+BITMAP
+78
+84
+30
+30
+20
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F2E
+ENCODING 7982
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 15 0 0
+BITMAP
+7800
+8400
+3000
+3000
+17DF
+2104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F2F
+ENCODING 7983
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 15 0 0
+BITMAP
+7800
+8400
+3000
+3000
+27DF
+1104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F36
+ENCODING 7990
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 0 0
+BITMAP
+78
+84
+30
+30
+10
+20
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F37
+ENCODING 7991
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 0 0
+BITMAP
+78
+84
+30
+30
+20
+10
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F3E
+ENCODING 7998
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 0
+BITMAP
+7800
+8400
+3000
+3000
+17C0
+2100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F3F
+ENCODING 7999
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 0
+BITMAP
+7800
+8400
+3000
+3000
+27C0
+1100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F56
+ENCODING 8022
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+78
+84
+30
+30
+10
+20
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F57
+ENCODING 8023
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+78
+84
+30
+30
+20
+10
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F5F
+ENCODING 8031
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 0 0
+BITMAP
+7800
+8400
+3000
+3F1E
+2208
+1110
+0110
+00A0
+00E0
+0040
+0040
+0040
+0040
+01F0
+ENDCHAR
+STARTCHAR 0x1F66
+ENCODING 8038
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 0
+BITMAP
+3C00
+4200
+1800
+1800
+0800
+1000
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F67
+ENCODING 8039
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 0
+BITMAP
+3C00
+4200
+1800
+1800
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F6E
+ENCODING 8046
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 15 0 0
+BITMAP
+7800
+8400
+3000
+3000
+13E0
+2410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+ENDCHAR
+STARTCHAR 0x1F6F
+ENCODING 8047
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 15 0 0
+BITMAP
+7800
+8400
+3000
+3000
+23E0
+1410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+ENDCHAR
+STARTCHAR 0x1F86
+ENCODING 8070
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 19 1 -5
+BITMAP
+3C
+42
+18
+18
+08
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F87
+ENCODING 8071
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 19 1 -5
+BITMAP
+78
+84
+30
+30
+20
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F8E
+ENCODING 8078
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 19 -1 -4
+BITMAP
+7800
+8400
+3000
+3000
+1200
+2200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F8F
+ENCODING 8079
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 19 -1 -4
+BITMAP
+7800
+8400
+3000
+3000
+2200
+1200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F96
+ENCODING 8086
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 18 1 -4
+BITMAP
+78
+84
+30
+30
+10
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F97
+ENCODING 8087
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 18 1 -4
+BITMAP
+78
+84
+30
+30
+20
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F9E
+ENCODING 8094
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 20 0 -5
+BITMAP
+7800
+8400
+3000
+3000
+17DF
+2104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1F9F
+ENCODING 8095
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 20 0 -5
+BITMAP
+7800
+8400
+3000
+3000
+27DF
+1104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1FA6
+ENCODING 8102
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 19 1 -5
+BITMAP
+3C00
+4200
+1800
+1800
+0800
+1000
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA7
+ENCODING 8103
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 19 1 -5
+BITMAP
+3C00
+4200
+1800
+1800
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FAE
+ENCODING 8110
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 19 0 -4
+BITMAP
+7800
+8400
+3000
+3000
+13E0
+2410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+0180
+0080
+00A0
+0040
+ENDCHAR
+STARTCHAR 0x1FAF
+ENCODING 8111
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 19 0 -4
+BITMAP
+7800
+8400
+3000
+3000
+23E0
+1410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+0180
+0080
+00A0
+0040
+ENDCHAR
+STARTCHAR 0x1FB6
+ENCODING 8118
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+38
+44
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1FB7
+ENCODING 8119
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -5
+BITMAP
+38
+44
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FC0
+ENCODING 8128
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 2 1 11
+BITMAP
+78
+84
+ENDCHAR
+STARTCHAR 0x1FC1
+ENCODING 8129
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 11
+BITMAP
+70
+88
+00
+D8
+D8
+ENDCHAR
+STARTCHAR 0x1FC6
+ENCODING 8134
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -4
+BITMAP
+38
+44
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1FC7
+ENCODING 8135
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -4
+BITMAP
+38
+44
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1FCF
+ENCODING 8143
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 11
+BITMAP
+78
+84
+30
+30
+10
+20
+ENDCHAR
+STARTCHAR 0x1FD6
+ENCODING 8150
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 10 0 0
+BITMAP
+70
+88
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FD7
+ENCODING 8151
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 14 0 0
+BITMAP
+70
+88
+00
+D8
+D8
+00
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FDF
+ENCODING 8159
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 11
+BITMAP
+78
+84
+30
+30
+20
+10
+ENDCHAR
+STARTCHAR 0x1FE6
+ENCODING 8166
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+38
+44
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FE7
+ENCODING 8167
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+38
+44
+00
+6C
+6C
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FF6
+ENCODING 8182
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 0
+BITMAP
+1C00
+2200
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1FF7
+ENCODING 8183
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 15 1 -5
+BITMAP
+1C00
+2200
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x20A3
+ENCODING 8355
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 0 0
+BITMAP
+FF80
+2080
+2080
+2000
+7F00
+2000
+7F00
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x2116
+ENCODING 8470
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 16 11 1 0
+BITMAP
+E3EE
+3091
+3091
+2891
+2891
+248E
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0xF0C6
+ENCODING 61638
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 0
+BITMAP
+7800
+8400
+C400
+0400
+3F80
+4440
+4440
+4440
+3F80
+0400
+0460
+0420
+03C0
+ENDCHAR
+STARTCHAR 0xF0F7
+ENCODING 61687
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+78
+84
+C4
+04
+08
+10
+20
+40
+80
+8C
+84
+78
+ENDCHAR
+STARTCHAR 0xF0F8
+ENCODING 61688
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+24
+20
+20
+20
+10
+08
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0xFBA8
+ENCODING 64424
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 4 10 0 -5
+BITMAP
+10
+10
+10
+10
+10
+E0
+00
+10
+20
+30
+ENDCHAR
+STARTCHAR 0xFEEC
+ENCODING 65260
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 7 0 -6
+BITMAP
+40
+CC
+30
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFFFD
+ENCODING 65533
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 15 0 0
+BITMAP
+0100
+0380
+07C0
+0C60
+1BB0
+3BB8
+7F7C
+FEFE
+7EFC
+3FF8
+1EF0
+0C60
+06C0
+0380
+0100
+ENDCHAR
+STARTCHAR C072
+ENCODING 65534
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 7 11 2 0
+BITMAP
+AA
+00
+82
+00
+82
+00
+82
+00
+82
+00
+AA
+ENDCHAR
+ENDFONT
diff --git a/xc/extras/fonts/ClearlyU/cu-arabic12.bdf b/xc/extras/fonts/ClearlyU/cu-arabic12.bdf
new file mode 100644
index 000000000..3738430f8
--- /dev/null
+++ b/xc/extras/fonts/ClearlyU/cu-arabic12.bdf
@@ -0,0 +1,3732 @@
+STARTFONT 2.1
+COMMENT
+COMMENT From: Id: cu-arabic12.bdf,v 1.4 1999/04/22 18:39:51 mleisher Exp $
+COMMENT
+COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State
+COMMENT University
+COMMENT
+COMMENT Permission is hereby granted, free of charge, to any person
+COMMENT obtaining a copy of this software and associated documentation
+COMMENT files (the "Software"), to deal in the Software without
+COMMENT restriction, including without limitation the rights to use,
+COMMENT copy, modify, merge, publish, distribute, sublicense, and/or
+COMMENT sell copies of the Software, and to permit persons to whom the
+COMMENT Software is furnished to do so, subject to the following
+COMMENT conditions:
+COMMENT
+COMMENT The above copyright notice and this permission notice shall be
+COMMENT included in all copies or substantial portions of the Software.
+COMMENT
+COMMENT THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+COMMENT EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+COMMENT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+COMMENT NONINFRINGEMENT. IN NO EVENT SHALL THE COMPUTING RESEARCH LAB
+COMMENT OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY CLAIM, DAMAGES
+COMMENT OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+COMMENT OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+COMMENT SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+COMMENT
+COMMENT This font contains the contextual glyph forms that are not encoded
+COMMENT in Unicode.
+COMMENT
+FONT -MUTT-ClearlyU Arabic Extra-Medium-R-Normal--17-120-100-100-P-103-FontSpecific-0
+SIZE 12 100 100
+FONTBOUNDINGBOX 22 26 -1 -9
+STARTPROPERTIES 20
+POINT_SIZE 120
+PIXEL_SIZE 17
+RESOLUTION_X 100
+RESOLUTION_Y 100
+FONT_ASCENT 17
+FONT_DESCENT 9
+AVERAGE_WIDTH 103
+SPACING "P"
+FOUNDRY "MUTT"
+FAMILY_NAME "ClearlyU Arabic Extra"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+CHARSET_REGISTRY "FontSpecific"
+CHARSET_ENCODING "0"
+_XMBDFED_INFO "Edited with xmbdfed 3.5."
+CAP_HEIGHT 11
+X_HEIGHT 7
+_XFREE86_GLYPH_RANGES "0_178 208_213 240 244"
+ENDPROPERTIES
+CHARS 187
+STARTCHAR 0x0000
+ENCODING 0
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 -1 0
+BITMAP
+18
+20
+18
+E0
+00
+10
+10
+18
+10
+10
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x0001
+ENCODING 1
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 18 -1 -1
+BITMAP
+18
+20
+18
+E0
+00
+00
+10
+10
+18
+10
+10
+10
+10
+10
+10
+10
+10
+0E
+ENDCHAR
+STARTCHAR 0x0002
+ENCODING 2
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 -1 -5
+BITMAP
+10
+10
+18
+10
+10
+10
+10
+10
+10
+10
+10
+00
+18
+20
+18
+E0
+ENDCHAR
+STARTCHAR 0x0003
+ENCODING 3
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 17 -1 -6
+BITMAP
+10
+10
+18
+10
+10
+10
+10
+10
+10
+10
+10
+0E
+00
+18
+20
+18
+E0
+ENDCHAR
+STARTCHAR 0x0004
+ENCODING 4
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 13 2 0
+BITMAP
+0C
+10
+8C
+90
+C0
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0005
+ENCODING 5
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 2 -1
+BITMAP
+0C
+10
+8C
+90
+C0
+80
+80
+80
+80
+80
+80
+80
+80
+70
+ENDCHAR
+STARTCHAR 0x0006
+ENCODING 6
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 10 12 -1 -3
+BITMAP
+00C0
+0100
+00C0
+0100
+0400
+0A00
+0A00
+0E00
+0200
+0200
+8400
+7800
+ENDCHAR
+STARTCHAR 0x0007
+ENCODING 7
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 -3
+BITMAP
+00C0
+0100
+00C0
+0100
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0x0008
+ENCODING 8
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 13 13 0 -3
+BITMAP
+0018
+0020
+0018
+0020
+0000
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x0009
+ENCODING 9
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -5
+BITMAP
+00C0
+0100
+00C0
+0100
+0000
+41C0
+8300
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x000A
+ENCODING 10
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 8 10 0 -1
+BITMAP
+03
+04
+03
+04
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0x000B
+ENCODING 11
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 -1
+BITMAP
+06
+08
+06
+08
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0x000C
+ENCODING 12
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 12 0 -4
+BITMAP
+0A00
+0A00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+0600
+0900
+0600
+ENDCHAR
+STARTCHAR 0x000D
+ENCODING 13
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 12 1 -4
+BITMAP
+0A00
+0A00
+0000
+0020
+8020
+8010
+8010
+4070
+3F8C
+0600
+0900
+0600
+ENDCHAR
+STARTCHAR 0x000E
+ENCODING 14
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 0 -4
+BITMAP
+28
+28
+00
+00
+10
+08
+08
+08
+08
+F0
+60
+90
+60
+ENDCHAR
+STARTCHAR 0x000F
+ENCODING 15
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 13 0 -4
+BITMAP
+50
+50
+00
+00
+20
+20
+10
+10
+10
+EE
+60
+90
+60
+ENDCHAR
+STARTCHAR 0x0010
+ENCODING 16
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 9 0 -1
+BITMAP
+0A00
+0A00
+0000
+0420
+8410
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x0011
+ENCODING 17
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 12 1 -1
+BITMAP
+0A00
+0A00
+0000
+0400
+0400
+0000
+0020
+8020
+8010
+8010
+4070
+3F8C
+ENDCHAR
+STARTCHAR 0x0012
+ENCODING 18
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 0 -1
+BITMAP
+28
+28
+00
+10
+10
+00
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0x0013
+ENCODING 19
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 13 0 -1
+BITMAP
+50
+50
+00
+20
+20
+00
+00
+20
+20
+10
+10
+10
+EE
+ENDCHAR
+STARTCHAR 0x0014
+ENCODING 20
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 16 1 -6
+BITMAP
+18
+20
+18
+20
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0015
+ENCODING 21
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 1 -6
+BITMAP
+1800
+2000
+1800
+2000
+0000
+7F00
+B200
+4200
+C200
+81C0
+8000
+8000
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0x0016
+ENCODING 22
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 -1
+BITMAP
+1800
+2000
+1800
+2000
+0000
+1800
+2400
+4200
+0100
+0080
+FFC0
+ENDCHAR
+STARTCHAR 0x0017
+ENCODING 23
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 0 -1
+BITMAP
+1800
+2000
+1800
+2000
+0000
+1800
+2400
+4200
+0100
+0080
+FFE0
+ENDCHAR
+STARTCHAR 0x0018
+ENCODING 24
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 18 1 -6
+BITMAP
+10
+10
+00
+10
+10
+00
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0019
+ENCODING 25
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 1 -6
+BITMAP
+1000
+1000
+0000
+1000
+1000
+0000
+7F00
+B200
+4200
+C200
+81C0
+8000
+8000
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0x001A
+ENCODING 26
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 -1
+BITMAP
+1000
+1000
+0000
+1000
+1000
+0000
+1800
+2400
+4200
+0100
+0080
+FFC0
+ENDCHAR
+STARTCHAR 0x001B
+ENCODING 27
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 -1
+BITMAP
+1000
+1000
+0000
+1000
+1000
+0000
+1800
+2400
+4200
+0100
+0080
+FFE0
+ENDCHAR
+STARTCHAR 0x001C
+ENCODING 28
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 18 1 -6
+BITMAP
+10
+10
+00
+28
+28
+00
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x001D
+ENCODING 29
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 1 -6
+BITMAP
+1000
+1000
+0000
+2800
+2800
+0000
+7F00
+B200
+4200
+C200
+81C0
+8000
+8000
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0x001E
+ENCODING 30
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 -1
+BITMAP
+1000
+1000
+0000
+2800
+2800
+0000
+1800
+2400
+4200
+0100
+0080
+FFC0
+ENDCHAR
+STARTCHAR 0x001F
+ENCODING 31
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 -1
+BITMAP
+1000
+1000
+0000
+2800
+2800
+0000
+1800
+2400
+4200
+0100
+0080
+FFE0
+ENDCHAR
+STARTCHAR 0x0020
+ENCODING 32
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 8 0 -3
+BITMAP
+10
+10
+08
+08
+88
+78
+28
+10
+ENDCHAR
+STARTCHAR 0x0021
+ENCODING 33
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 8 1 -3
+BITMAP
+10
+10
+08
+08
+8C
+7A
+28
+10
+ENDCHAR
+STARTCHAR 0x0022
+ENCODING 34
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 9 0 -4
+BITMAP
+10
+10
+08
+08
+88
+78
+00
+10
+10
+ENDCHAR
+STARTCHAR 0x0023
+ENCODING 35
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -4
+BITMAP
+10
+10
+08
+08
+8C
+7A
+00
+10
+10
+ENDCHAR
+STARTCHAR 0x0024
+ENCODING 36
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 14 0 -4
+BITMAP
+20
+20
+38
+38
+00
+10
+10
+08
+08
+88
+78
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x0025
+ENCODING 37
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -4
+BITMAP
+20
+20
+38
+38
+00
+10
+10
+08
+08
+8C
+7A
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x0026
+ENCODING 38
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 13 0 -1
+BITMAP
+50
+50
+00
+20
+20
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x0027
+ENCODING 39
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -1
+BITMAP
+50
+50
+00
+20
+20
+00
+00
+10
+10
+08
+08
+8C
+7A
+ENDCHAR
+STARTCHAR 0x0028
+ENCODING 40
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 13 0 -1
+BITMAP
+50
+50
+00
+50
+50
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x0029
+ENCODING 41
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -1
+BITMAP
+50
+50
+00
+50
+50
+00
+00
+10
+10
+08
+08
+8C
+7A
+ENDCHAR
+STARTCHAR 0x002A
+ENCODING 42
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 0 -4
+BITMAP
+12
+0C
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x002B
+ENCODING 43
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -4
+BITMAP
+1200
+0C00
+0000
+0000
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+ENDCHAR
+STARTCHAR 0x002C
+ENCODING 44
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 0 -5
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+7A
+04
+ENDCHAR
+STARTCHAR 0x002D
+ENCODING 45
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 -5
+BITMAP
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7A00
+0400
+ENDCHAR
+STARTCHAR 0x002E
+ENCODING 46
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 0 -6
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+78
+04
+04
+ENDCHAR
+STARTCHAR 0x002F
+ENCODING 47
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 -6
+BITMAP
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0030
+ENCODING 48
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 0 -7
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+78
+00
+24
+18
+ENDCHAR
+STARTCHAR 0x0031
+ENCODING 49
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 -7
+BITMAP
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+0000
+2400
+1800
+ENDCHAR
+STARTCHAR 0x0032
+ENCODING 50
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 0 -6
+BITMAP
+04
+06
+02
+22
+22
+04
+8C
+78
+04
+04
+ENDCHAR
+STARTCHAR 0x0033
+ENCODING 51
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 -6
+BITMAP
+0400
+0600
+0200
+2300
+2280
+0400
+8C00
+7800
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0034
+ENCODING 52
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 0 -4
+BITMAP
+0A
+0A
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0035
+ENCODING 53
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -4
+BITMAP
+0A00
+0A00
+0000
+0000
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+ENDCHAR
+STARTCHAR 0x0036
+ENCODING 54
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 15 0 -4
+BITMAP
+0A
+0A
+00
+0A
+0A
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0037
+ENCODING 55
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 15 1 -4
+BITMAP
+0A00
+0A00
+0000
+0A00
+0A00
+0000
+0000
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+ENDCHAR
+STARTCHAR 0x0038
+ENCODING 56
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 11 0 -5
+BITMAP
+0040
+0040
+0000
+0004
+4124
+8124
+81FC
+8100
+4200
+3C10
+0010
+ENDCHAR
+STARTCHAR 0x0039
+ENCODING 57
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 1 -5
+BITMAP
+0040
+0040
+0000
+0004
+4124
+8124
+81FE
+8100
+4200
+3C10
+0010
+ENDCHAR
+STARTCHAR 0x003A
+ENCODING 58
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 0 -5
+BITMAP
+0800
+0800
+0000
+0080
+2480
+2480
+FF80
+0000
+0000
+0200
+0200
+ENDCHAR
+STARTCHAR 0x003B
+ENCODING 59
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 0 -5
+BITMAP
+0800
+0800
+0000
+0080
+2480
+2480
+FFC0
+0000
+0000
+0200
+0200
+ENDCHAR
+STARTCHAR 0x003C
+ENCODING 60
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 11 0 -8
+BITMAP
+0004
+4124
+8124
+81FC
+8100
+4200
+3C28
+0028
+0000
+0010
+0010
+ENDCHAR
+STARTCHAR 0x003D
+ENCODING 61
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 10 1 -7
+BITMAP
+0004
+4124
+8124
+81FE
+8100
+4250
+3C50
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x003E
+ENCODING 62
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 0 -7
+BITMAP
+0080
+2480
+2480
+FF80
+0000
+0A00
+0A00
+0000
+0400
+0400
+ENDCHAR
+STARTCHAR 0x003F
+ENCODING 63
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 10 0 -7
+BITMAP
+0080
+2480
+2480
+FFC0
+0000
+0A00
+0A00
+0000
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0040
+ENCODING 64
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 17 0 -8
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0004
+4124
+8124
+81FC
+8100
+4200
+3C28
+0028
+0000
+0010
+0010
+ENDCHAR
+STARTCHAR 0x0041
+ENCODING 65
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 16 1 -7
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0004
+4124
+8124
+81FE
+8100
+4250
+3C50
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x0042
+ENCODING 66
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 0 -7
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0080
+2480
+2480
+FF80
+0000
+0A00
+0A00
+0000
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0043
+ENCODING 67
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 16 0 -7
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0080
+2480
+2480
+FFC0
+0000
+0A00
+0A00
+0000
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0044
+ENCODING 68
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 7 0 -4
+BITMAP
+000380
+410C40
+811020
+81FFE0
+810000
+420500
+3C0500
+ENDCHAR
+STARTCHAR 0x0045
+ENCODING 69
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 7 1 -4
+BITMAP
+000380
+410C40
+811020
+81FFF0
+810000
+420A00
+3C0A00
+ENDCHAR
+STARTCHAR 0x0046
+ENCODING 70
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 7 0 -4
+BITMAP
+0038
+10C4
+1102
+EFFE
+0000
+00A0
+00A0
+ENDCHAR
+STARTCHAR 0x0047
+ENCODING 71
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 7 0 -4
+BITMAP
+0038
+10C4
+1102
+EFFF
+0000
+00A0
+00A0
+ENDCHAR
+STARTCHAR 0x0048
+ENCODING 72
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 14 0 -4
+BITMAP
+000400
+000400
+000000
+000A00
+000A00
+000000
+000000
+000380
+410C40
+811020
+81FFE0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0x0049
+ENCODING 73
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 14 1 -4
+BITMAP
+000400
+000400
+000000
+000A00
+000A00
+000000
+000000
+000380
+410C40
+811020
+81FFF0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0x004A
+ENCODING 74
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 0 -1
+BITMAP
+0040
+0040
+0000
+00A0
+00A0
+0000
+0000
+0038
+10C4
+1102
+EFFE
+ENDCHAR
+STARTCHAR 0x004B
+ENCODING 75
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 11 0 -1
+BITMAP
+0040
+0040
+0000
+00A0
+00A0
+0000
+0000
+0038
+10C4
+1102
+EFFF
+ENDCHAR
+STARTCHAR 0x004C
+ENCODING 76
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 -1
+BITMAP
+1000
+1100
+1900
+1000
+1280
+1280
+1000
+1380
+1440
+1840
+1040
+FF80
+ENDCHAR
+STARTCHAR 0x004D
+ENCODING 77
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 -1
+BITMAP
+1000
+1100
+1900
+1000
+1280
+1280
+1000
+1380
+1440
+1840
+1040
+FFF0
+ENDCHAR
+STARTCHAR 0x004E
+ENCODING 78
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 0 -1
+BITMAP
+2000
+2200
+3200
+2000
+2500
+2500
+2000
+2700
+2880
+3080
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x004F
+ENCODING 79
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 -1
+BITMAP
+2000
+2200
+3200
+2000
+2500
+2500
+2000
+2700
+2880
+3080
+2080
+FFE0
+ENDCHAR
+STARTCHAR 0x0050
+ENCODING 80
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 18 0 -5
+BITMAP
+10
+10
+00
+28
+28
+00
+00
+38
+40
+40
+38
+60
+40
+80
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0x0051
+ENCODING 81
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 15 1 -5
+BITMAP
+20
+20
+00
+50
+50
+00
+70
+78
+38
+70
+8F
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0x0052
+ENCODING 82
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 -1
+BITMAP
+08
+08
+00
+14
+14
+00
+1C
+22
+20
+10
+FF
+ENDCHAR
+STARTCHAR 0x0053
+ENCODING 83
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 11 0 -1
+BITMAP
+10
+10
+00
+28
+28
+00
+38
+3C
+1C
+18
+E7
+ENDCHAR
+STARTCHAR 0x0054
+ENCODING 84
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 7 0 -1
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0x0055
+ENCODING 85
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 7 1 -1
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FFC
+ENDCHAR
+STARTCHAR 0x0056
+ENCODING 86
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 0 -1
+BITMAP
+30
+58
+48
+58
+28
+08
+F0
+ENDCHAR
+STARTCHAR 0x0057
+ENCODING 87
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 7 0 -1
+BITMAP
+30
+58
+48
+58
+28
+08
+FC
+ENDCHAR
+STARTCHAR 0x0058
+ENCODING 88
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 10 0 -4
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x0059
+ENCODING 89
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 10 1 -4
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FFC
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x005A
+ENCODING 90
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -4
+BITMAP
+30
+58
+48
+58
+28
+08
+F0
+00
+20
+20
+ENDCHAR
+STARTCHAR 0x005B
+ENCODING 91
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 10 0 -4
+BITMAP
+30
+58
+48
+58
+28
+08
+FC
+00
+20
+20
+ENDCHAR
+STARTCHAR 0x005C
+ENCODING 92
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 14 0 -4
+BITMAP
+0020
+0020
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+0000
+0100
+0100
+ENDCHAR
+STARTCHAR 0x005D
+ENCODING 93
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -4
+BITMAP
+0020
+0020
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FFC
+0000
+0080
+0080
+ENDCHAR
+STARTCHAR 0x005E
+ENCODING 94
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 0 -4
+BITMAP
+20
+20
+00
+00
+30
+58
+48
+58
+28
+08
+F0
+00
+80
+80
+ENDCHAR
+STARTCHAR 0x005F
+ENCODING 95
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 0 -4
+BITMAP
+20
+20
+00
+00
+30
+58
+48
+58
+28
+08
+FC
+00
+80
+80
+ENDCHAR
+STARTCHAR 0x0060
+ENCODING 96
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 0 -7
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+0000
+0050
+0050
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x0061
+ENCODING 97
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 1 -7
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FFC
+0000
+0050
+0050
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x0062
+ENCODING 98
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 0 -7
+BITMAP
+30
+58
+48
+58
+28
+08
+F0
+00
+50
+50
+00
+20
+20
+ENDCHAR
+STARTCHAR 0x0063
+ENCODING 99
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 13 0 -7
+BITMAP
+30
+58
+48
+58
+28
+08
+FC
+00
+50
+50
+00
+20
+20
+ENDCHAR
+STARTCHAR 0x0064
+ENCODING 100
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 0 -4
+BITMAP
+04
+04
+00
+00
+06
+0B
+09
+0B
+85
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x0065
+ENCODING 101
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -4
+BITMAP
+0400
+0400
+0000
+0000
+0600
+0B00
+0900
+0B00
+85C0
+8160
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x0066
+ENCODING 102
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -1
+BITMAP
+20
+20
+00
+00
+30
+58
+48
+58
+28
+F0
+ENDCHAR
+STARTCHAR 0x0067
+ENCODING 103
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 10 0 -1
+BITMAP
+20
+20
+00
+00
+30
+58
+48
+58
+28
+FC
+ENDCHAR
+STARTCHAR 0x0068
+ENCODING 104
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 16 0 -4
+BITMAP
+04
+04
+00
+0A
+0A
+00
+00
+06
+0B
+09
+0B
+85
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x0069
+ENCODING 105
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 -4
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0000
+0600
+0B00
+0900
+0B00
+85C0
+8160
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x006A
+ENCODING 106
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 0 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+30
+58
+48
+58
+28
+F0
+ENDCHAR
+STARTCHAR 0x006B
+ENCODING 107
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 13 0 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+30
+58
+48
+58
+28
+FC
+ENDCHAR
+STARTCHAR 0x006C
+ENCODING 108
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 8 0 -1
+BITMAP
+0600
+1800
+2000
+2000
+1FF8
+0004
+8004
+7FF8
+ENDCHAR
+STARTCHAR 0x006D
+ENCODING 109
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 8 1 -1
+BITMAP
+0600
+1800
+2000
+2000
+1FF8
+0004
+8004
+7FFB
+ENDCHAR
+STARTCHAR 0x006E
+ENCODING 110
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 8 0 -1
+BITMAP
+0600
+1800
+2000
+2000
+1FF8
+0004
+0004
+FFF8
+ENDCHAR
+STARTCHAR 0x006F
+ENCODING 111
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 8 0 -1
+BITMAP
+0600
+1800
+2000
+2000
+1FF8
+0004
+0004
+FFFB
+ENDCHAR
+STARTCHAR 0x0070
+ENCODING 112
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 12 0 -1
+BITMAP
+0006
+001C
+0074
+0094
+0088
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x0071
+ENCODING 113
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 12 1 -1
+BITMAP
+0006
+001C
+0074
+0094
+0088
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+ENDCHAR
+STARTCHAR 0x0072
+ENCODING 114
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 12 0 -1
+BITMAP
+0180
+0700
+1D00
+2500
+2200
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0x0073
+ENCODING 115
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 12 0 -1
+BITMAP
+0180
+0700
+1D00
+2500
+2200
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0x0074
+ENCODING 116
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 -1
+BITMAP
+0200
+0200
+0000
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+ENDCHAR
+STARTCHAR 0x0075
+ENCODING 117
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 15 1 -1
+BITMAP
+0200
+0200
+0000
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+40E0
+3F30
+ENDCHAR
+STARTCHAR 0x0076
+ENCODING 118
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 14 0 -1
+BITMAP
+0800
+0800
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0x0077
+ENCODING 119
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 14 0 -1
+BITMAP
+0800
+0800
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0x0078
+ENCODING 120
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 18 0 -7
+BITMAP
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+0000
+1400
+1400
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0x0079
+ENCODING 121
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 18 1 -7
+BITMAP
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+40E0
+3F30
+0000
+1400
+1400
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0x007A
+ENCODING 122
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 18 0 -7
+BITMAP
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+0000
+5000
+5000
+0000
+2000
+2000
+ENDCHAR
+STARTCHAR 0x007B
+ENCODING 123
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 18 0 -7
+BITMAP
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+0000
+5000
+5000
+0000
+2000
+2000
+ENDCHAR
+STARTCHAR 0x007C
+ENCODING 124
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 0 -1
+BITMAP
+0006
+0018
+0066
+009C
+0074
+0094
+0088
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x007D
+ENCODING 125
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 14 1 -1
+BITMAP
+0006
+0018
+0066
+009C
+0074
+0094
+0088
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+ENDCHAR
+STARTCHAR 0x007E
+ENCODING 126
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 14 0 -1
+BITMAP
+0180
+0600
+1980
+2700
+1D00
+2500
+2200
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0x007F
+ENCODING 127
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 14 0 -1
+BITMAP
+0180
+0600
+1980
+2700
+1D00
+2500
+2200
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0x0080
+ENCODING 128
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 17 0 -4
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+0000
+0A00
+0A00
+ENDCHAR
+STARTCHAR 0x0081
+ENCODING 129
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 17 1 -4
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+0000
+0A00
+0A00
+ENDCHAR
+STARTCHAR 0x0082
+ENCODING 130
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 17 0 -4
+BITMAP
+0180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+0000
+5000
+5000
+ENDCHAR
+STARTCHAR 0x0083
+ENCODING 131
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 17 0 -4
+BITMAP
+0180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+0000
+5000
+5000
+ENDCHAR
+STARTCHAR 0x0084
+ENCODING 132
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 18 0 -1
+BITMAP
+0040
+0040
+0010
+0050
+0046
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x0085
+ENCODING 133
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 18 1 -1
+BITMAP
+0040
+0040
+0010
+0050
+0046
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+ENDCHAR
+STARTCHAR 0x0086
+ENCODING 134
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 18 0 -1
+BITMAP
+1000
+1000
+0400
+1400
+1180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0x0087
+ENCODING 135
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 18 0 -1
+BITMAP
+1000
+1000
+0400
+1400
+1180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0x0088
+ENCODING 136
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 16 0 -3
+BITMAP
+09
+06
+00
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x0089
+ENCODING 137
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 1 -3
+BITMAP
+0900
+0600
+0000
+0200
+0200
+0300
+0200
+0200
+0200
+0200
+0200
+8200
+8380
+82C0
+4400
+3800
+ENDCHAR
+STARTCHAR 0x008A
+ENCODING 138
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 14 0 -1
+BITMAP
+90
+60
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0x008B
+ENCODING 139
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 14 0 -1
+BITMAP
+90
+60
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+D8
+ENDCHAR
+STARTCHAR 0x008C
+ENCODING 140
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 17 0 -3
+BITMAP
+02
+02
+00
+00
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x008D
+ENCODING 141
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 17 1 -3
+BITMAP
+0200
+0200
+0000
+0000
+0200
+0200
+0300
+0200
+0200
+0200
+0200
+0200
+8200
+8380
+82C0
+4400
+3800
+ENDCHAR
+STARTCHAR 0x008E
+ENCODING 142
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 15 0 -1
+BITMAP
+20
+20
+00
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0x008F
+ENCODING 143
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 15 0 -1
+BITMAP
+20
+20
+00
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+D8
+ENDCHAR
+STARTCHAR 0x0090
+ENCODING 144
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 20 0 -3
+BITMAP
+02
+02
+00
+05
+05
+00
+00
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x0091
+ENCODING 145
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 20 1 -3
+BITMAP
+0200
+0200
+0000
+0500
+0500
+0000
+0000
+0200
+0200
+0300
+0200
+0200
+0200
+0200
+0200
+8200
+8380
+82C0
+4400
+3800
+ENDCHAR
+STARTCHAR 0x0092
+ENCODING 146
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 18 0 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0x0093
+ENCODING 147
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 18 0 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+D8
+ENDCHAR
+STARTCHAR 0x0094
+ENCODING 148
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 12 1 -5
+BITMAP
+10
+10
+00
+02
+02
+41
+81
+81
+82
+86
+7D
+07
+ENDCHAR
+STARTCHAR 0x0095
+ENCODING 149
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 -5
+BITMAP
+1000
+1000
+0000
+0200
+0200
+4100
+8180
+8140
+8200
+8600
+7D00
+0700
+ENDCHAR
+STARTCHAR 0x0096
+ENCODING 150
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 0 -4
+BITMAP
+10
+10
+00
+10
+08
+08
+08
+08
+F0
+60
+90
+60
+ENDCHAR
+STARTCHAR 0x0097
+ENCODING 151
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 -4
+BITMAP
+20
+20
+00
+20
+20
+10
+10
+10
+FE
+60
+90
+60
+ENDCHAR
+STARTCHAR 0x0098
+ENCODING 152
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 14 1 -4
+BITMAP
+10
+10
+00
+28
+28
+00
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0x0099
+ENCODING 153
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 1 -4
+BITMAP
+1000
+1000
+0000
+2800
+2800
+0000
+0200
+0200
+4100
+8180
+8140
+8200
+8600
+7800
+ENDCHAR
+STARTCHAR 0x009A
+ENCODING 154
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 0 -1
+BITMAP
+10
+10
+00
+28
+28
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0x009B
+ENCODING 155
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0x009C
+ENCODING 156
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 11 1 0
+BITMAP
+30
+40
+30
+40
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x009D
+ENCODING 157
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 -1
+BITMAP
+18
+20
+18
+20
+00
+10
+30
+50
+90
+90
+70
+10
+0C
+ENDCHAR
+STARTCHAR 0x009E
+ENCODING 158
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 11 1 0
+BITMAP
+30
+40
+30
+40
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x009F
+ENCODING 159
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+18
+20
+18
+20
+00
+00
+30
+78
+8C
+04
+ENDCHAR
+STARTCHAR 0x00A0
+ENCODING 160
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 10 1 0
+BITMAP
+50
+50
+00
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x00A1
+ENCODING 161
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 8 1 0
+BITMAP
+28
+28
+00
+00
+30
+78
+8C
+04
+ENDCHAR
+STARTCHAR 0x00A2
+ENCODING 162
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 8 0 -3
+BITMAP
+04
+0A
+0A
+0E
+12
+2A
+9C
+78
+ENDCHAR
+STARTCHAR 0x00A3
+ENCODING 163
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 8 1 -3
+BITMAP
+0400
+0A00
+0A00
+0E00
+1300
+2A80
+9C00
+7800
+ENDCHAR
+STARTCHAR 0x00A4
+ENCODING 164
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 0 -3
+BITMAP
+0A
+0A
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x00A5
+ENCODING 165
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -3
+BITMAP
+0A00
+0A00
+0000
+0000
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0x00A6
+ENCODING 166
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 8 0 -3
+BITMAP
+0070
+1080
+3100
+61C0
+A020
+2020
+20C0
+1F00
+ENDCHAR
+STARTCHAR 0x00A7
+ENCODING 167
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 6 1 -5
+BITMAP
+1000
+3070
+60C0
+A020
+20C0
+1F00
+ENDCHAR
+STARTCHAR 0x00A8
+ENCODING 168
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 10 0 -3
+BITMAP
+2400
+1800
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x00A9
+ENCODING 169
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 -5
+BITMAP
+2400
+1800
+41C0
+8300
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x00AA
+ENCODING 170
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 0 -1
+BITMAP
+48
+30
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0x00AB
+ENCODING 171
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 0 -1
+BITMAP
+90
+60
+00
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0x00AC
+ENCODING 172
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 0 -9
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+0000
+2800
+2800
+0000
+1000
+1000
+ENDCHAR
+STARTCHAR 0x00AD
+ENCODING 173
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 -9
+BITMAP
+41C0
+8300
+8080
+8300
+7C00
+0000
+6C00
+0000
+3000
+ENDCHAR
+STARTCHAR 0x00AE
+ENCODING 174
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 0 -7
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+50
+50
+00
+20
+20
+ENDCHAR
+STARTCHAR 0x00AF
+ENCODING 175
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 -7
+BITMAP
+20
+20
+10
+10
+10
+FE
+00
+28
+28
+00
+10
+10
+ENDCHAR
+STARTCHAR 0x00B0
+ENCODING 176
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 6 0 -1
+BITMAP
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0x00B1
+ENCODING 177
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 6 0 -1
+BITMAP
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0x00B2
+ENCODING 178
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 13 -1 -3
+BITMAP
+1000
+28C0
+1100
+28C0
+4100
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0x00D0
+ENCODING 208
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -1
+BITMAP
+12
+0C
+00
+04
+06
+04
+C4
+E4
+28
+18
+18
+18
+28
+48
+70
+ENDCHAR
+STARTCHAR 0x00D1
+ENCODING 209
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 -2
+BITMAP
+0900
+0600
+0000
+0200
+0200
+0300
+6200
+7200
+1200
+1200
+0A00
+0A00
+0D00
+1900
+70E0
+C000
+ENDCHAR
+STARTCHAR 0x00D2
+ENCODING 210
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 -1
+BITMAP
+04
+04
+00
+00
+04
+06
+04
+C4
+E4
+28
+18
+18
+18
+28
+48
+70
+ENDCHAR
+STARTCHAR 0x00D3
+ENCODING 211
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 1 -2
+BITMAP
+0200
+0200
+0000
+0000
+0200
+0200
+0300
+6200
+7200
+1200
+1200
+0A00
+0A00
+0D00
+1900
+70E0
+C000
+ENDCHAR
+STARTCHAR 0x00D4
+ENCODING 212
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 18 1 -1
+BITMAP
+04
+04
+00
+0A
+0A
+00
+04
+06
+04
+C4
+E4
+28
+18
+18
+18
+28
+48
+70
+ENDCHAR
+STARTCHAR 0x00D5
+ENCODING 213
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 19 1 -2
+BITMAP
+0200
+0200
+0000
+0500
+0500
+0000
+0200
+0200
+0300
+6200
+7200
+1200
+1200
+0A00
+0A00
+0D00
+1900
+70E0
+C000
+ENDCHAR
+STARTCHAR 0x00F0
+ENCODING 240
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 19 14 1 -4
+BITMAP
+028000
+028000
+02C000
+028000
+028000
+028000
+028840
+028460
+828420
+828420
+827820
+440040
+3858C0
+005780
+ENDCHAR
+STARTCHAR 0x00F4
+ENCODING 244
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 10 2 0
+BITMAP
+B9
+EE
+E4
+60
+60
+20
+30
+10
+10
+10
+ENDCHAR
+ENDFONT
diff --git a/xc/extras/fonts/ClearlyU/cu-lig12.bdf b/xc/extras/fonts/ClearlyU/cu-lig12.bdf
new file mode 100644
index 000000000..8cd36b93d
--- /dev/null
+++ b/xc/extras/fonts/ClearlyU/cu-lig12.bdf
@@ -0,0 +1,1214 @@
+STARTFONT 2.1
+COMMENT
+COMMENT From: Id: cu-lig12.bdf,v 1.4 1999/04/22 18:39:51 mleisher Exp $
+COMMENT
+COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State
+COMMENT University
+COMMENT
+COMMENT Permission is hereby granted, free of charge, to any person
+COMMENT obtaining a copy of this software and associated documentation
+COMMENT files (the "Software"), to deal in the Software without
+COMMENT restriction, including without limitation the rights to use,
+COMMENT copy, modify, merge, publish, distribute, sublicense, and/or
+COMMENT sell copies of the Software, and to permit persons to whom the
+COMMENT Software is furnished to do so, subject to the following
+COMMENT conditions:
+COMMENT
+COMMENT The above copyright notice and this permission notice shall be
+COMMENT included in all copies or substantial portions of the Software.
+COMMENT
+COMMENT THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+COMMENT EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+COMMENT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+COMMENT NONINFRINGEMENT. IN NO EVENT SHALL THE COMPUTING RESEARCH LAB
+COMMENT OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY CLAIM, DAMAGES
+COMMENT OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+COMMENT OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+COMMENT SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+COMMENT
+COMMENT This ligature font contains contextual shapes and ligatures that are
+COMMENT not encoded in Unicode but are useful for text presentation.
+COMMENT
+COMMENT The ligature font is broken into groups of 64 codepoints
+COMMENT each for non-Arabic glyphs. Starting at encoding 0, the groups
+COMMENT are:
+COMMENT
+COMMENT Group 1: Latin ligatures.
+COMMENT Group 2: Armenian ligatures.
+COMMENT Group 3: Georgian Mxedruli ligatures.
+COMMENT Group 4: Arabic contextual shapes and ligatures.
+COMMENT
+FONT -MUTT-ClearlyU Ligature-Medium-R-Normal--17-120-100-100-P-141-FontSpecific-0
+SIZE 12 100 100
+FONTBOUNDINGBOX 23 19 0 -6
+STARTPROPERTIES 21
+COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University."
+POINT_SIZE 120
+PIXEL_SIZE 17
+RESOLUTION_X 100
+RESOLUTION_Y 100
+FONT_ASCENT 13
+FONT_DESCENT 4
+AVERAGE_WIDTH 141
+SPACING "P"
+FOUNDRY "MUTT"
+FAMILY_NAME "ClearlyU Ligature"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+CHARSET_REGISTRY "FontSpecific"
+CHARSET_ENCODING "0"
+_XMBDFED_INFO "Edited with xmbdfed 3.5."
+CAP_HEIGHT 11
+X_HEIGHT 7
+_XFREE86_GLYPH_RANGES "0_5 7 64_66 128_174"
+ENDPROPERTIES
+CHARS 57
+STARTCHAR 0x0000
+ENCODING 0
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 8 15 0 -3
+BITMAP
+1C
+24
+20
+20
+20
+FC
+2C
+24
+24
+24
+24
+7E
+04
+09
+06
+ENDCHAR
+STARTCHAR 0x0001
+ENCODING 1
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 13 15 0 -3
+BITMAP
+0EE0
+1320
+2200
+2200
+2200
+FFE0
+2260
+2220
+2220
+2220
+2220
+7770
+0020
+0048
+0030
+ENDCHAR
+STARTCHAR 0x0002
+ENCODING 2
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 12 0 0
+BITMAP
+1E00
+2200
+2200
+2280
+2300
+FE00
+2600
+2A00
+2200
+2200
+2200
+7700
+ENDCHAR
+STARTCHAR 0x0003
+ENCODING 3
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 13 12 0 0
+BITMAP
+0EE0
+1120
+2220
+2228
+2230
+FFE0
+2260
+22A0
+2220
+2220
+2220
+7770
+ENDCHAR
+STARTCHAR 0x0004
+ENCODING 4
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 0 -4
+BITMAP
+1C
+24
+20
+20
+20
+FC
+2C
+24
+24
+24
+24
+74
+04
+04
+24
+38
+ENDCHAR
+STARTCHAR 0x0005
+ENCODING 5
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 0 -4
+BITMAP
+0EE0
+1320
+2200
+2200
+2200
+FFE0
+2260
+2220
+2220
+2220
+2220
+7720
+0020
+0020
+0120
+01C0
+ENDCHAR
+STARTCHAR 0x0007
+ENCODING 7
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+1E00
+2100
+2080
+2080
+1180
+7BE0
+8880
+8080
+8080
+8090
+8890
+7060
+ENDCHAR
+STARTCHAR 0x0040
+ENCODING 64
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+0380
+0480
+0480
+0480
+C4E0
+4480
+4480
+4480
+4480
+4CC0
+3420
+0020
+0020
+00C0
+ENDCHAR
+STARTCHAR 0x0041
+ENCODING 65
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -3
+BITMAP
+0380
+0480
+0480
+0480
+C498
+4488
+4488
+4488
+4488
+4C98
+3468
+0008
+0008
+001C
+ENDCHAR
+STARTCHAR 0x0042
+ENCODING 66
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 14 14 1 -3
+BITMAP
+0380
+0480
+04B0
+04C8
+C488
+4488
+4488
+4488
+4488
+4C88
+3488
+0008
+0008
+001C
+ENDCHAR
+STARTCHAR 0x0080
+ENCODING 128
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+00E0
+0110
+1E10
+2010
+2010
+20F0
+1910
+4510
+8510
+8510
+78E0
+ENDCHAR
+STARTCHAR 0x0081
+ENCODING 129
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+00FC
+0708
+1830
+2040
+20EE
+2111
+1911
+4539
+8501
+8501
+7882
+ENDCHAR
+STARTCHAR 0x0082
+ENCODING 130
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+0300
+0500
+1900
+2120
+2140
+2160
+1910
+4510
+8510
+8510
+78E0
+ENDCHAR
+STARTCHAR 0x0083
+ENCODING 131
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 1 -4
+BITMAP
+0020
+0060
+00A0
+0720
+1820
+2020
+2020
+20E0
+1920
+4520
+8420
+8420
+7920
+0220
+0220
+0220
+01C0
+ENDCHAR
+STARTCHAR 0x0084
+ENCODING 132
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 1 0
+BITMAP
+36
+49
+22
+1C
+20
+20
+20
+18
+44
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x0085
+ENCODING 133
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+0300
+0500
+1900
+2120
+2140
+21E0
+1990
+4510
+8510
+8510
+78E0
+ENDCHAR
+STARTCHAR 0x0086
+ENCODING 134
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 -3
+BITMAP
+0400
+0400
+0200
+0A00
+0C00
+0800
+7F00
+8880
+8880
+8880
+8880
+4700
+2000
+D800
+8400
+0200
+ENDCHAR
+STARTCHAR 0x0087
+ENCODING 135
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 1 -4
+BITMAP
+71DC
+8A22
+CA22
+0A22
+0A22
+091C
+0880
+0B60
+0A10
+0A08
+0400
+ENDCHAR
+STARTCHAR 0x0088
+ENCODING 136
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 15 1 -4
+BITMAP
+0700
+0880
+0880
+0480
+7280
+8AF8
+CA84
+0A84
+0A84
+0A84
+0A78
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x0089
+ENCODING 137
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 11 1 -4
+BITMAP
+71DDC0
+8A2220
+CA2220
+0A2220
+0A7720
+090040
+08E000
+0B1C00
+0A0300
+0A0080
+040000
+ENDCHAR
+STARTCHAR 0x008A
+ENCODING 138
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 15 1 -4
+BITMAP
+0048
+00B0
+0080
+0080
+7080
+89F0
+CA88
+0A88
+0A88
+0A88
+0A70
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x008B
+ENCODING 139
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 -4
+BITMAP
+0100
+0080
+0040
+0020
+0020
+7020
+88C0
+C820
+0B20
+0A20
+0A20
+0BC0
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x008C
+ENCODING 140
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 15 1 -4
+BITMAP
+0100
+0280
+0280
+0290
+72A0
+8AB0
+CA88
+0A88
+0A88
+0A88
+0A70
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x008D
+ENCODING 141
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 15 1 -4
+BITMAP
+0009
+0016
+0010
+0010
+7210
+8A3E
+CA51
+0E51
+7A51
+8A51
+4A4E
+8A40
+8A40
+8A40
+7180
+ENDCHAR
+STARTCHAR 0x008E
+ENCODING 142
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 15 1 -4
+BITMAP
+0100
+0280
+0280
+0290
+72A0
+8AF0
+CAC8
+0A88
+0A88
+0A88
+0A70
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x008F
+ENCODING 143
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 -4
+BITMAP
+0100
+7100
+8880
+C860
+0910
+3210
+0A10
+0BE0
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x0090
+ENCODING 144
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 18 15 1 -4
+BITMAP
+000C00
+001400
+006400
+008480
+708500
+888580
+C86440
+091440
+321440
+0A1440
+0BE380
+0A0000
+0A0000
+0A0000
+040000
+ENDCHAR
+STARTCHAR 0x0091
+ENCODING 145
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -6
+BITMAP
+71C0
+8A20
+CB20
+0920
+3120
+0920
+0920
+0920
+0920
+0920
+6620
+4040
+3F80
+ENDCHAR
+STARTCHAR 0x0092
+ENCODING 146
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 11 1 -4
+BITMAP
+71DDC0
+8A2220
+CA2220
+0A2220
+327720
+090040
+08E000
+0B1C00
+0A0300
+0A0080
+040000
+ENDCHAR
+STARTCHAR 0x0093
+ENCODING 147
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 17 1 -4
+BITMAP
+0700
+0500
+18C0
+1040
+18C0
+0400
+7200
+8A00
+CA00
+0A00
+3200
+0A00
+0A00
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x0094
+ENCODING 148
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 1 -4
+BITMAP
+71DC
+8A22
+CA22
+0A22
+3272
+0904
+08C0
+0B30
+0A08
+0A04
+0400
+ENDCHAR
+STARTCHAR 0x0095
+ENCODING 149
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 15 1 -4
+BITMAP
+0100
+0280
+0280
+0290
+72A0
+8AF0
+CAC8
+0A88
+3288
+0A88
+0A70
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x0096
+ENCODING 150
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+0020
+0050
+0050
+0052
+3354
+4CD6
+8451
+8451
+8451
+4891
+310E
+ENDCHAR
+STARTCHAR 0x0097
+ENCODING 151
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+0020
+0050
+0050
+0052
+3354
+4CDE
+8459
+8451
+8451
+4891
+310E
+ENDCHAR
+STARTCHAR 0x0098
+ENCODING 152
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+0200
+0500
+0500
+0520
+7540
+8D60
+8510
+8510
+8510
+8510
+48E0
+ENDCHAR
+STARTCHAR 0x0099
+ENCODING 153
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+0200
+0500
+0500
+0520
+7540
+8DE0
+8590
+8510
+8510
+8510
+48E0
+ENDCHAR
+STARTCHAR 0x009A
+ENCODING 154
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 -4
+BITMAP
+38C0
+4520
+6520
+0540
+1980
+0700
+0D00
+1500
+9500
+A500
+4200
+ENDCHAR
+STARTCHAR 0x009B
+ENCODING 155
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 16 1 -4
+BITMAP
+0040
+00F0
+0088
+0088
+0088
+4488
+2A9C
+2AA2
+2AA2
+CAA2
+2AA2
+2A9C
+2A80
+2A80
+2A80
+1100
+ENDCHAR
+STARTCHAR 0x009C
+ENCODING 156
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 -4
+BITMAP
+0120
+02C0
+0200
+0200
+4200
+27C0
+2A20
+2A20
+CA20
+2A20
+29C0
+2800
+2800
+2800
+1000
+ENDCHAR
+STARTCHAR 0x009D
+ENCODING 157
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 -4
+BITMAP
+0400
+0A00
+0A00
+0A40
+4A80
+2AC0
+2A20
+2A20
+CA20
+2A20
+29C0
+2800
+2800
+2800
+1000
+ENDCHAR
+STARTCHAR 0x009E
+ENCODING 158
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 12 1 -4
+BITMAP
+0020
+1220
+0A10
+0A0C
+0A22
+3242
+0A42
+7E7C
+8A40
+4A40
+8A40
+7180
+ENDCHAR
+STARTCHAR 0x009F
+ENCODING 159
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 15 1 -4
+BITMAP
+0009
+0016
+0010
+0010
+1210
+0A3E
+0A51
+0A51
+3251
+0A51
+7E4E
+8A40
+4A40
+8A40
+7180
+ENDCHAR
+STARTCHAR 0x00A0
+ENCODING 160
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 14 1 -3
+BITMAP
+000400
+000A00
+000A00
+000A40
+777A80
+888AC0
+888A20
+888A20
+9DCA20
+401220
+3801C0
+C70000
+80C000
+002000
+ENDCHAR
+STARTCHAR 0x00A1
+ENCODING 161
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+7000
+8800
+8800
+0800
+0B60
+7C90
+8800
+8800
+8800
+8800
+7000
+ENDCHAR
+STARTCHAR 0x00A2
+ENCODING 162
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 12 1 -4
+BITMAP
+0020
+9620
+E910
+090C
+1D22
+0142
+0142
+017C
+0140
+0140
+0140
+0080
+ENDCHAR
+STARTCHAR 0x00A3
+ENCODING 163
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 12 1 0
+BITMAP
+0200
+0200
+0400
+1800
+2000
+7700
+8880
+88B6
+9CC9
+8080
+8080
+4100
+ENDCHAR
+STARTCHAR 0x00A4
+ENCODING 164
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 1 0
+BITMAP
+0080
+6080
+A040
+2030
+2608
+2908
+2D08
+22F0
+2200
+2200
+2200
+1C00
+ENDCHAR
+STARTCHAR 0x00A5
+ENCODING 165
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 11 1 0
+BITMAP
+6100
+A280
+2280
+2490
+28A0
+2CB0
+2288
+2288
+2288
+2288
+1C70
+ENDCHAR
+STARTCHAR 0x00A6
+ENCODING 166
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 1 -6
+BITMAP
+9638
+E944
+0964
+1D24
+0124
+0124
+0124
+0124
+0124
+0124
+0CC4
+0808
+07F0
+ENDCHAR
+STARTCHAR 0x00A7
+ENCODING 167
+SWIDTH 1380 0
+DWIDTH 23 0
+BBX 22 11 1 -4
+BITMAP
+963BB8
+E94444
+094444
+1D4444
+014EE4
+012008
+011C00
+016380
+014060
+014010
+008000
+ENDCHAR
+STARTCHAR 0x00A8
+ENCODING 168
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 1 -6
+BITMAP
+6C70
+9288
+92C8
+9248
+6248
+0C48
+0248
+0248
+0248
+0248
+1988
+1010
+0FE0
+ENDCHAR
+STARTCHAR 0x00A9
+ENCODING 169
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 1 -6
+BITMAP
+6C70
+9288
+9288
+9288
+62B0
+0C88
+0288
+0288
+0288
+0288
+1908
+1010
+0FE0
+ENDCHAR
+STARTCHAR 0x00AA
+ENCODING 170
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 -4
+BITMAP
+0100
+4900
+8880
+8860
+9910
+6A10
+0A10
+0BE0
+0A00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x00AB
+ENCODING 171
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 1 -4
+BITMAP
+49DC
+8A22
+8A22
+9A22
+6A22
+091C
+0880
+0B60
+0A10
+0A08
+0400
+ENDCHAR
+STARTCHAR 0x00AC
+ENCODING 172
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 12 1 -4
+BITMAP
+0020
+4A20
+8A10
+8A0C
+9A22
+6A42
+0A42
+7E7C
+8A40
+4A40
+8A40
+7180
+ENDCHAR
+STARTCHAR 0x00AD
+ENCODING 173
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 15 1 -4
+BITMAP
+0009
+0016
+0010
+0010
+4A10
+8A3E
+8A51
+9A51
+6A51
+0A51
+7E4E
+8A40
+4A40
+8A40
+7180
+ENDCHAR
+STARTCHAR 0x00AE
+ENCODING 174
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 1 0
+BITMAP
+6C00
+9200
+9200
+D200
+02D8
+1F24
+2200
+2200
+2200
+2200
+1C00
+ENDCHAR
+ENDFONT
diff --git a/xc/extras/fonts/ClearlyU/cu-pua12.bdf b/xc/extras/fonts/ClearlyU/cu-pua12.bdf
new file mode 100644
index 000000000..6215993bb
--- /dev/null
+++ b/xc/extras/fonts/ClearlyU/cu-pua12.bdf
@@ -0,0 +1,1098 @@
+STARTFONT 2.1
+COMMENT
+COMMENT From: Id: cu-pua12.bdf,v 1.5 1999/04/22 18:39:52 mleisher Exp $
+COMMENT
+COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State
+COMMENT University
+COMMENT
+COMMENT Permission is hereby granted, free of charge, to any person
+COMMENT obtaining a copy of this software and associated documentation
+COMMENT files (the "Software"), to deal in the Software without
+COMMENT restriction, including without limitation the rights to use,
+COMMENT copy, modify, merge, publish, distribute, sublicense, and/or
+COMMENT sell copies of the Software, and to permit persons to whom the
+COMMENT Software is furnished to do so, subject to the following
+COMMENT conditions:
+COMMENT
+COMMENT The above copyright notice and this permission notice shall be
+COMMENT included in all copies or substantial portions of the Software.
+COMMENT
+COMMENT THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+COMMENT EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+COMMENT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+COMMENT NONINFRINGEMENT. IN NO EVENT SHALL THE COMPUTING RESEARCH LAB
+COMMENT OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY CLAIM, DAMAGES
+COMMENT OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+COMMENT OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+COMMENT SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+COMMENT
+COMMENT This font contains a small set of glyphs that are not encoded in
+COMMENT Unicode. These glyphs are provided for two cases:
+COMMENT
+COMMENT 1. The glyph is convenient for rendering.
+COMMENT
+COMMENT 2. The glyph represents a character not encoded in Unicode, but is
+COMMENT used.
+COMMENT
+FONT -MUTT-ClearlyU PUA-Medium-R-Normal--17-120-100-100-P-111-ISO10646-1
+SIZE 12 100 100
+FONTBOUNDINGBOX 21 23 -5 -4
+STARTPROPERTIES 20
+COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University."
+POINT_SIZE 120
+PIXEL_SIZE 17
+RESOLUTION_X 100
+RESOLUTION_Y 100
+FONT_ASCENT 13
+FONT_DESCENT 4
+AVERAGE_WIDTH 111
+SPACING "P"
+FOUNDRY "MUTT"
+FAMILY_NAME "ClearlyU PUA"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+_XMBDFED_INFO "Edited with xmbdfed 3.8."
+DEFAULT_CHAR 65534
+_XFREE86_GLYPH_RANGES "57646_57647 57840 57908_57909 57951 58842 60909_60910 61638 61641 61687_61689 63696_63721 63728_63737 65533_65534"
+ENDPROPERTIES
+CHARS 52
+STARTCHAR C073
+ENCODING 57646
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 19 1 -3
+BITMAP
+10
+30
+20
+40
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+20
+48
+30
+ENDCHAR
+STARTCHAR 0x012F
+ENCODING 57647
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 4 15 1 -3
+BITMAP
+10
+30
+20
+40
+00
+C0
+40
+40
+40
+40
+40
+E0
+40
+90
+60
+ENDCHAR
+STARTCHAR 0xE1F0
+ENCODING 57840
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 2 0
+BITMAP
+44
+38
+10
+00
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0xE234
+ENCODING 57908
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 1 0
+BITMAP
+0900
+1500
+1200
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0xE235
+ENCODING 57909
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -4
+BITMAP
+12
+2A
+24
+00
+3E
+44
+44
+44
+78
+40
+7C
+82
+82
+82
+7C
+ENDCHAR
+STARTCHAR 0xE25F
+ENCODING 57951
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 10 0 -3
+BITMAP
+30
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0xE5DA
+ENCODING 58842
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -4
+BITMAP
+40
+FE
+04
+04
+74
+24
+04
+04
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0xEDED
+ENCODING 60909
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 12 19 -5 0
+BITMAP
+4000
+A000
+4400
+FC00
+0000
+2000
+5000
+5000
+2000
+0000
+01E0
+0310
+0290
+0110
+0010
+0010
+0010
+0010
+0010
+ENDCHAR
+STARTCHAR 0xEDEE
+ENCODING 60910
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 11 18 -4 0
+BITMAP
+4000
+4000
+4000
+0000
+4000
+A000
+A000
+4000
+0000
+03C0
+0620
+0520
+0220
+0020
+0020
+0020
+0020
+0020
+ENDCHAR
+STARTCHAR 0xF0C6
+ENCODING 61638
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+0E00
+0400
+0400
+3F80
+4440
+8420
+4440
+3F80
+0400
+0400
+0E00
+ENDCHAR
+STARTCHAR 0xF0C9
+ENCODING 61641
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+EE
+44
+4E
+40
+7C
+44
+44
+4E
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0xF0F7
+ENCODING 61687
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+C8
+08
+10
+20
+40
+80
+98
+88
+70
+ENDCHAR
+STARTCHAR 0xF0F8
+ENCODING 61688
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+30
+48
+40
+20
+18
+44
+84
+84
+78
+ENDCHAR
+STARTCHAR 0xF0F9
+ENCODING 61689
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -3
+BITMAP
+EE
+44
+4E
+40
+58
+64
+44
+44
+44
+4E
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0xF8D0
+ENCODING 63696
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -1
+BITMAP
+00FC
+01E0
+0180
+0380
+0780
+0780
+0FF0
+1F00
+3FE0
+7FF0
+FFF8
+0018
+000C
+0004
+ENDCHAR
+STARTCHAR 0xF8D1
+ENCODING 63697
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 14 1 -1
+BITMAP
+1878
+38C0
+7F80
+FF00
+7F00
+3300
+3300
+0100
+0100
+0180
+0080
+00C0
+0060
+0020
+ENDCHAR
+STARTCHAR 0xF8D2
+ENCODING 63698
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 1 -1
+BITMAP
+1804
+1808
+3C08
+3E08
+7E08
+7F18
+63F8
+C3F8
+8038
+0038
+0878
+0FF0
+03E0
+ENDCHAR
+STARTCHAR 0xF8D3
+ENCODING 63699
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 0
+BITMAP
+2000
+3000
+3800
+3800
+1C00
+0E00
+1300
+3180
+60C0
+40E0
+F0E0
+FF80
+7E00
+ENDCHAR
+STARTCHAR 0xF8D4
+ENCODING 63700
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+FFC0
+FFC0
+FFC0
+F000
+E000
+E000
+E000
+E000
+E000
+E000
+7000
+6000
+6000
+ENDCHAR
+STARTCHAR 0xF8D5
+ENCODING 63701
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 1 0
+BITMAP
+0FFC
+07FE
+01F0
+01E0
+01C0
+01C0
+01C0
+03C0
+03C0
+07F8
+1FFC
+7C02
+E000
+ENDCHAR
+STARTCHAR 0xF8D6
+ENCODING 63702
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+10
+38
+7C
+E6
+C4
+CC
+C8
+F8
+70
+70
+30
+18
+08
+ENDCHAR
+STARTCHAR 0xF8D7
+ENCODING 63703
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 1 0
+BITMAP
+39E0
+70F0
+60F0
+E0F0
+F0E0
+7FC0
+3F80
+3E00
+1E00
+0F00
+0700
+0380
+01C0
+ENDCHAR
+STARTCHAR 0xF8D8
+ENCODING 63704
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 1 0
+BITMAP
+3FF8
+7FF8
+1FF8
+0CF0
+0CF0
+08E0
+08E0
+10C0
+10C0
+2080
+4000
+8000
+ENDCHAR
+STARTCHAR 0xF8D9
+ENCODING 63705
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+0600
+0700
+0F80
+1F00
+1C00
+3C00
+3800
+7800
+7E00
+FF00
+FF80
+0180
+ENDCHAR
+STARTCHAR 0xF8DA
+ENCODING 63706
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+0600
+0F00
+3F80
+FFC0
+F3C0
+F3C0
+F380
+7380
+7300
+7A00
+3800
+1C00
+0C00
+ENDCHAR
+STARTCHAR 0xF8DB
+ENCODING 63707
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 14 1 -1
+BITMAP
+0600
+1F00
+3F80
+7F80
+F800
+FFC0
+7FC0
+3E00
+3E00
+1F00
+0F80
+07C0
+03F0
+01F0
+ENDCHAR
+STARTCHAR 0xF8DC
+ENCODING 63708
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 1 0
+BITMAP
+F01C
+FFFE
+1FFE
+0F8C
+0F8C
+1FC8
+7C00
+7C00
+3C00
+1E00
+0E00
+0300
+00C0
+ENDCHAR
+STARTCHAR 0xF8DD
+ENCODING 63709
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 14 1 -1
+BITMAP
+E000
+7FF8
+1FF8
+00F8
+00F0
+00F0
+01F8
+03E0
+03C0
+03C0
+03E0
+01E0
+00F0
+0038
+ENDCHAR
+STARTCHAR 0xF8DE
+ENCODING 63710
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+1800
+3800
+3F00
+7F80
+4380
+8380
+0380
+0780
+0F00
+1E00
+3C00
+F000
+ENDCHAR
+STARTCHAR 0xF8DF
+ENCODING 63711
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+3C
+7C
+F8
+F8
+3C
+3C
+1C
+1C
+1C
+18
+10
+ENDCHAR
+STARTCHAR 0xF8E0
+ENCODING 63712
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 13 1 0
+BITMAP
+0080
+0F80
+1F00
+3E00
+7C00
+F800
+F800
+3800
+3800
+3800
+3800
+7000
+E000
+ENDCHAR
+STARTCHAR 0xF8E1
+ENCODING 63713
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 1
+BITMAP
+FFF0
+3FF0
+0FC0
+07C0
+03F0
+07E0
+0780
+0F00
+1E00
+1800
+3000
+4000
+ENDCHAR
+STARTCHAR 0xF8E2
+ENCODING 63714
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 1 0
+BITMAP
+1FE0
+1F80
+0F00
+0F00
+0E00
+0E00
+0E00
+1E00
+1F00
+3FC0
+7FF0
+E038
+ENDCHAR
+STARTCHAR 0xF8E3
+ENCODING 63715
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 1 0
+BITMAP
+0038
+0070
+00F0
+00F0
+00F0
+21F0
+61F0
+63F0
+7FF0
+FE00
+F800
+E000
+C000
+ENDCHAR
+STARTCHAR 0xF8E4
+ENCODING 63716
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -1
+BITMAP
+0EFC
+3C7C
+FC78
+DC70
+1CE0
+1F80
+3F00
+3E00
+3E00
+1E00
+1F00
+0F80
+07C0
+01E0
+ENDCHAR
+STARTCHAR 0xF8E5
+ENCODING 63717
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 1 0
+BITMAP
+0080
+0180
+03C0
+0380
+0620
+0C70
+1FF8
+1FE0
+3F00
+7800
+E000
+8000
+ENDCHAR
+STARTCHAR 0xF8E6
+ENCODING 63718
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 1 -1
+BITMAP
+0006
+000C
+001C
+0038
+2038
+6078
+7078
+7FF8
+7FF8
+7FFC
+703C
+E00E
+C000
+ENDCHAR
+STARTCHAR 0xF8E7
+ENCODING 63719
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 1 0
+BITMAP
+7FF0
+FFE0
+FC00
+E000
+E000
+6000
+6000
+6000
+3000
+3000
+1000
+1800
+0800
+ENDCHAR
+STARTCHAR 0xF8E8
+ENCODING 63720
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 15 1 -1
+BITMAP
+1FF8
+3FF0
+7FF0
+79F0
+F1E0
+F1E0
+F1E0
+79C0
+3FC0
+1FC0
+0FC0
+03C0
+01E0
+0070
+0030
+ENDCHAR
+STARTCHAR 0xF8E9
+ENCODING 63721
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 8 1 5
+BITMAP
+E0
+70
+70
+70
+E0
+C0
+C0
+60
+ENDCHAR
+STARTCHAR 0xF8F0
+ENCODING 63728
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 4 1 4
+BITMAP
+3FE0
+FFF8
+FFF8
+3FE0
+ENDCHAR
+STARTCHAR 0xF8F1
+ENCODING 63729
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 1 0
+BITMAP
+00FC
+0FF0
+1FC0
+1E00
+3800
+3000
+3000
+6000
+6000
+4000
+C000
+8000
+8000
+ENDCHAR
+STARTCHAR 0xF8F2
+ENCODING 63730
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+18
+30
+60
+E0
+C0
+C0
+C0
+40
+60
+20
+30
+18
+ENDCHAR
+STARTCHAR 0xF8F3
+ENCODING 63731
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 0
+BITMAP
+3800
+7000
+F000
+F180
+FE00
+FC00
+F800
+7800
+3800
+1C00
+0700
+01C0
+ENDCHAR
+STARTCHAR 0xF8F4
+ENCODING 63732
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 1 0
+BITMAP
+20FC
+17F0
+1FC0
+0F80
+0F00
+0700
+0780
+0380
+83C0
+E1E0
+7FF0
+7FF8
+3FFC
+ENDCHAR
+STARTCHAR 0xF8F5
+ENCODING 63733
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -1
+BITMAP
+7C
+F0
+E0
+E0
+E0
+7E
+78
+7E
+38
+30
+30
+10
+18
+08
+ENDCHAR
+STARTCHAR 0xF8F6
+ENCODING 63734
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 12 1 0
+BITMAP
+C000
+6000
+781C
+7FFC
+3FFC
+3FF8
+3838
+3030
+3010
+2010
+2010
+0010
+ENDCHAR
+STARTCHAR 0xF8F7
+ENCODING 63735
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 0
+BITMAP
+00C0
+3180
+7F80
+FF00
+1F00
+1F00
+3700
+0300
+0300
+0180
+0080
+0040
+ENDCHAR
+STARTCHAR 0xF8F8
+ENCODING 63736
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 1 0
+BITMAP
+C00C
+6FD8
+37B0
+37B0
+1FE0
+1FE0
+1FE0
+1FE0
+1FE0
+3FF0
+3FF0
+6798
+CFCC
+ENDCHAR
+STARTCHAR 0xF8F9
+ENCODING 63737
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 -1
+BITMAP
+0C00
+1E00
+7F80
+FFC0
+0C00
+0C00
+0C00
+0C00
+0C00
+1E00
+1E00
+1E00
+3300
+ENDCHAR
+STARTCHAR 0xFFFD
+ENCODING 65533
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 15 0 0
+BITMAP
+0100
+0380
+07C0
+0C60
+1BB0
+3BB8
+7F7C
+FEFE
+7EFC
+3FF8
+1EF0
+0C60
+06C0
+0380
+0100
+ENDCHAR
+STARTCHAR C072
+ENCODING 65534
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 7 11 2 0
+BITMAP
+AA
+00
+82
+00
+82
+00
+82
+00
+82
+00
+AA
+ENDCHAR
+ENDFONT
diff --git a/xc/extras/fonts/ClearlyU/cu12.bdf b/xc/extras/fonts/ClearlyU/cu12.bdf
new file mode 100644
index 000000000..d3ed49e61
--- /dev/null
+++ b/xc/extras/fonts/ClearlyU/cu12.bdf
@@ -0,0 +1,68414 @@
+STARTFONT 2.1
+COMMENT
+COMMENT From: Id: cu12.bdf,v 1.11 1999/04/22 18:39:52 mleisher Exp $
+COMMENT
+COMMENT Copyright 1997, 1998, 1999 Computing Research Labs, New Mexico State
+COMMENT University
+COMMENT
+COMMENT Permission is hereby granted, free of charge, to any person
+COMMENT obtaining a copy of this software and associated documentation
+COMMENT files (the "Software"), to deal in the Software without
+COMMENT restriction, including without limitation the rights to use,
+COMMENT copy, modify, merge, publish, distribute, sublicense, and/or
+COMMENT sell copies of the Software, and to permit persons to whom the
+COMMENT Software is furnished to do so, subject to the following
+COMMENT conditions:
+COMMENT
+COMMENT The above copyright notice and this permission notice shall be
+COMMENT included in all copies or substantial portions of the Software.
+COMMENT
+COMMENT THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+COMMENT EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+COMMENT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+COMMENT NONINFRINGEMENT. IN NO EVENT SHALL THE COMPUTING RESEARCH LAB
+COMMENT OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY CLAIM, DAMAGES
+COMMENT OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+COMMENT OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+COMMENT SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+COMMENT
+FONT -MUTT-ClearlyU-Medium-R-Normal--17-120-100-100-P-101-ISO10646-1
+SIZE 12 100 100
+FONTBOUNDINGBOX 25 29 -4 -9
+STARTPROPERTIES 26
+FONT_ASCENT 20
+FONT_DESCENT 9
+COPYRIGHT "1997, 1998 Computing Research Lab, New Mexico State University."
+_XMBDFED_INFO "Edited with xmbdfed 3.8."
+FOUNDRY "MUTT"
+FAMILY_NAME "ClearlyU"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 17
+POINT_SIZE 120
+RESOLUTION_X 100
+RESOLUTION_Y 100
+SPACING "P"
+AVERAGE_WIDTH 101
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+DEFAULT_CHAR 65534
+CAP_HEIGHT 11
+X_HEIGHT 7
+_XFREE86_GLYPH_RANGES "32_126 160_543 546_563 592_685 688_750 768_846 864_866 884_885 890 894 900_906 908 910_929 931_974 976_983 986_1011 1024_1158 1166_1230 1232_1269 1272_1279 1329_1366 1369_1375 1377_1415 1417_1418 1425_1441 1443_1465 1467_1476 1488_1514 1520_1524 1548 1563 1567 1569_1594 1600_1618 1632_1645"
+_XFREE86_GLYPH_RANGES "1648_1719 1722_1726 1728_1742 1744_1749 1776_1785 3585_3642 3647_3675 3713_3714 3716 3719_3720 3722 3725 3732_3735 3737_3743 3745_3747 3749 3751 3754_3755 3757_3769 3771_3773 3776_3780 3782 3784_3789 3792_3801 3804_3805 4256_4293 4304_4342 4347 4608_4614 4616_4678 4680 4682_4685"
+_XFREE86_GLYPH_RANGES "4688_4694 4696 4698_4701 4704_4742 4744 4746_4749 4752_4782 4784 4786_4789 4792_4798 4800 4802_4805 4808_4814 4816_4822 4824_4878 4880 4882_4885 4888_4934 4936_4954 4960_4988 4991 7680_7835 7840_7929 7936_7957 7960_7965 7968_8005 8008_8013 8016_8023 8025 8027 8029 8031_8061 8064_8116"
+_XFREE86_GLYPH_RANGES "8118_8132 8134_8147 8150_8155 8157_8175 8178_8180 8182_8190 8203 8208_8231 8240_8262 8304 8308_8334 8352_8364 8400_8415 8448_8506 8531_8579 8592_8691 8704_8945 8960 8962_8966 8968_8976 9216_9254 9280_9289 9312_9450 9632_9719 64256_64262 64275_64279 64286_64310 64312_64316 64318"
+_XFREE86_GLYPH_RANGES "64320_64321 64323_64324 64326_64419 64422_64433 64467_64489 64508_64511 64830_64831 65010 65056_65059 65104_65106 65108_65119 65122_65123 65126 65136_65138 65140 65142_65276 65281_65374 65382_65433 65504_65509 65533_65534"
+ENDPROPERTIES
+CHARS 3832
+STARTCHAR 0x0020
+ENCODING 32
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 0 0 0 0
+BITMAP
+ENDCHAR
+STARTCHAR 0x0021
+ENCODING 33
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 12 1 0
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0022
+ENCODING 34
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 5 1 7
+BITMAP
+D8
+D8
+48
+48
+90
+ENDCHAR
+STARTCHAR 0x0023
+ENCODING 35
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 15 1 -3
+BITMAP
+0480
+0480
+0900
+0900
+0900
+FFC0
+1200
+1200
+1200
+FFC0
+2400
+2400
+2400
+4800
+4800
+ENDCHAR
+STARTCHAR 0x0024
+ENCODING 36
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 14 1 -1
+BITMAP
+20
+70
+A8
+A8
+A8
+A0
+60
+30
+28
+A8
+A8
+A8
+70
+20
+ENDCHAR
+STARTCHAR 0x0025
+ENCODING 37
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 11 13 1 -1
+BITMAP
+6040
+9880
+9780
+9100
+9200
+6200
+0400
+08C0
+0920
+1120
+2120
+2120
+40C0
+ENDCHAR
+STARTCHAR 0x0026
+ENCODING 38
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 12 1 0
+BITMAP
+1800
+2400
+2400
+2400
+2800
+33C0
+3100
+5100
+8A00
+8A00
+C440
+7B80
+ENDCHAR
+STARTCHAR 0x0027
+ENCODING 39
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 5 1 7
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x0028
+ENCODING 40
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 15 2 -3
+BITMAP
+10
+20
+40
+40
+80
+80
+80
+80
+80
+80
+80
+40
+40
+20
+10
+ENDCHAR
+STARTCHAR 0x0029
+ENCODING 41
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 15 1 -3
+BITMAP
+80
+40
+20
+20
+10
+10
+10
+10
+10
+10
+10
+20
+20
+40
+80
+ENDCHAR
+STARTCHAR 0x002A
+ENCODING 42
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 7 0 5
+BITMAP
+10
+92
+54
+38
+54
+92
+10
+ENDCHAR
+STARTCHAR 0x002B
+ENCODING 43
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 2 -1
+BITMAP
+0800
+0800
+0800
+0800
+0800
+FF80
+0800
+0800
+0800
+0800
+0800
+ENDCHAR
+STARTCHAR 0x002C
+ENCODING 44
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 5 1 -3
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x002D
+ENCODING 45
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 4 1 2 3
+BITMAP
+F0
+ENDCHAR
+STARTCHAR 0x002E
+ENCODING 46
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 2 1 0
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x002F
+ENCODING 47
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 16 2 -4
+BITMAP
+08
+08
+10
+10
+10
+10
+20
+20
+20
+20
+40
+40
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0x0030
+ENCODING 48
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+70
+50
+88
+88
+88
+88
+88
+88
+88
+50
+70
+ENDCHAR
+STARTCHAR 0x0031
+ENCODING 49
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+20
+E0
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0032
+ENCODING 50
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+70
+88
+88
+88
+08
+10
+10
+20
+48
+48
+F8
+ENDCHAR
+STARTCHAR 0x0033
+ENCODING 51
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+70
+88
+88
+08
+08
+30
+08
+08
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0034
+ENCODING 52
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+18
+18
+28
+28
+48
+C8
+FE
+08
+08
+08
+3E
+ENDCHAR
+STARTCHAR 0x0035
+ENCODING 53
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+88
+F0
+80
+80
+F0
+C8
+08
+08
+88
+90
+60
+ENDCHAR
+STARTCHAR 0x0036
+ENCODING 54
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+30
+48
+40
+80
+F0
+88
+88
+88
+88
+50
+70
+ENDCHAR
+STARTCHAR 0x0037
+ENCODING 55
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 12 1 0
+BITMAP
+80
+FC
+84
+88
+10
+10
+10
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x0038
+ENCODING 56
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+70
+88
+88
+88
+50
+70
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0039
+ENCODING 57
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 0
+BITMAP
+70
+50
+88
+88
+88
+88
+78
+08
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x003A
+ENCODING 58
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 7 3 0
+BITMAP
+C0
+C0
+00
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x003B
+ENCODING 59
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 10 1 -3
+BITMAP
+C0
+C0
+00
+00
+00
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x003C
+ENCODING 60
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 1
+BITMAP
+08
+10
+20
+40
+80
+40
+20
+10
+08
+ENDCHAR
+STARTCHAR 0x003D
+ENCODING 61
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 5 2 2
+BITMAP
+FFC0
+0000
+0000
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x003E
+ENCODING 62
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 1
+BITMAP
+80
+40
+20
+10
+08
+10
+20
+40
+80
+ENDCHAR
+STARTCHAR 0x003F
+ENCODING 63
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 12 1 0
+BITMAP
+70
+88
+88
+10
+20
+20
+60
+00
+00
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x0040
+ENCODING 64
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 12 1 0
+BITMAP
+1E00
+2100
+4C80
+9340
+A140
+A140
+A140
+A140
+9340
+4D80
+20C0
+1F00
+ENDCHAR
+STARTCHAR C065
+ENCODING 65
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 0 0
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR C066
+ENCODING 66
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 0 0
+BITMAP
+FF00
+2080
+2040
+2040
+2080
+3F00
+2080
+2040
+2040
+2080
+FF00
+ENDCHAR
+STARTCHAR C067
+ENCODING 67
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR C068
+ENCODING 68
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 0 0
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FE00
+ENDCHAR
+STARTCHAR C069
+ENCODING 69
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 1 0
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR C070
+ENCODING 70
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 11 1 0
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2200
+2200
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR C071
+ENCODING 71
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 1 0
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR C072
+ENCODING 72
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR C073
+ENCODING 73
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 11 1 0
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR C074
+ENCODING 74
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 11 1 0
+BITMAP
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR C075
+ENCODING 75
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR C076
+ENCODING 76
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 11 0 0
+BITMAP
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+ENDCHAR
+STARTCHAR C077
+ENCODING 77
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 14 11 1 0
+BITMAP
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+ENDCHAR
+STARTCHAR C078
+ENCODING 78
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR C079
+ENCODING 79
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 1 0
+BITMAP
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR C080
+ENCODING 80
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 11 1 0
+BITMAP
+FF00
+2180
+2080
+2080
+2180
+3F00
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR C081
+ENCODING 81
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 14 1 -3
+BITMAP
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+5C80
+3300
+1E00
+0200
+0240
+0180
+ENDCHAR
+STARTCHAR C082
+ENCODING 82
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+ENDCHAR
+STARTCHAR C083
+ENCODING 83
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR C084
+ENCODING 84
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 11 1 0
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR C085
+ENCODING 85
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR C086
+ENCODING 86
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+F1E0
+2080
+2080
+1100
+1100
+1100
+0A00
+0A00
+0A00
+0400
+0400
+ENDCHAR
+STARTCHAR C087
+ENCODING 87
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 11 1 0
+BITMAP
+F1CF
+2184
+2184
+2244
+1248
+1248
+1248
+1428
+0C30
+0C30
+0810
+ENDCHAR
+STARTCHAR C088
+ENCODING 88
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+F3C0
+1100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+F1E0
+ENDCHAR
+STARTCHAR C089
+ENCODING 89
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR C090
+ENCODING 90
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 11 1 0
+BITMAP
+FE
+C4
+84
+88
+08
+10
+22
+22
+42
+46
+FE
+ENDCHAR
+STARTCHAR 0x005B
+ENCODING 91
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 16 1 -4
+BITMAP
+E0
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+E0
+ENDCHAR
+STARTCHAR 0x005C
+ENCODING 92
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 16 2 -4
+BITMAP
+80
+80
+40
+40
+40
+40
+20
+20
+20
+20
+10
+10
+10
+10
+08
+08
+ENDCHAR
+STARTCHAR 0x005D
+ENCODING 93
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 16 0 -4
+BITMAP
+E0
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+E0
+ENDCHAR
+STARTCHAR 0x005E
+ENCODING 94
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 1 9
+BITMAP
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x005F
+ENCODING 95
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 1 1 -2
+BITMAP
+FFE0
+ENDCHAR
+STARTCHAR 0x0060
+ENCODING 96
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 5 1 7
+BITMAP
+40
+80
+80
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0061
+ENCODING 97
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0062
+ENCODING 98
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+78
+ENDCHAR
+STARTCHAR 0x0063
+ENCODING 99
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0064
+ENCODING 100
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0065
+ENCODING 101
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0066
+ENCODING 102
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+38
+48
+40
+40
+40
+F0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0067
+ENCODING 103
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+3E
+44
+44
+44
+78
+40
+7C
+82
+82
+82
+7C
+ENDCHAR
+STARTCHAR 0x0068
+ENCODING 104
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0069
+ENCODING 105
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 11 1 0
+BITMAP
+C0
+C0
+00
+00
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x006A
+ENCODING 106
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 14 0 -3
+BITMAP
+30
+30
+00
+00
+30
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x006B
+ENCODING 107
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+C0
+40
+40
+40
+40
+5E
+48
+50
+70
+58
+48
+EE
+ENDCHAR
+STARTCHAR 0x006C
+ENCODING 108
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 12 1 0
+BITMAP
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x006D
+ENCODING 109
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+FB80
+4440
+4440
+4440
+4440
+4440
+EEE0
+ENDCHAR
+STARTCHAR 0x006E
+ENCODING 110
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+F8
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x006F
+ENCODING 111
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0070
+ENCODING 112
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+F8
+44
+44
+44
+44
+44
+78
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0071
+ENCODING 113
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+78
+88
+88
+88
+88
+88
+78
+08
+08
+1C
+ENDCHAR
+STARTCHAR 0x0072
+ENCODING 114
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+D0
+68
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x0073
+ENCODING 115
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x0074
+ENCODING 116
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+ENDCHAR
+STARTCHAR 0x0075
+ENCODING 117
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x0076
+ENCODING 118
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+E7
+24
+24
+24
+18
+18
+18
+ENDCHAR
+STARTCHAR 0x0077
+ENCODING 119
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 7 0 0
+BITMAP
+EEE0
+2480
+2A80
+2A80
+2A80
+1100
+1100
+ENDCHAR
+STARTCHAR 0x0078
+ENCODING 120
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+E7
+24
+18
+18
+18
+24
+E7
+ENDCHAR
+STARTCHAR 0x0079
+ENCODING 121
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 10 1 -3
+BITMAP
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x007A
+ENCODING 122
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+F8
+90
+90
+20
+48
+48
+F8
+ENDCHAR
+STARTCHAR 0x007B
+ENCODING 123
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 16 1 -4
+BITMAP
+18
+20
+20
+20
+20
+20
+20
+C0
+20
+20
+20
+20
+20
+20
+20
+18
+ENDCHAR
+STARTCHAR 0x007C
+ENCODING 124
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 1 16 2 -4
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x007D
+ENCODING 125
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 0 -4
+BITMAP
+C0
+20
+20
+20
+20
+20
+20
+18
+20
+20
+20
+20
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0x007E
+ENCODING 126
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 3 1 9
+BITMAP
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x00A0
+ENCODING 160
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 0 0 0 0
+BITMAP
+ENDCHAR
+STARTCHAR 0x00A1
+ENCODING 161
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 12 1 -3
+BITMAP
+C0
+C0
+00
+00
+00
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0x00A2
+ENCODING 162
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 1 -2
+BITMAP
+10
+10
+70
+A8
+A0
+A0
+A0
+C8
+70
+40
+40
+ENDCHAR
+STARTCHAR 0x00A3
+ENCODING 163
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 0
+BITMAP
+06
+09
+11
+10
+10
+7C
+10
+10
+10
+51
+B2
+CC
+ENDCHAR
+STARTCHAR 0x00A4
+ENCODING 164
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 7 1 3
+BITMAP
+82
+7C
+44
+44
+44
+7C
+82
+ENDCHAR
+STARTCHAR 0x00A5
+ENCODING 165
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F1E0
+2080
+1100
+0A00
+7FC0
+0E00
+0400
+7FC0
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x00A6
+ENCODING 166
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 1 16 2 -4
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+00
+00
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x00A7
+ENCODING 167
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 13 1 0
+BITMAP
+60
+90
+80
+80
+60
+90
+90
+90
+60
+10
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x00A8
+ENCODING 168
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 2 1 11
+BITMAP
+D8
+D8
+ENDCHAR
+STARTCHAR 0x00A9
+ENCODING 169
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 3
+BITMAP
+3E00
+4100
+9E80
+A280
+A280
+A080
+A280
+9C80
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x00AA
+ENCODING 170
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 6 1 7
+BITMAP
+60
+10
+70
+90
+70
+F0
+ENDCHAR
+STARTCHAR 0x00AB
+ENCODING 171
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 7 1 0
+BITMAP
+12
+24
+6C
+D8
+6C
+24
+12
+ENDCHAR
+STARTCHAR 0x00AC
+ENCODING 172
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 4 1 2
+BITMAP
+FC
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x00AD
+ENCODING 173
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 1 0 3
+BITMAP
+E0
+ENDCHAR
+STARTCHAR 0x00AE
+ENCODING 174
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 3
+BITMAP
+3E00
+4100
+BC80
+9280
+9280
+9C80
+9280
+BA80
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x00AF
+ENCODING 175
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 1 1 11
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x00B0
+ENCODING 176
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 4 2 8
+BITMAP
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x00B1
+ENCODING 177
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 2 1
+BITMAP
+10
+10
+10
+FE
+10
+10
+10
+00
+FE
+ENDCHAR
+STARTCHAR 0x00B2
+ENCODING 178
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+60
+90
+10
+10
+20
+40
+F0
+ENDCHAR
+STARTCHAR 0x00B3
+ENCODING 179
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+60
+90
+10
+20
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x00B4
+ENCODING 180
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 3 4 3 11
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x00B5
+ENCODING 181
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+88
+88
+88
+88
+88
+DA
+A4
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x00B6
+ENCODING 182
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -4
+BITMAP
+3E
+74
+F4
+F4
+F4
+74
+34
+14
+14
+14
+14
+14
+14
+14
+14
+ENDCHAR
+STARTCHAR 0x00B7
+ENCODING 183
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 2 2 5
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x00B8
+ENCODING 184
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 3 3 2 -3
+BITMAP
+40
+20
+E0
+ENDCHAR
+STARTCHAR 0x00B9
+ENCODING 185
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 7 1 6
+BITMAP
+40
+C0
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x00BA
+ENCODING 186
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 6 1 7
+BITMAP
+60
+90
+90
+90
+60
+F0
+ENDCHAR
+STARTCHAR 0x00BB
+ENCODING 187
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+90
+48
+6C
+36
+6C
+48
+90
+ENDCHAR
+STARTCHAR 0x00BC
+ENCODING 188
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+4000
+C400
+4400
+4400
+4440
+E8C0
+0940
+0A40
+0BE0
+1040
+10E0
+ENDCHAR
+STARTCHAR 0x00BD
+ENCODING 189
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+4000
+C400
+4400
+4400
+4400
+E8C0
+0920
+0820
+0840
+1080
+11E0
+ENDCHAR
+STARTCHAR 0x00BE
+ENCODING 190
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+6000
+9200
+1200
+2200
+1220
+9460
+64A0
+0520
+05F0
+0820
+0870
+ENDCHAR
+STARTCHAR 0x00BF
+ENCODING 191
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 12 1 -3
+BITMAP
+30
+30
+00
+00
+00
+30
+20
+20
+40
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x00C0
+ENCODING 192
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+0800
+0C00
+0400
+0200
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x00C1
+ENCODING 193
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x00C2
+ENCODING 194
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 15 0 0
+BITMAP
+0400
+0E00
+1100
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x00C3
+ENCODING 195
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 15 0 0
+BITMAP
+0900
+1500
+1200
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x00C4
+ENCODING 196
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+1B00
+1B00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x00C5
+ENCODING 197
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 15 0 0
+BITMAP
+0600
+0900
+0900
+0600
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x00C6
+ENCODING 198
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 0 0
+BITMAP
+0FF8
+0A18
+0A08
+0A28
+1220
+1FE0
+1224
+1224
+2208
+2208
+F7F8
+ENDCHAR
+STARTCHAR 0x00C7
+ENCODING 199
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+0800
+0400
+1C00
+ENDCHAR
+STARTCHAR 0x00C8
+ENCODING 200
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+1000
+1800
+0800
+0400
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x00C9
+ENCODING 201
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x00CA
+ENCODING 202
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 0
+BITMAP
+0800
+1C00
+2200
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x00CB
+ENCODING 203
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+3600
+3600
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x00CC
+ENCODING 204
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 16 1 0
+BITMAP
+40
+60
+20
+10
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x00CD
+ENCODING 205
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 16 1 0
+BITMAP
+10
+30
+20
+40
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x00CE
+ENCODING 206
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+20
+70
+88
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x00CF
+ENCODING 207
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+D8
+D8
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x00D0
+ENCODING 208
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+F840
+2040
+2040
+2080
+2180
+FE00
+ENDCHAR
+STARTCHAR 0x00D1
+ENCODING 209
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+0900
+1500
+1200
+0000
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0x00D2
+ENCODING 210
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1000
+1800
+0800
+0400
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x00D3
+ENCODING 211
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x00D4
+ENCODING 212
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+0800
+1C00
+2200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x00D5
+ENCODING 213
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+1200
+2A00
+2400
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x00D6
+ENCODING 214
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+3600
+3600
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x00D7
+ENCODING 215
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 7 1 2
+BITMAP
+82
+44
+28
+10
+28
+44
+82
+ENDCHAR
+STARTCHAR 0x00D8
+ENCODING 216
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 13 1 -1
+BITMAP
+0080
+1F00
+2100
+4280
+8240
+8440
+8C40
+8840
+9040
+5080
+2100
+3E00
+4000
+ENDCHAR
+STARTCHAR 0x00D9
+ENCODING 217
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+0800
+0C00
+0400
+0200
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x00DA
+ENCODING 218
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x00DB
+ENCODING 219
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 0
+BITMAP
+0400
+0E00
+1100
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x00DC
+ENCODING 220
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 0
+BITMAP
+1B00
+1B00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x00DD
+ENCODING 221
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 0 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x00DE
+ENCODING 222
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 0 0
+BITMAP
+F800
+2000
+3E00
+2100
+2080
+2080
+2080
+2100
+3E00
+2000
+F800
+ENDCHAR
+STARTCHAR 0x00DF
+ENCODING 223
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+30
+48
+48
+48
+48
+D8
+48
+44
+44
+44
+44
+D8
+ENDCHAR
+STARTCHAR 0x00E0
+ENCODING 224
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+40
+60
+20
+10
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x00E1
+ENCODING 225
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x00E2
+ENCODING 226
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+20
+70
+88
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x00E3
+ENCODING 227
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+48
+A8
+90
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x00E4
+ENCODING 228
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x00E5
+ENCODING 229
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+30
+48
+48
+30
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x00E6
+ENCODING 230
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 0
+BITMAP
+7380
+8C40
+0FC0
+7800
+8800
+8C40
+7380
+ENDCHAR
+STARTCHAR 0x00E7
+ENCODING 231
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+80
+80
+80
+88
+70
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x00E8
+ENCODING 232
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+40
+60
+20
+10
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x00E9
+ENCODING 233
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x00EA
+ENCODING 234
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+70
+88
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x00EB
+ENCODING 235
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x00EC
+ENCODING 236
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 4 12 0 0
+BITMAP
+80
+C0
+40
+20
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x00ED
+ENCODING 237
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 4 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x00EE
+ENCODING 238
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 11 0 0
+BITMAP
+20
+70
+88
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x00EF
+ENCODING 239
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 0
+BITMAP
+D8
+D8
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x00F0
+ENCODING 240
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+50
+70
+E0
+10
+10
+78
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x00F1
+ENCODING 241
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+48
+A8
+90
+00
+F8
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x00F2
+ENCODING 242
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+40
+60
+20
+10
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x00F3
+ENCODING 243
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x00F4
+ENCODING 244
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+70
+88
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x00F5
+ENCODING 245
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+48
+A8
+90
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x00F6
+ENCODING 246
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x00F7
+ENCODING 247
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 7 1 2
+BITMAP
+0800
+0800
+0000
+FF80
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0x00F8
+ENCODING 248
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -2
+BITMAP
+08
+10
+70
+98
+A8
+A8
+A8
+C8
+70
+40
+80
+ENDCHAR
+STARTCHAR 0x00F9
+ENCODING 249
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+40
+60
+20
+10
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x00FA
+ENCODING 250
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+08
+18
+10
+20
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x00FB
+ENCODING 251
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+10
+38
+44
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x00FC
+ENCODING 252
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+6C
+6C
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x00FD
+ENCODING 253
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 15 1 -3
+BITMAP
+04
+0C
+08
+10
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x00FE
+ENCODING 254
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+78
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x00FF
+ENCODING 255
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 13 1 -3
+BITMAP
+36
+36
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0100
+ENCODING 256
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+1F00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0101
+ENCODING 257
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+F8
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0102
+ENCODING 258
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0103
+ENCODING 259
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+88
+70
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0104
+ENCODING 260
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 -3
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0080
+0120
+00C0
+ENDCHAR
+STARTCHAR 0x0105
+ENCODING 261
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 1 -3
+BITMAP
+70
+88
+08
+78
+88
+88
+7C
+08
+12
+0C
+ENDCHAR
+STARTCHAR 0x0106
+ENCODING 262
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 16 1 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0107
+ENCODING 263
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+70
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0108
+ENCODING 264
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 15 1 0
+BITMAP
+0800
+1C00
+2200
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0109
+ENCODING 265
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+70
+88
+00
+70
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x010A
+ENCODING 266
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+0C00
+0C00
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x010B
+ENCODING 267
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+60
+60
+00
+70
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x010C
+ENCODING 268
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 15 1 0
+BITMAP
+2200
+1C00
+0800
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x010D
+ENCODING 269
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+88
+70
+20
+00
+70
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x010E
+ENCODING 270
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 15 0 0
+BITMAP
+2200
+1C00
+0800
+0000
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FF00
+ENDCHAR
+STARTCHAR 0x010F
+ENCODING 271
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 0
+BITMAP
+1B
+0B
+09
+09
+0A
+78
+48
+88
+88
+88
+48
+7C
+ENDCHAR
+STARTCHAR 0x0110
+ENCODING 272
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 0 0
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+F840
+2040
+2040
+2080
+2180
+FF00
+ENDCHAR
+STARTCHAR 0x0111
+ENCODING 273
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+08
+7C
+08
+08
+78
+48
+88
+88
+88
+48
+7C
+ENDCHAR
+STARTCHAR 0x0112
+ENCODING 274
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 0
+BITMAP
+3E00
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0113
+ENCODING 275
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+F8
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0114
+ENCODING 276
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+2100
+1E00
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0115
+ENCODING 277
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+88
+70
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0116
+ENCODING 278
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+0C00
+0C00
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0117
+ENCODING 279
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+60
+60
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0118
+ENCODING 280
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 -3
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+0800
+1200
+0C00
+ENDCHAR
+STARTCHAR 0x0119
+ENCODING 281
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+F8
+80
+80
+88
+70
+40
+90
+60
+ENDCHAR
+STARTCHAR 0x011A
+ENCODING 282
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 0
+BITMAP
+2200
+1C00
+0800
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x011B
+ENCODING 283
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+88
+70
+20
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x011C
+ENCODING 284
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 15 1 0
+BITMAP
+0800
+1C00
+2200
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x011D
+ENCODING 285
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -4
+BITMAP
+10
+38
+44
+00
+3E
+48
+48
+48
+70
+40
+7C
+82
+82
+C6
+38
+ENDCHAR
+STARTCHAR 0x011E
+ENCODING 286
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 14 1 0
+BITMAP
+2100
+1E00
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x011F
+ENCODING 287
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -4
+BITMAP
+44
+38
+00
+3E
+48
+48
+48
+70
+40
+7C
+82
+82
+C6
+38
+ENDCHAR
+STARTCHAR 0x0120
+ENCODING 288
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 14 1 0
+BITMAP
+0C00
+0C00
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x0121
+ENCODING 289
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -4
+BITMAP
+30
+30
+00
+3E
+48
+48
+48
+70
+40
+7C
+82
+82
+C6
+38
+ENDCHAR
+STARTCHAR 0x0122
+ENCODING 290
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 14 1 -3
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+0800
+0400
+1C00
+ENDCHAR
+STARTCHAR 0x0123
+ENCODING 291
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 18 1 -4
+BITMAP
+08
+10
+10
+18
+18
+00
+00
+3E
+48
+48
+48
+70
+40
+7C
+82
+82
+C6
+38
+ENDCHAR
+STARTCHAR 0x0124
+ENCODING 292
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+0400
+0E00
+1100
+0000
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x0125
+ENCODING 293
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+10
+38
+44
+00
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0126
+ENCODING 294
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FBE0
+2080
+2080
+FFE0
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x0127
+ENCODING 295
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+C0
+40
+40
+F8
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0128
+ENCODING 296
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+48
+A8
+90
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0129
+ENCODING 297
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 11 0 0
+BITMAP
+48
+A8
+90
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x012A
+ENCODING 298
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 0
+BITMAP
+F8
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x012B
+ENCODING 299
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 9 0 0
+BITMAP
+F8
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x012C
+ENCODING 300
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 0 0
+BITMAP
+84
+78
+00
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+10
+7C
+ENDCHAR
+STARTCHAR 0x012D
+ENCODING 301
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 6 11 -1 0
+BITMAP
+84
+78
+00
+00
+30
+10
+10
+10
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x012E
+ENCODING 302
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 -3
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+20
+48
+30
+ENDCHAR
+STARTCHAR 0x012F
+ENCODING 303
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 4 14 1 -3
+BITMAP
+C0
+C0
+00
+00
+C0
+40
+40
+40
+40
+40
+E0
+40
+90
+60
+ENDCHAR
+STARTCHAR 0x0130
+ENCODING 304
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+60
+60
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0131
+ENCODING 305
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 7 1 0
+BITMAP
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0132
+ENCODING 306
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+F9F0
+2040
+2040
+2040
+2040
+2040
+2040
+2040
+2040
+2240
+FB80
+ENDCHAR
+STARTCHAR 0x0133
+ENCODING 307
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -3
+BITMAP
+C6
+C6
+00
+00
+C6
+42
+42
+42
+42
+42
+E2
+02
+12
+1C
+ENDCHAR
+STARTCHAR 0x0134
+ENCODING 308
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 15 2 0
+BITMAP
+10
+38
+44
+00
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0135
+ENCODING 309
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 0 -3
+BITMAP
+20
+70
+88
+00
+30
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0136
+ENCODING 310
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+1000
+0800
+3800
+ENDCHAR
+STARTCHAR 0x0137
+ENCODING 311
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+5E
+48
+50
+70
+58
+48
+EE
+40
+20
+E0
+ENDCHAR
+STARTCHAR 0x0138
+ENCODING 312
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+48
+50
+70
+48
+48
+E6
+ENDCHAR
+STARTCHAR 0x0139
+ENCODING 313
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 16 0 0
+BITMAP
+08
+18
+10
+20
+00
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+ENDCHAR
+STARTCHAR 0x013A
+ENCODING 314
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 17 1 0
+BITMAP
+20
+60
+40
+80
+00
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x013B
+ENCODING 315
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 14 0 -3
+BITMAP
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+0C
+04
+1C
+ENDCHAR
+STARTCHAR 0x013C
+ENCODING 316
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+E0
+40
+20
+E0
+ENDCHAR
+STARTCHAR 0x013D
+ENCODING 317
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 15 0 0
+BITMAP
+44
+38
+10
+00
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+ENDCHAR
+STARTCHAR 0x013E
+ENCODING 318
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+D8
+58
+48
+48
+50
+40
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x013F
+ENCODING 319
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 0 0
+BITMAP
+F8
+20
+20
+26
+26
+20
+21
+21
+21
+23
+FF
+ENDCHAR
+STARTCHAR 0x0140
+ENCODING 320
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+C0
+40
+40
+40
+58
+58
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0141
+ENCODING 321
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 0 0
+BITMAP
+F8
+20
+20
+28
+30
+20
+61
+A1
+21
+23
+FF
+ENDCHAR
+STARTCHAR 0x0142
+ENCODING 322
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 12 0 0
+BITMAP
+60
+20
+20
+28
+30
+20
+60
+A0
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x0143
+ENCODING 323
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 0 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0x0144
+ENCODING 324
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+08
+18
+10
+20
+00
+F8
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0145
+ENCODING 325
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+1000
+0800
+3800
+ENDCHAR
+STARTCHAR 0x0146
+ENCODING 326
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+F8
+44
+44
+44
+44
+44
+EE
+40
+20
+E0
+ENDCHAR
+STARTCHAR 0x0147
+ENCODING 327
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+1100
+0E00
+0400
+0000
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0x0148
+ENCODING 328
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+44
+38
+10
+00
+F8
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0149
+ENCODING 329
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+C0
+C0
+40
+40
+80
+00
+F8
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x014A
+ENCODING 330
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+0080
+0480
+0700
+ENDCHAR
+STARTCHAR 0x014B
+ENCODING 331
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+F8
+44
+44
+44
+44
+44
+E4
+04
+14
+18
+ENDCHAR
+STARTCHAR 0x014C
+ENCODING 332
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 13 1 0
+BITMAP
+3E00
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x014D
+ENCODING 333
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+F8
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x014E
+ENCODING 334
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+2100
+1E00
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x014F
+ENCODING 335
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+88
+70
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0150
+ENCODING 336
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0480
+0D80
+0900
+1200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0151
+ENCODING 337
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 1 0
+BITMAP
+24
+6C
+48
+90
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0152
+ENCODING 338
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 1 0
+BITMAP
+1FF8
+6308
+4308
+8328
+8120
+81E0
+8124
+8324
+4308
+6308
+1FF8
+ENDCHAR
+STARTCHAR 0x0153
+ENCODING 339
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+31C0
+4A20
+87E0
+8400
+8400
+4A20
+31C0
+ENDCHAR
+STARTCHAR 0x0154
+ENCODING 340
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 1 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+ENDCHAR
+STARTCHAR 0x0155
+ENCODING 341
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+D0
+68
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x0156
+ENCODING 342
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 1 -3
+BITMAP
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+1000
+0800
+3800
+ENDCHAR
+STARTCHAR 0x0157
+ENCODING 343
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+D0
+68
+40
+40
+40
+40
+F0
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x0158
+ENCODING 344
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 15 1 0
+BITMAP
+2200
+1C00
+0800
+0000
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+ENDCHAR
+STARTCHAR 0x0159
+ENCODING 345
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+88
+70
+20
+00
+D0
+68
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x015A
+ENCODING 346
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 16 1 0
+BITMAP
+10
+30
+20
+40
+00
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR 0x015B
+ENCODING 347
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x015C
+ENCODING 348
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 15 1 0
+BITMAP
+20
+70
+88
+00
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR 0x015D
+ENCODING 349
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+70
+88
+00
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x015E
+ENCODING 350
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 14 1 -3
+BITMAP
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x015F
+ENCODING 351
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+78
+88
+80
+70
+08
+88
+F0
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x0160
+ENCODING 352
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 15 1 0
+BITMAP
+88
+70
+20
+00
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR 0x0161
+ENCODING 353
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+88
+70
+20
+00
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x0162
+ENCODING 354
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 -3
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0800
+0400
+1C00
+ENDCHAR
+STARTCHAR 0x0163
+ENCODING 355
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 13 0 -3
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+08
+04
+1C
+ENDCHAR
+STARTCHAR 0x0164
+ENCODING 356
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 15 1 0
+BITMAP
+2200
+1C00
+0800
+0000
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x0165
+ENCODING 357
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 0 0
+BITMAP
+88
+70
+20
+00
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+ENDCHAR
+STARTCHAR 0x0166
+ENCODING 358
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+FF80
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x0167
+ENCODING 359
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 10 0 0
+BITMAP
+20
+20
+20
+F8
+20
+F8
+20
+24
+24
+18
+ENDCHAR
+STARTCHAR 0x0168
+ENCODING 360
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 0
+BITMAP
+0900
+1500
+1200
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x0169
+ENCODING 361
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+24
+54
+48
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x016A
+ENCODING 362
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 0
+BITMAP
+1F00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x016B
+ENCODING 363
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x016C
+ENCODING 364
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 0
+BITMAP
+2100
+1E00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x016D
+ENCODING 365
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+44
+38
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x016E
+ENCODING 366
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+0C00
+1200
+1200
+0C00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x016F
+ENCODING 367
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+30
+48
+48
+30
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x0170
+ENCODING 368
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+0480
+0D80
+0900
+1200
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x0171
+ENCODING 369
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+24
+6C
+48
+90
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x0172
+ENCODING 370
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+0400
+0900
+0600
+ENDCHAR
+STARTCHAR 0x0173
+ENCODING 371
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 10 1 -3
+BITMAP
+CC
+44
+44
+44
+44
+44
+3E
+04
+09
+06
+ENDCHAR
+STARTCHAR 0x0174
+ENCODING 372
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 15 0 0
+BITMAP
+0100
+0380
+0440
+0000
+F1CF
+2184
+2184
+2244
+1248
+1248
+1248
+1428
+0C30
+0C30
+0810
+ENDCHAR
+STARTCHAR 0x0175
+ENCODING 373
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+0400
+0E00
+1100
+0000
+EEE0
+2480
+2A80
+2A80
+2A80
+1100
+1100
+ENDCHAR
+STARTCHAR 0x0176
+ENCODING 374
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+0400
+0E00
+1100
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x0177
+ENCODING 375
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 14 1 -3
+BITMAP
+08
+1C
+22
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0178
+ENCODING 376
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1B00
+1B00
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x0179
+ENCODING 377
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+08
+18
+10
+20
+00
+FE
+C4
+84
+88
+08
+10
+22
+22
+42
+46
+FE
+ENDCHAR
+STARTCHAR 0x017A
+ENCODING 378
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+10
+30
+20
+40
+00
+F8
+90
+90
+20
+48
+48
+F8
+ENDCHAR
+STARTCHAR 0x017B
+ENCODING 379
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 0
+BITMAP
+30
+30
+00
+FE
+C4
+84
+88
+08
+10
+22
+22
+42
+46
+FE
+ENDCHAR
+STARTCHAR 0x017C
+ENCODING 380
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+60
+60
+00
+F8
+90
+90
+20
+48
+48
+F8
+ENDCHAR
+STARTCHAR 0x017D
+ENCODING 381
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 0
+BITMAP
+44
+38
+10
+00
+FE
+C4
+84
+88
+08
+10
+22
+22
+42
+46
+FE
+ENDCHAR
+STARTCHAR 0x017E
+ENCODING 382
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+88
+70
+20
+00
+F8
+90
+90
+20
+48
+48
+F8
+ENDCHAR
+STARTCHAR 0x017F
+ENCODING 383
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+38
+48
+40
+40
+40
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0180
+ENCODING 384
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+C0
+40
+40
+F8
+40
+78
+44
+44
+44
+44
+44
+78
+ENDCHAR
+STARTCHAR 0x0181
+ENCODING 385
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 -1 0
+BITMAP
+FF80
+9040
+1020
+1020
+1040
+1F80
+1040
+1020
+1020
+1040
+7F80
+ENDCHAR
+STARTCHAR 0x0182
+ENCODING 386
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 0 0
+BITMAP
+FF80
+2080
+2080
+2000
+2000
+3F00
+2080
+2080
+2080
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x0183
+ENCODING 387
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+FC
+44
+44
+40
+40
+78
+44
+44
+44
+44
+44
+78
+ENDCHAR
+STARTCHAR 0x0184
+ENCODING 388
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 0 0
+BITMAP
+2000
+6000
+E000
+E000
+6000
+3F00
+2080
+2080
+2080
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x0185
+ENCODING 389
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+20
+60
+E0
+E0
+60
+3C
+22
+22
+22
+22
+22
+3C
+ENDCHAR
+STARTCHAR 0x0186
+ENCODING 390
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+3C00
+4200
+8100
+8080
+0080
+0080
+0080
+8080
+8100
+C200
+BC00
+ENDCHAR
+STARTCHAR 0x0187
+ENCODING 391
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 1 0
+BITMAP
+0060
+00A0
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0188
+ENCODING 392
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 1 0
+BITMAP
+06
+0A
+78
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0189
+ENCODING 393
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+F840
+2040
+2040
+2080
+2180
+FE00
+ENDCHAR
+STARTCHAR 0x018A
+ENCODING 394
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 -1 0
+BITMAP
+FF00
+90C0
+1040
+1020
+1020
+1020
+1020
+1020
+1040
+10C0
+7F00
+ENDCHAR
+STARTCHAR 0x018B
+ENCODING 395
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 0 0
+BITMAP
+FF80
+8200
+8200
+0200
+0200
+7E00
+8200
+8200
+8200
+8200
+7F80
+ENDCHAR
+STARTCHAR 0x018C
+ENCODING 396
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+FC
+88
+88
+08
+08
+78
+88
+88
+88
+88
+88
+78
+ENDCHAR
+STARTCHAR 0x018D
+ENCODING 397
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+88
+88
+88
+88
+50
+30
+08
+48
+30
+ENDCHAR
+STARTCHAR 0x018E
+ENCODING 398
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+7FC0
+4100
+4100
+9100
+9100
+1F00
+1100
+5100
+4100
+4100
+7FC0
+ENDCHAR
+STARTCHAR 0x018F
+ENCODING 399
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+3E00
+4180
+8080
+0040
+0040
+0040
+FFC0
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0190
+ENCODING 400
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+7A
+86
+82
+82
+80
+78
+80
+80
+82
+82
+7C
+ENDCHAR
+STARTCHAR 0x0191
+ENCODING 401
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 14 -1 -3
+BITMAP
+7FC0
+1040
+1040
+1140
+1100
+1F00
+1100
+1100
+1000
+1000
+1000
+1000
+9000
+E000
+ENDCHAR
+STARTCHAR 0x0192
+ENCODING 402
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 15 0 -3
+BITMAP
+1C
+24
+20
+20
+20
+78
+20
+20
+20
+20
+20
+20
+20
+A0
+C0
+ENDCHAR
+STARTCHAR 0x0193
+ENCODING 403
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 0
+BITMAP
+0060
+00A0
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x0194
+ENCODING 404
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F1E0
+2080
+1100
+1100
+0A00
+0A00
+0400
+0E00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x0195
+ENCODING 405
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+C000
+4000
+4000
+4000
+5100
+6880
+4880
+4880
+4880
+4880
+E700
+ENDCHAR
+STARTCHAR 0x0196
+ENCODING 406
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 13 1 -2
+BITMAP
+40
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+48
+30
+ENDCHAR
+STARTCHAR 0x0197
+ENCODING 407
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 0 0
+BITMAP
+F8
+20
+20
+20
+20
+F8
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0198
+ENCODING 408
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F8E0
+2120
+2240
+2400
+2C00
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x0199
+ENCODING 409
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+30
+48
+58
+40
+40
+40
+5E
+48
+50
+70
+58
+48
+EE
+ENDCHAR
+STARTCHAR 0x019A
+ENCODING 410
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 12 0 0
+BITMAP
+60
+20
+20
+20
+20
+F8
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x019B
+ENCODING 411
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 0
+BITMAP
+44
+28
+10
+30
+58
+98
+24
+24
+42
+E7
+ENDCHAR
+STARTCHAR 0x019C
+ENCODING 412
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 0 0
+BITMAP
+F39E
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+2298
+1C6E
+ENDCHAR
+STARTCHAR 0x019D
+ENCODING 413
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 14 -1 -3
+BITMAP
+71F0
+1840
+1840
+1440
+1440
+1240
+1140
+1140
+10C0
+10C0
+1040
+1000
+9000
+E000
+ENDCHAR
+STARTCHAR 0x019E
+ENCODING 414
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 1 -3
+BITMAP
+F8
+44
+44
+44
+44
+44
+E4
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x019F
+ENCODING 415
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1E00
+6180
+4080
+8040
+8040
+FFC0
+8040
+8040
+4080
+6180
+1E00
+ENDCHAR
+STARTCHAR 0x01A0
+ENCODING 416
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+0060
+1E20
+21C0
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x01A1
+ENCODING 417
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 8 1 0
+BITMAP
+06
+72
+8C
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x01A2
+ENCODING 418
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -3
+BITMAP
+1E30
+2148
+4088
+8048
+8048
+8048
+8048
+8048
+4088
+2108
+1E08
+0008
+0008
+001C
+ENDCHAR
+STARTCHAR 0x01A3
+ENCODING 419
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 -3
+BITMAP
+0200
+7500
+8900
+8900
+8900
+8900
+8900
+7100
+0100
+0100
+0380
+ENDCHAR
+STARTCHAR 0x01A4
+ENCODING 420
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 -1 0
+BITMAP
+FF80
+90C0
+1040
+1040
+10C0
+1F80
+1000
+1000
+1000
+1000
+7C00
+ENDCHAR
+STARTCHAR 0x01A5
+ENCODING 421
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 -3
+BITMAP
+03
+05
+FC
+44
+44
+44
+44
+44
+78
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x01A6
+ENCODING 422
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 -2
+BITMAP
+F800
+2000
+3E00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+F900
+0100
+00E0
+ENDCHAR
+STARTCHAR 0x01A7
+ENCODING 423
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+F8
+84
+84
+04
+08
+30
+40
+80
+84
+84
+7C
+ENDCHAR
+STARTCHAR 0x01A8
+ENCODING 424
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+F0
+88
+08
+70
+80
+88
+78
+ENDCHAR
+STARTCHAR 0x01A9
+ENCODING 425
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+FF80
+C180
+4080
+2080
+1000
+1800
+1000
+2080
+2080
+4180
+FF80
+ENDCHAR
+STARTCHAR 0x01AA
+ENCODING 426
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 13 1 -2
+BITMAP
+40
+A0
+A0
+60
+20
+20
+20
+20
+20
+20
+20
+24
+18
+ENDCHAR
+STARTCHAR 0x01AB
+ENCODING 427
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 0 -2
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+1C
+44
+38
+ENDCHAR
+STARTCHAR 0x01AC
+ENCODING 428
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+FF80
+8880
+0880
+0880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x01AD
+ENCODING 429
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 0 0
+BITMAP
+18
+24
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+ENDCHAR
+STARTCHAR 0x01AE
+ENCODING 430
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0A00
+0600
+ENDCHAR
+STARTCHAR 0x01AF
+ENCODING 431
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 13 1 0
+BITMAP
+0030
+0010
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x01B0
+ENCODING 432
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 9 1 0
+BITMAP
+03
+01
+CE
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x01B1
+ENCODING 433
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F1E0
+2080
+2080
+4040
+4040
+4040
+4040
+4040
+4040
+2080
+1F00
+ENDCHAR
+STARTCHAR 0x01B2
+ENCODING 434
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 0
+BITMAP
+0100
+F880
+2080
+2040
+2040
+2040
+2040
+2040
+2040
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x01B3
+ENCODING 435
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 11 -1 0
+BITMAP
+E0F0
+9040
+0880
+0880
+0500
+0700
+0200
+0200
+0200
+0200
+0F80
+ENDCHAR
+STARTCHAR 0x01B4
+ENCODING 436
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 1 -3
+BITMAP
+03
+05
+E4
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x01B5
+ENCODING 437
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FE
+C4
+84
+88
+08
+FE
+20
+22
+42
+46
+FE
+ENDCHAR
+STARTCHAR 0x01B6
+ENCODING 438
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+F8
+90
+10
+F8
+40
+48
+F8
+ENDCHAR
+STARTCHAR 0x01B7
+ENCODING 439
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+FC
+08
+10
+20
+70
+08
+04
+04
+C4
+88
+70
+ENDCHAR
+STARTCHAR 0x01B8
+ENCODING 440
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+FC
+40
+20
+10
+38
+40
+80
+80
+8C
+44
+38
+ENDCHAR
+STARTCHAR 0x01B9
+ENCODING 441
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 -3
+BITMAP
+F8
+40
+20
+70
+80
+80
+98
+88
+70
+ENDCHAR
+STARTCHAR 0x01BA
+ENCODING 442
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 -3
+BITMAP
+F8
+10
+20
+70
+08
+70
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x01BB
+ENCODING 443
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+70
+88
+88
+88
+08
+FC
+10
+20
+48
+48
+F8
+ENDCHAR
+STARTCHAR 0x01BC
+ENCODING 444
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+FC
+40
+40
+70
+08
+04
+04
+04
+04
+88
+70
+ENDCHAR
+STARTCHAR 0x01BD
+ENCODING 445
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+F8
+40
+70
+08
+08
+88
+70
+ENDCHAR
+STARTCHAR 0x01BE
+ENCODING 446
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+20
+F8
+20
+20
+30
+08
+08
+C8
+88
+70
+ENDCHAR
+STARTCHAR 0x01BF
+ENCODING 447
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+F8
+44
+44
+44
+44
+48
+50
+60
+40
+E0
+ENDCHAR
+STARTCHAR 0x01C0
+ENCODING 448
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 1 12 2 0
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x01C1
+ENCODING 449
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 12 2 0
+BITMAP
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR 0x01C2
+ENCODING 450
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 12 1 0
+BITMAP
+20
+20
+20
+20
+F8
+20
+F8
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x01C3
+ENCODING 451
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 12 1 0
+BITMAP
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+00
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x01C4
+ENCODING 452
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 18 15 0 0
+BITMAP
+000880
+000700
+000200
+000000
+FE1FC0
+219880
+209080
+205100
+204100
+204200
+204440
+204440
+208840
+2188C0
+FF1FC0
+ENDCHAR
+STARTCHAR 0x01C5
+ENCODING 453
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 0 0
+BITMAP
+FE11
+218E
+2084
+2040
+205F
+2052
+2052
+2044
+2089
+2189
+FF1F
+ENDCHAR
+STARTCHAR 0x01C6
+ENCODING 454
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+1800
+0910
+08E0
+0840
+0800
+79F0
+4920
+8920
+8840
+8890
+4890
+7DF0
+ENDCHAR
+STARTCHAR 0x01C7
+ENCODING 455
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 0 0
+BITMAP
+F83E
+2008
+2008
+2008
+2008
+2008
+2108
+2108
+2108
+2348
+FF70
+ENDCHAR
+STARTCHAR 0x01C8
+ENCODING 456
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 14 0 -3
+BITMAP
+F830
+2030
+2000
+2000
+2030
+2010
+2110
+2110
+2110
+2310
+FF10
+0010
+0090
+00E0
+ENDCHAR
+STARTCHAR 0x01C9
+ENCODING 457
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+C0
+46
+46
+40
+40
+46
+42
+42
+42
+42
+42
+E2
+02
+12
+1C
+ENDCHAR
+STARTCHAR 0x01CA
+ENCODING 458
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 11 0 0
+BITMAP
+E3EF80
+308200
+308200
+288200
+288200
+248200
+228200
+228200
+218200
+219200
+F89C00
+ENDCHAR
+STARTCHAR 0x01CB
+ENCODING 459
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 0 -3
+BITMAP
+E3E6
+3086
+3080
+2880
+2886
+2482
+2282
+2282
+2182
+2182
+F882
+0002
+0012
+001C
+ENDCHAR
+STARTCHAR 0x01CC
+ENCODING 460
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 1 -3
+BITMAP
+00C0
+00C0
+0000
+0000
+F8C0
+4440
+4440
+4440
+4440
+4440
+EE40
+0040
+0240
+0380
+ENDCHAR
+STARTCHAR 0x01CD
+ENCODING 461
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 15 0 0
+BITMAP
+1100
+0E00
+0400
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x01CE
+ENCODING 462
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+88
+70
+20
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x01CF
+ENCODING 463
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+88
+70
+20
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x01D0
+ENCODING 464
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 11 0 0
+BITMAP
+88
+70
+20
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x01D1
+ENCODING 465
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 15 1 0
+BITMAP
+2200
+1C00
+0800
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x01D2
+ENCODING 466
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+88
+70
+20
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x01D3
+ENCODING 467
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 0
+BITMAP
+1100
+0E00
+0400
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x01D4
+ENCODING 468
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+44
+38
+10
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x01D5
+ENCODING 469
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+1F00
+0000
+1B00
+1B00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x01D6
+ENCODING 470
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+7C
+00
+6C
+6C
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x01D7
+ENCODING 471
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 19 1 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+1B00
+1B00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x01D8
+ENCODING 472
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 0
+BITMAP
+08
+18
+10
+20
+00
+6C
+6C
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x01D9
+ENCODING 473
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 18 1 0
+BITMAP
+1100
+0E00
+0400
+0000
+1B00
+1B00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x01DA
+ENCODING 474
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 0
+BITMAP
+44
+38
+10
+00
+6C
+6C
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x01DB
+ENCODING 475
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 19 1 0
+BITMAP
+0800
+0C00
+0400
+0200
+0000
+1B00
+1B00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x01DC
+ENCODING 476
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 0
+BITMAP
+40
+60
+20
+10
+00
+6C
+6C
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x01DD
+ENCODING 477
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+08
+08
+F8
+88
+70
+ENDCHAR
+STARTCHAR 0x01DE
+ENCODING 478
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+1F00
+0000
+1B00
+1B00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x01DF
+ENCODING 479
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+F8
+00
+D8
+D8
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x01E0
+ENCODING 480
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+1F00
+0000
+0C00
+0C00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x01E1
+ENCODING 481
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+F8
+00
+60
+60
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x01E2
+ENCODING 482
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+03E0
+0000
+0FF8
+0A18
+0A08
+0A28
+1220
+1FE0
+1224
+1224
+2208
+2208
+F7F8
+ENDCHAR
+STARTCHAR 0x01E3
+ENCODING 483
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+1F00
+0000
+7380
+8C40
+0FC0
+7800
+8800
+8C40
+7380
+ENDCHAR
+STARTCHAR 0x01E4
+ENCODING 484
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+47C0
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x01E5
+ENCODING 485
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 11 1 -4
+BITMAP
+3E
+44
+44
+44
+78
+40
+7C
+82
+9F
+82
+7C
+ENDCHAR
+STARTCHAR 0x01E6
+ENCODING 486
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 1 0
+BITMAP
+2200
+1C00
+0800
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x01E7
+ENCODING 487
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -4
+BITMAP
+44
+38
+10
+00
+3E
+44
+44
+44
+78
+40
+7C
+82
+82
+82
+7C
+ENDCHAR
+STARTCHAR 0x01E8
+ENCODING 488
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 0
+BITMAP
+1100
+0E00
+0400
+0000
+F9E0
+2180
+2300
+2600
+2C00
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x01E9
+ENCODING 489
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+44
+38
+10
+00
+C0
+40
+40
+40
+40
+5E
+48
+50
+70
+58
+48
+EE
+ENDCHAR
+STARTCHAR 0x01EA
+ENCODING 490
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 -3
+BITMAP
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+0800
+1200
+0C00
+ENDCHAR
+STARTCHAR 0x01EB
+ENCODING 491
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+88
+88
+88
+88
+70
+40
+90
+60
+ENDCHAR
+STARTCHAR 0x01EC
+ENCODING 492
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 -3
+BITMAP
+3E00
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+0800
+1200
+0C00
+ENDCHAR
+STARTCHAR 0x01ED
+ENCODING 493
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 -3
+BITMAP
+F8
+00
+70
+88
+88
+88
+88
+88
+70
+40
+90
+60
+ENDCHAR
+STARTCHAR 0x01EE
+ENCODING 494
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 0
+BITMAP
+88
+70
+20
+00
+FC
+08
+10
+20
+70
+08
+04
+04
+C4
+88
+70
+ENDCHAR
+STARTCHAR 0x01EF
+ENCODING 495
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 -3
+BITMAP
+88
+70
+20
+00
+F8
+10
+20
+70
+08
+08
+C8
+88
+70
+ENDCHAR
+STARTCHAR 0x01F0
+ENCODING 496
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 0 -3
+BITMAP
+44
+38
+10
+00
+30
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x01F1
+ENCODING 497
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 18 11 0 0
+BITMAP
+FE1FC0
+219880
+209080
+205100
+204100
+204200
+204440
+204440
+208840
+2188C0
+FF1FC0
+ENDCHAR
+STARTCHAR 0x01F2
+ENCODING 498
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 0 0
+BITMAP
+FE00
+2180
+2080
+2040
+205F
+2052
+2052
+2044
+2089
+2189
+FF1F
+ENDCHAR
+STARTCHAR 0x01F3
+ENCODING 499
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+1800
+0800
+0800
+0800
+0800
+79F0
+8920
+8920
+8840
+8890
+8890
+7DF0
+ENDCHAR
+STARTCHAR 0x01F4
+ENCODING 500
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 1 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x01F5
+ENCODING 501
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 -4
+BITMAP
+04
+0C
+08
+10
+00
+3E
+44
+44
+44
+78
+40
+7C
+82
+82
+82
+7C
+ENDCHAR
+STARTCHAR 0x0124
+ENCODING 502
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 14 11 0 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F9C
+2084
+2084
+2084
+2084
+F878
+ENDCHAR
+STARTCHAR C080
+ENCODING 503
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 11 1 0
+BITMAP
+6F00
+B180
+2080
+2080
+2100
+2600
+2800
+3000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR C078
+ENCODING 504
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 1 0
+BITMAP
+2000
+3000
+1000
+0800
+0000
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0x006E
+ENCODING 505
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+40
+60
+20
+10
+00
+F8
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x01FA
+ENCODING 506
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 20 0 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+0600
+0900
+0900
+0600
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x01FB
+ENCODING 507
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 0
+BITMAP
+10
+30
+20
+40
+00
+60
+90
+90
+60
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x01FC
+ENCODING 508
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 16 0 0
+BITMAP
+0040
+00C0
+0080
+0100
+0000
+0FF8
+0A18
+0A08
+0A28
+1220
+1FE0
+1224
+1224
+2208
+2208
+F7F8
+ENDCHAR
+STARTCHAR 0x01FD
+ENCODING 509
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+7380
+8C40
+0FC0
+7800
+8800
+8C40
+7380
+ENDCHAR
+STARTCHAR 0x01FE
+ENCODING 510
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 17 1 -1
+BITMAP
+0200
+0600
+0400
+0800
+0080
+1F00
+2100
+4280
+8240
+8440
+8C40
+8840
+9040
+5080
+2100
+3E00
+4000
+ENDCHAR
+STARTCHAR 0x01FF
+ENCODING 511
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 -2
+BITMAP
+10
+30
+20
+48
+10
+70
+98
+A8
+A8
+A8
+C8
+70
+40
+80
+ENDCHAR
+STARTCHAR 0x0200
+ENCODING 512
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+2400
+3600
+1200
+0900
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0201
+ENCODING 513
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 0
+BITMAP
+90
+D8
+48
+24
+00
+38
+44
+04
+3C
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x0202
+ENCODING 514
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+1E00
+2100
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0203
+ENCODING 515
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+70
+88
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0204
+ENCODING 516
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+4800
+6C00
+2400
+1200
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0205
+ENCODING 517
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 0 0
+BITMAP
+90
+D8
+48
+24
+00
+38
+44
+7C
+40
+40
+44
+38
+ENDCHAR
+STARTCHAR 0x0206
+ENCODING 518
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+1E00
+2100
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0207
+ENCODING 519
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+70
+88
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0208
+ENCODING 520
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 16 0 0
+BITMAP
+90
+D8
+48
+24
+00
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+10
+7C
+ENDCHAR
+STARTCHAR 0x0209
+ENCODING 521
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 6 12 -1 0
+BITMAP
+90
+D8
+48
+24
+00
+30
+10
+10
+10
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x020A
+ENCODING 522
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 0 0
+BITMAP
+78
+84
+00
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+10
+7C
+ENDCHAR
+STARTCHAR 0x020B
+ENCODING 523
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 6 10 -1 0
+BITMAP
+78
+84
+00
+30
+10
+10
+10
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x020C
+ENCODING 524
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+4800
+6C00
+2400
+1200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x020D
+ENCODING 525
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 0 0
+BITMAP
+90
+D8
+48
+24
+00
+38
+44
+44
+44
+44
+44
+38
+ENDCHAR
+STARTCHAR 0x020E
+ENCODING 526
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+1E00
+2100
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x020F
+ENCODING 527
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+70
+88
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0210
+ENCODING 528
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 1 0
+BITMAP
+4800
+6C00
+2400
+1200
+0000
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+ENDCHAR
+STARTCHAR 0x0211
+ENCODING 529
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 0 0
+BITMAP
+90
+D8
+48
+24
+00
+68
+34
+20
+20
+20
+20
+78
+ENDCHAR
+STARTCHAR 0x0212
+ENCODING 530
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 1 0
+BITMAP
+3C00
+4200
+0000
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+ENDCHAR
+STARTCHAR 0x0213
+ENCODING 531
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+78
+84
+00
+D0
+68
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x0214
+ENCODING 532
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+2400
+3600
+1200
+0900
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x0215
+ENCODING 533
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 0 0
+BITMAP
+90
+D8
+48
+24
+00
+66
+22
+22
+22
+22
+22
+1F
+ENDCHAR
+STARTCHAR 0x0216
+ENCODING 534
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 0
+BITMAP
+1E00
+2100
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x0217
+ENCODING 535
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+38
+44
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x0218
+ENCODING 536
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 17 1 -6
+BITMAP
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+00
+30
+30
+10
+10
+20
+ENDCHAR
+STARTCHAR 0x0219
+ENCODING 537
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 -6
+BITMAP
+78
+88
+80
+70
+08
+88
+F0
+00
+30
+30
+10
+10
+20
+ENDCHAR
+STARTCHAR 0x021A
+ENCODING 538
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 17 1 -6
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0C00
+0C00
+0400
+0400
+0800
+ENDCHAR
+STARTCHAR 0x021B
+ENCODING 539
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 16 0 -6
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+00
+30
+30
+10
+10
+20
+ENDCHAR
+STARTCHAR 0x0033
+ENCODING 540
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+B0
+C8
+88
+08
+10
+30
+48
+08
+08
+10
+E0
+ENDCHAR
+STARTCHAR 0x0292
+ENCODING 541
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+B0
+C8
+88
+10
+30
+48
+08
+10
+E0
+ENDCHAR
+STARTCHAR 0x021E
+ENCODING 542
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+1100
+0E00
+0400
+0000
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x021F
+ENCODING 543
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+44
+38
+10
+00
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x022E
+ENCODING 546
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 0
+BITMAP
+66
+81
+81
+42
+3C
+42
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x022E
+ENCODING 547
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+48
+84
+84
+48
+30
+48
+84
+84
+48
+30
+ENDCHAR
+STARTCHAR C090
+ENCODING 548
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 15 1 -4
+BITMAP
+FE
+C4
+84
+88
+08
+10
+22
+22
+42
+46
+FE
+02
+02
+14
+18
+ENDCHAR
+STARTCHAR 0x007A
+ENCODING 549
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+F8
+90
+90
+20
+48
+48
+F8
+08
+28
+30
+ENDCHAR
+STARTCHAR 0x0226
+ENCODING 550
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+0C00
+0C00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0227
+ENCODING 551
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+60
+60
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0228
+ENCODING 552
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 -3
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+0800
+0400
+1C00
+ENDCHAR
+STARTCHAR 0x0229
+ENCODING 553
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+F8
+80
+80
+88
+70
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x022A
+ENCODING 554
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+3E00
+0000
+3600
+3600
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x022B
+ENCODING 555
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+F8
+00
+D8
+D8
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x022C
+ENCODING 556
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+3E00
+0000
+1200
+2A00
+2400
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x022D
+ENCODING 557
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 0
+BITMAP
+F8
+00
+48
+A8
+90
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x022E
+ENCODING 558
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+0C00
+0C00
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x022F
+ENCODING 559
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+30
+30
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0230
+ENCODING 560
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+1E00
+0000
+0C00
+0C00
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0231
+ENCODING 561
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+78
+00
+30
+30
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0232
+ENCODING 562
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1F00
+0000
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x0233
+ENCODING 563
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 1 -3
+BITMAP
+3E
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0250
+ENCODING 592
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+F8
+44
+44
+78
+40
+44
+38
+ENDCHAR
+STARTCHAR 0x0251
+ENCODING 593
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+68
+98
+88
+88
+88
+9A
+6C
+ENDCHAR
+STARTCHAR 0x0252
+ENCODING 594
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+6C
+B2
+22
+22
+22
+32
+2C
+ENDCHAR
+STARTCHAR 0x0253
+ENCODING 595
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 0
+BITMAP
+60
+90
+80
+80
+80
+80
+F0
+88
+88
+88
+88
+88
+F0
+ENDCHAR
+STARTCHAR 0x0254
+ENCODING 596
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+08
+08
+08
+88
+70
+ENDCHAR
+STARTCHAR 0x0255
+ENCODING 597
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 8 1 -1
+BITMAP
+70
+88
+80
+80
+90
+A8
+70
+80
+ENDCHAR
+STARTCHAR 0x0256
+ENCODING 598
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 8 15 1 -3
+BITMAP
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+78
+08
+09
+07
+ENDCHAR
+STARTCHAR 0x0257
+ENCODING 599
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 8 13 1 0
+BITMAP
+07
+09
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0258
+ENCODING 600
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+F8
+08
+08
+88
+70
+ENDCHAR
+STARTCHAR 0x0259
+ENCODING 601
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+08
+08
+F8
+88
+70
+ENDCHAR
+STARTCHAR 0x025A
+ENCODING 602
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+68
+94
+36
+50
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x025B
+ENCODING 603
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+60
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x025C
+ENCODING 604
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+30
+48
+08
+30
+08
+88
+70
+ENDCHAR
+STARTCHAR 0x025D
+ENCODING 605
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+3600
+4A80
+0900
+3000
+0800
+8800
+7000
+ENDCHAR
+STARTCHAR 0x025E
+ENCODING 606
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+3C
+42
+82
+9C
+82
+42
+3C
+ENDCHAR
+STARTCHAR 0x025F
+ENCODING 607
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -3
+BITMAP
+30
+10
+10
+10
+10
+10
+38
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0260
+ENCODING 608
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 1 -3
+BITMAP
+06
+0A
+78
+88
+88
+88
+88
+88
+78
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x0261
+ENCODING 609
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+78
+88
+88
+88
+88
+88
+78
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x0262
+ENCODING 610
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+34
+4C
+84
+80
+8E
+44
+3C
+ENDCHAR
+STARTCHAR 0x0263
+ENCODING 611
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F1E0
+2080
+1100
+1100
+0A00
+0A00
+0400
+0E00
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x0264
+ENCODING 612
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 0 0
+BITMAP
+E7
+24
+24
+18
+18
+24
+18
+ENDCHAR
+STARTCHAR 0x0265
+ENCODING 613
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+EE
+44
+44
+44
+44
+44
+3C
+04
+04
+06
+ENDCHAR
+STARTCHAR 0x0266
+ENCODING 614
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+38
+48
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0267
+ENCODING 615
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -3
+BITMAP
+38
+48
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+E4
+04
+24
+38
+ENDCHAR
+STARTCHAR 0x0268
+ENCODING 616
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 12 0 0
+BITMAP
+60
+60
+00
+00
+00
+60
+20
+20
+F8
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x0269
+ENCODING 617
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 0
+BITMAP
+C0
+40
+40
+40
+40
+50
+70
+ENDCHAR
+STARTCHAR 0x026A
+ENCODING 618
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 7 1 0
+BITMAP
+E0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x026B
+ENCODING 619
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 12 1 0
+BITMAP
+60
+20
+20
+20
+20
+68
+B0
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x026C
+ENCODING 620
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+30
+10
+10
+10
+50
+B0
+7C
+10
+10
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x026D
+ENCODING 621
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+48
+38
+ENDCHAR
+STARTCHAR 0x026E
+ENCODING 622
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+E4
+04
+22
+1C
+ENDCHAR
+STARTCHAR 0x026F
+ENCODING 623
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+EEE0
+4440
+4440
+4440
+4440
+4440
+3BE0
+ENDCHAR
+STARTCHAR 0x0270
+ENCODING 624
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 -3
+BITMAP
+EEE0
+4440
+4440
+4440
+4440
+4440
+3BC0
+0040
+0040
+0060
+ENDCHAR
+STARTCHAR 0x0271
+ENCODING 625
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -3
+BITMAP
+FB80
+4440
+4440
+4440
+4440
+4440
+EE40
+0040
+0240
+0380
+ENDCHAR
+STARTCHAR 0x0272
+ENCODING 626
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 10 -1 -3
+BITMAP
+3E00
+1100
+1100
+1100
+1100
+1100
+1380
+1000
+9000
+E000
+ENDCHAR
+STARTCHAR 0x0273
+ENCODING 627
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 10 1 -3
+BITMAP
+F800
+4400
+4400
+4400
+4400
+4400
+E400
+0400
+0480
+0380
+ENDCHAR
+STARTCHAR 0x0274
+ENCODING 628
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+CE
+64
+64
+54
+4C
+4C
+E4
+ENDCHAR
+STARTCHAR 0x0275
+ENCODING 629
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+88
+F8
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0276
+ENCODING 630
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+3F00
+4900
+8A00
+8E00
+8A80
+4900
+3F00
+ENDCHAR
+STARTCHAR 0x0277
+ENCODING 631
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+38
+44
+82
+92
+92
+92
+6C
+ENDCHAR
+STARTCHAR 0x0278
+ENCODING 632
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 0 0
+BITMAP
+F8
+20
+20
+70
+A8
+A8
+A8
+70
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0279
+ENCODING 633
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+78
+10
+10
+10
+10
+B0
+58
+ENDCHAR
+STARTCHAR 0x027A
+ENCODING 634
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+78
+10
+10
+10
+10
+10
+10
+10
+10
+B0
+58
+ENDCHAR
+STARTCHAR 0x027B
+ENCODING 635
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 1 -3
+BITMAP
+78
+10
+10
+10
+10
+B0
+50
+10
+12
+0E
+ENDCHAR
+STARTCHAR 0x027C
+ENCODING 636
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -3
+BITMAP
+D0
+68
+40
+40
+40
+40
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x027D
+ENCODING 637
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+D0
+68
+40
+40
+40
+40
+40
+40
+48
+38
+ENDCHAR
+STARTCHAR 0x027E
+ENCODING 638
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+30
+48
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x027F
+ENCODING 639
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+60
+90
+10
+10
+10
+10
+78
+ENDCHAR
+STARTCHAR 0x0280
+ENCODING 640
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+F0
+48
+48
+70
+50
+48
+E6
+ENDCHAR
+STARTCHAR 0x0281
+ENCODING 641
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+E6
+48
+50
+70
+48
+48
+F0
+ENDCHAR
+STARTCHAR 0x0282
+ENCODING 642
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+78
+88
+80
+70
+08
+88
+F0
+80
+A0
+60
+ENDCHAR
+STARTCHAR 0x0283
+ENCODING 643
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 14 -1 -3
+BITMAP
+0E
+12
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0284
+ENCODING 644
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 -1 -3
+BITMAP
+0E
+12
+10
+10
+7C
+10
+10
+10
+10
+7C
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0285
+ENCODING 645
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 14 -1 -3
+BITMAP
+E0
+90
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+12
+0E
+ENDCHAR
+STARTCHAR 0x0286
+ENCODING 646
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 14 -1 -3
+BITMAP
+0E
+12
+10
+10
+10
+10
+10
+10
+10
+10
+10
+78
+94
+74
+ENDCHAR
+STARTCHAR 0x0287
+ENCODING 647
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+40
+A0
+A0
+20
+20
+20
+F8
+30
+20
+20
+ENDCHAR
+STARTCHAR 0x0288
+ENCODING 648
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 -3
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+20
+20
+20
+20
+24
+1C
+ENDCHAR
+STARTCHAR 0x0289
+ENCODING 649
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+D8
+48
+48
+FC
+48
+48
+3C
+ENDCHAR
+STARTCHAR 0x028A
+ENCODING 650
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+CC
+48
+48
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x028B
+ENCODING 651
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 8 1 0
+BITMAP
+08
+E4
+42
+42
+42
+42
+44
+38
+ENDCHAR
+STARTCHAR 0x028C
+ENCODING 652
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+18
+18
+18
+24
+24
+24
+E7
+ENDCHAR
+STARTCHAR 0x028D
+ENCODING 653
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 0 0
+BITMAP
+1100
+1100
+2A80
+2A80
+2A80
+2480
+EEE0
+ENDCHAR
+STARTCHAR 0x028E
+ENCODING 654
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 0 0
+BITMAP
+07
+09
+08
+18
+18
+18
+24
+24
+24
+E7
+ENDCHAR
+STARTCHAR 0x028F
+ENCODING 655
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+44
+28
+38
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x0290
+ENCODING 656
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 10 1 -3
+BITMAP
+F8
+90
+90
+20
+48
+48
+F8
+08
+09
+07
+ENDCHAR
+STARTCHAR 0x0291
+ENCODING 657
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 8 1 -1
+BITMAP
+F8
+90
+90
+20
+48
+54
+FC
+20
+ENDCHAR
+STARTCHAR 0x0292
+ENCODING 658
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+F8
+10
+20
+70
+08
+08
+C8
+88
+70
+ENDCHAR
+STARTCHAR 0x0293
+ENCODING 659
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -1
+BITMAP
+F8
+10
+20
+70
+08
+08
+C8
+A8
+70
+08
+ENDCHAR
+STARTCHAR 0x0294
+ENCODING 660
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+70
+88
+08
+08
+08
+70
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR 0x0295
+ENCODING 661
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+70
+88
+80
+80
+80
+70
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x0296
+ENCODING 662
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+40
+40
+40
+40
+40
+70
+08
+08
+08
+88
+70
+ENDCHAR
+STARTCHAR 0x0297
+ENCODING 663
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+70
+88
+80
+80
+80
+80
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0298
+ENCODING 664
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 1
+BITMAP
+30
+48
+B4
+B4
+48
+30
+ENDCHAR
+STARTCHAR 0x0299
+ENCODING 665
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+F8
+44
+44
+78
+44
+44
+F8
+ENDCHAR
+STARTCHAR 0x029A
+ENCODING 666
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+78
+84
+82
+72
+82
+84
+78
+ENDCHAR
+STARTCHAR 0x029B
+ENCODING 667
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 8 1 0
+BITMAP
+03
+35
+4C
+84
+80
+8E
+44
+3C
+ENDCHAR
+STARTCHAR 0x029C
+ENCODING 668
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+44
+44
+7C
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x029D
+ENCODING 669
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 6 15 -1 -3
+BITMAP
+30
+30
+00
+00
+00
+30
+10
+10
+10
+10
+10
+10
+7C
+90
+60
+ENDCHAR
+STARTCHAR 0x029E
+ENCODING 670
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+EE
+24
+34
+1C
+14
+24
+F4
+04
+04
+04
+04
+06
+ENDCHAR
+STARTCHAR 0x029F
+ENCODING 671
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+E0
+40
+40
+40
+44
+4C
+FC
+ENDCHAR
+STARTCHAR 0x02A0
+ENCODING 672
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 -3
+BITMAP
+06
+0A
+78
+48
+88
+88
+88
+48
+78
+08
+08
+1C
+ENDCHAR
+STARTCHAR 0x02A1
+ENCODING 673
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 0 0
+BITMAP
+38
+44
+04
+04
+04
+38
+20
+F8
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x02A2
+ENCODING 674
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+70
+88
+80
+80
+80
+70
+10
+7C
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x02A3
+ENCODING 675
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 0
+BITMAP
+1800
+0800
+0800
+0800
+0800
+7FC0
+8C80
+8880
+8900
+8A40
+8A40
+7FC0
+ENDCHAR
+STARTCHAR 0x02A4
+ENCODING 676
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 1 -2
+BITMAP
+1800
+0800
+0800
+0800
+0800
+7FC0
+8880
+8900
+8B80
+8840
+8840
+7E40
+0440
+0380
+ENDCHAR
+STARTCHAR 0x02A5
+ENCODING 677
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -1
+BITMAP
+1800
+0800
+0800
+0800
+0800
+7FC0
+8C80
+8880
+8900
+8A40
+8AA0
+7FC0
+0100
+ENDCHAR
+STARTCHAR 0x02A6
+ENCODING 678
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 0 0
+BITMAP
+2000
+2000
+2000
+F380
+2480
+2400
+2300
+2080
+2080
+1F00
+ENDCHAR
+STARTCHAR 0x02A7
+ENCODING 679
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 10 14 0 -3
+BITMAP
+01C0
+2240
+2200
+2200
+FA00
+2200
+2200
+2200
+2200
+2600
+1A00
+0200
+1200
+1C00
+ENDCHAR
+STARTCHAR 0x02A8
+ENCODING 680
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 -1
+BITMAP
+2000
+2000
+2000
+F9C0
+2220
+2200
+2200
+2240
+26A0
+19C0
+0200
+ENDCHAR
+STARTCHAR 0x0066
+ENCODING 681
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 1 -3
+BITMAP
+3800
+4800
+4000
+4000
+4000
+FF80
+4440
+4440
+4440
+4440
+4440
+EE40
+0040
+0140
+0180
+ENDCHAR
+STARTCHAR 0x006C
+ENCODING 682
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+C0
+40
+40
+40
+40
+5E
+62
+60
+5C
+42
+62
+FC
+ENDCHAR
+STARTCHAR 0x006C
+ENCODING 683
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+C0
+40
+40
+40
+40
+7E
+64
+64
+48
+52
+52
+FE
+ENDCHAR
+STARTCHAR 0x0077
+ENCODING 684
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+DD80
+4900
+5500
+5500
+2200
+0000
+DD80
+4900
+5500
+5500
+2200
+ENDCHAR
+STARTCHAR 0x0077
+ENCODING 685
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FE
+82
+82
+82
+00
+00
+00
+FE
+82
+82
+82
+ENDCHAR
+STARTCHAR 0x02B0
+ENCODING 688
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 6
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x02B1
+ENCODING 689
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 6
+BITMAP
+38
+48
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x02B2
+ENCODING 690
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 13 0 3
+BITMAP
+60
+60
+00
+60
+20
+20
+20
+20
+20
+20
+20
+A0
+C0
+ENDCHAR
+STARTCHAR 0x02B3
+ENCODING 691
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 6
+BITMAP
+D0
+68
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x02B4
+ENCODING 692
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 6
+BITMAP
+38
+10
+10
+10
+10
+B0
+58
+ENDCHAR
+STARTCHAR 0x02B5
+ENCODING 693
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 4
+BITMAP
+38
+10
+10
+10
+10
+B0
+50
+14
+08
+ENDCHAR
+STARTCHAR 0x02B6
+ENCODING 694
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 6
+BITMAP
+E6
+48
+50
+70
+48
+48
+F0
+ENDCHAR
+STARTCHAR 0x02B7
+ENCODING 695
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 7 0 6
+BITMAP
+EEE0
+2480
+2A80
+2A80
+2A80
+1100
+1100
+ENDCHAR
+STARTCHAR 0x02B8
+ENCODING 696
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 10 0 3
+BITMAP
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x02B9
+ENCODING 697
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 5 1 9
+BITMAP
+30
+30
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x02BA
+ENCODING 698
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 5 1 9
+BITMAP
+33
+33
+66
+44
+88
+ENDCHAR
+STARTCHAR 0x02BB
+ENCODING 699
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 5 1 7
+BITMAP
+40
+80
+80
+C0
+C0
+ENDCHAR
+STARTCHAR 0x02BC
+ENCODING 700
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 5 1 7
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x02BD
+ENCODING 701
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 5 1 7
+BITMAP
+C0
+C0
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x02BE
+ENCODING 702
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 5 1 7
+BITMAP
+80
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x02BF
+ENCODING 703
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 5 1 7
+BITMAP
+40
+80
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x02C0
+ENCODING 704
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 6
+BITMAP
+70
+88
+08
+08
+08
+70
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR 0x02C1
+ENCODING 705
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 6
+BITMAP
+70
+88
+80
+80
+80
+70
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x02C2
+ENCODING 706
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 6
+BITMAP
+03
+0C
+30
+C0
+30
+0C
+03
+ENDCHAR
+STARTCHAR 0x02C3
+ENCODING 707
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 6
+BITMAP
+C0
+30
+0C
+03
+0C
+30
+C0
+ENDCHAR
+STARTCHAR 0x02C4
+ENCODING 708
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 8 2 6
+BITMAP
+82
+82
+44
+44
+28
+28
+10
+10
+ENDCHAR
+STARTCHAR 0x02C5
+ENCODING 709
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 8 2 6
+BITMAP
+10
+10
+28
+28
+44
+44
+82
+82
+ENDCHAR
+STARTCHAR 0x02C6
+ENCODING 710
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 1 10
+BITMAP
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x02C7
+ENCODING 711
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 1 10
+BITMAP
+88
+70
+20
+ENDCHAR
+STARTCHAR 0x02C8
+ENCODING 712
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 3 1 10
+BITMAP
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x02C9
+ENCODING 713
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 1 1 12
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x02CA
+ENCODING 714
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 4 1 11
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x02CB
+ENCODING 715
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 4 1 11
+BITMAP
+80
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x02CC
+ENCODING 716
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 3 1 -3
+BITMAP
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x02CD
+ENCODING 717
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 1 1 -1
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x02CE
+ENCODING 718
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 4 1 -2
+BITMAP
+80
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x02CF
+ENCODING 719
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 4 1 -2
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x02D0
+ENCODING 720
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 9 1 0
+BITMAP
+E0
+E0
+40
+00
+00
+00
+40
+E0
+E0
+ENDCHAR
+STARTCHAR 0x02D1
+ENCODING 721
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 3 1 6
+BITMAP
+E0
+E0
+40
+ENDCHAR
+STARTCHAR 0x02D2
+ENCODING 722
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 5 1 4
+BITMAP
+80
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x02D3
+ENCODING 723
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 5 1 4
+BITMAP
+40
+80
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x02D4
+ENCODING 724
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 6
+BITMAP
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x02D5
+ENCODING 725
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 3
+BITMAP
+F8
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x02D6
+ENCODING 726
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 2
+BITMAP
+20
+20
+F8
+20
+20
+ENDCHAR
+STARTCHAR 0x02D7
+ENCODING 727
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 1 1 4
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x02D8
+ENCODING 728
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 2 1 10
+BITMAP
+88
+70
+ENDCHAR
+STARTCHAR 0x02D9
+ENCODING 729
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 2 1 10
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x02DA
+ENCODING 730
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 4 1 10
+BITMAP
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x02DB
+ENCODING 731
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 3 1 -3
+BITMAP
+40
+90
+60
+ENDCHAR
+STARTCHAR 0x02DC
+ENCODING 732
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 1 10
+BITMAP
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x02DD
+ENCODING 733
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 4 1 11
+BITMAP
+24
+6C
+48
+90
+ENDCHAR
+STARTCHAR 0x02DE
+ENCODING 734
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 4
+BITMAP
+40
+A0
+28
+10
+ENDCHAR
+STARTCHAR 0x00D7
+ENCODING 735
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 5 1 4
+BITMAP
+88
+50
+20
+50
+88
+ENDCHAR
+STARTCHAR 0x02E0
+ENCODING 736
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 6
+BITMAP
+E380
+4100
+2200
+2200
+1400
+1400
+0800
+1400
+1400
+0800
+ENDCHAR
+STARTCHAR 0x02E1
+ENCODING 737
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 12 1 6
+BITMAP
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x02E2
+ENCODING 738
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 6
+BITMAP
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x02E3
+ENCODING 739
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 6
+BITMAP
+CC
+48
+30
+30
+30
+48
+CC
+ENDCHAR
+STARTCHAR 0x02E4
+ENCODING 740
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 4
+BITMAP
+70
+88
+80
+80
+80
+70
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x02E5
+ENCODING 741
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 4
+BITMAP
+F8
+08
+08
+08
+08
+08
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x02E6
+ENCODING 742
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 4
+BITMAP
+08
+08
+F8
+08
+08
+08
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x02E7
+ENCODING 743
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 4
+BITMAP
+08
+08
+08
+08
+F8
+08
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x02E8
+ENCODING 744
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 4
+BITMAP
+08
+08
+08
+08
+08
+08
+F8
+08
+08
+ENDCHAR
+STARTCHAR 0x02E9
+ENCODING 745
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 4
+BITMAP
+08
+08
+08
+08
+08
+08
+08
+08
+F8
+ENDCHAR
+STARTCHAR char746
+ENCODING 746
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 4 1 6
+BITMAP
+80
+80
+80
+E0
+ENDCHAR
+STARTCHAR char746
+ENCODING 747
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 5 1 5
+BITMAP
+80
+80
+E0
+80
+80
+ENDCHAR
+STARTCHAR char748
+ENCODING 748
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 4 1 0
+BITMAP
+88
+50
+70
+20
+ENDCHAR
+STARTCHAR 0x02CD
+ENCODING 749
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 3 1 9
+BITMAP
+FC
+00
+FC
+ENDCHAR
+STARTCHAR 0x0022
+ENCODING 750
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 5 1 7
+BITMAP
+D8
+D8
+48
+48
+90
+ENDCHAR
+STARTCHAR 0x0300
+ENCODING 768
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 12
+BITMAP
+80
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x0301
+ENCODING 769
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 12
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x0302
+ENCODING 770
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 12
+BITMAP
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x0303
+ENCODING 771
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 12
+BITMAP
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x0304
+ENCODING 772
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 1 0 12
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x0305
+ENCODING 773
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 10 1 0 12
+BITMAP
+FFC0
+ENDCHAR
+STARTCHAR 0x0306
+ENCODING 774
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 12
+BITMAP
+88
+70
+ENDCHAR
+STARTCHAR 0x0307
+ENCODING 775
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 2 0 12
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0308
+ENCODING 776
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 12
+BITMAP
+D8
+D8
+ENDCHAR
+STARTCHAR 0x0309
+ENCODING 777
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 12
+BITMAP
+40
+A0
+20
+40
+40
+ENDCHAR
+STARTCHAR 0x030A
+ENCODING 778
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 4 0 12
+BITMAP
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x030B
+ENCODING 779
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 12
+BITMAP
+24
+6C
+48
+90
+ENDCHAR
+STARTCHAR 0x030C
+ENCODING 780
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 12
+BITMAP
+88
+70
+20
+ENDCHAR
+STARTCHAR 0x030D
+ENCODING 781
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 4 0 12
+BITMAP
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x030E
+ENCODING 782
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 3 4 0 12
+BITMAP
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR 0x030F
+ENCODING 783
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 12
+BITMAP
+90
+D8
+48
+24
+ENDCHAR
+STARTCHAR 0x0310
+ENCODING 784
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 12
+BITMAP
+30
+30
+84
+78
+ENDCHAR
+STARTCHAR 0x0311
+ENCODING 785
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 12
+BITMAP
+70
+88
+ENDCHAR
+STARTCHAR 0x0312
+ENCODING 786
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 5 0 12
+BITMAP
+40
+80
+80
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0313
+ENCODING 787
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 5 0 12
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x0314
+ENCODING 788
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 5 0 12
+BITMAP
+C0
+C0
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x0315
+ENCODING 789
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 5 0 12
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x0316
+ENCODING 790
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 -4
+BITMAP
+80
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x0317
+ENCODING 791
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 -4
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x0318
+ENCODING 792
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 3 5 0 -5
+BITMAP
+20
+20
+E0
+20
+20
+ENDCHAR
+STARTCHAR 0x0319
+ENCODING 793
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 -5
+BITMAP
+80
+80
+E0
+80
+80
+ENDCHAR
+STARTCHAR 0x031A
+ENCODING 794
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 3 0 12
+BITMAP
+F8
+08
+08
+ENDCHAR
+STARTCHAR 0x031B
+ENCODING 795
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 9
+BITMAP
+60
+60
+20
+C0
+ENDCHAR
+STARTCHAR 0x031C
+ENCODING 796
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 2 5 0 -5
+BITMAP
+40
+80
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x031D
+ENCODING 797
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 3 0 -3
+BITMAP
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x031E
+ENCODING 798
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 3 0 -3
+BITMAP
+F8
+20
+20
+ENDCHAR
+STARTCHAR 0x031F
+ENCODING 799
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 5 0 -5
+BITMAP
+20
+20
+F8
+20
+20
+ENDCHAR
+STARTCHAR 0x0320
+ENCODING 800
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 1 0 -1
+BITMAP
+F0
+ENDCHAR
+STARTCHAR 0x0321
+ENCODING 801
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 -5
+BITMAP
+20
+20
+20
+A0
+C0
+ENDCHAR
+STARTCHAR 0x0322
+ENCODING 802
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 -5
+BITMAP
+80
+80
+80
+A0
+60
+ENDCHAR
+STARTCHAR 0x0323
+ENCODING 803
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 2 0 -2
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0324
+ENCODING 804
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 -2
+BITMAP
+D8
+D8
+ENDCHAR
+STARTCHAR 0x0325
+ENCODING 805
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 4 0 -4
+BITMAP
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x0326
+ENCODING 806
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 5 0 -5
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x0327
+ENCODING 807
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 3 3 2 -3
+BITMAP
+40
+20
+E0
+ENDCHAR
+STARTCHAR 0x0328
+ENCODING 808
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 3 0 -3
+BITMAP
+40
+90
+60
+ENDCHAR
+STARTCHAR 0x0329
+ENCODING 809
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 4 0 -4
+BITMAP
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x032A
+ENCODING 810
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 -2
+BITMAP
+F8
+88
+ENDCHAR
+STARTCHAR 0x032B
+ENCODING 811
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 -3
+BITMAP
+A8
+A8
+50
+ENDCHAR
+STARTCHAR 0x032C
+ENCODING 812
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 -3
+BITMAP
+88
+70
+20
+ENDCHAR
+STARTCHAR 0x032D
+ENCODING 813
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 -3
+BITMAP
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x032E
+ENCODING 814
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 -2
+BITMAP
+88
+70
+ENDCHAR
+STARTCHAR 0x032F
+ENCODING 815
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 -2
+BITMAP
+70
+88
+ENDCHAR
+STARTCHAR 0x0330
+ENCODING 816
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 -3
+BITMAP
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x0331
+ENCODING 817
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 1 0 -1
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x0332
+ENCODING 818
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 10 1 0 -1
+BITMAP
+FFC0
+ENDCHAR
+STARTCHAR 0x0333
+ENCODING 819
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 10 3 0 -3
+BITMAP
+FFC0
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x0334
+ENCODING 820
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 6
+BITMAP
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x0335
+ENCODING 821
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 1 0 6
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x0336
+ENCODING 822
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 10 1 0 6
+BITMAP
+FFC0
+ENDCHAR
+STARTCHAR 0x0337
+ENCODING 823
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 6 0 6
+BITMAP
+20
+20
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0x0338
+ENCODING 824
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 12 0 1
+BITMAP
+20
+20
+20
+20
+40
+40
+40
+40
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0339
+ENCODING 825
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 2 5 0 -5
+BITMAP
+80
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x033A
+ENCODING 826
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 0 -2
+BITMAP
+88
+F8
+ENDCHAR
+STARTCHAR 0x033B
+ENCODING 827
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 -3
+BITMAP
+E0
+A0
+E0
+ENDCHAR
+STARTCHAR 0x033C
+ENCODING 828
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 -3
+BITMAP
+D8
+20
+20
+ENDCHAR
+STARTCHAR 0x033D
+ENCODING 829
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 3 0 12
+BITMAP
+90
+60
+90
+ENDCHAR
+STARTCHAR 0x033E
+ENCODING 830
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 12
+BITMAP
+40
+80
+40
+20
+40
+ENDCHAR
+STARTCHAR 0x033F
+ENCODING 831
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 10 3 0 12
+BITMAP
+FFC0
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x0340
+ENCODING 832
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 12
+BITMAP
+80
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x0341
+ENCODING 833
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 12
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x0342
+ENCODING 834
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 12
+BITMAP
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x0343
+ENCODING 835
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 5 0 12
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x0385
+ENCODING 836
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 4 3 12
+BITMAP
+10
+10
+EC
+CC
+ENDCHAR
+STARTCHAR 0x0345
+ENCODING 837
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 3 1 -3
+BITMAP
+40
+90
+60
+ENDCHAR
+STARTCHAR char838
+ENCODING 838
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 2 1 12
+BITMAP
+F8
+88
+ENDCHAR
+STARTCHAR 0x0333
+ENCODING 839
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 1 -3
+BITMAP
+F8
+00
+F8
+ENDCHAR
+STARTCHAR char840
+ENCODING 840
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 1 -4
+BITMAP
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR char840
+ENCODING 841
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 1 -4
+BITMAP
+E0
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x0342
+ENCODING 842
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 3 0 12
+BITMAP
+6A
+92
+AC
+ENDCHAR
+STARTCHAR 0x0342
+ENCODING 843
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 5 0 11
+BITMAP
+08
+62
+92
+8C
+20
+ENDCHAR
+STARTCHAR 0x0342
+ENCODING 844
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 6 0 12
+BITMAP
+48
+A8
+90
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x0333
+ENCODING 845
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 3 1 -3
+BITMAP
+44
+FE
+44
+ENDCHAR
+STARTCHAR char840
+ENCODING 846
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 1 -5
+BITMAP
+40
+E0
+40
+40
+40
+ENDCHAR
+STARTCHAR 0x0360
+ENCODING 864
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 11 3 0 12
+BITMAP
+7820
+8420
+83C0
+ENDCHAR
+STARTCHAR 0x0361
+ENCODING 865
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 11 3 0 12
+BITMAP
+3F80
+4040
+8020
+ENDCHAR
+STARTCHAR 0x0333
+ENCODING 866
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 9 3 1 -3
+BITMAP
+0100
+FF80
+0100
+ENDCHAR
+STARTCHAR 0x0374
+ENCODING 884
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 3 4 4 12
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x0375
+ENCODING 885
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 3 4 4 -2
+BITMAP
+20
+40
+C0
+80
+ENDCHAR
+STARTCHAR 0x037A
+ENCODING 890
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 4 4 3 -4
+BITMAP
+C0
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x037E
+ENCODING 894
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 10 1 -3
+BITMAP
+C0
+C0
+00
+00
+00
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x0384
+ENCODING 900
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 3 3 12
+BITMAP
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x0385
+ENCODING 901
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 4 3 12
+BITMAP
+10
+10
+EC
+CC
+ENDCHAR
+STARTCHAR 0x0386
+ENCODING 902
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 0
+BITMAP
+1000
+1400
+2400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0387
+ENCODING 903
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 2 2 2 5
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0388
+ENCODING 904
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 0 0
+BITMAP
+4000
+7FE0
+8820
+0820
+08A0
+0880
+0F80
+0890
+0890
+0820
+0820
+3FE0
+ENDCHAR
+STARTCHAR 0x0389
+ENCODING 905
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 0 0
+BITMAP
+4000
+7EF8
+8820
+0820
+0820
+0820
+0FE0
+0820
+0820
+0820
+0820
+3EF8
+ENDCHAR
+STARTCHAR 0x038A
+ENCODING 906
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 0
+BITMAP
+40
+7E
+88
+08
+08
+08
+08
+08
+08
+08
+08
+3E
+ENDCHAR
+STARTCHAR 0x038C
+ENCODING 908
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 12 0 0
+BITMAP
+4000
+4F00
+9080
+2040
+4020
+4020
+4020
+4020
+4020
+2040
+1080
+0F00
+ENDCHAR
+STARTCHAR 0x038E
+ENCODING 910
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 0 0
+BITMAP
+4000
+7C78
+8820
+0440
+0440
+0280
+0380
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x038F
+ENCODING 911
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 0 0
+BITMAP
+4000
+4F80
+9040
+2020
+2020
+2020
+2020
+1040
+1040
+0880
+28A0
+38E0
+ENDCHAR
+STARTCHAR 0x0390
+ENCODING 912
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 -1 0
+BITMAP
+10
+10
+EC
+CC
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x0391
+ENCODING 913
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 0 0
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0392
+ENCODING 914
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+FF00
+2080
+2040
+2040
+2080
+3F00
+2080
+2040
+2040
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x0393
+ENCODING 915
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 0
+BITMAP
+FF
+21
+21
+21
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0394
+ENCODING 916
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0400
+0A00
+0A00
+1100
+1100
+2080
+2080
+4040
+4040
+8020
+FFE0
+ENDCHAR
+STARTCHAR 0x0395
+ENCODING 917
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0396
+ENCODING 918
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FE
+C4
+84
+88
+08
+10
+22
+22
+42
+46
+FE
+ENDCHAR
+STARTCHAR 0x0397
+ENCODING 919
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x0398
+ENCODING 920
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1E00
+2100
+4080
+8040
+9240
+9E40
+9240
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0399
+ENCODING 921
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x039A
+ENCODING 922
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x039B
+ENCODING 923
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1100
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x039C
+ENCODING 924
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 0 0
+BITMAP
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+ENDCHAR
+STARTCHAR 0x039D
+ENCODING 925
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0x039E
+ENCODING 926
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+FF
+81
+00
+00
+42
+7E
+42
+00
+81
+81
+FF
+ENDCHAR
+STARTCHAR 0x039F
+ENCODING 927
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x03A0
+ENCODING 928
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FFE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x03A1
+ENCODING 929
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 0 0
+BITMAP
+FF00
+2180
+2080
+2080
+2180
+3F00
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x03A3
+ENCODING 931
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+FF80
+4180
+2080
+2080
+1000
+1800
+1000
+2080
+2080
+4180
+FF80
+ENDCHAR
+STARTCHAR 0x03A4
+ENCODING 932
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x03A5
+ENCODING 933
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR C070
+ENCODING 934
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+3E00
+0800
+0800
+3E00
+C980
+8880
+C980
+3E00
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x03A7
+ENCODING 935
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+FBC0
+1100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x03A8
+ENCODING 936
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+1F00
+0400
+C4C0
+4480
+4480
+4480
+2480
+1F00
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x03A9
+ENCODING 937
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+8080
+4100
+4100
+2200
+A280
+E380
+ENDCHAR
+STARTCHAR 0x03AA
+ENCODING 938
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+D8
+D8
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x03AB
+ENCODING 939
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1B00
+1B00
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x03AC
+ENCODING 940
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+10
+10
+20
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x03AD
+ENCODING 941
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+10
+10
+20
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x03AE
+ENCODING 942
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -4
+BITMAP
+08
+08
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x03AF
+ENCODING 943
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 11 1 0
+BITMAP
+20
+20
+40
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x03B0
+ENCODING 944
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+10
+10
+EC
+CC
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x03B1
+ENCODING 945
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x03B2
+ENCODING 946
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 16 1 -4
+BITMAP
+70
+88
+88
+88
+88
+B0
+D0
+C8
+88
+88
+88
+F0
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x03B3
+ENCODING 947
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -3
+BITMAP
+43
+A4
+24
+14
+14
+08
+08
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x03B4
+ENCODING 948
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+60
+90
+90
+40
+20
+50
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x03B5
+ENCODING 949
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x03B6
+ENCODING 950
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 2 -2
+BITMAP
+8C
+78
+20
+40
+40
+80
+80
+80
+80
+80
+80
+78
+04
+08
+ENDCHAR
+STARTCHAR 0x03B7
+ENCODING 951
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 -4
+BITMAP
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x03B8
+ENCODING 952
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+50
+88
+88
+88
+F8
+88
+88
+88
+50
+20
+ENDCHAR
+STARTCHAR 0x03B9
+ENCODING 953
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 0
+BITMAP
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x03BA
+ENCODING 954
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+48
+50
+70
+48
+48
+E6
+ENDCHAR
+STARTCHAR 0x03BB
+ENCODING 955
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+80
+40
+20
+20
+30
+30
+48
+48
+84
+84
+ENDCHAR
+STARTCHAR 0x03BC
+ENCODING 956
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+88
+88
+88
+88
+88
+DA
+A4
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x03BD
+ENCODING 957
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 7 1 0
+BITMAP
+88
+48
+48
+28
+28
+30
+20
+ENDCHAR
+STARTCHAR 0x03BE
+ENCODING 958
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 2 -2
+BITMAP
+98
+60
+40
+40
+40
+38
+60
+80
+80
+80
+80
+78
+04
+08
+ENDCHAR
+STARTCHAR 0x03BF
+ENCODING 959
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x03C0
+ENCODING 960
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+FC
+48
+48
+48
+48
+88
+86
+ENDCHAR
+STARTCHAR 0x03C1
+ENCODING 961
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+88
+88
+88
+88
+F0
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x03C2
+ENCODING 962
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 10 1 -3
+BITMAP
+30
+40
+80
+80
+80
+80
+60
+10
+10
+20
+ENDCHAR
+STARTCHAR 0x03C3
+ENCODING 963
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+7C
+90
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x03C4
+ENCODING 964
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+7C
+90
+10
+10
+10
+14
+08
+ENDCHAR
+STARTCHAR 0x03C5
+ENCODING 965
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x03C6
+ENCODING 966
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 -3
+BITMAP
+20
+20
+20
+70
+A8
+A8
+A8
+A8
+A8
+70
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x03C7
+ENCODING 967
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+C4
+A8
+28
+10
+30
+30
+30
+50
+54
+8C
+ENDCHAR
+STARTCHAR 0x03C8
+ENCODING 968
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+0800
+0800
+0800
+0800
+C980
+4900
+4900
+4900
+4900
+2900
+1E00
+0800
+0800
+0800
+ENDCHAR
+STARTCHAR 0x03C9
+ENCODING 969
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x03CA
+ENCODING 970
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 10 0 0
+BITMAP
+D8
+D8
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x03CB
+ENCODING 971
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+6C
+6C
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x03CC
+ENCODING 972
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+10
+10
+20
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x03CD
+ENCODING 973
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+08
+08
+10
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x03CE
+ENCODING 974
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+0400
+0400
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x03D0
+ENCODING 976
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+70
+88
+88
+88
+B0
+88
+84
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x03D1
+ENCODING 977
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+18
+24
+1E
+C4
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x03D2
+ENCODING 978
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+6300
+9480
+0880
+0980
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x03D3
+ENCODING 979
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 0
+BITMAP
+4000
+58C0
+A520
+0220
+0260
+0200
+0200
+0200
+0200
+0200
+0200
+0F80
+ENDCHAR
+STARTCHAR 0x03D4
+ENCODING 980
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 0
+BITMAP
+3600
+3600
+0000
+6300
+9480
+0880
+0980
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x03D5
+ENCODING 981
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+4C
+92
+92
+92
+92
+54
+38
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x03D6
+ENCODING 982
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+FE00
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x03C7
+ENCODING 983
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 -2
+BITMAP
+C2
+A6
+2C
+34
+24
+45
+42
+0A
+0C
+ENDCHAR
+STARTCHAR 0x03DA
+ENCODING 986
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -2
+BITMAP
+3C
+42
+80
+80
+80
+80
+80
+40
+38
+04
+02
+02
+1C
+ENDCHAR
+STARTCHAR 0x03C2
+ENCODING 987
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 10 1 -3
+BITMAP
+30
+40
+80
+80
+80
+80
+60
+10
+10
+20
+ENDCHAR
+STARTCHAR 0x03DC
+ENCODING 988
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 0
+BITMAP
+FF
+21
+21
+21
+20
+3C
+24
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0066
+ENCODING 989
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 1 0
+BITMAP
+24
+58
+40
+40
+40
+70
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x03DE
+ENCODING 990
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 -3
+BITMAP
+1C00
+2200
+4100
+8080
+8080
+8080
+8080
+8080
+4100
+2200
+1C00
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x03DF
+ENCODING 991
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+88
+88
+88
+88
+70
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x03E0
+ENCODING 992
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 -1
+BITMAP
+E0
+18
+04
+0A
+12
+23
+45
+89
+11
+22
+E2
+04
+ENDCHAR
+STARTCHAR 0x03E0
+ENCODING 993
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+F0
+18
+64
+8C
+34
+44
+E8
+ENDCHAR
+STARTCHAR 0x03E2
+ENCODING 994
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 14 1 -3
+BITMAP
+F8F8
+2020
+4010
+8008
+8708
+8208
+8208
+8208
+8208
+4518
+38E8
+0010
+03E0
+0600
+ENDCHAR
+STARTCHAR 0x03E3
+ENCODING 995
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 -3
+BITMAP
+2200
+4100
+8080
+8880
+8880
+8880
+7780
+0080
+0F00
+1800
+ENDCHAR
+STARTCHAR 0x03E4
+ENCODING 996
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+6F80
+A200
+8200
+8200
+C600
+7A00
+0200
+0200
+0200
+0200
+0F80
+ENDCHAR
+STARTCHAR 0x03E5
+ENCODING 997
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+48
+88
+88
+88
+88
+48
+38
+08
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x03E6
+ENCODING 998
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 -3
+BITMAP
+7C00
+1000
+1000
+1000
+1F00
+1080
+1040
+1040
+1040
+1040
+7C40
+0080
+FF00
+8000
+ENDCHAR
+STARTCHAR 0x03E7
+ENCODING 999
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 8 1 0
+BITMAP
+0200
+3E00
+4900
+3080
+0080
+6080
+9180
+4F00
+ENDCHAR
+STARTCHAR 0x03E8
+ENCODING 1000
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+78
+84
+84
+C4
+04
+04
+08
+08
+10
+20
+C0
+70
+1C
+ENDCHAR
+STARTCHAR 0x03E9
+ENCODING 1001
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 -2
+BITMAP
+70
+88
+88
+48
+10
+20
+C0
+60
+38
+ENDCHAR
+STARTCHAR 0x03EA
+ENCODING 1002
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+6180
+5100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+FFE0
+ENDCHAR
+STARTCHAR 0x03EB
+ENCODING 1003
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+66
+B4
+18
+18
+18
+24
+FF
+ENDCHAR
+STARTCHAR 0x03EC
+ENCODING 1004
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 0
+BITMAP
+0080
+1F00
+6000
+4000
+9F00
+A080
+8040
+8040
+8040
+8040
+4080
+3F00
+ENDCHAR
+STARTCHAR 0x03ED
+ENCODING 1005
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 8 1 0
+BITMAP
+04
+78
+80
+B8
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x03EE
+ENCODING 1006
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 0 0
+BITMAP
+1F00
+0400
+0400
+7FC0
+8420
+4440
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x03EF
+ENCODING 1007
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+38
+10
+10
+FE
+92
+10
+10
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x03C7
+ENCODING 1008
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+C2
+A6
+2C
+34
+24
+45
+42
+ENDCHAR
+STARTCHAR 0x03F1
+ENCODING 1009
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+88
+88
+88
+88
+F0
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x03F2
+ENCODING 1010
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+7C
+80
+80
+80
+80
+84
+78
+ENDCHAR
+STARTCHAR 0x03F3
+ENCODING 1011
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 14 0 -3
+BITMAP
+30
+30
+00
+00
+30
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0400
+ENCODING 1024
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 0
+BITMAP
+3000
+1800
+0400
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0401
+ENCODING 1025
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+3600
+3600
+0000
+FF80
+2180
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0402
+ENCODING 1026
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0BC0
+0C20
+0820
+0820
+0820
+3E20
+0020
+0320
+01C0
+ENDCHAR
+STARTCHAR 0x0403
+ENCODING 1027
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 15 0 0
+BITMAP
+0600
+0C00
+1000
+0000
+FF80
+2180
+2080
+2080
+2000
+2000
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0404
+ENCODING 1028
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+FC00
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0405
+ENCODING 1029
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 11 1 0
+BITMAP
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR 0x0406
+ENCODING 1030
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0407
+ENCODING 1031
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+D8
+D8
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x0408
+ENCODING 1032
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0409
+ENCODING 1033
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 11 1 0
+BITMAP
+7FC0
+2100
+2100
+2100
+2100
+21F8
+2104
+2104
+2104
+A108
+C7F0
+ENDCHAR
+STARTCHAR 0x040A
+ENCODING 1034
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 11 0 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3FFC
+2082
+2082
+2082
+2084
+FBF8
+ENDCHAR
+STARTCHAR 0x040B
+ENCODING 1035
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 11 1 0
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0BC0
+0C20
+0820
+0820
+0820
+3EF8
+ENDCHAR
+STARTCHAR 0x040C
+ENCODING 1036
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 0
+BITMAP
+0300
+0600
+0800
+0000
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x040D
+ENCODING 1037
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+3000
+1800
+0400
+0000
+FBE0
+2180
+2180
+2280
+2680
+2480
+2C80
+2880
+3080
+3080
+FBE0
+ENDCHAR
+STARTCHAR 0x040E
+ENCODING 1038
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1100
+0E00
+0000
+F1E0
+2080
+1080
+1100
+0900
+0900
+0A00
+0600
+4400
+4400
+3800
+ENDCHAR
+STARTCHAR 0x040F
+ENCODING 1039
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 -2
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+FFE0
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0410
+ENCODING 1040
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 0 0
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0411
+ENCODING 1041
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+FF80
+2180
+2080
+2080
+2000
+3F80
+20C0
+2040
+2040
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x0412
+ENCODING 1042
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+FF00
+2080
+2040
+2040
+2080
+3F00
+2080
+2040
+2040
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x0413
+ENCODING 1043
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 11 0 0
+BITMAP
+FF80
+2180
+2080
+2080
+2000
+2000
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0414
+ENCODING 1044
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 -2
+BITMAP
+3FE0
+0880
+0880
+0880
+0880
+1080
+1080
+1080
+1080
+2080
+FFE0
+8060
+8020
+ENDCHAR
+STARTCHAR 0x0415
+ENCODING 1045
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+FF80
+2180
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x0416
+ENCODING 1046
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 0 0
+BITMAP
+F39E
+3118
+1110
+0920
+0540
+0BA0
+0920
+1110
+3118
+2108
+F39E
+ENDCHAR
+STARTCHAR 0x0417
+ENCODING 1047
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+BC
+C2
+82
+02
+04
+3C
+02
+02
+02
+82
+7C
+ENDCHAR
+STARTCHAR 0x0418
+ENCODING 1048
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FBE0
+2180
+2180
+2280
+2680
+2480
+2C80
+2880
+3080
+3080
+FBE0
+ENDCHAR
+STARTCHAR 0x0419
+ENCODING 1049
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+1100
+0E00
+0000
+0000
+FBE0
+2180
+2180
+2280
+2280
+2480
+2880
+2880
+3080
+3080
+FBE0
+ENDCHAR
+STARTCHAR 0x041A
+ENCODING 1050
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x041B
+ENCODING 1051
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+7FC0
+2100
+2100
+2100
+2100
+2100
+2100
+2100
+2100
+A100
+C7C0
+ENDCHAR
+STARTCHAR 0x041C
+ENCODING 1052
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 0 0
+BITMAP
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+ENDCHAR
+STARTCHAR 0x041D
+ENCODING 1053
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x041E
+ENCODING 1054
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x041F
+ENCODING 1055
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FFE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x0420
+ENCODING 1056
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 0 0
+BITMAP
+FF00
+2180
+2080
+2080
+2180
+3F00
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0421
+ENCODING 1057
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0422
+ENCODING 1058
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x0423
+ENCODING 1059
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F1E0
+2080
+1080
+1100
+0900
+0900
+0A00
+0600
+4400
+4400
+3800
+ENDCHAR
+STARTCHAR 0x0424
+ENCODING 1060
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+0E00
+0400
+3F80
+4440
+8420
+8420
+8420
+4440
+3F80
+0400
+0E00
+ENDCHAR
+STARTCHAR 0x0425
+ENCODING 1061
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+F3C0
+1100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x0426
+ENCODING 1062
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 -2
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+FFE0
+0060
+0020
+ENDCHAR
+STARTCHAR 0x0427
+ENCODING 1063
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 11 1 0
+BITMAP
+E380
+4100
+4100
+4100
+4100
+4100
+3F00
+0100
+0100
+0100
+0380
+ENDCHAR
+STARTCHAR 0x0428
+ENCODING 1064
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 11 0 0
+BITMAP
+F39E
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+FFFE
+ENDCHAR
+STARTCHAR 0x0429
+ENCODING 1065
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 13 0 -2
+BITMAP
+F39E
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+2108
+FFFE
+0006
+0002
+ENDCHAR
+STARTCHAR 0x042A
+ENCODING 1066
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 0 0
+BITMAP
+FF00
+8400
+8400
+0400
+0400
+07F0
+0418
+0408
+0408
+0410
+1FE0
+ENDCHAR
+STARTCHAR 0x042B
+ENCODING 1067
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 11 1 0
+BITMAP
+F83E
+2008
+2008
+2008
+2008
+3F88
+20C8
+2048
+2048
+20C8
+FF3E
+ENDCHAR
+STARTCHAR 0x042C
+ENCODING 1068
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+F800
+2000
+2000
+2000
+2000
+3F80
+20C0
+2040
+2040
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x042D
+ENCODING 1069
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+BC00
+C200
+8100
+8080
+0080
+1F80
+0080
+8080
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x042E
+ENCODING 1070
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 11 0 0
+BITMAP
+F87C00
+208200
+210100
+220080
+220080
+3E0080
+220080
+220080
+210100
+208200
+F87C00
+ENDCHAR
+STARTCHAR 0x042F
+ENCODING 1071
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+1FE0
+2080
+4080
+4080
+2080
+1F80
+0480
+0880
+1080
+2080
+E3E0
+ENDCHAR
+STARTCHAR 0x0430
+ENCODING 1072
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x0431
+ENCODING 1073
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+38
+40
+80
+80
+F0
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0432
+ENCODING 1074
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+F8
+44
+44
+78
+44
+44
+F8
+ENDCHAR
+STARTCHAR 0x0433
+ENCODING 1075
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+FC
+44
+44
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x0434
+ENCODING 1076
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+7E
+14
+24
+24
+24
+24
+FE
+82
+82
+ENDCHAR
+STARTCHAR 0x0435
+ENCODING 1077
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0436
+ENCODING 1078
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+EEE0
+2480
+1500
+0E00
+1500
+2480
+EEE0
+ENDCHAR
+STARTCHAR 0x0437
+ENCODING 1079
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+48
+08
+30
+08
+88
+70
+ENDCHAR
+STARTCHAR 0x0438
+ENCODING 1080
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+4C
+54
+54
+54
+64
+EE
+ENDCHAR
+STARTCHAR 0x0439
+ENCODING 1081
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+44
+38
+00
+00
+EE
+4C
+54
+54
+54
+64
+EE
+ENDCHAR
+STARTCHAR 0x043A
+ENCODING 1082
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+48
+50
+70
+48
+48
+E6
+ENDCHAR
+STARTCHAR 0x043B
+ENCODING 1083
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+FE
+44
+44
+44
+44
+C4
+CE
+ENDCHAR
+STARTCHAR 0x043C
+ENCODING 1084
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+C180
+6300
+6300
+5500
+5500
+4900
+EB80
+ENDCHAR
+STARTCHAR 0x043D
+ENCODING 1085
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+44
+44
+7C
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x043E
+ENCODING 1086
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x043F
+ENCODING 1087
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+FE
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0440
+ENCODING 1088
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+F8
+44
+44
+44
+44
+44
+78
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0441
+ENCODING 1089
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0442
+ENCODING 1090
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+FE
+92
+92
+10
+10
+10
+7C
+ENDCHAR
+STARTCHAR 0x0443
+ENCODING 1091
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -3
+BITMAP
+E7
+24
+24
+24
+18
+18
+18
+10
+10
+E0
+ENDCHAR
+STARTCHAR 0x0444
+ENCODING 1092
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 13 1 -3
+BITMAP
+0800
+1800
+0800
+6B00
+9C80
+8880
+8880
+8880
+9C80
+6B00
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x0445
+ENCODING 1093
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+E7
+24
+18
+18
+18
+24
+E7
+ENDCHAR
+STARTCHAR 0x0446
+ENCODING 1094
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+EE
+44
+44
+44
+44
+44
+FE
+02
+02
+ENDCHAR
+STARTCHAR 0x0447
+ENCODING 1095
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+44
+44
+44
+3C
+04
+0E
+ENDCHAR
+STARTCHAR 0x0448
+ENCODING 1096
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+EEE0
+4440
+4440
+4440
+4440
+4440
+FFE0
+ENDCHAR
+STARTCHAR 0x0449
+ENCODING 1097
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 -2
+BITMAP
+EEE0
+4440
+4440
+4440
+4440
+4440
+FFE0
+0020
+0020
+ENDCHAR
+STARTCHAR 0x044A
+ENCODING 1098
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+F8
+90
+90
+1E
+11
+11
+3E
+ENDCHAR
+STARTCHAR 0x044B
+ENCODING 1099
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+E380
+4100
+4100
+7900
+4500
+4500
+FB80
+ENDCHAR
+STARTCHAR 0x044C
+ENCODING 1100
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+E0
+40
+40
+78
+44
+44
+F8
+ENDCHAR
+STARTCHAR 0x044D
+ENCODING 1101
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+70
+48
+04
+3C
+04
+88
+70
+ENDCHAR
+STARTCHAR 0x044E
+ENCODING 1102
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+E380
+4440
+4820
+7820
+4820
+4440
+E380
+ENDCHAR
+STARTCHAR 0x044F
+ENCODING 1103
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+3C
+48
+48
+38
+18
+28
+CC
+ENDCHAR
+STARTCHAR 0x0450
+ENCODING 1104
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+C0
+60
+10
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0451
+ENCODING 1105
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x0452
+ENCODING 1106
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -3
+BITMAP
+C0
+40
+40
+40
+F8
+40
+78
+44
+44
+44
+E4
+04
+34
+18
+ENDCHAR
+STARTCHAR 0x0453
+ENCODING 1107
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+0C
+18
+20
+00
+FC
+44
+44
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x0454
+ENCODING 1108
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+38
+48
+80
+F0
+80
+44
+38
+ENDCHAR
+STARTCHAR 0x0455
+ENCODING 1109
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x0456
+ENCODING 1110
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 11 1 0
+BITMAP
+C0
+C0
+00
+00
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0457
+ENCODING 1111
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 10 0 0
+BITMAP
+D8
+D8
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x0458
+ENCODING 1112
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 14 -1 -3
+BITMAP
+30
+30
+00
+00
+30
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0459
+ENCODING 1113
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 0
+BITMAP
+FE00
+4400
+4400
+4780
+4440
+C440
+CF80
+ENDCHAR
+STARTCHAR 0x045A
+ENCODING 1114
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 0
+BITMAP
+EE00
+4400
+4400
+7F80
+4440
+4440
+EF80
+ENDCHAR
+STARTCHAR 0x045B
+ENCODING 1115
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+C0
+40
+40
+40
+F8
+40
+78
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x045C
+ENCODING 1116
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+0C
+18
+20
+00
+EE
+48
+50
+70
+48
+48
+E6
+ENDCHAR
+STARTCHAR 0x045D
+ENCODING 1117
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+C0
+60
+10
+00
+EE
+4C
+54
+54
+54
+64
+EE
+ENDCHAR
+STARTCHAR 0x045E
+ENCODING 1118
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 -3
+BITMAP
+22
+1C
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+10
+E0
+ENDCHAR
+STARTCHAR 0x045F
+ENCODING 1119
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+EE
+44
+44
+44
+44
+44
+FE
+10
+10
+ENDCHAR
+STARTCHAR 0x0460
+ENCODING 1120
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+3060
+4010
+8008
+8008
+8708
+8208
+8208
+8208
+8208
+4510
+38E0
+ENDCHAR
+STARTCHAR 0x0461
+ENCODING 1121
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+4100
+8080
+9C80
+8880
+8880
+4900
+3600
+ENDCHAR
+STARTCHAR 0x0462
+ENCODING 1122
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 -1 0
+BITMAP
+7C00
+1000
+FE00
+9200
+1000
+1FC0
+1060
+1020
+1020
+1040
+7F80
+ENDCHAR
+STARTCHAR 0x0463
+ENCODING 1123
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 -1 0
+BITMAP
+30
+10
+10
+FE
+92
+10
+10
+1E
+11
+11
+3E
+ENDCHAR
+STARTCHAR 0x0464
+ENCODING 1124
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 11 0 0
+BITMAP
+F87A
+2086
+2102
+2202
+2200
+3FF0
+2200
+2202
+2102
+2084
+F878
+ENDCHAR
+STARTCHAR 0x0465
+ENCODING 1125
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 0
+BITMAP
+E380
+4480
+4800
+7F00
+4800
+4440
+E380
+ENDCHAR
+STARTCHAR 0x0466
+ENCODING 1126
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 11 0 0
+BITMAP
+0100
+0100
+0280
+0440
+0440
+0C60
+0AA0
+1110
+1110
+2108
+F39E
+ENDCHAR
+STARTCHAR 0x0467
+ENCODING 1127
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+0400
+0E00
+1100
+1B00
+2480
+4440
+EEE0
+ENDCHAR
+STARTCHAR 0x0468
+ENCODING 1128
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 11 0 0
+BITMAP
+F80800
+200800
+201400
+202200
+202200
+3FE300
+205500
+208880
+208880
+210840
+FB9CF0
+ENDCHAR
+STARTCHAR 0x0469
+ENCODING 1129
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 7 1 0
+BITMAP
+E080
+41C0
+4220
+7F60
+4490
+4888
+FDDC
+ENDCHAR
+STARTCHAR 0x046A
+ENCODING 1130
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 11 0 0
+BITMAP
+1FF0
+0820
+0440
+0280
+0100
+0FE0
+1110
+2108
+2108
+2108
+F39E
+ENDCHAR
+STARTCHAR 0x046B
+ENCODING 1131
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+1F00
+0A00
+0400
+3F80
+4440
+4440
+EEE0
+ENDCHAR
+STARTCHAR 0x046C
+ENCODING 1132
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 11 0 0
+BITMAP
+F8FF80
+204100
+202200
+201400
+200800
+3FFF00
+208880
+210840
+210840
+210840
+FB9CF0
+ENDCHAR
+STARTCHAR 0x046D
+ENCODING 1133
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 7 1 0
+BITMAP
+E3E0
+4140
+4080
+7FF0
+4888
+4888
+EDDC
+ENDCHAR
+STARTCHAR 0x046E
+ENCODING 1134
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 18 0 -3
+BITMAP
+22
+1C
+08
+00
+5E
+61
+41
+01
+02
+1E
+01
+01
+01
+61
+9E
+80
+7F
+01
+ENDCHAR
+STARTCHAR 0x046F
+ENCODING 1135
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 -3
+BITMAP
+88
+70
+20
+00
+70
+48
+08
+30
+08
+48
+B0
+80
+78
+08
+ENDCHAR
+STARTCHAR 0x0470
+ENCODING 1136
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1F00
+0400
+C4C0
+4480
+4480
+4480
+2480
+1F00
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x0471
+ENCODING 1137
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+0800
+0800
+0800
+0800
+C980
+4900
+4900
+4900
+4900
+2900
+1E00
+0800
+0800
+0800
+ENDCHAR
+STARTCHAR 0x0472
+ENCODING 1138
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1E00
+2100
+4080
+8040
+9840
+EDC0
+8640
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x0473
+ENCODING 1139
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+A8
+F8
+A8
+88
+70
+ENDCHAR
+STARTCHAR 0x0474
+ENCODING 1140
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 0 0
+BITMAP
+F0E0
+2160
+2100
+1100
+1100
+1200
+0A00
+0A00
+0A00
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0475
+ENCODING 1141
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+E3
+25
+24
+24
+18
+18
+18
+ENDCHAR
+STARTCHAR 0x0476
+ENCODING 1142
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 16 0 0
+BITMAP
+1400
+1400
+0A00
+0A00
+0000
+F0E0
+2160
+2100
+1100
+1100
+1200
+0A00
+0A00
+0A00
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0477
+ENCODING 1143
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 0
+BITMAP
+28
+28
+14
+14
+00
+E3
+25
+24
+24
+18
+18
+18
+ENDCHAR
+STARTCHAR 0x0478
+ENCODING 1144
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 14 1 -3
+BITMAP
+100000
+280000
+460000
+810000
+817180
+811280
+811200
+811200
+620C00
+140C00
+080C00
+000400
+000800
+000800
+ENDCHAR
+STARTCHAR 0x0479
+ENCODING 1145
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 10 1 -3
+BITMAP
+6718
+9128
+8920
+8920
+88C0
+48C0
+30C0
+0040
+0080
+0080
+ENDCHAR
+STARTCHAR 0x047A
+ENCODING 1146
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 13 1 -1
+BITMAP
+0600
+1F80
+2640
+4020
+8010
+8010
+8010
+8010
+8010
+4020
+2640
+1F80
+0600
+ENDCHAR
+STARTCHAR 0x047B
+ENCODING 1147
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 -1
+BITMAP
+18
+3C
+5A
+81
+81
+81
+5A
+3C
+18
+ENDCHAR
+STARTCHAR 0x047C
+ENCODING 1148
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 16 1 0
+BITMAP
+0F00
+1080
+2E40
+2D30
+0000
+3060
+4010
+8008
+8008
+8708
+8208
+8208
+8208
+8208
+4510
+38E0
+ENDCHAR
+STARTCHAR 0x047D
+ENCODING 1149
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+3800
+4400
+B300
+A800
+4100
+8080
+9C80
+8880
+8880
+4900
+3600
+ENDCHAR
+STARTCHAR 0x047E
+ENCODING 1150
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 14 1 0
+BITMAP
+1FC0
+1240
+0000
+3060
+4010
+8008
+8008
+8708
+8208
+8208
+8208
+8208
+4510
+38E0
+ENDCHAR
+STARTCHAR 0x047F
+ENCODING 1151
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 0
+BITMAP
+7F00
+4900
+0000
+4100
+8080
+9C80
+8880
+8880
+4900
+3600
+ENDCHAR
+STARTCHAR 0x0480
+ENCODING 1152
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 -3
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8000
+4000
+3C00
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x0481
+ENCODING 1153
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+30
+48
+80
+80
+80
+80
+70
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x0482
+ENCODING 1154
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+0200
+0100
+0A80
+0400
+2A00
+1000
+A800
+4000
+2000
+ENDCHAR
+STARTCHAR 0x0483
+ENCODING 1155
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 4 1 12
+BITMAP
+3C00
+4200
+B900
+B4C0
+ENDCHAR
+STARTCHAR 0x0484
+ENCODING 1156
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 3 0 12
+BITMAP
+18
+24
+C0
+ENDCHAR
+STARTCHAR 0x0485
+ENCODING 1157
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 0 12
+BITMAP
+80
+F8
+80
+ENDCHAR
+STARTCHAR 0x0486
+ENCODING 1158
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 0 12
+BITMAP
+08
+F8
+08
+ENDCHAR
+STARTCHAR 0x048E
+ENCODING 1166
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 0 0
+BITMAP
+FF00
+2180
+2080
+2480
+2780
+3F00
+2100
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x048F
+ENCODING 1167
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+F8
+44
+44
+44
+54
+5C
+78
+44
+40
+E0
+ENDCHAR
+STARTCHAR 0x0490
+ENCODING 1168
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 14 0 0
+BITMAP
+0080
+0080
+0180
+FF80
+2000
+2000
+2000
+2000
+2000
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0491
+ENCODING 1169
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+04
+04
+FC
+40
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x0492
+ENCODING 1170
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 11 0 0
+BITMAP
+FF80
+2180
+2080
+2080
+2000
+FC00
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0493
+ENCODING 1171
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+FC
+44
+44
+F0
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x0494
+ENCODING 1172
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 -3
+BITMAP
+FF00
+2300
+2100
+2100
+2000
+2F00
+3080
+2080
+2080
+2080
+F880
+0080
+0C80
+0700
+ENDCHAR
+STARTCHAR 0x0495
+ENCODING 1173
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+FC
+44
+44
+78
+44
+44
+E4
+04
+34
+18
+ENDCHAR
+STARTCHAR 0x0496
+ENCODING 1174
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 0 -3
+BITMAP
+F39E
+3118
+1110
+0920
+0540
+0BA0
+0920
+1110
+3118
+2108
+F39E
+0006
+0002
+0002
+ENDCHAR
+STARTCHAR 0x0497
+ENCODING 1175
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 -2
+BITMAP
+EEE0
+2480
+1500
+0E00
+1500
+2480
+EEE0
+0020
+0020
+ENDCHAR
+STARTCHAR 0x0498
+ENCODING 1176
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 1 -3
+BITMAP
+BC
+C2
+82
+02
+04
+3C
+02
+02
+02
+82
+7C
+10
+08
+38
+ENDCHAR
+STARTCHAR 0x0499
+ENCODING 1177
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+48
+08
+30
+08
+88
+70
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x049A
+ENCODING 1178
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+0060
+0020
+0020
+ENDCHAR
+STARTCHAR 0x049B
+ENCODING 1179
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+EE
+48
+50
+70
+48
+48
+E6
+02
+02
+ENDCHAR
+STARTCHAR 0x049C
+ENCODING 1180
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+F9E0
+2080
+2900
+2A00
+2C00
+2E00
+3A00
+2900
+2900
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x049D
+ENCODING 1181
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+E6
+54
+58
+70
+58
+54
+E6
+ENDCHAR
+STARTCHAR 0x049E
+ENCODING 1182
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+F9E0
+2080
+F900
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x049F
+ENCODING 1183
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+58
+F0
+70
+48
+48
+E6
+ENDCHAR
+STARTCHAR 0x04A0
+ENCODING 1184
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 14 11 0 0
+BITMAP
+FF3C
+8410
+8420
+0440
+0480
+05C0
+0640
+0420
+0420
+0410
+1F3C
+ENDCHAR
+STARTCHAR 0x04A1
+ENCODING 1185
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 0
+BITMAP
+FDC0
+8900
+0A00
+0E00
+0900
+0900
+1CC0
+ENDCHAR
+STARTCHAR 0x04A2
+ENCODING 1186
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 14 0 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+0060
+0020
+0020
+ENDCHAR
+STARTCHAR 0x04A3
+ENCODING 1187
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 -2
+BITMAP
+EE
+44
+44
+7C
+44
+44
+EE
+02
+02
+ENDCHAR
+STARTCHAR 0x04A4
+ENCODING 1188
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 14 11 0 0
+BITMAP
+FBFC
+2084
+2084
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x04A5
+ENCODING 1189
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 0
+BITMAP
+EFC0
+4440
+4400
+7C00
+4400
+4400
+EE00
+ENDCHAR
+STARTCHAR 0x04A6
+ENCODING 1190
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 14 0 -3
+BITMAP
+FFE0
+2080
+2080
+2080
+2080
+20BC
+20C2
+2082
+2082
+2082
+FBE2
+0002
+0032
+001C
+ENDCHAR
+STARTCHAR 0x04A7
+ENCODING 1191
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -3
+BITMAP
+FE00
+4400
+4400
+4780
+4440
+4440
+EE40
+0040
+0340
+0180
+ENDCHAR
+STARTCHAR 0x04A8
+ENCODING 1192
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+1F00
+2080
+4000
+8380
+8440
+8440
+8440
+8440
+4280
+2120
+1EC0
+ENDCHAR
+STARTCHAR 0x04A9
+ENCODING 1193
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+38
+44
+88
+94
+94
+4A
+3C
+ENDCHAR
+STARTCHAR 0x04AA
+ENCODING 1194
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 -3
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+0800
+1200
+0C00
+ENDCHAR
+STARTCHAR 0x04AB
+ENCODING 1195
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+80
+80
+80
+88
+70
+20
+48
+30
+ENDCHAR
+STARTCHAR 0x04AC
+ENCODING 1196
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 -3
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3F00
+0300
+0100
+0100
+ENDCHAR
+STARTCHAR 0x04AD
+ENCODING 1197
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+FE
+92
+92
+10
+10
+10
+7C
+04
+04
+ENDCHAR
+STARTCHAR 0x04AE
+ENCODING 1198
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x04AF
+ENCODING 1199
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 -3
+BITMAP
+F780
+2200
+2200
+1400
+1400
+1400
+0800
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x04B0
+ENCODING 1200
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+FFE0
+0400
+0400
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x04B1
+ENCODING 1201
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 -3
+BITMAP
+F780
+2200
+2200
+1400
+1400
+1400
+FF80
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x04B2
+ENCODING 1202
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 1 -3
+BITMAP
+F3C0
+1100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+F1E0
+0060
+0020
+0020
+ENDCHAR
+STARTCHAR 0x04B3
+ENCODING 1203
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 -2
+BITMAP
+E7
+24
+18
+18
+18
+24
+E7
+01
+01
+ENDCHAR
+STARTCHAR 0x04B4
+ENCODING 1204
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 13 0 -2
+BITMAP
+FFBE
+8888
+8888
+0808
+0808
+0808
+0808
+0808
+0808
+0808
+3FFE
+0006
+0002
+ENDCHAR
+STARTCHAR 0x04B5
+ENCODING 1205
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 -2
+BITMAP
+FEE0
+9240
+1040
+1040
+1040
+1040
+3FE0
+0020
+0020
+ENDCHAR
+STARTCHAR 0x04B6
+ENCODING 1206
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 -3
+BITMAP
+E380
+4100
+4100
+4100
+4100
+4100
+3F00
+0100
+0100
+0100
+03C0
+00C0
+0040
+0040
+ENDCHAR
+STARTCHAR 0x04B7
+ENCODING 1207
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+EE
+44
+44
+44
+3C
+04
+0E
+02
+02
+ENDCHAR
+STARTCHAR 0x04B8
+ENCODING 1208
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+E380
+4100
+4100
+4100
+4900
+4900
+3F00
+0900
+0900
+0100
+0380
+ENDCHAR
+STARTCHAR 0x04B9
+ENCODING 1209
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+EE
+44
+54
+54
+3C
+14
+0E
+ENDCHAR
+STARTCHAR 0x04BA
+ENCODING 1210
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+E000
+4000
+4000
+4000
+7E00
+4100
+4100
+4100
+4100
+4100
+E380
+ENDCHAR
+STARTCHAR 0x04BB
+ENCODING 1211
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+E0
+40
+78
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x04BC
+ENCODING 1212
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 11 0 0
+BITMAP
+03C0
+0420
+C810
+9008
+7FF8
+1000
+1000
+1000
+0808
+0C10
+03E0
+ENDCHAR
+STARTCHAR 0x04BD
+ENCODING 1213
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+CE
+91
+7F
+10
+10
+11
+0E
+ENDCHAR
+STARTCHAR 0x04BE
+ENCODING 1214
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 14 0 -3
+BITMAP
+03C0
+0420
+C810
+9008
+7FF8
+1000
+1000
+1000
+0808
+0C10
+03E0
+0080
+0120
+00C0
+ENDCHAR
+STARTCHAR 0x04BF
+ENCODING 1215
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 0 -3
+BITMAP
+CE
+91
+7F
+10
+10
+11
+0E
+08
+12
+0C
+ENDCHAR
+STARTCHAR 0x04C0
+ENCODING 1216
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x04C1
+ENCODING 1217
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 0 0
+BITMAP
+0440
+0380
+0000
+F39E
+3118
+1110
+0920
+0540
+0BA0
+0920
+1110
+3118
+2108
+F39E
+ENDCHAR
+STARTCHAR 0x04C2
+ENCODING 1218
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 0
+BITMAP
+1100
+0E00
+0000
+EEE0
+2480
+1500
+0E00
+1500
+2480
+EEE0
+ENDCHAR
+STARTCHAR 0x04C3
+ENCODING 1219
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 14 0 -3
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2F00
+3080
+2080
+2080
+2080
+F880
+0080
+0C80
+0700
+ENDCHAR
+STARTCHAR 0x04C4
+ENCODING 1220
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+EE
+58
+50
+78
+44
+44
+E4
+04
+34
+18
+ENDCHAR
+STARTCHAR 0x04C5
+ENCODING 1221
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 13 1 -2
+BITMAP
+7FC0
+2100
+2100
+2100
+2100
+2100
+2100
+2100
+2100
+A100
+C7C0
+00C0
+0040
+ENDCHAR
+STARTCHAR 0x04C6
+ENCODING 1222
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+FE
+44
+44
+44
+44
+C4
+CE
+02
+02
+ENDCHAR
+STARTCHAR 0x04C7
+ENCODING 1223
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 14 0 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+F880
+0080
+0C80
+0700
+ENDCHAR
+STARTCHAR 0x04C8
+ENCODING 1224
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 -3
+BITMAP
+EE
+44
+44
+7C
+44
+44
+E4
+04
+34
+18
+ENDCHAR
+STARTCHAR 0x04C9
+ENCODING 1225
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 17 0 -2
+BITMAP
+1100
+0E00
+0000
+0000
+FBE0
+2180
+2180
+2280
+2280
+2480
+2880
+2880
+3080
+3080
+FBE0
+0060
+0020
+ENDCHAR
+STARTCHAR 0x04CA
+ENCODING 1226
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -2
+BITMAP
+44
+38
+00
+00
+EE
+4C
+54
+54
+54
+64
+EE
+02
+02
+ENDCHAR
+STARTCHAR 0x04CB
+ENCODING 1227
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 -3
+BITMAP
+E380
+4100
+4100
+4100
+4100
+4100
+3F00
+0100
+0100
+0100
+0780
+0600
+0400
+0400
+ENDCHAR
+STARTCHAR 0x04CC
+ENCODING 1228
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+EE
+44
+44
+44
+3C
+04
+0E
+08
+08
+ENDCHAR
+STARTCHAR 0x04CD
+ENCODING 1229
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 -2
+BITMAP
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+000C
+0004
+ENDCHAR
+STARTCHAR 0x04CE
+ENCODING 1230
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 -2
+BITMAP
+C180
+6300
+6300
+5500
+5500
+4900
+EB80
+0080
+0080
+ENDCHAR
+STARTCHAR 0x04D0
+ENCODING 1232
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x04D1
+ENCODING 1233
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+88
+70
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x04D2
+ENCODING 1234
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+1B00
+1B00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x04D3
+ENCODING 1235
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x04D4
+ENCODING 1236
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 0 0
+BITMAP
+0FF8
+0A18
+0A08
+0A28
+1220
+1FE0
+1224
+1224
+2208
+2208
+F7F8
+ENDCHAR
+STARTCHAR 0x04D5
+ENCODING 1237
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 7 1 0
+BITMAP
+7380
+8C40
+0FC0
+7800
+8800
+8C40
+7380
+ENDCHAR
+STARTCHAR 0x04D6
+ENCODING 1238
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+2100
+1E00
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x04D7
+ENCODING 1239
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+88
+70
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x04D8
+ENCODING 1240
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 11 1 0
+BITMAP
+3E00
+4180
+8080
+0040
+0040
+0040
+FFC0
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x04D9
+ENCODING 1241
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+08
+08
+F8
+88
+70
+ENDCHAR
+STARTCHAR 0x04DA
+ENCODING 1242
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 14 1 0
+BITMAP
+3600
+3600
+0000
+3E00
+4180
+8080
+0040
+0040
+0040
+FFC0
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x04DB
+ENCODING 1243
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+08
+08
+F8
+88
+70
+ENDCHAR
+STARTCHAR 0x04DC
+ENCODING 1244
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 0 0
+BITMAP
+06C0
+06C0
+0000
+F39E
+3118
+1110
+0920
+0540
+0BA0
+0920
+1110
+3118
+2108
+F39E
+ENDCHAR
+STARTCHAR 0x04DD
+ENCODING 1245
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 0
+BITMAP
+1B00
+1B00
+0000
+EEE0
+2480
+1500
+0E00
+1500
+2480
+EEE0
+ENDCHAR
+STARTCHAR 0x04DE
+ENCODING 1246
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 1 0
+BITMAP
+6C
+6C
+00
+BC
+C2
+82
+02
+04
+3C
+02
+02
+02
+82
+7C
+ENDCHAR
+STARTCHAR 0x04DF
+ENCODING 1247
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+D8
+D8
+00
+70
+48
+08
+30
+08
+88
+70
+ENDCHAR
+STARTCHAR 0x04E0
+ENCODING 1248
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+FC
+08
+10
+20
+70
+08
+04
+04
+C4
+88
+70
+ENDCHAR
+STARTCHAR 0x04E1
+ENCODING 1249
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 -3
+BITMAP
+F8
+10
+20
+70
+08
+08
+C8
+88
+70
+ENDCHAR
+STARTCHAR 0x04E2
+ENCODING 1250
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 0
+BITMAP
+1F00
+0000
+FBE0
+2180
+2180
+2280
+2680
+2480
+2C80
+2880
+3080
+3080
+FBE0
+ENDCHAR
+STARTCHAR 0x04E3
+ENCODING 1251
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+00
+EE
+4C
+54
+54
+54
+64
+EE
+ENDCHAR
+STARTCHAR 0x04E4
+ENCODING 1252
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1B00
+1B00
+0000
+FBE0
+2180
+2180
+2280
+2680
+2480
+2C80
+2880
+3080
+3080
+FBE0
+ENDCHAR
+STARTCHAR 0x04E5
+ENCODING 1253
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 0
+BITMAP
+6C
+6C
+00
+EE
+4C
+54
+54
+54
+64
+EE
+ENDCHAR
+STARTCHAR 0x04E6
+ENCODING 1254
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+3600
+3600
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x04E7
+ENCODING 1255
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x04E8
+ENCODING 1256
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1E00
+6180
+4080
+8040
+8040
+FFC0
+8040
+8040
+4080
+6180
+1E00
+ENDCHAR
+STARTCHAR 0x04E9
+ENCODING 1257
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+88
+F8
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x04EA
+ENCODING 1258
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 0
+BITMAP
+3600
+3600
+0000
+1E00
+6180
+4080
+8040
+8040
+FFC0
+8040
+8040
+4080
+6180
+1E00
+ENDCHAR
+STARTCHAR 0x04EB
+ENCODING 1259
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+D8
+D8
+00
+70
+88
+88
+F8
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x04EC
+ENCODING 1260
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3600
+3600
+0000
+BC00
+C200
+8100
+8080
+0080
+1F80
+0080
+8080
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x04ED
+ENCODING 1261
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+D8
+D8
+00
+70
+48
+04
+3C
+04
+88
+70
+ENDCHAR
+STARTCHAR 0x04EE
+ENCODING 1262
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 0
+BITMAP
+1F00
+0000
+F1E0
+2080
+1080
+1100
+0900
+0900
+0A00
+0600
+4400
+4400
+3800
+ENDCHAR
+STARTCHAR 0x04EF
+ENCODING 1263
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 -3
+BITMAP
+3E
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+10
+E0
+ENDCHAR
+STARTCHAR 0x04F0
+ENCODING 1264
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1B00
+1B00
+0000
+F1E0
+2080
+1080
+1100
+0900
+0900
+0A00
+0600
+4400
+4400
+3800
+ENDCHAR
+STARTCHAR 0x04F1
+ENCODING 1265
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 -3
+BITMAP
+36
+36
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+10
+E0
+ENDCHAR
+STARTCHAR 0x04F2
+ENCODING 1266
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+06C0
+0D80
+1200
+0000
+F1E0
+2080
+1080
+1100
+0900
+0900
+0A00
+0600
+4400
+4400
+3800
+ENDCHAR
+STARTCHAR 0x04F3
+ENCODING 1267
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 14 1 -3
+BITMAP
+1B
+36
+48
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+10
+E0
+ENDCHAR
+STARTCHAR 0x04F4
+ENCODING 1268
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3600
+3600
+0000
+E380
+4100
+4100
+4100
+4100
+4100
+3F00
+0100
+0100
+0100
+0380
+ENDCHAR
+STARTCHAR 0x04F5
+ENCODING 1269
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+6C
+6C
+00
+EE
+44
+44
+44
+3C
+04
+0E
+ENDCHAR
+STARTCHAR 0x04F8
+ENCODING 1272
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 14 0 0
+BITMAP
+06C0
+06C0
+0000
+F83E
+2008
+2008
+2008
+2008
+3F88
+20C8
+2048
+2048
+20C8
+FF3E
+ENDCHAR
+STARTCHAR 0x04F9
+ENCODING 1273
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 0
+BITMAP
+3600
+3600
+0000
+E380
+4100
+4100
+7900
+4500
+4500
+FB80
+ENDCHAR
+STARTCHAR 0x04FA
+ENCODING 1274
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 14 1 0
+BITMAP
+3600
+3600
+0000
+BC00
+C200
+8100
+8080
+0080
+1F80
+0080
+8080
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x04FB
+ENCODING 1275
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+D8
+D8
+00
+70
+48
+04
+3C
+04
+88
+70
+ENDCHAR
+STARTCHAR 0x04FC
+ENCODING 1276
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 0 -2
+BITMAP
+1100
+0E00
+0000
+0000
+FBE0
+2180
+2180
+2280
+2280
+2480
+2880
+2880
+3080
+3080
+FBE0
+0060
+0020
+ENDCHAR
+STARTCHAR 0x04FD
+ENCODING 1277
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -2
+BITMAP
+44
+38
+00
+00
+EE
+4C
+54
+54
+54
+64
+EE
+02
+02
+ENDCHAR
+STARTCHAR 0x04FE
+ENCODING 1278
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 14 13 0 -2
+BITMAP
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+000C
+0004
+ENDCHAR
+STARTCHAR 0x04FF
+ENCODING 1279
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 -2
+BITMAP
+C180
+6300
+6300
+5500
+5500
+4900
+EB80
+0080
+0080
+ENDCHAR
+STARTCHAR 0x0531
+ENCODING 1329
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 0 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+20E0
+1130
+0E10
+ENDCHAR
+STARTCHAR 0x0532
+ENCODING 1330
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+0E00
+1100
+2080
+2080
+2000
+2000
+3F80
+20C0
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0533
+ENCODING 1331
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+3800
+4400
+8200
+8200
+8200
+4200
+3FC0
+0260
+0200
+0200
+0F80
+ENDCHAR
+STARTCHAR 0x0534
+ENCODING 1332
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 0 0
+BITMAP
+1C00
+2200
+4100
+4100
+4100
+E100
+01E0
+0130
+0110
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x0535
+ENCODING 1333
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+F800
+2000
+3F80
+2040
+2040
+2000
+2000
+20C0
+2080
+2080
+1F00
+ENDCHAR
+STARTCHAR 0x0536
+ENCODING 1334
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -1
+BITMAP
+1E00
+2100
+4080
+4080
+4080
+2100
+1E00
+0400
+0800
+D000
+FE00
+C300
+ENDCHAR
+STARTCHAR 0x0537
+ENCODING 1335
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 -2
+BITMAP
+F8
+20
+3E
+23
+21
+20
+20
+20
+20
+20
+3C
+06
+02
+ENDCHAR
+STARTCHAR 0x0538
+ENCODING 1336
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 13 1 -2
+BITMAP
+3800
+4400
+8200
+8200
+8200
+8200
+8700
+8000
+8000
+8000
+FF00
+0180
+0080
+ENDCHAR
+STARTCHAR 0x0539
+ENCODING 1337
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 0 0
+BITMAP
+0E00
+1100
+2080
+23E0
+24B0
+2490
+2480
+2300
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x053A
+ENCODING 1338
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0F80
+0200
+0200
+0200
+3FC0
+4260
+8200
+8200
+8200
+4400
+3800
+ENDCHAR
+STARTCHAR 0x053B
+ENCODING 1339
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F800
+2000
+2E00
+3100
+2080
+2080
+2080
+23E0
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x053C
+ENCODING 1340
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 0 -2
+BITMAP
+F0
+20
+20
+20
+20
+20
+20
+20
+20
+20
+3C
+02
+02
+ENDCHAR
+STARTCHAR 0x053D
+ENCODING 1341
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 11 0 0
+BITMAP
+F800
+2000
+2000
+3C70
+2420
+2420
+2420
+2420
+2420
+23C0
+F800
+ENDCHAR
+STARTCHAR 0x053E
+ENCODING 1342
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 0 0
+BITMAP
+8000
+C000
+7FE0
+1130
+2090
+4040
+4040
+4040
+4040
+4040
+2080
+1F00
+ENDCHAR
+STARTCHAR 0x053F
+ENCODING 1343
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+F800
+2000
+2000
+2000
+2300
+2100
+2100
+1300
+0D00
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x0540
+ENCODING 1344
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+2000
+3E00
+0200
+0400
+0800
+1000
+2000
+4000
+FF00
+0080
+0040
+ENDCHAR
+STARTCHAR 0x0541
+ENCODING 1345
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+38
+44
+82
+82
+82
+46
+3A
+04
+64
+99
+66
+ENDCHAR
+STARTCHAR 0x0542
+ENCODING 1346
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 0 -2
+BITMAP
+0E00
+1100
+2080
+2080
+2080
+2080
+F880
+0080
+0080
+0080
+00E0
+0030
+0010
+ENDCHAR
+STARTCHAR 0x0543
+ENCODING 1347
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+1F00
+2180
+F800
+4400
+4200
+4200
+4100
+4100
+4100
+2300
+1DC0
+ENDCHAR
+STARTCHAR 0x0544
+ENCODING 1348
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 0 0
+BITMAP
+F8E0
+20B0
+2090
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x0545
+ENCODING 1349
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+7C
+C2
+02
+84
+FC
+86
+01
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x0546
+ENCODING 1350
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+4000
+8000
+8000
+6000
+2000
+21C0
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x0547
+ENCODING 1351
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+7C00
+8200
+3D00
+4380
+8080
+8000
+8080
+8080
+8100
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x0548
+ENCODING 1352
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+0E00
+1100
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x0549
+ENCODING 1353
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -2
+BITMAP
+38
+44
+84
+82
+82
+02
+02
+02
+04
+E8
+70
+1C
+04
+ENDCHAR
+STARTCHAR 0x054A
+ENCODING 1354
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 0 0
+BITMAP
+1F00
+2480
+4440
+4440
+4440
+E440
+0440
+0E40
+0040
+0040
+01F0
+ENDCHAR
+STARTCHAR 0x054B
+ENCODING 1355
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 13 1 -2
+BITMAP
+7C00
+8200
+8100
+8100
+6100
+1100
+0A00
+0A00
+0C00
+C800
+FF00
+C180
+0080
+ENDCHAR
+STARTCHAR 0x054C
+ENCODING 1356
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 11 0 0
+BITMAP
+0E00
+1100
+2080
+2080
+2080
+2080
+20F0
+2098
+2088
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x054D
+ENCODING 1357
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x054E
+ENCODING 1358
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 0 -2
+BITMAP
+07C0
+0100
+0100
+0100
+E100
+2100
+2100
+2300
+1D00
+0100
+01E0
+0030
+0010
+ENDCHAR
+STARTCHAR 0x054F
+ENCODING 1359
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+3A
+46
+82
+82
+40
+38
+04
+82
+82
+C4
+B8
+ENDCHAR
+STARTCHAR 0x0550
+ENCODING 1360
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 0 0
+BITMAP
+0E00
+1100
+2080
+2080
+2080
+2080
+21C0
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0551
+ENCODING 1361
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+3C
+42
+42
+3C
+42
+81
+01
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x0552
+ENCODING 1362
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+F800
+2000
+3E00
+2100
+2080
+2080
+2060
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x0553
+ENCODING 1363
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+3E00
+0800
+3E00
+4900
+8880
+8880
+8880
+4900
+3E00
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x0554
+ENCODING 1364
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+0700
+0880
+1080
+1080
+1080
+1F00
+9000
+7F80
+10C0
+1000
+7C00
+ENDCHAR
+STARTCHAR 0x0555
+ENCODING 1365
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x0556
+ENCODING 1366
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+7800
+8800
+8800
+7800
+0E00
+0900
+0880
+0880
+C880
+4900
+3E00
+ENDCHAR
+STARTCHAR 0x0559
+ENCODING 1369
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 2 4 0 12
+BITMAP
+40
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x055A
+ENCODING 1370
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 2 4 0 12
+BITMAP
+80
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x055B
+ENCODING 1371
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 3 4 0 12
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x055C
+ENCODING 1372
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 2 0 12
+BITMAP
+72
+9C
+ENDCHAR
+STARTCHAR 0x055D
+ENCODING 1373
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 3 4 0 12
+BITMAP
+80
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x055E
+ENCODING 1374
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 3 0 12
+BITMAP
+38
+4C
+8C
+ENDCHAR
+STARTCHAR 0x055F
+ENCODING 1375
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 5 0 12
+BITMAP
+60
+E0
+80
+80
+78
+ENDCHAR
+STARTCHAR 0x0561
+ENCODING 1377
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+CCC0
+4440
+4440
+4440
+4440
+4440
+3BE0
+ENDCHAR
+STARTCHAR 0x0562
+ENCODING 1378
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+D8
+64
+44
+44
+44
+40
+7C
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0563
+ENCODING 1379
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+38
+44
+84
+84
+84
+44
+3E
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x0564
+ENCODING 1380
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -3
+BITMAP
+D8
+64
+44
+44
+44
+44
+E7
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x0565
+ENCODING 1381
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+C0
+40
+40
+40
+78
+40
+44
+44
+44
+4C
+36
+ENDCHAR
+STARTCHAR 0x0566
+ENCODING 1382
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 10 1 -3
+BITMAP
+34
+4C
+84
+84
+84
+4C
+34
+04
+04
+07
+ENDCHAR
+STARTCHAR 0x0567
+ENCODING 1383
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 1 -1
+BITMAP
+C0
+40
+40
+40
+70
+40
+40
+40
+40
+40
+78
+0C
+ENDCHAR
+STARTCHAR 0x0568
+ENCODING 1384
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+D8
+64
+44
+44
+44
+44
+4E
+40
+40
+7E
+ENDCHAR
+STARTCHAR 0x0569
+ENCODING 1385
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -3
+BITMAP
+DC
+62
+42
+5F
+62
+62
+5C
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x056A
+ENCODING 1386
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+0C
+04
+04
+04
+3F
+44
+84
+84
+84
+48
+30
+ENDCHAR
+STARTCHAR 0x056B
+ENCODING 1387
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -3
+BITMAP
+C0
+40
+40
+40
+58
+64
+44
+44
+44
+44
+4E
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x056C
+ENCODING 1388
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 4 11 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+70
+ENDCHAR
+STARTCHAR 0x056D
+ENCODING 1389
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 1 -3
+BITMAP
+C000
+4000
+4000
+4000
+5180
+6880
+4880
+4880
+4880
+4880
+47C0
+4000
+4000
+E000
+ENDCHAR
+STARTCHAR 0x056E
+ENCODING 1390
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+40
+20
+10
+3E
+48
+84
+84
+84
+48
+30
+ENDCHAR
+STARTCHAR 0x056F
+ENCODING 1391
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -3
+BITMAP
+C0
+40
+40
+40
+4C
+44
+44
+44
+44
+4C
+34
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x0570
+ENCODING 1392
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+C0
+40
+40
+40
+58
+64
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0571
+ENCODING 1393
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+08
+10
+18
+10
+30
+48
+84
+84
+84
+4C
+36
+ENDCHAR
+STARTCHAR 0x0572
+ENCODING 1394
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+D8
+64
+44
+44
+44
+44
+E4
+04
+04
+06
+ENDCHAR
+STARTCHAR 0x0573
+ENCODING 1395
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+0E
+16
+20
+20
+F0
+48
+84
+84
+84
+8C
+76
+ENDCHAR
+STARTCHAR 0x0574
+ENCODING 1396
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+0C
+16
+10
+08
+C4
+44
+44
+44
+44
+4C
+36
+ENDCHAR
+STARTCHAR 0x0575
+ENCODING 1397
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 10 0 -3
+BITMAP
+30
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x0576
+ENCODING 1398
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+30
+58
+80
+80
+98
+88
+88
+88
+88
+98
+6C
+ENDCHAR
+STARTCHAR 0x0577
+ENCODING 1399
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+60
+90
+10
+10
+20
+20
+40
+80
+80
+F8
+ENDCHAR
+STARTCHAR 0x0578
+ENCODING 1400
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+D8
+64
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x0579
+ENCODING 1401
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 10 1 -3
+BITMAP
+20
+40
+60
+10
+10
+20
+40
+40
+80
+70
+ENDCHAR
+STARTCHAR 0x057A
+ENCODING 1402
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 -3
+BITMAP
+CCC0
+4440
+4440
+4440
+4440
+4440
+3BC0
+0040
+0040
+00E0
+ENDCHAR
+STARTCHAR 0x057B
+ENCODING 1403
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+88
+48
+50
+20
+20
+40
+40
+78
+ENDCHAR
+STARTCHAR 0x057C
+ENCODING 1404
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+D8
+64
+44
+44
+44
+48
+EE
+ENDCHAR
+STARTCHAR 0x057D
+ENCODING 1405
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+CC
+44
+44
+44
+44
+4C
+36
+ENDCHAR
+STARTCHAR 0x057E
+ENCODING 1406
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -3
+BITMAP
+0C
+04
+04
+04
+C4
+44
+44
+44
+44
+4C
+34
+04
+04
+06
+ENDCHAR
+STARTCHAR 0x057F
+ENCODING 1407
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+CD80
+4640
+4440
+4440
+4440
+4C40
+36E0
+ENDCHAR
+STARTCHAR 0x0580
+ENCODING 1408
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+D8
+64
+44
+44
+44
+44
+4E
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x0581
+ENCODING 1409
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+34
+4C
+84
+84
+84
+4C
+34
+04
+C8
+70
+ENDCHAR
+STARTCHAR 0x0582
+ENCODING 1410
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 0
+BITMAP
+C0
+40
+40
+40
+40
+40
+70
+ENDCHAR
+STARTCHAR 0x0583
+ENCODING 1411
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+0C00
+0400
+0400
+0400
+C580
+4640
+4440
+4440
+4440
+4C40
+34E0
+0400
+0400
+0E00
+ENDCHAR
+STARTCHAR 0x0584
+ENCODING 1412
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+D8
+64
+42
+42
+42
+64
+58
+FE
+40
+E0
+ENDCHAR
+STARTCHAR 0x0585
+ENCODING 1413
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+38
+44
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x0586
+ENCODING 1414
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -3
+BITMAP
+70
+90
+90
+90
+78
+14
+12
+12
+92
+92
+7C
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x0587
+ENCODING 1415
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+C0
+40
+40
+40
+40
+44
+44
+44
+44
+4C
+37
+ENDCHAR
+STARTCHAR 0x0589
+ENCODING 1417
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 7 1 1
+BITMAP
+C0
+C0
+00
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x058A
+ENCODING 1418
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 3 2 2
+BITMAP
+C0
+C2
+7C
+ENDCHAR
+STARTCHAR 0x0591
+ENCODING 1425
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 4 0 -5
+BITMAP
+20
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x0592
+ENCODING 1426
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 10
+BITMAP
+30
+30
+CC
+CC
+ENDCHAR
+STARTCHAR 0x0593
+ENCODING 1427
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 7 0 10
+BITMAP
+20
+40
+E0
+40
+E0
+40
+80
+ENDCHAR
+STARTCHAR 0x0594
+ENCODING 1428
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 5 0 10
+BITMAP
+C0
+C0
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0595
+ENCODING 1429
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 5 0 10
+BITMAP
+B0
+B0
+80
+B0
+B0
+ENDCHAR
+STARTCHAR 0x0596
+ENCODING 1430
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 -3
+BITMAP
+80
+80
+60
+ENDCHAR
+STARTCHAR 0x0597
+ENCODING 1431
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 5 0 10
+BITMAP
+20
+70
+F8
+70
+20
+ENDCHAR
+STARTCHAR 0x0598
+ENCODING 1432
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 4 0 9
+BITMAP
+64
+92
+92
+4C
+ENDCHAR
+STARTCHAR 0x0599
+ENCODING 1433
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+C0
+20
+20
+ENDCHAR
+STARTCHAR 0x059A
+ENCODING 1434
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 -6
+BITMAP
+20
+40
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x059B
+ENCODING 1435
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 -3
+BITMAP
+A0
+20
+C0
+ENDCHAR
+STARTCHAR 0x059C
+ENCODING 1436
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+60
+80
+80
+ENDCHAR
+STARTCHAR 0x059D
+ENCODING 1437
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+60
+80
+80
+ENDCHAR
+STARTCHAR 0x059E
+ENCODING 1438
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 3 0 10
+BITMAP
+6C
+90
+90
+ENDCHAR
+STARTCHAR 0x059F
+ENCODING 1439
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 4 0 10
+BITMAP
+44
+AA
+44
+28
+ENDCHAR
+STARTCHAR 0x05A0
+ENCODING 1440
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 10
+BITMAP
+40
+A0
+40
+80
+ENDCHAR
+STARTCHAR 0x05A1
+ENCODING 1441
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 3 0 10
+BITMAP
+28
+70
+80
+ENDCHAR
+STARTCHAR 0x05A3
+ENCODING 1443
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 -4
+BITMAP
+20
+20
+E0
+ENDCHAR
+STARTCHAR 0x05A4
+ENCODING 1444
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 -6
+BITMAP
+20
+40
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x05A5
+ENCODING 1445
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 -3
+BITMAP
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0x05A6
+ENCODING 1446
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 3 0 -4
+BITMAP
+24
+24
+D8
+ENDCHAR
+STARTCHAR 0x05A7
+ENCODING 1447
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 5 0 -6
+BITMAP
+60
+80
+60
+10
+60
+ENDCHAR
+STARTCHAR 0x05A8
+ENCODING 1448
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+C0
+20
+20
+ENDCHAR
+STARTCHAR 0x05A9
+ENCODING 1449
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 10
+BITMAP
+40
+A0
+40
+20
+ENDCHAR
+STARTCHAR 0x05AA
+ENCODING 1450
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 4 0 -5
+BITMAP
+88
+70
+20
+20
+ENDCHAR
+STARTCHAR 0x05AB
+ENCODING 1451
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 10
+BITMAP
+20
+40
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x05AC
+ENCODING 1452
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+20
+20
+E0
+ENDCHAR
+STARTCHAR 0x05AD
+ENCODING 1453
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 -3
+BITMAP
+80
+80
+60
+ENDCHAR
+STARTCHAR 0x05AE
+ENCODING 1454
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 4 0 9
+BITMAP
+64
+92
+92
+4C
+ENDCHAR
+STARTCHAR 0x05AF
+ENCODING 1455
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+40
+A0
+40
+ENDCHAR
+STARTCHAR 0x05B0
+ENCODING 1456
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 5 1 -6
+BITMAP
+80
+80
+00
+80
+80
+ENDCHAR
+STARTCHAR 0x05B1
+ENCODING 1457
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 5 1 -6
+BITMAP
+A4
+A4
+00
+44
+44
+ENDCHAR
+STARTCHAR 0x05B2
+ENCODING 1458
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 5 0 -6
+BITMAP
+E8
+08
+00
+08
+08
+ENDCHAR
+STARTCHAR 0x05B3
+ENCODING 1459
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 5 0 -6
+BITMAP
+E8
+48
+40
+48
+08
+ENDCHAR
+STARTCHAR 0x05B4
+ENCODING 1460
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 2 1 -3
+BITMAP
+80
+80
+ENDCHAR
+STARTCHAR 0x05B5
+ENCODING 1461
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 2 1 -3
+BITMAP
+A0
+A0
+ENDCHAR
+STARTCHAR 0x05B6
+ENCODING 1462
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 5 1 -6
+BITMAP
+A0
+A0
+00
+40
+40
+ENDCHAR
+STARTCHAR 0x05B7
+ENCODING 1463
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 1 0 -2
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x05B8
+ENCODING 1464
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 3 0 -4
+BITMAP
+F8
+20
+20
+ENDCHAR
+STARTCHAR 0x05B9
+ENCODING 1465
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 2 1 10
+BITMAP
+80
+80
+ENDCHAR
+STARTCHAR 0x05BB
+ENCODING 1467
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 -5
+BITMAP
+80
+A0
+28
+08
+ENDCHAR
+STARTCHAR 0x05BC
+ENCODING 1468
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 2 1 4
+BITMAP
+80
+80
+ENDCHAR
+STARTCHAR 0x05BD
+ENCODING 1469
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 4 0 -5
+BITMAP
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x05BE
+ENCODING 1470
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 2 0 6
+BITMAP
+7C
+F8
+ENDCHAR
+STARTCHAR 0x05BF
+ENCODING 1471
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 1 0 10
+BITMAP
+F0
+ENDCHAR
+STARTCHAR 0x05C0
+ENCODING 1472
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 8 0 0
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x05C1
+ENCODING 1473
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 2 1 10
+BITMAP
+80
+80
+ENDCHAR
+STARTCHAR 0x05C2
+ENCODING 1474
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 2 1 10
+BITMAP
+80
+80
+ENDCHAR
+STARTCHAR 0x05C3
+ENCODING 1475
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 6 1 1
+BITMAP
+C0
+C0
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x05C4
+ENCODING 1476
+SWIDTH 120 0
+DWIDTH 2 0
+BBX 1 2 1 10
+BITMAP
+80
+80
+ENDCHAR
+STARTCHAR 0x05D0
+ENCODING 1488
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+81
+81
+61
+39
+4A
+44
+42
+41
+E1
+ENDCHAR
+STARTCHAR 0x05D1
+ENCODING 1489
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+80
+FC
+04
+04
+04
+04
+04
+04
+FE
+ENDCHAR
+STARTCHAR 0x05D2
+ENCODING 1490
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+40
+F0
+10
+10
+10
+18
+28
+48
+88
+ENDCHAR
+STARTCHAR 0x05D3
+ENCODING 1491
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+40
+FE
+08
+08
+08
+08
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x05D4
+ENCODING 1492
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+40
+FE
+03
+01
+41
+41
+41
+41
+41
+ENDCHAR
+STARTCHAR 0x05D5
+ENCODING 1493
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 9 1 0
+BITMAP
+40
+E0
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x05D6
+ENCODING 1494
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 10 1 0
+BITMAP
+80
+C0
+60
+50
+40
+40
+40
+60
+20
+20
+ENDCHAR
+STARTCHAR 0x05D7
+ENCODING 1495
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+40
+FC
+86
+82
+82
+82
+82
+82
+82
+ENDCHAR
+STARTCHAR 0x05D8
+ENCODING 1496
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+0700
+C980
+4080
+4080
+4080
+2080
+2100
+3600
+1C00
+ENDCHAR
+STARTCHAR 0x05D9
+ENCODING 1497
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 2
+BITMAP
+40
+E0
+30
+10
+10
+10
+20
+ENDCHAR
+STARTCHAR 0x05DA
+ENCODING 1498
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -4
+BITMAP
+40
+FE
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x05DB
+ENCODING 1499
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+80
+F8
+0C
+04
+04
+04
+04
+0C
+F8
+ENDCHAR
+STARTCHAR 0x05DC
+ENCODING 1500
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+80
+80
+80
+F8
+0C
+04
+04
+04
+08
+10
+60
+ENDCHAR
+STARTCHAR 0x05DD
+ENCODING 1501
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+4000
+FF00
+4180
+4080
+4080
+4080
+4080
+4180
+7F00
+ENDCHAR
+STARTCHAR 0x05DE
+ENCODING 1502
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+4E
+D3
+71
+21
+21
+41
+41
+43
+1E
+ENDCHAR
+STARTCHAR 0x05DF
+ENCODING 1503
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 12 1 -3
+BITMAP
+40
+E0
+30
+10
+10
+10
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x05E0
+ENCODING 1504
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 9 1 0
+BITMAP
+40
+60
+30
+10
+10
+10
+10
+30
+E0
+ENDCHAR
+STARTCHAR 0x05E1
+ENCODING 1505
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+80
+FF
+81
+81
+41
+41
+42
+64
+38
+ENDCHAR
+STARTCHAR 0x05E2
+ENCODING 1506
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -1
+BITMAP
+84
+8C
+44
+44
+24
+28
+28
+30
+60
+80
+ENDCHAR
+STARTCHAR 0x05E3
+ENCODING 1507
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 -3
+BITMAP
+70
+CC
+84
+82
+82
+E2
+42
+02
+02
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x05E4
+ENCODING 1508
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+30
+6C
+44
+42
+62
+02
+02
+06
+FC
+ENDCHAR
+STARTCHAR 0x05E5
+ENCODING 1509
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 -3
+BITMAP
+40
+C4
+46
+44
+24
+14
+08
+04
+04
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x05E6
+ENCODING 1510
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+44
+C2
+22
+14
+08
+04
+04
+04
+FC
+ENDCHAR
+STARTCHAR 0x05E7
+ENCODING 1511
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 -3
+BITMAP
+40
+FE
+03
+01
+41
+42
+42
+44
+58
+40
+40
+40
+ENDCHAR
+STARTCHAR 0x05E8
+ENCODING 1512
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+40
+FC
+06
+02
+02
+02
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x05E9
+ENCODING 1513
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+89
+8B
+89
+49
+49
+51
+62
+24
+38
+ENDCHAR
+STARTCHAR 0x05EA
+ENCODING 1514
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+40
+FE
+23
+21
+21
+21
+21
+21
+E1
+ENDCHAR
+STARTCHAR 0x05F0
+ENCODING 1520
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+44
+EE
+22
+22
+22
+22
+22
+22
+22
+ENDCHAR
+STARTCHAR 0x05F1
+ENCODING 1521
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+44
+EE
+23
+21
+21
+21
+22
+20
+20
+ENDCHAR
+STARTCHAR 0x05F2
+ENCODING 1522
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 2
+BITMAP
+44
+EE
+33
+11
+11
+11
+22
+ENDCHAR
+STARTCHAR 0x05F3
+ENCODING 1523
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 4 1 7
+BITMAP
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0x05F4
+ENCODING 1524
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 7
+BITMAP
+48
+48
+90
+90
+ENDCHAR
+STARTCHAR 0x060C
+ENCODING 1548
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 4 1 0
+BITMAP
+40
+80
+C0
+C0
+ENDCHAR
+STARTCHAR 0x061B
+ENCODING 1563
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 7 1 0
+BITMAP
+40
+80
+C0
+C0
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x061F
+ENCODING 1567
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 10 1 0
+BITMAP
+70
+88
+88
+40
+20
+20
+00
+00
+20
+20
+ENDCHAR
+STARTCHAR 0x0621
+ENCODING 1569
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 6 1 0
+BITMAP
+70
+80
+80
+70
+C0
+80
+ENDCHAR
+STARTCHAR 0x0622
+ENCODING 1570
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 6 14 0 0
+BITMAP
+04
+78
+80
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x0623
+ENCODING 1571
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 17 1 0
+BITMAP
+60
+80
+60
+80
+00
+00
+40
+40
+60
+40
+40
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR 0x0624
+ENCODING 1572
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -3
+BITMAP
+06
+08
+06
+08
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x0625
+ENCODING 1573
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 3 17 1 -6
+BITMAP
+40
+40
+60
+40
+40
+40
+40
+40
+40
+40
+40
+00
+00
+60
+80
+60
+80
+ENDCHAR
+STARTCHAR 0x0626
+ENCODING 1574
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 -3
+BITMAP
+1800
+2000
+1800
+2000
+0000
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x0627
+ENCODING 1575
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 11 2 0
+BITMAP
+80
+80
+C0
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0628
+ENCODING 1576
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 10 1 -5
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0000
+0400
+0400
+ENDCHAR
+STARTCHAR 0x0629
+ENCODING 1577
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 10 1 0
+BITMAP
+50
+50
+00
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x062A
+ENCODING 1578
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 9 1 -1
+BITMAP
+0A00
+0A00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x062B
+ENCODING 1579
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 12 1 -1
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x062C
+ENCODING 1580
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 -6
+BITMAP
+7E
+B0
+40
+C0
+80
+88
+88
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x062D
+ENCODING 1581
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 -6
+BITMAP
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x062E
+ENCODING 1582
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 15 1 -6
+BITMAP
+10
+10
+00
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x062F
+ENCODING 1583
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 6 1 -1
+BITMAP
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x0630
+ENCODING 1584
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 10 1 -1
+BITMAP
+20
+20
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x0631
+ENCODING 1585
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 8 1 -4
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0632
+ENCODING 1586
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -4
+BITMAP
+08
+08
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0633
+ENCODING 1587
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 7 1 -4
+BITMAP
+0004
+4124
+8124
+81FC
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x0634
+ENCODING 1588
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 14 1 -4
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0000
+0004
+4124
+8124
+81FC
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x0635
+ENCODING 1589
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 19 7 1 -4
+BITMAP
+000380
+410C40
+811020
+81FFE0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0x0636
+ENCODING 1590
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 19 11 1 -4
+BITMAP
+000800
+000800
+000000
+000000
+000380
+410C40
+811020
+81FFE0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0x0637
+ENCODING 1591
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 -1
+BITMAP
+1000
+1000
+1800
+1000
+1000
+1000
+1000
+1380
+1440
+1840
+1040
+FF80
+ENDCHAR
+STARTCHAR 0x0638
+ENCODING 1592
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 -1
+BITMAP
+1000
+1000
+1800
+1100
+1100
+1000
+1000
+1380
+1440
+1840
+1040
+FF80
+ENDCHAR
+STARTCHAR 0x0639
+ENCODING 1593
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 -5
+BITMAP
+38
+40
+40
+38
+60
+40
+80
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0x063A
+ENCODING 1594
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 15 1 -5
+BITMAP
+10
+10
+00
+00
+38
+40
+40
+38
+60
+40
+80
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0x0640
+ENCODING 1600
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 1 0 0
+BITMAP
+FF80
+ENDCHAR
+STARTCHAR 0x0641
+ENCODING 1601
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 -1
+BITMAP
+0040
+0040
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0x0642
+ENCODING 1602
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 -4
+BITMAP
+0A
+0A
+00
+00
+06
+0B
+09
+0B
+85
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x0643
+ENCODING 1603
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 -1
+BITMAP
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+ENDCHAR
+STARTCHAR 0x0644
+ENCODING 1604
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 -3
+BITMAP
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x0645
+ENCODING 1605
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 11 1 -8
+BITMAP
+20
+70
+18
+FC
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0646
+ENCODING 1606
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 -4
+BITMAP
+10
+10
+00
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0x0647
+ENCODING 1607
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 6 1 0
+BITMAP
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x0648
+ENCODING 1608
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 8 1 -3
+BITMAP
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x0649
+ENCODING 1609
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 8 1 -3
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x064A
+ENCODING 1610
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 -6
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+0000
+2800
+2800
+ENDCHAR
+STARTCHAR 0x064B
+ENCODING 1611
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 4 1 10
+BITMAP
+30
+C0
+30
+C0
+ENDCHAR
+STARTCHAR 0x064C
+ENCODING 1612
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 10
+BITMAP
+0C
+14
+5C
+C8
+50
+60
+ENDCHAR
+STARTCHAR 0x064D
+ENCODING 1613
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 4 1 -6
+BITMAP
+30
+C0
+30
+C0
+ENDCHAR
+STARTCHAR 0x064E
+ENCODING 1614
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 3 1 10
+BITMAP
+10
+60
+80
+ENDCHAR
+STARTCHAR 0x064F
+ENCODING 1615
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 7 1 10
+BITMAP
+20
+50
+50
+38
+20
+40
+80
+ENDCHAR
+STARTCHAR 0x0650
+ENCODING 1616
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 3 1 -4
+BITMAP
+10
+60
+80
+ENDCHAR
+STARTCHAR 0x0651
+ENCODING 1617
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 5 1 10
+BITMAP
+08
+A8
+A8
+B0
+40
+ENDCHAR
+STARTCHAR 0x0652
+ENCODING 1618
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 5 1 10
+BITMAP
+60
+90
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x0660
+ENCODING 1632
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 2 2 3
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0661
+ENCODING 1633
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 3 11 3 0
+BITMAP
+80
+80
+C0
+C0
+40
+60
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x0662
+ENCODING 1634
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 10 2 0
+BITMAP
+84
+C4
+F8
+60
+60
+20
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x0663
+ENCODING 1635
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 7 10 2 0
+BITMAP
+8A
+CA
+F4
+60
+60
+20
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x0664
+ENCODING 1636
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 11 2 -1
+BITMAP
+20
+40
+80
+E0
+60
+20
+40
+80
+80
+F8
+70
+ENDCHAR
+STARTCHAR 0x0665
+ENCODING 1637
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 8 2 -1
+BITMAP
+30
+50
+48
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x0666
+ENCODING 1638
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+80
+F8
+08
+08
+08
+08
+08
+0C
+04
+04
+06
+ENDCHAR
+STARTCHAR 0x0667
+ENCODING 1639
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 -1
+BITMAP
+82
+82
+C4
+44
+48
+28
+28
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x0668
+ENCODING 1640
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -1
+BITMAP
+10
+10
+18
+18
+28
+28
+24
+44
+46
+C2
+82
+80
+ENDCHAR
+STARTCHAR 0x0669
+ENCODING 1641
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 5 11 2 0
+BITMAP
+60
+A0
+A0
+A0
+A0
+50
+10
+10
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x066A
+ENCODING 1642
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 7 10 1 0
+BITMAP
+04
+C4
+08
+08
+10
+10
+20
+26
+40
+40
+ENDCHAR
+STARTCHAR 0x066B
+ENCODING 1643
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 5 0 -3
+BITMAP
+10
+10
+10
+20
+C0
+ENDCHAR
+STARTCHAR 0x066C
+ENCODING 1644
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 5 1 -3
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x066D
+ENCODING 1645
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 6 1 5
+BITMAP
+10
+10
+FE
+38
+28
+44
+ENDCHAR
+STARTCHAR 0x0670
+ENCODING 1648
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 4 1 10
+BITMAP
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0671
+ENCODING 1649
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 0 0
+BITMAP
+10
+28
+78
+80
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x0672
+ENCODING 1650
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 -1 0
+BITMAP
+18
+20
+18
+E0
+00
+10
+10
+18
+10
+10
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x0673
+ENCODING 1651
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 -1 -5
+BITMAP
+10
+10
+18
+10
+10
+10
+10
+10
+10
+10
+10
+00
+18
+20
+18
+E0
+ENDCHAR
+STARTCHAR 0x0674
+ENCODING 1652
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 4 1 12
+BITMAP
+60
+80
+60
+80
+ENDCHAR
+STARTCHAR 0x0675
+ENCODING 1653
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 13 2 0
+BITMAP
+0C
+10
+8C
+90
+C0
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0676
+ENCODING 1654
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 10 12 1 -3
+BITMAP
+00C0
+0100
+00C0
+0100
+0400
+0A00
+0A00
+0E00
+0200
+0200
+8400
+7800
+ENDCHAR
+STARTCHAR 0x0677
+ENCODING 1655
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 10 13 1 -3
+BITMAP
+1000
+28C0
+1100
+28C0
+4100
+0400
+0A00
+0A00
+0E00
+0200
+0200
+8400
+7800
+ENDCHAR
+STARTCHAR 0x0678
+ENCODING 1656
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 13 13 1 -3
+BITMAP
+0018
+0020
+0018
+0020
+0000
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x0679
+ENCODING 1657
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 11 1 -1
+BITMAP
+0800
+0800
+0E00
+0E00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x067A
+ENCODING 1658
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 10 1 -1
+BITMAP
+0600
+0000
+0600
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x067B
+ENCODING 1659
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 10 1 -5
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0600
+0000
+0600
+ENDCHAR
+STARTCHAR 0x067C
+ENCODING 1660
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 12 1 -4
+BITMAP
+0A00
+0A00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+0600
+0900
+0600
+ENDCHAR
+STARTCHAR 0x067D
+ENCODING 1661
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 9 1 -1
+BITMAP
+0A00
+0A00
+0000
+0420
+8410
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x067E
+ENCODING 1662
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 10 1 -5
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0D80
+0000
+0300
+ENDCHAR
+STARTCHAR 0x067F
+ENCODING 1663
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 9 1 -1
+BITMAP
+0A00
+0A00
+0000
+0A20
+8A10
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x0680
+ENCODING 1664
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 10 1 -5
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0D80
+0000
+0D80
+ENDCHAR
+STARTCHAR 0x0681
+ENCODING 1665
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 16 1 -6
+BITMAP
+18
+20
+18
+20
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0682
+ENCODING 1666
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 18 1 -6
+BITMAP
+10
+10
+00
+10
+10
+00
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0683
+ENCODING 1667
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 -6
+BITMAP
+7E
+B0
+40
+C0
+80
+94
+94
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0684
+ENCODING 1668
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 -6
+BITMAP
+7E
+B0
+40
+C0
+98
+80
+98
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0685
+ENCODING 1669
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 18 1 -6
+BITMAP
+10
+10
+00
+28
+28
+00
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0686
+ENCODING 1670
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 -6
+BITMAP
+7E
+B0
+40
+D4
+94
+80
+88
+88
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0687
+ENCODING 1671
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 -6
+BITMAP
+7E
+B0
+40
+D4
+94
+80
+94
+94
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0x0688
+ENCODING 1672
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 12 1 -1
+BITMAP
+20
+20
+38
+38
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x0689
+ENCODING 1673
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 8 1 -3
+BITMAP
+10
+10
+08
+08
+88
+78
+28
+10
+ENDCHAR
+STARTCHAR 0x068A
+ENCODING 1674
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 9 1 -4
+BITMAP
+10
+10
+08
+08
+88
+78
+00
+10
+10
+ENDCHAR
+STARTCHAR 0x068B
+ENCODING 1675
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 14 1 -4
+BITMAP
+20
+20
+38
+38
+00
+10
+10
+08
+08
+88
+78
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x068C
+ENCODING 1676
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 10 1 -1
+BITMAP
+50
+50
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x068D
+ENCODING 1677
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 9 1 -4
+BITMAP
+10
+10
+08
+08
+88
+78
+00
+50
+50
+ENDCHAR
+STARTCHAR 0x068E
+ENCODING 1678
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 13 1 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x068F
+ENCODING 1679
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 13 1 -1
+BITMAP
+50
+50
+00
+20
+20
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x0690
+ENCODING 1680
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 13 1 -1
+BITMAP
+50
+50
+00
+50
+50
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0x0691
+ENCODING 1681
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 1 -4
+BITMAP
+08
+08
+0E
+0E
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0692
+ENCODING 1682
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -4
+BITMAP
+12
+0C
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0693
+ENCODING 1683
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 -5
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+7A
+04
+ENDCHAR
+STARTCHAR 0x0694
+ENCODING 1684
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 -6
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+78
+04
+04
+ENDCHAR
+STARTCHAR 0x0695
+ENCODING 1685
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 -7
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+78
+00
+24
+18
+ENDCHAR
+STARTCHAR 0x0696
+ENCODING 1686
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 -6
+BITMAP
+04
+06
+02
+22
+22
+04
+8C
+78
+04
+04
+ENDCHAR
+STARTCHAR 0x0697
+ENCODING 1687
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -4
+BITMAP
+0A
+0A
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0698
+ENCODING 1688
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 15 1 -4
+BITMAP
+04
+04
+00
+0A
+0A
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x0699
+ENCODING 1689
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 15 1 -4
+BITMAP
+0A
+0A
+00
+0A
+0A
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0x069A
+ENCODING 1690
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 11 1 -5
+BITMAP
+0040
+0040
+0000
+0004
+4124
+8124
+81FC
+8100
+4200
+3C10
+0010
+ENDCHAR
+STARTCHAR 0x069B
+ENCODING 1691
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 11 1 -8
+BITMAP
+0004
+4124
+8124
+81FC
+8100
+4200
+3C28
+0028
+0000
+0010
+0010
+ENDCHAR
+STARTCHAR 0x069C
+ENCODING 1692
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 17 1 -8
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0004
+4124
+8124
+81FC
+8100
+4200
+3C28
+0028
+0000
+0010
+0010
+ENDCHAR
+STARTCHAR 0x069D
+ENCODING 1693
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 7 1 -4
+BITMAP
+000380
+410C40
+811020
+81FFE0
+810000
+420500
+3C0500
+ENDCHAR
+STARTCHAR 0x069E
+ENCODING 1694
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 14 1 -4
+BITMAP
+000400
+000400
+000000
+000A00
+000A00
+000000
+000000
+000380
+410C40
+811020
+81FFE0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0x069F
+ENCODING 1695
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 -1
+BITMAP
+1000
+1100
+1900
+1000
+1280
+1280
+1000
+1380
+1440
+1840
+1040
+FF80
+ENDCHAR
+STARTCHAR 0x06A0
+ENCODING 1696
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 18 1 -5
+BITMAP
+10
+10
+00
+28
+28
+00
+00
+38
+40
+40
+38
+60
+40
+80
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0x06A1
+ENCODING 1697
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 7 1 -1
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0x06A2
+ENCODING 1698
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 10 1 -4
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x06A3
+ENCODING 1699
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 14 1 -4
+BITMAP
+0020
+0020
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+0000
+0100
+0100
+ENDCHAR
+STARTCHAR 0x06A4
+ENCODING 1700
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 14 1 -1
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0x06A5
+ENCODING 1701
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 -7
+BITMAP
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+0000
+0050
+0050
+0000
+0020
+0020
+ENDCHAR
+STARTCHAR 0x06A6
+ENCODING 1702
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 14 1 -1
+BITMAP
+0050
+0050
+0000
+0050
+0050
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0x06A7
+ENCODING 1703
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 -4
+BITMAP
+04
+04
+00
+00
+06
+0B
+09
+0B
+85
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x06A8
+ENCODING 1704
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 16 1 -4
+BITMAP
+04
+04
+00
+0A
+0A
+00
+00
+06
+0B
+09
+0B
+85
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x06A9
+ENCODING 1705
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 14 12 1 -1
+BITMAP
+000C
+0030
+00C0
+0100
+0100
+0100
+0080
+4040
+8040
+8020
+8020
+7FC0
+ENDCHAR
+STARTCHAR 0x06AA
+ENCODING 1706
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 8 1 -1
+BITMAP
+0600
+1800
+2000
+2000
+1FF8
+0004
+8004
+7FF8
+ENDCHAR
+STARTCHAR 0x06AB
+ENCODING 1707
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 12 1 -1
+BITMAP
+0006
+001C
+0074
+0094
+0088
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x06AC
+ENCODING 1708
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 1 -1
+BITMAP
+0200
+0200
+0000
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+ENDCHAR
+STARTCHAR 0x06AD
+ENCODING 1709
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 1 -1
+BITMAP
+0800
+0800
+0000
+1400
+1480
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+ENDCHAR
+STARTCHAR 0x06AE
+ENCODING 1710
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 18 1 -7
+BITMAP
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+0000
+1400
+1400
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0x06AF
+ENCODING 1711
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 14 1 -1
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x06B0
+ENCODING 1712
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 1 -1
+BITMAP
+0006
+0018
+0066
+009C
+0074
+0094
+0088
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x06B1
+ENCODING 1713
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 16 1 -1
+BITMAP
+0010
+0050
+0046
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x06B2
+ENCODING 1714
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 17 1 -4
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+0000
+0A00
+0A00
+ENDCHAR
+STARTCHAR 0x06B3
+ENCODING 1715
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 18 1 -5
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+0000
+0C00
+0000
+0C00
+ENDCHAR
+STARTCHAR 0x06B4
+ENCODING 1716
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 18 1 -1
+BITMAP
+0040
+0040
+0010
+0050
+0046
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0x06B5
+ENCODING 1717
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 16 1 -3
+BITMAP
+09
+06
+00
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x06B6
+ENCODING 1718
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 17 1 -3
+BITMAP
+02
+02
+00
+00
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x06B7
+ENCODING 1719
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 20 1 -3
+BITMAP
+02
+02
+00
+05
+05
+00
+00
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x06BA
+ENCODING 1722
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 8 1 -4
+BITMAP
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0x06BB
+ENCODING 1723
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 -4
+BITMAP
+20
+20
+38
+38
+00
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0x06BC
+ENCODING 1724
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 12 1 -5
+BITMAP
+10
+10
+00
+02
+02
+41
+81
+81
+82
+86
+7D
+07
+ENDCHAR
+STARTCHAR 0x06BD
+ENCODING 1725
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 14 1 -4
+BITMAP
+10
+10
+00
+28
+28
+00
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0x06BE
+ENCODING 1726
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 -1
+BITMAP
+18
+04
+1A
+2A
+2A
+32
+CC
+ENDCHAR
+STARTCHAR 0x06C0
+ENCODING 1728
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 11 1 0
+BITMAP
+30
+40
+30
+40
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x06C1
+ENCODING 1729
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 4 1 0
+BITMAP
+30
+78
+8C
+04
+ENDCHAR
+STARTCHAR 0x06C2
+ENCODING 1730
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 10 1 0
+BITMAP
+18
+20
+18
+20
+00
+00
+30
+78
+8C
+04
+ENDCHAR
+STARTCHAR 0x06C3
+ENCODING 1731
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 8 1 0
+BITMAP
+28
+28
+00
+00
+30
+78
+8C
+04
+ENDCHAR
+STARTCHAR 0x06C4
+ENCODING 1732
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 8 1 -3
+BITMAP
+04
+0A
+0A
+0E
+12
+2A
+9C
+78
+ENDCHAR
+STARTCHAR 0x06C5
+ENCODING 1733
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 8 1 -3
+BITMAP
+04
+0A
+0A
+0E
+02
+3E
+84
+78
+ENDCHAR
+STARTCHAR 0x06C6
+ENCODING 1734
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -3
+BITMAP
+12
+0C
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x06C7
+ENCODING 1735
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 1 -3
+BITMAP
+04
+0A
+04
+0A
+10
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x06C8
+ENCODING 1736
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 1 -3
+BITMAP
+04
+04
+04
+04
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x06C9
+ENCODING 1737
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -3
+BITMAP
+0C
+12
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x06CA
+ENCODING 1738
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -3
+BITMAP
+0A
+0A
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x06CB
+ENCODING 1739
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 15 1 -3
+BITMAP
+04
+04
+00
+0A
+0A
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0x06CC
+ENCODING 1740
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 8 1 -3
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x06CD
+ENCODING 1741
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 8 1 -3
+BITMAP
+0070
+1080
+3100
+61C0
+A020
+2020
+20C0
+1F00
+ENDCHAR
+STARTCHAR 0x06CE
+ENCODING 1742
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 10 1 -3
+BITMAP
+2400
+1800
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0x06D0
+ENCODING 1744
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 12 1 -7
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+0000
+3000
+0000
+3000
+ENDCHAR
+STARTCHAR 0x06D1
+ENCODING 1745
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 -9
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+0000
+2800
+2800
+0000
+1000
+1000
+ENDCHAR
+STARTCHAR 0x06D2
+ENCODING 1746
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 8 1 -4
+BITMAP
+0200
+0500
+0500
+1800
+6000
+8000
+8000
+7FF8
+ENDCHAR
+STARTCHAR 0x06D3
+ENCODING 1747
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 -4
+BITMAP
+3000
+4000
+3000
+4200
+0500
+0500
+1800
+6000
+8000
+8000
+7FF8
+ENDCHAR
+STARTCHAR 0x06D4
+ENCODING 1748
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 1 1 3
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x06D5
+ENCODING 1749
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 6 1 0
+BITMAP
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0x06F0
+ENCODING 1776
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 2 2 3
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x06F1
+ENCODING 1777
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 3 11 3 0
+BITMAP
+80
+80
+C0
+C0
+40
+60
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x06F2
+ENCODING 1778
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 10 2 0
+BITMAP
+84
+C4
+F8
+60
+60
+20
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x06F3
+ENCODING 1779
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 7 10 2 0
+BITMAP
+8A
+CA
+F4
+60
+60
+20
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x06F4
+ENCODING 1780
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 2 0
+BITMAP
+10
+A4
+C4
+F8
+60
+60
+20
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x06F5
+ENCODING 1781
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 9 2 0
+BITMAP
+20
+50
+50
+88
+88
+88
+A8
+A8
+50
+ENDCHAR
+STARTCHAR 0x06F6
+ENCODING 1782
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 9 2 0
+BITMAP
+38
+40
+40
+48
+30
+60
+40
+80
+80
+ENDCHAR
+STARTCHAR 0x06F7
+ENCODING 1783
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 -1
+BITMAP
+82
+82
+C4
+44
+48
+28
+28
+30
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x06F8
+ENCODING 1784
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 -1
+BITMAP
+10
+10
+18
+18
+28
+28
+24
+44
+46
+C2
+82
+80
+ENDCHAR
+STARTCHAR 0x06F9
+ENCODING 1785
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 5 11 2 0
+BITMAP
+60
+A0
+A0
+A0
+A0
+50
+10
+10
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x0E01
+ENCODING 3585
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+42
+82
+82
+82
+82
+82
+82
+ENDCHAR
+STARTCHAR 0x0E02
+ENCODING 3586
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+71
+A9
+49
+11
+11
+11
+11
+11
+3F
+ENDCHAR
+STARTCHAR 0x0E03
+ENCODING 3587
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+4880
+B480
+CC80
+A880
+4880
+0880
+0880
+0880
+1F80
+ENDCHAR
+STARTCHAR 0x0E04
+ENCODING 3588
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+7E
+83
+81
+B1
+E9
+51
+41
+41
+41
+ENDCHAR
+STARTCHAR 0x0E05
+ENCODING 3589
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+66
+99
+81
+B1
+E9
+51
+41
+41
+41
+ENDCHAR
+STARTCHAR 0x0E06
+ENCODING 3590
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+6840
+9440
+C840
+A840
+4840
+1E40
+2940
+28C0
+1840
+ENDCHAR
+STARTCHAR 0x0E07
+ENCODING 3591
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+08
+14
+0C
+84
+84
+44
+24
+14
+0C
+ENDCHAR
+STARTCHAR 0x0E08
+ENCODING 3592
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+02
+1A
+2E
+16
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x0E09
+ENCODING 3593
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+3C00
+4600
+0200
+4200
+A200
+6700
+2A80
+3280
+2100
+ENDCHAR
+STARTCHAR 0x0E0A
+ENCODING 3594
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+7180
+AA00
+4900
+1100
+1100
+1100
+1100
+1100
+3F00
+ENDCHAR
+STARTCHAR 0x0E0B
+ENCODING 3595
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+48C0
+B500
+8480
+C880
+A880
+4880
+0880
+0880
+1F80
+ENDCHAR
+STARTCHAR 0x0E0C
+ENCODING 3596
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+7840
+8440
+4440
+8440
+8440
+8440
+CF40
+ACC0
+4840
+ENDCHAR
+STARTCHAR 0x0E0D
+ENCODING 3597
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 -4
+BITMAP
+7840
+8440
+4440
+8440
+8440
+8440
+C440
+A440
+4FC0
+0000
+0440
+0A40
+0780
+ENDCHAR
+STARTCHAR 0x0E0E
+ENCODING 3598
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -5
+BITMAP
+1F00
+2080
+1080
+2080
+2080
+2080
+6080
+A080
+4080
+0480
+3C80
+4A80
+3180
+0080
+ENDCHAR
+STARTCHAR 0x0E0F
+ENCODING 3599
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -5
+BITMAP
+1F00
+2080
+1080
+2080
+2080
+2080
+6080
+A080
+4080
+0480
+3880
+4A80
+3580
+0080
+ENDCHAR
+STARTCHAR 0x0E10
+ENCODING 3600
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 14 1 -5
+BITMAP
+1C
+23
+78
+06
+1A
+2E
+16
+02
+02
+00
+16
+66
+AA
+D4
+ENDCHAR
+STARTCHAR 0x0E11
+ENCODING 3601
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+5880
+A540
+CA40
+AA40
+4C40
+0C40
+0840
+0840
+0840
+ENDCHAR
+STARTCHAR 0x0E12
+ENCODING 3602
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 9 1 0
+BITMAP
+6610
+9910
+9110
+A910
+9910
+5110
+63D0
+6530
+6310
+ENDCHAR
+STARTCHAR 0x0E13
+ENCODING 3603
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 9 1 0
+BITMAP
+7840
+8440
+4440
+8440
+8440
+84E0
+C550
+A650
+4460
+ENDCHAR
+STARTCHAR 0x0E14
+ENCODING 3604
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+3E
+43
+91
+A9
+99
+B1
+61
+41
+41
+ENDCHAR
+STARTCHAR 0x0E15
+ENCODING 3605
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 9 1 0
+BITMAP
+66
+99
+91
+A9
+99
+B1
+61
+41
+41
+ENDCHAR
+STARTCHAR 0x0E16
+ENCODING 3606
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+42
+82
+82
+82
+C2
+A2
+42
+ENDCHAR
+STARTCHAR 0x0E17
+ENCODING 3607
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+42
+A5
+69
+29
+31
+31
+21
+21
+21
+ENDCHAR
+STARTCHAR 0x0E18
+ENCODING 3608
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+38
+46
+F0
+0C
+24
+24
+24
+24
+7C
+ENDCHAR
+STARTCHAR 0x0E19
+ENCODING 3609
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+4100
+A100
+6100
+2100
+2100
+2780
+2940
+3140
+2180
+ENDCHAR
+STARTCHAR 0x0E1A
+ENCODING 3610
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+4080
+A080
+6080
+2080
+2080
+2080
+2080
+2080
+7F80
+ENDCHAR
+STARTCHAR 0x0E1B
+ENCODING 3611
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 13 1 0
+BITMAP
+0080
+0080
+0080
+0080
+4080
+A080
+6080
+2080
+2080
+2080
+2080
+2080
+7F80
+ENDCHAR
+STARTCHAR 0x0E1C
+ENCODING 3612
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 2 0
+BITMAP
+42
+A2
+C2
+82
+92
+AA
+C6
+82
+82
+ENDCHAR
+STARTCHAR 0x0E1D
+ENCODING 3613
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 2 0
+BITMAP
+02
+02
+02
+02
+42
+A2
+C2
+82
+92
+AA
+C6
+82
+82
+ENDCHAR
+STARTCHAR 0x0E1E
+ENCODING 3614
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+4040
+A640
+6640
+2940
+2940
+30C0
+30C0
+2040
+2040
+ENDCHAR
+STARTCHAR 0x0E1F
+ENCODING 3615
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+0040
+0040
+0040
+0040
+4040
+A640
+6640
+2940
+2940
+30C0
+30C0
+2040
+2040
+ENDCHAR
+STARTCHAR 0x0E20
+ENCODING 3616
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+1F00
+2180
+1080
+2080
+2080
+2080
+6080
+A080
+4080
+ENDCHAR
+STARTCHAR 0x0E21
+ENCODING 3617
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+41
+A1
+61
+21
+21
+79
+A5
+A3
+61
+ENDCHAR
+STARTCHAR 0x0E22
+ENCODING 3618
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+62
+D2
+A2
+82
+62
+82
+82
+82
+FC
+ENDCHAR
+STARTCHAR 0x0E23
+ENCODING 3619
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+38
+46
+F0
+0C
+04
+04
+0C
+14
+08
+ENDCHAR
+STARTCHAR 0x0E24
+ENCODING 3620
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -5
+BITMAP
+7C
+86
+42
+82
+82
+82
+C2
+A2
+42
+02
+02
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x0E25
+ENCODING 3621
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 2 0
+BITMAP
+7C
+86
+02
+72
+8A
+86
+C6
+A2
+42
+ENDCHAR
+STARTCHAR 0x0E26
+ENCODING 3622
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -5
+BITMAP
+1F00
+2180
+1080
+2080
+2080
+2080
+6080
+A080
+4080
+0080
+0080
+0080
+0080
+0080
+ENDCHAR
+STARTCHAR 0x0E27
+ENCODING 3623
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+02
+02
+02
+02
+06
+0A
+04
+ENDCHAR
+STARTCHAR 0x0E28
+ENCODING 3624
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 0
+BITMAP
+02
+7E
+87
+89
+B9
+E9
+51
+41
+41
+41
+ENDCHAR
+STARTCHAR 0x0E29
+ENCODING 3625
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+4100
+A100
+6D40
+2B80
+2700
+2100
+2100
+2100
+7F00
+ENDCHAR
+STARTCHAR 0x0E2A
+ENCODING 3626
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+02
+7E
+86
+0A
+7A
+8A
+86
+E6
+92
+62
+ENDCHAR
+STARTCHAR 0x0E2B
+ENCODING 3627
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+42
+A5
+66
+29
+29
+31
+31
+21
+21
+ENDCHAR
+STARTCHAR 0x0E2C
+ENCODING 3628
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 12 10 1 0
+BITMAP
+0090
+4160
+A6C0
+6640
+2940
+2940
+30C0
+30C0
+2040
+2040
+ENDCHAR
+STARTCHAR 0x0E2D
+ENCODING 3629
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 2 0
+BITMAP
+7C
+86
+02
+42
+A2
+C2
+82
+82
+FE
+ENDCHAR
+STARTCHAR 0x0E2E
+ENCODING 3630
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+7D
+82
+7E
+02
+42
+A2
+C2
+82
+7E
+ENDCHAR
+STARTCHAR 0x0E2F
+ENCODING 3631
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+42
+A2
+C6
+8A
+72
+02
+02
+06
+18
+ENDCHAR
+STARTCHAR 0x0E30
+ENCODING 3632
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+40
+A4
+C4
+78
+00
+40
+A4
+C4
+78
+ENDCHAR
+STARTCHAR 0x0E31
+ENCODING 3633
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 10
+BITMAP
+40
+A4
+C4
+78
+ENDCHAR
+STARTCHAR 0x0E32
+ENCODING 3634
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+02
+02
+02
+02
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x0E33
+ENCODING 3635
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 11 15 -3 0
+BITMAP
+4000
+A000
+A000
+4000
+0000
+0000
+07C0
+0860
+0020
+0020
+0020
+0020
+0020
+0020
+0020
+ENDCHAR
+STARTCHAR 0x0E34
+ENCODING 3636
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 4 0 9
+BITMAP
+38
+44
+FE
+02
+ENDCHAR
+STARTCHAR 0x0E35
+ENCODING 3637
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 5 0 9
+BITMAP
+02
+3A
+46
+FE
+02
+ENDCHAR
+STARTCHAR 0x0E36
+ENCODING 3638
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 5 0 9
+BITMAP
+06
+3A
+44
+FE
+02
+ENDCHAR
+STARTCHAR 0x0E37
+ENCODING 3639
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 5 0 9
+BITMAP
+0A
+3A
+46
+FE
+02
+ENDCHAR
+STARTCHAR 0x0E38
+ENCODING 3640
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 6 0 -7
+BITMAP
+40
+A0
+A0
+60
+20
+20
+ENDCHAR
+STARTCHAR 0x0E39
+ENCODING 3641
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 6 0 -7
+BITMAP
+44
+A4
+A4
+64
+24
+18
+ENDCHAR
+STARTCHAR 0x0E3A
+ENCODING 3642
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 2 2 0 -3
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x0E3F
+ENCODING 3647
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+3F20
+10C0
+10C0
+1140
+1280
+1F00
+1880
+1040
+3040
+5080
+BF00
+ENDCHAR
+STARTCHAR 0x0E40
+ENCODING 3648
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 9 1 0
+BITMAP
+80
+80
+80
+80
+80
+80
+C0
+A0
+40
+ENDCHAR
+STARTCHAR 0x0E41
+ENCODING 3649
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+88
+88
+88
+88
+88
+88
+CC
+AA
+44
+ENDCHAR
+STARTCHAR 0x0E42
+ENCODING 3650
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 17 1 0
+BITMAP
+F0
+98
+40
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+30
+28
+10
+ENDCHAR
+STARTCHAR 0x0E43
+ENCODING 3651
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 17 1 0
+BITMAP
+40
+A0
+60
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+30
+28
+10
+ENDCHAR
+STARTCHAR 0x0E44
+ENCODING 3652
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 17 1 0
+BITMAP
+18
+98
+A8
+68
+48
+08
+08
+08
+08
+08
+08
+08
+08
+08
+0C
+0A
+04
+ENDCHAR
+STARTCHAR 0x0E45
+ENCODING 3653
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -5
+BITMAP
+7C
+86
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x0E46
+ENCODING 3654
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -3
+BITMAP
+6C
+92
+C2
+A2
+42
+02
+02
+02
+02
+02
+02
+04
+18
+ENDCHAR
+STARTCHAR 0x0E47
+ENCODING 3655
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 5 0 10
+BITMAP
+04
+78
+88
+F4
+18
+ENDCHAR
+STARTCHAR 0x0E48
+ENCODING 3656
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 3 0 10
+BITMAP
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0E49
+ENCODING 3657
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 10
+BITMAP
+40
+A4
+44
+F8
+ENDCHAR
+STARTCHAR 0x0E4A
+ENCODING 3658
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 9 4 0 10
+BITMAP
+6C00
+9280
+D300
+D600
+ENDCHAR
+STARTCHAR 0x0E4B
+ENCODING 3659
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+40
+E0
+40
+ENDCHAR
+STARTCHAR 0x0E4C
+ENCODING 3660
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 4 0 10
+BITMAP
+10
+60
+A0
+40
+ENDCHAR
+STARTCHAR 0x0E4D
+ENCODING 3661
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 10
+BITMAP
+40
+A0
+A0
+40
+ENDCHAR
+STARTCHAR 0x0E4E
+ENCODING 3662
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 10
+BITMAP
+60
+80
+60
+80
+60
+ENDCHAR
+STARTCHAR 0x0E4F
+ENCODING 3663
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 8 1 1
+BITMAP
+3C
+42
+99
+BD
+BD
+99
+42
+3C
+ENDCHAR
+STARTCHAR 0x0E50
+ENCODING 3664
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+3C
+42
+81
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x0E51
+ENCODING 3665
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 8 1 -1
+BITMAP
+3C
+42
+89
+95
+8D
+C5
+79
+02
+ENDCHAR
+STARTCHAR 0x0E52
+ENCODING 3666
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 0
+BITMAP
+C000
+4000
+4000
+4D80
+5240
+5840
+5440
+4840
+4040
+3F80
+ENDCHAR
+STARTCHAR 0x0E53
+ENCODING 3667
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+7700
+8980
+8880
+8880
+C880
+A880
+4900
+ENDCHAR
+STARTCHAR 0x0E54
+ENCODING 3668
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0020
+0020
+0060
+0040
+3F80
+4000
+8800
+9400
+8C00
+4700
+3FC0
+ENDCHAR
+STARTCHAR 0x0E55
+ENCODING 3669
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 0
+BITMAP
+0820
+1460
+1C40
+3F80
+4000
+8800
+9400
+9800
+4E00
+3FC0
+ENDCHAR
+STARTCHAR 0x0E56
+ENCODING 3670
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 0 0
+BITMAP
+80
+80
+40
+40
+7C
+46
+02
+02
+22
+54
+38
+ENDCHAR
+STARTCHAR 0x0E57
+ENCODING 3671
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0020
+0040
+0040
+0040
+7640
+D940
+8940
+8140
+A140
+D280
+6300
+ENDCHAR
+STARTCHAR 0x0E58
+ENCODING 3672
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 0
+BITMAP
+0040
+0040
+0040
+3CC0
+4380
+8100
+B280
+A980
+6480
+2300
+ENDCHAR
+STARTCHAR 0x0E59
+ENCODING 3673
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+0100
+0080
+0080
+0080
+7280
+CD80
+8400
+8600
+9200
+A900
+7100
+ENDCHAR
+STARTCHAR 0x0E5A
+ENCODING 3674
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 -2
+BITMAP
+42
+A2
+C6
+8A
+72
+02
+02
+02
+02
+01
+06
+ENDCHAR
+STARTCHAR 0x0E5B
+ENCODING 3675
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 11 1 0
+BITMAP
+6000
+9000
+A018
+8930
+8920
+8920
+8920
+8920
+8920
+D6A0
+7240
+ENDCHAR
+STARTCHAR 0x0E81
+ENCODING 3713
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+DC
+B2
+62
+22
+22
+22
+62
+A2
+42
+ENDCHAR
+STARTCHAR 0x0E82
+ENCODING 3714
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+38
+44
+C2
+A2
+42
+04
+78
+82
+7C
+ENDCHAR
+STARTCHAR 0x0E84
+ENCODING 3716
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+82
+A2
+52
+A2
+82
+B2
+72
+ENDCHAR
+STARTCHAR 0x0E87
+ENCODING 3719
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -2
+BITMAP
+7C
+C6
+A2
+42
+02
+02
+02
+02
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x0E88
+ENCODING 3720
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+78
+C4
+82
+1A
+2E
+12
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x0E8A
+ENCODING 3722
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -4
+BITMAP
+38
+44
+C2
+A2
+42
+04
+38
+44
+7C
+04
+04
+04
+02
+ENDCHAR
+STARTCHAR 0x0E8D
+ENCODING 3725
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+72
+B2
+82
+82
+62
+82
+82
+C6
+7C
+ENDCHAR
+STARTCHAR 0x0E94
+ENCODING 3732
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+C6
+82
+82
+82
+82
+C2
+A2
+62
+ENDCHAR
+STARTCHAR 0x0E95
+ENCODING 3733
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+6C
+92
+82
+82
+82
+82
+C2
+A2
+42
+ENDCHAR
+STARTCHAR 0x0E96
+ENCODING 3734
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 13 1 -4
+BITMAP
+CE
+B1
+61
+21
+21
+21
+31
+29
+11
+01
+01
+01
+01
+ENDCHAR
+STARTCHAR 0x0E97
+ENCODING 3735
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+46
+A9
+69
+49
+89
+89
+89
+89
+71
+ENDCHAR
+STARTCHAR 0x0E99
+ENCODING 3737
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+41
+A1
+61
+21
+21
+21
+21
+21
+DE
+ENDCHAR
+STARTCHAR 0x0E9A
+ENCODING 3738
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+42
+A2
+62
+42
+82
+82
+82
+C6
+7C
+ENDCHAR
+STARTCHAR 0x0E9B
+ENCODING 3739
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+02
+02
+02
+02
+42
+A2
+62
+42
+82
+82
+82
+C6
+7C
+ENDCHAR
+STARTCHAR 0x0E9C
+ENCODING 3740
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+45
+AB
+C6
+82
+82
+92
+92
+92
+6C
+ENDCHAR
+STARTCHAR 0x0E9D
+ENCODING 3741
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+02
+02
+02
+02
+42
+A2
+C2
+82
+92
+92
+92
+92
+6C
+ENDCHAR
+STARTCHAR 0x0E9E
+ENCODING 3742
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+42
+A2
+62
+42
+82
+92
+92
+92
+6C
+ENDCHAR
+STARTCHAR 0x0E9F
+ENCODING 3743
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+02
+02
+02
+02
+42
+A2
+62
+42
+82
+92
+92
+92
+6C
+ENDCHAR
+STARTCHAR 0x0EA1
+ENCODING 3745
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+61
+21
+21
+21
+21
+21
+61
+B1
+4E
+ENDCHAR
+STARTCHAR 0x0EA2
+ENCODING 3746
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+02
+02
+02
+02
+72
+B2
+82
+82
+62
+82
+82
+C6
+7C
+ENDCHAR
+STARTCHAR 0x0EA3
+ENCODING 3747
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+78
+84
+82
+C0
+3C
+42
+A2
+C6
+7C
+ENDCHAR
+STARTCHAR 0x0EA5
+ENCODING 3749
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+82
+02
+02
+72
+CA
+AA
+44
+ENDCHAR
+STARTCHAR 0x0EA7
+ENCODING 3751
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+82
+02
+02
+42
+A2
+C2
+7C
+ENDCHAR
+STARTCHAR 0x0EAA
+ENCODING 3754
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+79
+86
+86
+7A
+02
+72
+CA
+AA
+44
+ENDCHAR
+STARTCHAR 0x0EAB
+ENCODING 3755
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 0
+BITMAP
+4DC0
+AB20
+6620
+4220
+8220
+8220
+8220
+C620
+7C20
+ENDCHAR
+STARTCHAR 0x0EAD
+ENCODING 3757
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+7C
+86
+86
+7A
+02
+42
+A2
+C2
+7C
+ENDCHAR
+STARTCHAR 0x0EAE
+ENCODING 3758
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+78
+85
+82
+C0
+3C
+42
+A2
+C6
+7C
+ENDCHAR
+STARTCHAR 0x0EAF
+ENCODING 3759
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -4
+BITMAP
+42
+A6
+CA
+72
+02
+02
+02
+02
+02
+02
+02
+82
+82
+46
+3C
+ENDCHAR
+STARTCHAR 0x0EB0
+ENCODING 3760
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 1
+BITMAP
+40
+A4
+7C
+00
+40
+A4
+7C
+ENDCHAR
+STARTCHAR 0x0EB1
+ENCODING 3761
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 8 4 0 10
+BITMAP
+40
+A1
+C1
+7E
+ENDCHAR
+STARTCHAR 0x0EB2
+ENCODING 3762
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+78
+C4
+A4
+44
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x0EB3
+ENCODING 3763
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 11 14 -4 0
+BITMAP
+4000
+A000
+A000
+4000
+0000
+03C0
+0620
+0520
+0220
+0020
+0020
+0020
+0020
+0020
+ENDCHAR
+STARTCHAR 0x0EB4
+ENCODING 3764
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 8 5 0 10
+BITMAP
+7E
+C3
+81
+81
+42
+ENDCHAR
+STARTCHAR 0x0EB5
+ENCODING 3765
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 10 5 0 10
+BITMAP
+7E00
+C300
+8100
+8140
+4380
+ENDCHAR
+STARTCHAR 0x0EB6
+ENCODING 3766
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 8 5 0 10
+BITMAP
+7E
+C3
+99
+99
+42
+ENDCHAR
+STARTCHAR 0x0EB7
+ENCODING 3767
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 10 5 0 10
+BITMAP
+7E00
+C300
+9900
+9940
+4380
+ENDCHAR
+STARTCHAR 0x0EB8
+ENCODING 3768
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 5 0 -5
+BITMAP
+40
+A0
+60
+20
+40
+ENDCHAR
+STARTCHAR 0x0EB9
+ENCODING 3769
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 4 5 0 -5
+BITMAP
+D0
+D0
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x0EBB
+ENCODING 3771
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 8 4 0 10
+BITMAP
+7E
+C1
+A1
+40
+ENDCHAR
+STARTCHAR 0x0EBC
+ENCODING 3772
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 3 0 -3
+BITMAP
+70
+AC
+40
+ENDCHAR
+STARTCHAR 0x0EBD
+ENCODING 3773
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -2
+BITMAP
+60
+5C
+40
+30
+08
+04
+62
+D2
+A2
+82
+82
+C6
+7C
+ENDCHAR
+STARTCHAR 0x0EC0
+ENCODING 3776
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+70
+80
+80
+80
+80
+80
+90
+A8
+70
+ENDCHAR
+STARTCHAR 0x0EC1
+ENCODING 3777
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+7380
+8400
+8400
+8400
+8400
+8400
+9480
+AD40
+7380
+ENDCHAR
+STARTCHAR 0x0EC2
+ENCODING 3778
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 0
+BITMAP
+60
+90
+88
+44
+22
+10
+08
+08
+08
+08
+08
+08
+0C
+0A
+04
+ENDCHAR
+STARTCHAR 0x0EC3
+ENCODING 3779
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 0 0
+BITMAP
+38
+44
+82
+82
+82
+4C
+10
+10
+10
+10
+10
+10
+18
+14
+08
+ENDCHAR
+STARTCHAR 0x0EC4
+ENCODING 3780
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 0 0
+BITMAP
+C0
+40
+40
+40
+58
+68
+08
+10
+10
+10
+10
+10
+14
+1A
+0C
+ENDCHAR
+STARTCHAR 0x0EC6
+ENCODING 3782
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -4
+BITMAP
+6C
+92
+C2
+A2
+42
+02
+02
+02
+02
+02
+02
+82
+82
+46
+3C
+ENDCHAR
+STARTCHAR 0x0EC8
+ENCODING 3784
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 3 0 10
+BITMAP
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x0EC9
+ENCODING 3785
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 10
+BITMAP
+40
+A0
+44
+FC
+ENDCHAR
+STARTCHAR 0x0ECA
+ENCODING 3786
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 8 4 0 9
+BITMAP
+6C
+92
+C3
+C6
+ENDCHAR
+STARTCHAR 0x0ECB
+ENCODING 3787
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 3 0 10
+BITMAP
+40
+E0
+40
+ENDCHAR
+STARTCHAR 0x0ECC
+ENCODING 3788
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 4 0 10
+BITMAP
+04
+78
+A0
+40
+ENDCHAR
+STARTCHAR 0x0ECD
+ENCODING 3789
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 3 4 0 10
+BITMAP
+40
+A0
+A0
+40
+ENDCHAR
+STARTCHAR 0x0ED0
+ENCODING 3792
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+38
+44
+82
+82
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x0ED1
+ENCODING 3793
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -1
+BITMAP
+3C
+42
+81
+81
+91
+A9
+72
+02
+1C
+20
+ENDCHAR
+STARTCHAR 0x0ED2
+ENCODING 3794
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+02
+02
+02
+04
+18
+20
+40
+80
+8C
+96
+8A
+42
+3C
+ENDCHAR
+STARTCHAR 0x0ED3
+ENCODING 3795
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+02
+3C
+30
+0C
+22
+52
+52
+52
+52
+52
+62
+B2
+6C
+ENDCHAR
+STARTCHAR 0x0ED4
+ENCODING 3796
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 0
+BITMAP
+01
+01
+7E
+80
+82
+85
+86
+84
+84
+84
+84
+84
+7B
+ENDCHAR
+STARTCHAR 0x0ED5
+ENCODING 3797
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 0
+BITMAP
+11
+29
+3E
+40
+82
+85
+86
+84
+84
+84
+84
+84
+7B
+ENDCHAR
+STARTCHAR 0x0ED6
+ENCODING 3798
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+02
+3C
+30
+0C
+42
+A2
+C2
+82
+82
+82
+92
+92
+6C
+ENDCHAR
+STARTCHAR 0x0ED7
+ENCODING 3799
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -4
+BITMAP
+CC
+B2
+62
+22
+22
+22
+62
+A2
+42
+02
+02
+02
+02
+ENDCHAR
+STARTCHAR 0x0ED8
+ENCODING 3800
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 13 1 -4
+BITMAP
+CC00
+B200
+6200
+2200
+2200
+2200
+6200
+A200
+4200
+0F80
+1300
+1680
+0900
+ENDCHAR
+STARTCHAR 0x0ED9
+ENCODING 3801
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+7080
+8880
+8880
+8880
+8880
+8880
+C880
+A880
+4700
+ENDCHAR
+STARTCHAR 0x0EDC
+ENCODING 3804
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 9 1 0
+BITMAP
+4DC2
+AB22
+6622
+4222
+8222
+8222
+8222
+C622
+7CDC
+ENDCHAR
+STARTCHAR 0x0EDD
+ENCODING 3805
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 9 1 0
+BITMAP
+4DC2
+AA22
+6622
+4222
+8222
+8222
+8262
+C6B6
+7C4C
+ENDCHAR
+STARTCHAR 0x10A0
+ENCODING 4256
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+DC
+66
+00
+E0
+40
+40
+40
+78
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x10A1
+ENCODING 4257
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+EE00
+4400
+4400
+4400
+3C00
+0400
+0400
+0F00
+0080
+0080
+01C0
+ENDCHAR
+STARTCHAR 0x10A2
+ENCODING 4258
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+FE00
+4400
+4400
+E400
+0400
+0400
+0E00
+0100
+0380
+0040
+00E0
+ENDCHAR
+STARTCHAR 0x10A3
+ENCODING 4259
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FE
+92
+10
+10
+38
+44
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x10A4
+ENCODING 4260
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FE
+44
+44
+E4
+04
+04
+04
+04
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x10A5
+ENCODING 4261
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+FE00
+4400
+4400
+E400
+0400
+07C0
+0440
+04E0
+0400
+0400
+0E00
+ENDCHAR
+STARTCHAR 0x10A6
+ENCODING 4262
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+E000
+4000
+3C00
+0800
+0800
+0F00
+0880
+0880
+0880
+0880
+0700
+ENDCHAR
+STARTCHAR 0x10A7
+ENCODING 4263
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+1E00
+6400
+4400
+8400
+8580
+8640
+8440
+84E0
+4400
+6400
+1E00
+ENDCHAR
+STARTCHAR 0x10A8
+ENCODING 4264
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+E0
+40
+3C
+08
+08
+08
+08
+08
+08
+08
+1C
+ENDCHAR
+STARTCHAR 0x10A9
+ENCODING 4265
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+E0
+40
+40
+40
+78
+44
+44
+3C
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x10AA
+ENCODING 4266
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+FC00
+4800
+4800
+4800
+4800
+E800
+0F00
+0880
+0880
+0880
+0700
+ENDCHAR
+STARTCHAR 0x10AB
+ENCODING 4267
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 1 0
+BITMAP
+E000
+4000
+3C00
+0800
+0800
+0800
+7F80
+8880
+8880
+8880
+71C0
+ENDCHAR
+STARTCHAR 0x10AC
+ENCODING 4268
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FC
+44
+44
+4E
+40
+78
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x10AD
+ENCODING 4269
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+1000
+6C00
+4400
+8200
+8200
+8200
+8200
+82E0
+4440
+6C40
+1380
+ENDCHAR
+STARTCHAR 0x10AE
+ENCODING 4270
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+E000
+4000
+4000
+3DC0
+0880
+0880
+0880
+0880
+0880
+0880
+0700
+ENDCHAR
+STARTCHAR 0x10AF
+ENCODING 4271
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+E7
+42
+42
+32
+22
+1E
+02
+02
+02
+02
+07
+ENDCHAR
+STARTCHAR 0x10B0
+ENCODING 4272
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+1C00
+0800
+0800
+0800
+0800
+2E00
+4900
+8900
+8B80
+8800
+7000
+ENDCHAR
+STARTCHAR 0x10B1
+ENCODING 4273
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 11 1 0
+BITMAP
+E0
+40
+40
+40
+40
+50
+48
+44
+44
+44
+38
+ENDCHAR
+STARTCHAR 0x10B2
+ENCODING 4274
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+F8
+44
+44
+44
+78
+40
+40
+F0
+08
+08
+1C
+ENDCHAR
+STARTCHAR 0x10B3
+ENCODING 4275
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 11 1 0
+BITMAP
+1000
+6C00
+4400
+8200
+8200
+8200
+8200
+8380
+4440
+6C40
+10E0
+ENDCHAR
+STARTCHAR 0x10B4
+ENCODING 4276
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+7F00
+8880
+8880
+8880
+7F00
+0800
+0800
+0800
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x10B5
+ENCODING 4277
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+1C00
+0800
+0800
+EA00
+4D00
+5900
+2B80
+0800
+0800
+0800
+1C00
+ENDCHAR
+STARTCHAR 0x10B6
+ENCODING 4278
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+38
+44
+44
+44
+44
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x10B7
+ENCODING 4279
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+EE
+44
+44
+44
+3C
+04
+04
+04
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x10B8
+ENCODING 4280
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+EE
+44
+44
+44
+3C
+04
+04
+64
+44
+44
+38
+ENDCHAR
+STARTCHAR 0x10B9
+ENCODING 4281
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+E0
+40
+40
+58
+64
+44
+4E
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x10BA
+ENCODING 4282
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+1C00
+6200
+4200
+8700
+8000
+8000
+87C0
+8240
+4240
+62E0
+1C00
+ENDCHAR
+STARTCHAR 0x10BB
+ENCODING 4283
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 1 0
+BITMAP
+1C00
+0800
+0800
+0800
+0800
+0800
+7F80
+8880
+8880
+8880
+71C0
+ENDCHAR
+STARTCHAR 0x10BC
+ENCODING 4284
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+F8
+44
+44
+78
+40
+78
+44
+44
+4E
+40
+E0
+ENDCHAR
+STARTCHAR 0x10BD
+ENCODING 4285
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+FE
+42
+42
+47
+40
+7C
+02
+E1
+41
+42
+3C
+ENDCHAR
+STARTCHAR 0x10BE
+ENCODING 4286
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+EE
+44
+44
+4C
+70
+40
+40
+40
+78
+04
+0E
+ENDCHAR
+STARTCHAR 0x10BF
+ENCODING 4287
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+E000
+4000
+4000
+3F00
+0880
+0880
+0F00
+3800
+4800
+4800
+FC00
+ENDCHAR
+STARTCHAR 0x10C0
+ENCODING 4288
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+FC00
+4800
+4800
+4800
+4800
+E800
+0B00
+0880
+0880
+0880
+0700
+ENDCHAR
+STARTCHAR 0x10C1
+ENCODING 4289
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+FE
+42
+40
+58
+64
+44
+4E
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x10C2
+ENCODING 4290
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+70
+20
+20
+10
+0C
+02
+01
+E1
+41
+42
+3C
+ENDCHAR
+STARTCHAR 0x10C3
+ENCODING 4291
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+0E
+04
+04
+E4
+44
+44
+44
+3C
+04
+04
+0E
+ENDCHAR
+STARTCHAR 0x10C4
+ENCODING 4292
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+EE
+44
+44
+44
+44
+FE
+10
+10
+10
+10
+38
+ENDCHAR
+STARTCHAR 0x10C5
+ENCODING 4293
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+1F00
+0880
+0880
+0F00
+0800
+0800
+7F80
+8880
+8880
+8880
+71C0
+ENDCHAR
+STARTCHAR 0x10D0
+ENCODING 4304
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+20
+20
+18
+04
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10D1
+ENCODING 4305
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+80
+E0
+10
+10
+10
+30
+48
+84
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10D2
+ENCODING 4306
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+30
+48
+48
+08
+38
+44
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x10D3
+ENCODING 4307
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 -3
+BITMAP
+7700
+8880
+8880
+8880
+8880
+4700
+2000
+D800
+8400
+0200
+ENDCHAR
+STARTCHAR 0x10D4
+ENCODING 4308
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+C8
+08
+08
+08
+48
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10D5
+ENCODING 4309
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+C8
+08
+30
+08
+48
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10D6
+ENCODING 4310
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 0 0
+BITMAP
+60
+90
+90
+92
+74
+1C
+1A
+11
+11
+11
+11
+0E
+ENDCHAR
+STARTCHAR 0x10D7
+ENCODING 4311
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 0
+BITMAP
+3300
+4C80
+8440
+8440
+8440
+4880
+3100
+ENDCHAR
+STARTCHAR 0x10D8
+ENCODING 4312
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 7 1 0
+BITMAP
+70
+88
+84
+84
+84
+84
+48
+ENDCHAR
+STARTCHAR 0x10D9
+ENCODING 4313
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+10
+08
+08
+08
+30
+08
+C8
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10DA
+ENCODING 4314
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 10 1 -3
+BITMAP
+7770
+8888
+8888
+8888
+9DC8
+4010
+3800
+C700
+80C0
+0020
+ENDCHAR
+STARTCHAR 0x10DB
+ENCODING 4315
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+70
+88
+88
+08
+68
+98
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10DC
+ENCODING 4316
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+48
+B0
+80
+80
+B0
+C8
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10DD
+ENCODING 4317
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 7 1 0
+BITMAP
+7700
+8880
+8880
+9C80
+8080
+8080
+4100
+ENDCHAR
+STARTCHAR 0x10DE
+ENCODING 4318
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+20
+10
+08
+08
+08
+30
+08
+08
+C8
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10DF
+ENCODING 4319
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+08
+38
+A8
+A8
+48
+08
+48
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10E0
+ENCODING 4320
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+0200
+0200
+0400
+1800
+2000
+7700
+8880
+8880
+9C80
+8080
+8080
+4100
+ENDCHAR
+STARTCHAR 0x10E1
+ENCODING 4321
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 11 0 0
+BITMAP
+60
+A0
+20
+24
+28
+2C
+22
+22
+22
+22
+1C
+ENDCHAR
+STARTCHAR 0x10E2
+ENCODING 4322
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 14 1 -4
+BITMAP
+08
+14
+14
+28
+54
+92
+8D
+81
+81
+81
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x10E3
+ENCODING 4323
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 -4
+BITMAP
+96
+E9
+09
+1D
+01
+01
+09
+11
+11
+11
+0E
+ENDCHAR
+STARTCHAR 0x10E4
+ENCODING 4324
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+6C
+92
+92
+92
+62
+0C
+22
+42
+42
+42
+3C
+ENDCHAR
+STARTCHAR 0x10E5
+ENCODING 4325
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 16 1 -4
+BITMAP
+08
+18
+28
+08
+08
+38
+48
+48
+08
+08
+08
+48
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10E6
+ENCODING 4326
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 -3
+BITMAP
+7700
+8880
+8880
+8880
+9C80
+4100
+3000
+CC00
+8200
+0100
+ENDCHAR
+STARTCHAR 0x10E7
+ENCODING 4327
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+48
+88
+88
+98
+68
+08
+48
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10E8
+ENCODING 4328
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+6C
+92
+D2
+02
+1A
+26
+22
+22
+22
+22
+1C
+ENDCHAR
+STARTCHAR 0x10E9
+ENCODING 4329
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+60
+90
+E0
+80
+B0
+C8
+88
+88
+88
+88
+90
+ENDCHAR
+STARTCHAR 0x10EA
+ENCODING 4330
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+28
+44
+42
+82
+82
+8C
+82
+82
+82
+42
+3C
+ENDCHAR
+STARTCHAR 0x10EB
+ENCODING 4331
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+60
+10
+08
+08
+68
+98
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10EC
+ENCODING 4332
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+6C
+92
+82
+80
+40
+7C
+44
+44
+44
+28
+28
+28
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x10ED
+ENCODING 4333
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+40
+70
+10
+10
+14
+74
+98
+74
+14
+10
+10
+48
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10EE
+ENCODING 4334
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 11 0 0
+BITMAP
+60
+A0
+24
+28
+3C
+32
+22
+22
+22
+22
+1C
+ENDCHAR
+STARTCHAR 0x10EF
+ENCODING 4335
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 -4
+BITMAP
+6380
+9040
+9180
+4A00
+0C00
+1400
+2480
+4240
+2240
+1180
+E000
+ENDCHAR
+STARTCHAR 0x10F0
+ENCODING 4336
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+10
+08
+04
+04
+18
+04
+04
+18
+C4
+84
+78
+ENDCHAR
+STARTCHAR 0x10F1
+ENCODING 4337
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+28
+44
+42
+82
+8C
+82
+82
+8C
+82
+42
+3C
+ENDCHAR
+STARTCHAR 0x10F2
+ENCODING 4338
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+38
+44
+44
+44
+28
+92
+EE
+ENDCHAR
+STARTCHAR 0x10F3
+ENCODING 4339
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 -4
+BITMAP
+7C
+04
+08
+10
+30
+08
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10F4
+ENCODING 4340
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+20
+38
+04
+04
+18
+04
+44
+84
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x10F5
+ENCODING 4341
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+70
+88
+88
+88
+7C
+08
+7C
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x10F6
+ENCODING 4342
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 -4
+BITMAP
+7000
+8800
+C800
+0800
+0800
+3E00
+4900
+4900
+4900
+3E00
+0800
+0800
+0800
+0980
+0880
+0700
+ENDCHAR
+STARTCHAR 0x10FB
+ENCODING 4347
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 6 1 1
+BITMAP
+C0
+C0
+18
+18
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1200
+ENCODING 4608
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 11 0 0
+BITMAP
+07
+C3
+C3
+C3
+C3
+C3
+C3
+C6
+C6
+7C
+38
+ENDCHAR
+STARTCHAR 0x1201
+ENCODING 4609
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 11 0 0
+BITMAP
+0700
+C300
+C300
+C300
+C3F0
+C330
+C300
+C600
+C600
+7C00
+3800
+ENDCHAR
+STARTCHAR 0x1202
+ENCODING 4610
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+66
+C6
+C6
+C6
+C6
+7C
+3C
+0C
+18
+30
+33
+3F
+ENDCHAR
+STARTCHAR 0x1203
+ENCODING 4611
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+66
+C6
+C6
+C6
+C6
+7C
+3C
+0C
+18
+30
+30
+30
+ENDCHAR
+STARTCHAR 0x1204
+ENCODING 4612
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+66
+C6
+C6
+C6
+C6
+7C
+3C
+0C
+1C
+34
+32
+3E
+ENDCHAR
+STARTCHAR 0x1205
+ENCODING 4613
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+C380
+C180
+E180
+7180
+3180
+6180
+6180
+6180
+6300
+3F00
+1E00
+ENDCHAR
+STARTCHAR 0x1206
+ENCODING 4614
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+03C0
+C320
+C360
+C380
+C300
+C300
+C300
+C600
+C600
+7C00
+3800
+ENDCHAR
+STARTCHAR 0x1208
+ENCODING 4616
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+30
+30
+30
+78
+7C
+CE
+C6
+C6
+C6
+C6
+C6
+C6
+ENDCHAR
+STARTCHAR 0x1209
+ENCODING 4617
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3000
+3000
+3000
+7800
+7C00
+CE00
+C600
+C600
+C7E0
+C660
+C600
+C600
+ENDCHAR
+STARTCHAR 0x120A
+ENCODING 4618
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3000
+3000
+3000
+7800
+7C00
+CE00
+C600
+C600
+C600
+C600
+C660
+C7E0
+ENDCHAR
+STARTCHAR 0x120B
+ENCODING 4619
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+30
+30
+30
+78
+7C
+CE
+C6
+C6
+C6
+06
+06
+06
+ENDCHAR
+STARTCHAR 0x120C
+ENCODING 4620
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3000
+3000
+3000
+7800
+7C00
+CE00
+C600
+C600
+C600
+C7C0
+C660
+C7C0
+ENDCHAR
+STARTCHAR 0x120D
+ENCODING 4621
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+18
+18
+18
+3C
+3E
+67
+63
+C3
+C3
+F3
+DB
+F3
+ENDCHAR
+STARTCHAR 0x120E
+ENCODING 4622
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+3000
+3000
+3000
+7800
+7C00
+CE00
+C600
+C7E0
+C6B0
+C6E0
+C600
+C600
+ENDCHAR
+STARTCHAR 0x120F
+ENCODING 4623
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 -2
+BITMAP
+3000
+3000
+3000
+7800
+7C00
+CE00
+C600
+C600
+C600
+0600
+0600
+0600
+1F80
+30C0
+ENDCHAR
+STARTCHAR 0x1210
+ENCODING 4624
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+3F00
+6D80
+6D80
+CCC0
+CCC0
+CCC0
+CCC0
+ENDCHAR
+STARTCHAR 0x1211
+ENCODING 4625
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+3F00
+6D80
+6D80
+CCFC
+CCCC
+CCC0
+CCC0
+ENDCHAR
+STARTCHAR 0x1212
+ENCODING 4626
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+3F00
+6D80
+6D80
+CCC0
+CCC0
+CCCC
+CCFC
+ENDCHAR
+STARTCHAR 0x1213
+ENCODING 4627
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+3F00
+6D80
+6D80
+CCC0
+00C0
+00C0
+00C0
+ENDCHAR
+STARTCHAR 0x1214
+ENCODING 4628
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+3F00
+6D80
+6D80
+CC80
+CCF0
+CC98
+CCF0
+ENDCHAR
+STARTCHAR 0x1215
+ENCODING 4629
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+3000
+3000
+3000
+3C00
+0C00
+3F00
+6D80
+6D80
+CCC0
+CCC0
+CCC0
+CCC0
+ENDCHAR
+STARTCHAR 0x1216
+ENCODING 4630
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+3F00
+6D80
+6D80
+CCC0
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 0x1217
+ENCODING 4631
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 14 0 -2
+BITMAP
+0C00
+0C00
+0C00
+0C00
+0C00
+3F00
+6D80
+6D80
+CCC0
+00C0
+00C0
+00C0
+07F8
+0E1C
+ENDCHAR
+STARTCHAR 0x1218
+ENCODING 4632
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 8 0 2
+BITMAP
+3FF0
+7FF0
+4490
+C590
+8D10
+9930
+F1E0
+F1C0
+ENDCHAR
+STARTCHAR 0x1219
+ENCODING 4633
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 8 0 2
+BITMAP
+3FF0
+7FF0
+4490
+C59E
+8D12
+9932
+F1E0
+F1C0
+ENDCHAR
+STARTCHAR 0x121A
+ENCODING 4634
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+3FF0
+7FF0
+C510
+8510
+8A10
+FBF0
+71F0
+0020
+0020
+0040
+004C
+007C
+ENDCHAR
+STARTCHAR 0x121B
+ENCODING 4635
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+3FF0
+7FF0
+C510
+8510
+8A10
+FBF0
+71F0
+0020
+0020
+0040
+0040
+0040
+ENDCHAR
+STARTCHAR 0x121C
+ENCODING 4636
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+3FF0
+7FF0
+C510
+8510
+8A10
+FBF0
+71F0
+0020
+0020
+0078
+004C
+0078
+ENDCHAR
+STARTCHAR 0x121D
+ENCODING 4637
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+7FC0
+7FE0
+CA20
+8A20
+8A20
+8BE0
+F9C0
+7800
+0800
+1800
+3000
+6000
+ENDCHAR
+STARTCHAR 0x121E
+ENCODING 4638
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+7FC0
+7FE0
+CA20
+8A20
+8A20
+8BE0
+F9C0
+7800
+0800
+0800
+0800
+0C00
+ENDCHAR
+STARTCHAR 0x121F
+ENCODING 4639
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 14 0 -2
+BITMAP
+3FF0
+7FF0
+C510
+8510
+8A10
+FBF0
+71F0
+0020
+0020
+0060
+0040
+0040
+03F0
+0618
+ENDCHAR
+STARTCHAR 0x1220
+ENCODING 4640
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 9 0 1
+BITMAP
+4CC0
+CCC0
+CCC0
+CCC0
+CCC0
+CD80
+CF80
+6C00
+3C00
+ENDCHAR
+STARTCHAR 0x1221
+ENCODING 4641
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 9 0 1
+BITMAP
+4D80
+CD80
+CDF8
+CD98
+CD80
+CD80
+CF80
+6C00
+3C00
+ENDCHAR
+STARTCHAR 0x1222
+ENCODING 4642
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+CC80
+CCC0
+CCC0
+CCC0
+CCC0
+EDC0
+7FC0
+00C0
+00C0
+00C0
+00CC
+00FC
+ENDCHAR
+STARTCHAR 0x1223
+ENCODING 4643
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+CC80
+CCC0
+CCC0
+CCC0
+CCC0
+EDC0
+7FC0
+00C0
+00C0
+00C0
+00C0
+00C0
+ENDCHAR
+STARTCHAR 0x1224
+ENCODING 4644
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+CC80
+CCC0
+CCC0
+CCC0
+CCC0
+EDC0
+7FC0
+00C0
+00C0
+00E0
+0190
+01E0
+ENDCHAR
+STARTCHAR 0x1225
+ENCODING 4645
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+CC80
+CCC0
+CCC0
+CCC0
+CCC0
+EDC0
+FF80
+E000
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 0x1226
+ENCODING 4646
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+CCC0
+CCC0
+CCC0
+CCC0
+CCC0
+EDC0
+7F80
+1C00
+1800
+3800
+7000
+6000
+ENDCHAR
+STARTCHAR 0x1227
+ENCODING 4647
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 14 0 -2
+BITMAP
+CC80
+CCC0
+CCC0
+CCC0
+CCC0
+EDC0
+7FC0
+00C0
+00C0
+00C0
+00C0
+00C0
+07F8
+0E1C
+ENDCHAR
+STARTCHAR 0x1228
+ENCODING 4648
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+0C
+0C
+0C
+18
+38
+70
+E0
+C0
+C0
+E3
+7F
+3F
+ENDCHAR
+STARTCHAR 0x1229
+ENCODING 4649
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+1C00
+3800
+7000
+6000
+C000
+E000
+7FC0
+3FC0
+0600
+0600
+ENDCHAR
+STARTCHAR 0x122A
+ENCODING 4650
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1800
+3800
+7000
+E000
+C300
+C380
+E180
+7F00
+3E00
+ENDCHAR
+STARTCHAR 0x122B
+ENCODING 4651
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1800
+3800
+7000
+E000
+C1E0
+C3E0
+E660
+7E00
+3C00
+ENDCHAR
+STARTCHAR 0x122C
+ENCODING 4652
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1800
+3800
+7000
+E000
+C000
+C000
+E780
+7CC0
+3F80
+ENDCHAR
+STARTCHAR 0x122D
+ENCODING 4653
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 11 0 0
+BITMAP
+3F
+7F
+C3
+C0
+C0
+C0
+C0
+C0
+C3
+FF
+7E
+ENDCHAR
+STARTCHAR 0x122E
+ENCODING 4654
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 11 0 0
+BITMAP
+3F80
+7CC0
+C780
+C000
+C000
+C000
+C000
+C000
+C300
+FF00
+7E00
+ENDCHAR
+STARTCHAR 0x122F
+ENCODING 4655
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 13 0 -2
+BITMAP
+C0C0
+7380
+0C00
+0C00
+1800
+3800
+7000
+E000
+C1E0
+C3E0
+E660
+7E00
+3C00
+ENDCHAR
+STARTCHAR 0x1230
+ENCODING 4656
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+10
+10
+38
+7C
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+ENDCHAR
+STARTCHAR 0x1231
+ENCODING 4657
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1000
+1000
+3800
+7C00
+C600
+C600
+C600
+C7E0
+C660
+C600
+C600
+C600
+ENDCHAR
+STARTCHAR 0x1232
+ENCODING 4658
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1000
+1000
+3800
+7C00
+C600
+C600
+C600
+C600
+C600
+C600
+C660
+C7E0
+ENDCHAR
+STARTCHAR 0x1233
+ENCODING 4659
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+10
+10
+38
+7C
+C6
+C6
+C6
+C6
+C6
+06
+06
+06
+ENDCHAR
+STARTCHAR 0x1234
+ENCODING 4660
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+1000
+1000
+3800
+7C00
+C600
+C600
+C600
+C600
+C700
+C680
+C640
+C7C0
+ENDCHAR
+STARTCHAR 0x1235
+ENCODING 4661
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 11 0 0
+BITMAP
+30
+18
+1C
+3E
+63
+63
+63
+63
+63
+63
+63
+ENDCHAR
+STARTCHAR 0x1236
+ENCODING 4662
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+10
+10
+38
+7C
+C6
+C6
+C6
+C6
+C6
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1237
+ENCODING 4663
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 -2
+BITMAP
+1000
+1000
+3800
+7C00
+C600
+C600
+C600
+C600
+C600
+0600
+0600
+0600
+1F80
+30C0
+ENDCHAR
+STARTCHAR 0x1238
+ENCODING 4664
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C180
+7F00
+0800
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+ENDCHAR
+STARTCHAR 0x1239
+ENCODING 4665
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+C180
+7F00
+0800
+1C00
+3E00
+6300
+6300
+63F0
+6330
+6330
+6300
+6300
+ENDCHAR
+STARTCHAR 0x123A
+ENCODING 4666
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+C180
+7F00
+0800
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6330
+63F0
+ENDCHAR
+STARTCHAR 0x123B
+ENCODING 4667
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C180
+7F00
+0800
+1C00
+3E00
+6300
+6300
+6300
+6300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x123C
+ENCODING 4668
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+C180
+7F00
+0800
+1C00
+3E00
+6300
+6300
+6300
+6300
+63E0
+6330
+63E0
+ENDCHAR
+STARTCHAR 0x123D
+ENCODING 4669
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C300
+7E00
+0C00
+0E00
+1F00
+1980
+3180
+3180
+3180
+3180
+3180
+3180
+ENDCHAR
+STARTCHAR 0x123E
+ENCODING 4670
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C180
+7F00
+0800
+1C00
+3E00
+6300
+6300
+6300
+6300
+6000
+6000
+6000
+ENDCHAR
+STARTCHAR 0x123F
+ENCODING 4671
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 14 0 -2
+BITMAP
+C180
+7F00
+0800
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+0300
+0300
+0FC0
+1860
+ENDCHAR
+STARTCHAR 0x1240
+ENCODING 4672
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1241
+ENCODING 4673
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0FC0
+0CC0
+0C00
+ENDCHAR
+STARTCHAR 0x1242
+ENCODING 4674
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0CC0
+0FC0
+ENDCHAR
+STARTCHAR 0x1243
+ENCODING 4675
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+1800
+3000
+6000
+ENDCHAR
+STARTCHAR 0x1244
+ENCODING 4676
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0F80
+0CC0
+0F80
+ENDCHAR
+STARTCHAR 0x1245
+ENCODING 4677
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+3000
+3000
+3C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1246
+ENCODING 4678
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0700
+0980
+0B00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1248
+ENCODING 4680
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0FC0
+0D60
+0DC0
+0C00
+ENDCHAR
+STARTCHAR 0x124A
+ENCODING 4682
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CD8
+CCD8
+CDF8
+7E0C
+0C0C
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x124B
+ENCODING 4683
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 -2
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+0C00
+3F00
+6180
+ENDCHAR
+STARTCHAR 0x124C
+ENCODING 4684
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 -2
+BITMAP
+0C00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0F80
+0CC0
+3F80
+6000
+ENDCHAR
+STARTCHAR 0x124D
+ENCODING 4685
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+0C00
+0C30
+0C30
+1FFC
+6CCC
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1250
+ENCODING 4688
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+3F00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1251
+ENCODING 4689
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+3F00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0FC0
+0CC0
+ENDCHAR
+STARTCHAR 0x1252
+ENCODING 4690
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+3F00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0CC0
+0FC0
+ENDCHAR
+STARTCHAR 0x1253
+ENCODING 4691
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+3F00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+1800
+3000
+ENDCHAR
+STARTCHAR 0x1254
+ENCODING 4692
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+3F00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0F80
+0CC0
+0F80
+ENDCHAR
+STARTCHAR 0x1255
+ENCODING 4693
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C300
+7E00
+1800
+1E00
+0600
+0FC0
+3660
+6660
+66C0
+3F00
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1256
+ENCODING 4694
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+60C0
+3F80
+0900
+0B00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1258
+ENCODING 4696
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+6180
+3F00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0FC0
+0D60
+0DC0
+0C00
+ENDCHAR
+STARTCHAR 0x125A
+ENCODING 4698
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+6180
+3F00
+0C00
+0C00
+1F80
+6CD8
+CCD8
+CDF8
+7E0C
+0C0C
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x125B
+ENCODING 4699
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 0
+BITMAP
+6180
+3F00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+3F00
+6180
+ENDCHAR
+STARTCHAR 0x125C
+ENCODING 4700
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 -2
+BITMAP
+6180
+3F00
+0C00
+0C00
+1F80
+6CC0
+CCC0
+CD80
+7E00
+0C00
+0F80
+0CC0
+3F80
+6000
+ENDCHAR
+STARTCHAR 0x125D
+ENCODING 4701
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+6180
+3F00
+0C30
+0C30
+1FFC
+6CCC
+CCC0
+CD80
+7E00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1260
+ENCODING 4704
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 11 0 0
+BITMAP
+38
+7C
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+ENDCHAR
+STARTCHAR 0x1261
+ENCODING 4705
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+3800
+7C00
+C600
+C600
+C600
+C7E0
+C660
+C660
+C600
+C600
+C600
+ENDCHAR
+STARTCHAR 0x1262
+ENCODING 4706
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+3800
+7C00
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C660
+C7E0
+ENDCHAR
+STARTCHAR 0x1263
+ENCODING 4707
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 11 0 0
+BITMAP
+38
+7C
+C6
+C6
+C6
+C6
+C6
+06
+06
+06
+06
+ENDCHAR
+STARTCHAR 0x1264
+ENCODING 4708
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+3800
+7C00
+C600
+C600
+C600
+C600
+C600
+C600
+C7C0
+C660
+C7C0
+ENDCHAR
+STARTCHAR 0x1265
+ENCODING 4709
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+0380
+07C0
+0C60
+0C60
+0C60
+FC60
+CC60
+CC60
+0C60
+0C60
+0C60
+ENDCHAR
+STARTCHAR 0x1266
+ENCODING 4710
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 11 0 0
+BITMAP
+38
+7C
+C6
+C6
+C6
+C6
+C6
+C0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1267
+ENCODING 4711
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 -2
+BITMAP
+3800
+7C00
+C600
+C600
+C600
+C600
+C600
+0600
+0600
+0600
+0600
+1F80
+30C0
+ENDCHAR
+STARTCHAR 0x1268
+ENCODING 4712
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C180
+7F00
+0000
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+ENDCHAR
+STARTCHAR 0x1269
+ENCODING 4713
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+C180
+7F00
+0000
+1C00
+3E00
+6300
+6300
+63F0
+6330
+6330
+6300
+6300
+ENDCHAR
+STARTCHAR 0x126A
+ENCODING 4714
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+C180
+7F00
+0000
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6330
+63F0
+ENDCHAR
+STARTCHAR 0x126B
+ENCODING 4715
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C180
+7F00
+0000
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x126C
+ENCODING 4716
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+C180
+7F00
+0000
+1C00
+3E00
+6300
+6300
+6300
+6300
+63E0
+6330
+63E0
+ENDCHAR
+STARTCHAR 0x126D
+ENCODING 4717
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+1830
+0FE0
+0000
+0380
+07C0
+0C60
+0C60
+FC60
+CC60
+CC60
+0C60
+0C60
+ENDCHAR
+STARTCHAR 0x126E
+ENCODING 4718
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C180
+7F00
+0000
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6000
+6000
+ENDCHAR
+STARTCHAR 0x126F
+ENCODING 4719
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 14 0 -2
+BITMAP
+C180
+7F00
+0000
+1C00
+3E00
+6300
+6300
+6300
+6300
+6300
+0300
+0300
+0FC0
+1860
+ENDCHAR
+STARTCHAR 0x1270
+ENCODING 4720
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0E00
+0600
+0600
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1271
+ENCODING 4721
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0E00
+0600
+0600
+0600
+7FE0
+FFF0
+C630
+0600
+07E0
+0660
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1272
+ENCODING 4722
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0E00
+0600
+0600
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0660
+07E0
+ENDCHAR
+STARTCHAR 0x1273
+ENCODING 4723
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0E00
+0600
+0600
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0E00
+1C00
+3800
+ENDCHAR
+STARTCHAR 0x1274
+ENCODING 4724
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0E00
+0600
+0600
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+07C0
+0660
+07C0
+ENDCHAR
+STARTCHAR 0x1275
+ENCODING 4725
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+1800
+1C00
+0E00
+0600
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1276
+ENCODING 4726
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0F80
+0C80
+0580
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1277
+ENCODING 4727
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 14 0 -2
+BITMAP
+0E00
+0600
+0600
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0600
+0600
+1F80
+30C0
+ENDCHAR
+STARTCHAR 0x1278
+ENCODING 4728
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+6060
+7FE0
+FFF0
+C630
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1279
+ENCODING 4729
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+6060
+7FE0
+FFF0
+C630
+0600
+7FE0
+FFF0
+C630
+0600
+07E0
+0660
+0600
+ENDCHAR
+STARTCHAR 0x127A
+ENCODING 4730
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+6060
+7FE0
+FFF0
+C630
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0660
+07E0
+ENDCHAR
+STARTCHAR 0x127B
+ENCODING 4731
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+6060
+7FE0
+FFF0
+C630
+0600
+7FE0
+FFF0
+C630
+0600
+0E00
+1C00
+3800
+ENDCHAR
+STARTCHAR 0x127C
+ENCODING 4732
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+6060
+7FE0
+FFF0
+C630
+0600
+7FE0
+FFF0
+C630
+0600
+07C0
+0660
+07C0
+ENDCHAR
+STARTCHAR 0x127D
+ENCODING 4733
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0E00
+0300
+3FF0
+7FF8
+6318
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x127E
+ENCODING 4734
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+30C0
+7FE0
+6960
+0900
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x127F
+ENCODING 4735
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 14 0 -2
+BITMAP
+6060
+7FE0
+FFF0
+C630
+0600
+7FE0
+FFF0
+C630
+0600
+0600
+0600
+0600
+1F80
+30C0
+ENDCHAR
+STARTCHAR 0x1280
+ENCODING 4736
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+0C
+0C
+0C
+FC
+CF
+03
+03
+03
+03
+03
+03
+03
+ENDCHAR
+STARTCHAR 0x1281
+ENCODING 4737
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+FC00
+CF00
+0300
+0300
+03F0
+0330
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x1282
+ENCODING 4738
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+FC00
+CF00
+0300
+0300
+0300
+0300
+0300
+0330
+03F0
+ENDCHAR
+STARTCHAR 0x1283
+ENCODING 4739
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+0C
+0C
+0C
+FC
+CF
+03
+03
+03
+0E
+18
+30
+30
+ENDCHAR
+STARTCHAR 0x1284
+ENCODING 4740
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+FC00
+CF00
+0300
+0300
+0300
+0300
+03E0
+0330
+03E0
+ENDCHAR
+STARTCHAR 0x1285
+ENCODING 4741
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+0C
+0C
+0C
+3C
+6F
+C3
+C3
+03
+03
+03
+03
+03
+ENDCHAR
+STARTCHAR 0x1286
+ENCODING 4742
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+07E0
+0F90
+18E0
+F800
+D800
+1800
+1F80
+0F80
+0180
+0180
+0180
+0180
+ENDCHAR
+STARTCHAR 0x1288
+ENCODING 4744
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+FC00
+CF00
+0300
+03F0
+0358
+0370
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x128A
+ENCODING 4746
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+FC00
+CF00
+0330
+0330
+03F0
+0318
+0318
+0300
+0300
+ENDCHAR
+STARTCHAR 0x128B
+ENCODING 4747
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 14 0 -2
+BITMAP
+0C00
+0C00
+0C00
+FC00
+CF00
+0300
+0300
+0300
+0300
+0300
+0300
+0300
+0FC0
+1860
+ENDCHAR
+STARTCHAR 0x128C
+ENCODING 4748
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 14 0 -2
+BITMAP
+0C00
+0C00
+0C00
+FC00
+CF00
+0300
+0300
+0300
+0300
+0300
+03E0
+0330
+0FE0
+1800
+ENDCHAR
+STARTCHAR 0x128D
+ENCODING 4749
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+0C00
+0C00
+0C00
+FC60
+CF60
+03F8
+0318
+0300
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x1290
+ENCODING 4752
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 5 12 0 0
+BITMAP
+C0
+C0
+C0
+F0
+38
+30
+30
+30
+60
+60
+60
+60
+ENDCHAR
+STARTCHAR 0x1291
+ENCODING 4753
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+C0
+C0
+C0
+F0
+38
+30
+30
+3E
+66
+60
+60
+60
+ENDCHAR
+STARTCHAR 0x1292
+ENCODING 4754
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+C0
+C0
+C0
+F0
+38
+30
+30
+30
+60
+60
+66
+7E
+ENDCHAR
+STARTCHAR 0x1293
+ENCODING 4755
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+1F00
+3F80
+6180
+C000
+E000
+7C00
+0E00
+0600
+0400
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1294
+ENCODING 4756
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 6 12 0 0
+BITMAP
+C0
+C0
+C0
+F0
+38
+30
+30
+30
+78
+64
+6C
+78
+ENDCHAR
+STARTCHAR 0x1295
+ENCODING 4757
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+FF
+FE
+C6
+0C
+1F
+03
+06
+0C
+0C
+18
+18
+30
+ENDCHAR
+STARTCHAR 0x1296
+ENCODING 4758
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1FC0
+3F20
+6160
+C0C0
+E000
+7C00
+0E00
+0600
+0400
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1297
+ENCODING 4759
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 13 0 -2
+BITMAP
+1F00
+3F80
+6180
+C000
+E000
+7C00
+0E00
+0600
+0400
+0C00
+0C00
+3F00
+6180
+ENDCHAR
+STARTCHAR 0x1298
+ENCODING 4760
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+FFC0
+8C40
+0C00
+0F00
+0380
+0300
+0300
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1299
+ENCODING 4761
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+6180
+FFC0
+8C40
+0C00
+0F00
+0380
+0300
+03E0
+0660
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x129A
+ENCODING 4762
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+6180
+FFC0
+8C40
+0C00
+0F00
+0380
+0300
+0300
+0600
+0600
+0660
+07E0
+ENDCHAR
+STARTCHAR 0x129B
+ENCODING 4763
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 13 0 0
+BITMAP
+30C0
+7FE0
+4620
+1F00
+3F80
+6180
+C000
+E000
+7C00
+0E00
+0600
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x129C
+ENCODING 4764
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+FFC0
+8C40
+0C00
+0F00
+0380
+0300
+0300
+0780
+0640
+06C0
+0780
+ENDCHAR
+STARTCHAR 0x129D
+ENCODING 4765
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 0
+BITMAP
+6180
+FFC0
+8C40
+3F80
+7F00
+6300
+0600
+0F80
+0180
+0300
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x129E
+ENCODING 4766
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 13 0 0
+BITMAP
+3180
+7FC0
+4440
+1FC0
+3F20
+6160
+C0C0
+E000
+7C00
+0E00
+0600
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x129F
+ENCODING 4767
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 15 0 -2
+BITMAP
+30C0
+7FE0
+4620
+1F00
+3F80
+6180
+C000
+E000
+7C00
+0E00
+0600
+0C00
+0C00
+3F00
+6180
+ENDCHAR
+STARTCHAR 0x12A0
+ENCODING 4768
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+60
+60
+60
+78
+18
+38
+3C
+6E
+E6
+C6
+C6
+C6
+ENDCHAR
+STARTCHAR 0x12A1
+ENCODING 4769
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+6000
+6000
+6000
+7800
+1800
+3800
+3C00
+6E00
+E7E0
+C660
+C600
+C600
+ENDCHAR
+STARTCHAR 0x12A2
+ENCODING 4770
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+6000
+6000
+6000
+7800
+1800
+3800
+3C00
+6E00
+E600
+C600
+C660
+C7E0
+ENDCHAR
+STARTCHAR 0x12A3
+ENCODING 4771
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+60
+60
+60
+78
+18
+3C
+6E
+C6
+C6
+C6
+06
+06
+ENDCHAR
+STARTCHAR 0x12A4
+ENCODING 4772
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+6000
+6000
+6000
+7800
+1800
+3800
+3C00
+6E00
+E600
+C7C0
+C660
+C7C0
+ENDCHAR
+STARTCHAR 0x12A5
+ENCODING 4773
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+C0
+C0
+E0
+60
+30
+38
+7C
+EE
+C6
+C6
+C6
+C6
+ENDCHAR
+STARTCHAR 0x12A6
+ENCODING 4774
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+60
+60
+60
+78
+18
+3C
+6E
+C6
+C6
+C6
+C0
+C0
+ENDCHAR
+STARTCHAR 0x12A7
+ENCODING 4775
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 13 0 0
+BITMAP
+6300
+7F00
+D980
+1800
+1E00
+0600
+0E00
+0F00
+1B80
+3980
+3180
+3180
+3180
+ENDCHAR
+STARTCHAR 0x12A8
+ENCODING 4776
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+3180
+3180
+3180
+3180
+3180
+ENDCHAR
+STARTCHAR 0x12A9
+ENCODING 4777
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 11 0 0
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+31F8
+3198
+3180
+3180
+3180
+ENDCHAR
+STARTCHAR 0x12AA
+ENCODING 4778
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 11 0 0
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+3180
+3180
+3180
+3198
+31F8
+ENDCHAR
+STARTCHAR 0x12AB
+ENCODING 4779
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+3180
+3180
+0180
+0180
+0180
+ENDCHAR
+STARTCHAR 0x12AC
+ENCODING 4780
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 11 0 0
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+3180
+3180
+31F0
+3198
+31F0
+ENDCHAR
+STARTCHAR 0x12AD
+ENCODING 4781
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+C000
+CE00
+DF00
+F180
+6180
+7180
+3180
+3180
+3180
+3180
+3180
+ENDCHAR
+STARTCHAR 0x12AE
+ENCODING 4782
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+3180
+3180
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR 0x12B0
+ENCODING 4784
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 11 0 0
+BITMAP
+C000
+CC00
+FE00
+F300
+3300
+33F0
+3358
+3370
+3300
+3300
+3300
+ENDCHAR
+STARTCHAR 0x12B2
+ENCODING 4786
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 11 0 0
+BITMAP
+C000
+CC00
+FE00
+F300
+3330
+3330
+33F0
+3318
+3318
+3300
+3300
+ENDCHAR
+STARTCHAR 0x12B3
+ENCODING 4787
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 13 0 -2
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+3180
+3180
+0180
+0180
+0180
+07E0
+0C30
+ENDCHAR
+STARTCHAR 0x12B4
+ENCODING 4788
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 13 0 -2
+BITMAP
+C000
+CE00
+FF00
+F180
+3180
+3180
+3180
+3180
+0180
+01F0
+0198
+07F0
+0C00
+ENDCHAR
+STARTCHAR 0x12B5
+ENCODING 4789
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 11 0 0
+BITMAP
+C000
+CC60
+FE60
+F3F8
+3318
+3300
+3300
+3300
+3300
+3300
+3300
+ENDCHAR
+STARTCHAR 0x12B8
+ENCODING 4792
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+ENDCHAR
+STARTCHAR 0x12B9
+ENCODING 4793
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C60
+0C60
+0C7E
+0C66
+0C60
+0C60
+0C60
+ENDCHAR
+STARTCHAR 0x12BA
+ENCODING 4794
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C60
+0C60
+0C60
+0C60
+0C60
+0C66
+0C7E
+ENDCHAR
+STARTCHAR 0x12BB
+ENCODING 4795
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C60
+0C60
+0C60
+0C60
+0060
+0060
+0060
+ENDCHAR
+STARTCHAR 0x12BC
+ENCODING 4796
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C60
+0C60
+0C60
+0C60
+0C7C
+0C66
+0C7C
+ENDCHAR
+STARTCHAR 0x12BD
+ENCODING 4797
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+C300
+7E00
+1800
+1DC0
+1FE0
+0630
+0730
+0330
+0330
+0330
+0330
+0330
+ENDCHAR
+STARTCHAR 0x12BE
+ENCODING 4798
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C60
+0C60
+0C60
+0C60
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x12C0
+ENCODING 4800
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C60
+0C7E
+0C6B
+0C6E
+0C60
+0C60
+0C60
+ENDCHAR
+STARTCHAR 0x12C2
+ENCODING 4802
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 12 0 0
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0C66
+0C66
+0C7E
+0C63
+0C63
+0C60
+0C60
+ENDCHAR
+STARTCHAR 0x12C3
+ENCODING 4803
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 14 0 -2
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0CE0
+0C60
+0C60
+0C60
+0060
+0060
+0060
+01F8
+030C
+ENDCHAR
+STARTCHAR 0x12C4
+ENCODING 4804
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 0 -2
+BITMAP
+C300
+7E00
+1800
+1B80
+1FC0
+0CE0
+0C60
+0C60
+0C60
+0060
+007C
+0066
+01FC
+0300
+ENDCHAR
+STARTCHAR 0x12C5
+ENCODING 4805
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 12 0 0
+BITMAP
+C300
+7E00
+180C
+1B8C
+1FFF
+0C63
+0C60
+0C60
+0C60
+0C60
+0C60
+0C60
+ENDCHAR
+STARTCHAR 0x12C8
+ENCODING 4808
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 8 0 1
+BITMAP
+3FC0
+76E0
+C660
+C660
+CC60
+CCC0
+EDC0
+7F00
+ENDCHAR
+STARTCHAR 0x12C9
+ENCODING 4809
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 9 0 -1
+BITMAP
+3FC0
+76E0
+C660
+C660
+CC60
+CCE0
+EDC6
+7FFC
+000C
+ENDCHAR
+STARTCHAR 0x12CA
+ENCODING 4810
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3FC0
+76E0
+C660
+C660
+CC60
+EEC0
+7F80
+0C00
+0C00
+1C00
+18C0
+1FC0
+ENDCHAR
+STARTCHAR 0x12CB
+ENCODING 4811
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3FC0
+76E0
+C660
+C660
+CC60
+EEC0
+7F80
+0C00
+0C00
+0C00
+0C00
+1C00
+ENDCHAR
+STARTCHAR 0x12CC
+ENCODING 4812
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3FC0
+76E0
+C660
+C660
+CC60
+EEC0
+7F80
+0C00
+0C00
+1E00
+1980
+1F00
+ENDCHAR
+STARTCHAR 0x12CD
+ENCODING 4813
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 8 0 1
+BITMAP
+3FC0
+76E0
+C660
+C67E
+CC66
+CCC2
+EDC0
+7F00
+ENDCHAR
+STARTCHAR 0x12CE
+ENCODING 4814
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3FC0
+76E0
+C660
+C660
+CC60
+EEC0
+7F80
+0C00
+1800
+3000
+6000
+6000
+ENDCHAR
+STARTCHAR 0x12D0
+ENCODING 4816
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 11 0 0
+BITMAP
+1E
+63
+C3
+C3
+C3
+C3
+C3
+C3
+C3
+7F
+60
+ENDCHAR
+STARTCHAR 0x12D1
+ENCODING 4817
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 11 0 0
+BITMAP
+1E00
+6300
+C300
+C300
+C300
+C300
+C3F0
+C330
+C300
+7F00
+6000
+ENDCHAR
+STARTCHAR 0x12D2
+ENCODING 4818
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 11 0 0
+BITMAP
+3E00
+6300
+C300
+C300
+C300
+7F80
+0180
+0180
+0300
+0330
+03F0
+ENDCHAR
+STARTCHAR 0x12D3
+ENCODING 4819
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+3E00
+6300
+C300
+C300
+C300
+7F80
+0180
+0180
+0180
+0300
+0300
+ENDCHAR
+STARTCHAR 0x12D4
+ENCODING 4820
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 11 0 0
+BITMAP
+3E00
+6300
+C300
+C300
+C300
+7F80
+0180
+0180
+03E0
+0330
+03E0
+ENDCHAR
+STARTCHAR 0x12D5
+ENCODING 4821
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 13 0 0
+BITMAP
+18
+18
+18
+7E
+E3
+C3
+C3
+C3
+C3
+C3
+C3
+7F
+60
+ENDCHAR
+STARTCHAR 0x12D6
+ENCODING 4822
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+3C
+66
+C3
+C3
+C3
+E7
+7E
+3C
+70
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0x12D8
+ENCODING 4824
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+C6
+C6
+C6
+C6
+C6
+FE
+FE
+C6
+C6
+C6
+C6
+C6
+ENDCHAR
+STARTCHAR 0x12D9
+ENCODING 4825
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C600
+C600
+C600
+C600
+C600
+FE00
+FE00
+C7E0
+C660
+C660
+C600
+C600
+ENDCHAR
+STARTCHAR 0x12DA
+ENCODING 4826
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C600
+C600
+C600
+C600
+C600
+FE00
+FE00
+C600
+C600
+C600
+C660
+C7E0
+ENDCHAR
+STARTCHAR 0x12DB
+ENCODING 4827
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+C6
+C6
+C6
+C6
+FE
+FE
+C6
+C6
+C6
+06
+06
+06
+ENDCHAR
+STARTCHAR 0x12DC
+ENCODING 4828
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C600
+C600
+C600
+C600
+C600
+FE00
+FE00
+C600
+C600
+C7C0
+C660
+C7C0
+ENDCHAR
+STARTCHAR 0x12DD
+ENCODING 4829
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+70C0
+D8C0
+D8C0
+18C0
+18C0
+1FC0
+1FC0
+18C0
+18C0
+18C0
+18C0
+18C0
+ENDCHAR
+STARTCHAR 0x12DE
+ENCODING 4830
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+C6
+C6
+C6
+C6
+FE
+FE
+C6
+C6
+C6
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0x12DF
+ENCODING 4831
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 -2
+BITMAP
+C600
+C600
+C600
+C600
+FE00
+FE00
+C600
+C600
+C600
+0600
+0600
+0600
+1F80
+30C0
+ENDCHAR
+STARTCHAR 0x12E0
+ENCODING 4832
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+70E0
+D9B0
+D9B0
+1980
+1980
+1F80
+1F80
+1980
+1980
+1980
+1980
+1980
+ENDCHAR
+STARTCHAR 0x12E1
+ENCODING 4833
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+70E0
+D9B0
+D9B0
+1980
+1980
+1F80
+1F80
+19F8
+1998
+1998
+1980
+1980
+ENDCHAR
+STARTCHAR 0x12E2
+ENCODING 4834
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+70E0
+D9B0
+D9B0
+1980
+1980
+1F80
+1F80
+1980
+1980
+1980
+1998
+19F8
+ENDCHAR
+STARTCHAR 0x12E3
+ENCODING 4835
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+70E0
+D9B0
+D9B0
+1980
+1F80
+1F80
+1980
+1980
+1980
+0180
+0180
+0180
+ENDCHAR
+STARTCHAR 0x12E4
+ENCODING 4836
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 12 0 0
+BITMAP
+70E0
+D9B0
+D9B0
+1980
+1980
+1F80
+1F80
+1980
+1980
+19F0
+1998
+19F0
+ENDCHAR
+STARTCHAR 0x12E5
+ENCODING 4837
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 13 0 0
+BITMAP
+C300
+7E00
+1800
+3870
+6CD8
+6CD8
+0CC0
+0FC0
+0FC0
+0CC0
+0CC0
+0CC0
+0CC0
+ENDCHAR
+STARTCHAR 0x12E6
+ENCODING 4838
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+70E0
+D9B0
+D9B0
+1980
+1F80
+1F80
+1980
+1980
+1980
+1800
+1800
+1800
+ENDCHAR
+STARTCHAR 0x12E7
+ENCODING 4839
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 14 0 -2
+BITMAP
+70E0
+D9B0
+D9B0
+1980
+1F80
+1F80
+1980
+1980
+1980
+0180
+0180
+0180
+07E0
+0C30
+ENDCHAR
+STARTCHAR 0x12E8
+ENCODING 4840
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+38
+6C
+C6
+C6
+C6
+C6
+EC
+78
+30
+30
+30
+30
+ENDCHAR
+STARTCHAR 0x12E9
+ENCODING 4841
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+38
+6C
+C6
+C6
+C6
+C6
+EC
+78
+30
+3F
+33
+30
+ENDCHAR
+STARTCHAR 0x12EA
+ENCODING 4842
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+3800
+6C00
+C600
+C600
+C600
+C600
+EC00
+7800
+3300
+3FC0
+30C0
+3000
+ENDCHAR
+STARTCHAR 0x12EB
+ENCODING 4843
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+38
+6C
+C6
+C6
+C6
+CC
+F8
+70
+38
+0C
+38
+70
+ENDCHAR
+STARTCHAR 0x12EC
+ENCODING 4844
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+3800
+6C00
+C600
+C600
+C600
+C600
+EC00
+7800
+3780
+3CC0
+3780
+3000
+ENDCHAR
+STARTCHAR 0x12ED
+ENCODING 4845
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+0F00
+1980
+3180
+3180
+3180
+1B00
+1E60
+0E60
+07C0
+7C00
+E000
+C000
+ENDCHAR
+STARTCHAR 0x12EE
+ENCODING 4846
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+3800
+6C00
+C600
+C7E0
+C660
+C600
+EC00
+7800
+3000
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR 0x12EF
+ENCODING 4847
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 15 0 -2
+BITMAP
+E380
+7F00
+1C00
+1C00
+3600
+6300
+6300
+6300
+6300
+7600
+3C00
+1800
+1800
+1800
+1800
+ENDCHAR
+STARTCHAR 0x12F0
+ENCODING 4848
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+1C00
+3E00
+6200
+6200
+6600
+7C00
+3000
+1800
+1800
+0C00
+FFC0
+C0C0
+ENDCHAR
+STARTCHAR 0x12F1
+ENCODING 4849
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+1C00
+3E00
+6200
+6600
+7C00
+3000
+1800
+7F00
+C300
+C3F0
+0630
+0600
+ENDCHAR
+STARTCHAR 0x12F2
+ENCODING 4850
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1C00
+3E00
+6200
+6600
+7C00
+3000
+1800
+7F00
+C300
+C300
+0660
+07E0
+ENDCHAR
+STARTCHAR 0x12F3
+ENCODING 4851
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+1C
+3E
+62
+66
+7C
+30
+18
+FF
+C3
+C3
+03
+03
+ENDCHAR
+STARTCHAR 0x12F4
+ENCODING 4852
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1C00
+3E00
+6200
+6200
+6600
+7C00
+3000
+1800
+1800
+0FC0
+FE60
+C3C0
+ENDCHAR
+STARTCHAR 0x12F5
+ENCODING 4853
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1C00
+3E00
+63E0
+6260
+6600
+7C00
+3000
+1800
+1800
+0C00
+FFC0
+C0C0
+ENDCHAR
+STARTCHAR 0x12F6
+ENCODING 4854
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+0E00
+1F00
+3100
+3300
+3E00
+1C00
+3F80
+6180
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 0x12F7
+ENCODING 4855
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 14 0 -2
+BITMAP
+1C00
+3E00
+6200
+6600
+7C00
+3000
+1800
+FF00
+C300
+C300
+0300
+0300
+0FC0
+1860
+ENDCHAR
+STARTCHAR 0x12F8
+ENCODING 4856
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+10
+10
+38
+7C
+C4
+CC
+F8
+60
+30
+18
+FF
+C3
+ENDCHAR
+STARTCHAR 0x12F9
+ENCODING 4857
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+0800
+0800
+1C00
+3E00
+6200
+6600
+7C00
+3000
+7F00
+C3F0
+C630
+0600
+ENDCHAR
+STARTCHAR 0x12FA
+ENCODING 4858
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+0800
+0800
+1C00
+3E00
+6200
+6600
+7C00
+3000
+7F00
+C300
+C660
+07E0
+ENDCHAR
+STARTCHAR 0x12FB
+ENCODING 4859
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+08
+08
+1C
+3E
+62
+66
+7C
+30
+FF
+C3
+03
+03
+ENDCHAR
+STARTCHAR 0x12FC
+ENCODING 4860
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1000
+1000
+3800
+7C00
+C400
+CC00
+F800
+6000
+3000
+1BC0
+FE60
+C3C0
+ENDCHAR
+STARTCHAR 0x12FD
+ENCODING 4861
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+1000
+1000
+3800
+7C00
+C7C0
+CCC0
+F800
+6000
+3000
+1800
+FF00
+C300
+ENDCHAR
+STARTCHAR 0x12FE
+ENCODING 4862
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0400
+0400
+0E00
+1F00
+3100
+3300
+3E00
+1FC0
+30C0
+6000
+6000
+6000
+ENDCHAR
+STARTCHAR 0x12FF
+ENCODING 4863
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 16 0 -2
+BITMAP
+0800
+0800
+1C00
+3E00
+6200
+6600
+7C00
+3000
+1800
+FF00
+C300
+C300
+0300
+0300
+0FC0
+1860
+ENDCHAR
+STARTCHAR 0x1300
+ENCODING 4864
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 0
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+3100
+3300
+1E00
+1800
+1C00
+0C00
+7F80
+6180
+ENDCHAR
+STARTCHAR 0x1301
+ENCODING 4865
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 13 0 0
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+3300
+1E00
+0C00
+3F80
+6180
+61F8
+0318
+0300
+ENDCHAR
+STARTCHAR 0x1302
+ENCODING 4866
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 13 0 0
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+3300
+1E00
+0C00
+3F80
+6180
+6180
+0330
+03F0
+ENDCHAR
+STARTCHAR 0x1303
+ENCODING 4867
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 0
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+3300
+1E00
+0C00
+7F80
+6180
+6180
+0180
+0180
+ENDCHAR
+STARTCHAR 0x1304
+ENCODING 4868
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 13 0 0
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+3100
+3300
+1E00
+1800
+1C00
+0FE0
+7F30
+61E0
+ENDCHAR
+STARTCHAR 0x1305
+ENCODING 4869
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 13 0 0
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+31F0
+3330
+1E00
+1800
+1C00
+0C00
+7F80
+6180
+ENDCHAR
+STARTCHAR 0x1306
+ENCODING 4870
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 0
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+3300
+1E00
+1FC0
+30C0
+6000
+6000
+6000
+6000
+ENDCHAR
+STARTCHAR 0x1307
+ENCODING 4871
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 15 0 -2
+BITMAP
+C0C0
+7F80
+0C00
+1E00
+3300
+3300
+1E00
+0C00
+7F80
+6180
+6180
+0180
+0180
+0FF0
+1C38
+ENDCHAR
+STARTCHAR 0x1308
+ENCODING 4872
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 11 0 0
+BITMAP
+7C
+C6
+C6
+06
+06
+06
+0C
+0C
+0C
+0C
+0C
+ENDCHAR
+STARTCHAR 0x1309
+ENCODING 4873
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+7C00
+C600
+C600
+0600
+0600
+0600
+0FE0
+0C60
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x130A
+ENCODING 4874
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 11 0 0
+BITMAP
+7C00
+C600
+C600
+0600
+0600
+0600
+0C00
+0C00
+0C00
+0CC0
+0FC0
+ENDCHAR
+STARTCHAR 0x130B
+ENCODING 4875
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 11 0 0
+BITMAP
+78
+FE
+C6
+06
+06
+06
+0C
+1C
+78
+E0
+C0
+ENDCHAR
+STARTCHAR 0x130C
+ENCODING 4876
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 11 0 0
+BITMAP
+7C00
+C600
+C600
+0600
+0600
+0600
+0C00
+0C00
+0F80
+0CC0
+0F80
+ENDCHAR
+STARTCHAR 0x130D
+ENCODING 4877
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+7F00
+CD80
+7980
+0180
+0180
+0300
+0300
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x130E
+ENCODING 4878
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+10
+10
+10
+7C
+C6
+C6
+06
+04
+0C
+0C
+0C
+0C
+ENDCHAR
+STARTCHAR 0x1310
+ENCODING 4880
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 11 0 0
+BITMAP
+7C00
+C600
+C600
+0600
+0600
+07E0
+0EB0
+0CE0
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1312
+ENCODING 4882
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+7C00
+C600
+C600
+0600
+06C0
+06C0
+0FC0
+0C60
+0C60
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1313
+ENCODING 4883
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 11 0 0
+BITMAP
+78
+CC
+CC
+0C
+7E
+66
+06
+06
+06
+06
+06
+ENDCHAR
+STARTCHAR 0x1314
+ENCODING 4884
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 -2
+BITMAP
+7C00
+C600
+C600
+0600
+0600
+0600
+0C00
+0C00
+0C00
+0F80
+0CC0
+3F80
+6000
+ENDCHAR
+STARTCHAR 0x1315
+ENCODING 4885
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 11 0 0
+BITMAP
+7C00
+C6C0
+C6C0
+07F0
+0630
+0600
+0E00
+0C00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1318
+ENCODING 4888
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+C3
+7E
+00
+7C
+C6
+C6
+06
+04
+0C
+0C
+0C
+0C
+ENDCHAR
+STARTCHAR 0x1319
+ENCODING 4889
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+C300
+7E00
+0000
+7C00
+C600
+C600
+0600
+0600
+0FE0
+0C60
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x131A
+ENCODING 4890
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+C300
+7E00
+0000
+7C00
+C600
+C600
+0600
+0400
+0C00
+0C00
+0CC0
+0FC0
+ENDCHAR
+STARTCHAR 0x131B
+ENCODING 4891
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+C3
+7E
+00
+3C
+7F
+43
+03
+03
+0E
+3C
+70
+E0
+ENDCHAR
+STARTCHAR 0x131C
+ENCODING 4892
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+C300
+7E00
+0000
+7C00
+C600
+C600
+0600
+0400
+0C00
+0F80
+0CC0
+0F80
+ENDCHAR
+STARTCHAR 0x131D
+ENCODING 4893
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+C300
+7E00
+0000
+7F00
+CD80
+7980
+0180
+0100
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x131E
+ENCODING 4894
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 7 12 0 0
+BITMAP
+C6
+7C
+10
+7C
+C6
+C6
+06
+04
+0C
+0C
+0C
+0C
+ENDCHAR
+STARTCHAR 0x131F
+ENCODING 4895
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 14 0 -2
+BITMAP
+C3
+7E
+00
+78
+CC
+CC
+0C
+7E
+66
+06
+06
+06
+06
+06
+ENDCHAR
+STARTCHAR 0x1320
+ENCODING 4896
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 10 0 0
+BITMAP
+3E00
+6B00
+6B00
+C980
+C980
+C980
+C980
+C980
+C980
+C980
+ENDCHAR
+STARTCHAR 0x1321
+ENCODING 4897
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 10 0 0
+BITMAP
+3E00
+6B00
+6B00
+C980
+C980
+C9F8
+C998
+C980
+C980
+C980
+ENDCHAR
+STARTCHAR 0x1322
+ENCODING 4898
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 10 0 0
+BITMAP
+3E00
+6B00
+6B00
+C980
+C980
+C980
+C980
+C980
+C998
+C9F8
+ENDCHAR
+STARTCHAR 0x1323
+ENCODING 4899
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+3E00
+6B00
+6B00
+C980
+C980
+C980
+C980
+0180
+0180
+0180
+0180
+ENDCHAR
+STARTCHAR 0x1324
+ENCODING 4900
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 13 11 0 0
+BITMAP
+3E00
+6B00
+6B00
+C980
+C980
+C980
+C980
+C980
+C9F0
+C998
+C9F0
+ENDCHAR
+STARTCHAR 0x1325
+ENCODING 4901
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 0 0
+BITMAP
+3F80
+7FC0
+4CC0
+CC60
+CE60
+C660
+0600
+0600
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1326
+ENCODING 4902
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 11 0 0
+BITMAP
+3E00
+6B00
+6B00
+C980
+C980
+C980
+C980
+C000
+C000
+C000
+C000
+ENDCHAR
+STARTCHAR 0x1327
+ENCODING 4903
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 13 0 -2
+BITMAP
+3E00
+6B00
+6B00
+C980
+C980
+C980
+C980
+0180
+0180
+0180
+0180
+07E0
+0C30
+ENDCHAR
+STARTCHAR 0x1328
+ENCODING 4904
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 10 0 0
+BITMAP
+1F80
+3FC0
+6260
+C230
+C230
+C230
+F338
+DAB6
+CAB2
+FBBE
+ENDCHAR
+STARTCHAR 0x1329
+ENCODING 4905
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 10 0 0
+BITMAP
+1F80
+3FC0
+6260
+C230
+C23F
+C233
+F338
+DAB4
+CAB2
+FBBE
+ENDCHAR
+STARTCHAR 0x132A
+ENCODING 4906
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 10 0 0
+BITMAP
+1F80
+3FC0
+6260
+C230
+C230
+C230
+F330
+DAB0
+CAB3
+FBBF
+ENDCHAR
+STARTCHAR 0x132B
+ENCODING 4907
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+1FC0
+3FE0
+6230
+C230
+E330
+D2B0
+CAB0
+FBB0
+0030
+0068
+0064
+007C
+ENDCHAR
+STARTCHAR 0x132C
+ENCODING 4908
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 10 0 0
+BITMAP
+1F80
+3FC0
+6260
+C23F
+C239
+C237
+F330
+DABC
+CAB2
+FBBE
+ENDCHAR
+STARTCHAR 0x132D
+ENCODING 4909
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 11 0 0
+BITMAP
+1FC0
+7FE0
+C630
+E638
+9724
+F33C
+0300
+0380
+0340
+0320
+03E0
+ENDCHAR
+STARTCHAR 0x132E
+ENCODING 4910
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 12 0 0
+BITMAP
+1FC0
+3FE0
+3430
+6430
+4630
+C528
+C4A4
+C738
+E000
+D000
+C800
+F800
+ENDCHAR
+STARTCHAR 0x132F
+ENCODING 4911
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 13 0 -2
+BITMAP
+1FC0
+3FE0
+6230
+C230
+E330
+D2B0
+CAB0
+FBB0
+0030
+0060
+0060
+01F8
+030C
+ENDCHAR
+STARTCHAR 0x1330
+ENCODING 4912
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+18
+18
+18
+3C
+66
+66
+3C
+7E
+E7
+C3
+C3
+C3
+ENDCHAR
+STARTCHAR 0x1331
+ENCODING 4913
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+1800
+1800
+1800
+3C00
+6600
+6600
+3C00
+7E00
+E700
+C3F0
+C330
+C300
+ENDCHAR
+STARTCHAR 0x1332
+ENCODING 4914
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+1800
+1800
+1800
+3C00
+6600
+6600
+3C00
+7E00
+E700
+C300
+C330
+C3F0
+ENDCHAR
+STARTCHAR 0x1333
+ENCODING 4915
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+18
+18
+18
+3C
+66
+3C
+7E
+E7
+C7
+C3
+03
+03
+ENDCHAR
+STARTCHAR 0x1334
+ENCODING 4916
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+1800
+1800
+1800
+3C00
+6600
+6600
+3C00
+7E00
+E700
+C3E0
+C330
+C3E0
+ENDCHAR
+STARTCHAR 0x1335
+ENCODING 4917
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+1800
+1800
+1800
+3C00
+67E0
+6660
+3C00
+7E00
+E700
+C300
+C300
+C300
+ENDCHAR
+STARTCHAR 0x1336
+ENCODING 4918
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+18
+18
+18
+3C
+66
+3C
+7E
+E7
+C3
+C3
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1337
+ENCODING 4919
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 14 0 -2
+BITMAP
+1800
+1800
+1800
+3C00
+6600
+3C00
+7E00
+E700
+C300
+C300
+0300
+0300
+0FC0
+1860
+ENDCHAR
+STARTCHAR 0x1338
+ENCODING 4920
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 10 0 0
+BITMAP
+18
+3C
+66
+66
+3C
+7E
+E7
+C3
+C3
+C3
+ENDCHAR
+STARTCHAR 0x1339
+ENCODING 4921
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 10 0 0
+BITMAP
+1800
+3C00
+6600
+6600
+3C00
+7E00
+E700
+C3F0
+C330
+C300
+ENDCHAR
+STARTCHAR 0x133A
+ENCODING 4922
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 10 0 0
+BITMAP
+1800
+3C00
+6600
+6600
+3C00
+7E00
+E700
+C300
+C330
+C3F0
+ENDCHAR
+STARTCHAR 0x133B
+ENCODING 4923
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 11 0 0
+BITMAP
+18
+3C
+66
+66
+3C
+7E
+E6
+C7
+C3
+03
+03
+ENDCHAR
+STARTCHAR 0x133C
+ENCODING 4924
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 10 0 0
+BITMAP
+1800
+3C00
+6600
+6600
+3C00
+7E00
+E700
+C3C0
+C360
+C3C0
+ENDCHAR
+STARTCHAR 0x133D
+ENCODING 4925
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 10 0 0
+BITMAP
+1800
+3C00
+67E0
+6660
+3C00
+7E00
+E700
+C300
+C300
+C300
+ENDCHAR
+STARTCHAR 0x133E
+ENCODING 4926
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 11 0 0
+BITMAP
+18
+3C
+66
+66
+3C
+7E
+E7
+C3
+C3
+C0
+C0
+ENDCHAR
+STARTCHAR 0x133F
+ENCODING 4927
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 13 0 -2
+BITMAP
+1800
+3C00
+6600
+6600
+3C00
+7E00
+E600
+C700
+C300
+0300
+0300
+0FC0
+1860
+ENDCHAR
+STARTCHAR 0x1340
+ENCODING 4928
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 11 0 0
+BITMAP
+1E
+63
+C3
+C3
+C3
+FF
+C3
+C3
+C3
+7F
+60
+ENDCHAR
+STARTCHAR 0x1341
+ENCODING 4929
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 11 0 0
+BITMAP
+1E00
+6300
+C300
+C300
+C300
+FF00
+C3F0
+C330
+C300
+7F00
+6000
+ENDCHAR
+STARTCHAR 0x1342
+ENCODING 4930
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+7E00
+C300
+C300
+FF00
+C300
+C300
+7F00
+0300
+0300
+0300
+0330
+03F0
+ENDCHAR
+STARTCHAR 0x1343
+ENCODING 4931
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+7E
+C3
+C3
+FF
+C3
+C3
+7F
+03
+03
+03
+03
+03
+ENDCHAR
+STARTCHAR 0x1344
+ENCODING 4932
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 12 0 0
+BITMAP
+7E00
+C300
+C300
+FF00
+C300
+C300
+7F00
+0300
+0300
+03E0
+0330
+03E0
+ENDCHAR
+STARTCHAR 0x1345
+ENCODING 4933
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 13 0 0
+BITMAP
+18
+18
+18
+7E
+E3
+C3
+C3
+FF
+C3
+C3
+C3
+7F
+60
+ENDCHAR
+STARTCHAR 0x1346
+ENCODING 4934
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+3C
+66
+C3
+FF
+C3
+E7
+7E
+3C
+70
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1348
+ENCODING 4936
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 11 0 0
+BITMAP
+0600
+0200
+0600
+0C00
+1800
+3000
+7800
+CC00
+C440
+7FC0
+1F40
+ENDCHAR
+STARTCHAR 0x1349
+ENCODING 4937
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 12 0 0
+BITMAP
+0400
+0C00
+1800
+3000
+6000
+F800
+C880
+CF80
+FE00
+1800
+3000
+3000
+ENDCHAR
+STARTCHAR 0x134A
+ENCODING 4938
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 11 0 0
+BITMAP
+0600
+0200
+0600
+0C00
+1800
+3000
+78C0
+CC40
+C4C0
+7F80
+3E00
+ENDCHAR
+STARTCHAR 0x134B
+ENCODING 4939
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+0800
+0C00
+1800
+1000
+3000
+7000
+D800
+CC80
+7FC0
+0C40
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x134C
+ENCODING 4940
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 0
+BITMAP
+0600
+0200
+0600
+0C00
+1800
+3000
+7800
+CC00
+C4C0
+7FA0
+1F20
+01C0
+ENDCHAR
+STARTCHAR 0x134D
+ENCODING 4941
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 0
+BITMAP
+3E
+67
+43
+C0
+C0
+F8
+CF
+DD
+6C
+0C
+0C
+0C
+ENDCHAR
+STARTCHAR 0x134E
+ENCODING 4942
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 11 0 0
+BITMAP
+1F80
+3E40
+63C0
+C000
+C000
+C000
+F000
+E800
+C4C0
+6D80
+3F80
+ENDCHAR
+STARTCHAR 0x134F
+ENCODING 4943
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 -2
+BITMAP
+0800
+0C00
+1800
+1000
+3000
+7000
+D800
+CC80
+7FC0
+0C40
+0C00
+3F00
+6180
+ENDCHAR
+STARTCHAR 0x1350
+ENCODING 4944
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1351
+ENCODING 4945
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0C00
+0C00
+0FC0
+0CC0
+0C00
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1352
+ENCODING 4946
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0CC0
+0FC0
+ENDCHAR
+STARTCHAR 0x1353
+ENCODING 4947
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+6000
+4000
+ENDCHAR
+STARTCHAR 0x1354
+ENCODING 4948
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0F80
+0CC0
+0F80
+ENDCHAR
+STARTCHAR 0x1355
+ENCODING 4949
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0F00
+0300
+0300
+0300
+0300
+0300
+0300
+ENDCHAR
+STARTCHAR 0x1356
+ENCODING 4950
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 0
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0C00
+1800
+1800
+3000
+3000
+3000
+3000
+ENDCHAR
+STARTCHAR 0x1357
+ENCODING 4951
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 0 -2
+BITMAP
+6180
+7F80
+FFC0
+CCC0
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+7F80
+E1C0
+ENDCHAR
+STARTCHAR 0x1358
+ENCODING 4952
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 15 2 -1
+BITMAP
+7070
+1FC0
+0700
+3FF0
+7FF0
+C510
+8510
+8A10
+FBF0
+71F0
+0020
+0020
+0040
+0040
+0040
+ENDCHAR
+STARTCHAR 0x1359
+ENCODING 4953
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 14 3 -1
+BITMAP
+C0C0
+7F80
+0C00
+0C00
+0C00
+1800
+3800
+7000
+E000
+C300
+C380
+E180
+7F00
+3E00
+ENDCHAR
+STARTCHAR 0x135A
+ENCODING 4954
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 13 2 0
+BITMAP
+6060
+3FC0
+0600
+0200
+0600
+0C00
+1800
+3000
+78C0
+CC40
+C4C0
+7F80
+3E00
+ENDCHAR
+STARTCHAR 0x1360
+ENCODING 4960
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 0 0 0 0
+BITMAP
+ENDCHAR
+STARTCHAR 0x1361
+ENCODING 4961
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 2 6 2 2
+BITMAP
+C0
+C0
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1362
+ENCODING 4962
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 6 6 0 2
+BITMAP
+CC
+CC
+00
+00
+CC
+CC
+ENDCHAR
+STARTCHAR 0x1363
+ENCODING 4963
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 6 7 0 2
+BITMAP
+FC
+00
+30
+30
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1364
+ENCODING 4964
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 6 9 0 1
+BITMAP
+FC
+00
+30
+30
+00
+30
+30
+00
+FC
+ENDCHAR
+STARTCHAR 0x1365
+ENCODING 4965
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 6 7 0 2
+BITMAP
+30
+30
+00
+FC
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1366
+ENCODING 4966
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 6 7 0 2
+BITMAP
+C0
+C0
+00
+7C
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1367
+ENCODING 4967
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 2 10 0 1
+BITMAP
+C0
+C0
+00
+00
+C0
+C0
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1368
+ENCODING 4968
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 9 0 1
+BITMAP
+18
+18
+C3
+DB
+18
+C3
+C3
+18
+18
+ENDCHAR
+STARTCHAR 0x1369
+ENCODING 4969
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 13 0 -1
+BITMAP
+C180
+7F00
+0000
+0C00
+0C00
+1800
+3E00
+6300
+6300
+3E00
+0000
+7F00
+C180
+ENDCHAR
+STARTCHAR 0x136A
+ENCODING 4970
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 13 0 -1
+BITMAP
+C180
+7F00
+0000
+1C00
+3600
+6600
+7C00
+6000
+7C00
+3600
+1C00
+7F00
+C180
+ENDCHAR
+STARTCHAR 0x136B
+ENCODING 4971
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 -1
+BITMAP
+C3
+7E
+00
+7E
+66
+60
+60
+60
+60
+00
+7E
+C3
+ENDCHAR
+STARTCHAR 0x136C
+ENCODING 4972
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 -1
+BITMAP
+C3
+7E
+00
+3C
+66
+66
+66
+66
+3C
+00
+7E
+C3
+ENDCHAR
+STARTCHAR 0x136D
+ENCODING 4973
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 13 0 -1
+BITMAP
+C180
+7F00
+0000
+1800
+1800
+3F00
+7300
+6000
+6300
+3F00
+0000
+7F00
+C180
+ENDCHAR
+STARTCHAR 0x136E
+ENCODING 4974
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 14 0 -1
+BITMAP
+C180
+7F00
+0000
+3C00
+7E00
+6600
+0600
+0C00
+0E00
+1B00
+1E00
+0000
+7F00
+C180
+ENDCHAR
+STARTCHAR 0x136F
+ENCODING 4975
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 14 0 -1
+BITMAP
+C180
+7F00
+0000
+3C00
+7E00
+6600
+0600
+0C00
+0800
+1900
+1F00
+0000
+7F00
+C180
+ENDCHAR
+STARTCHAR 0x1370
+ENCODING 4976
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 -1
+BITMAP
+C0C0
+7F80
+0000
+7F80
+6D80
+0C00
+0C00
+0C00
+7F80
+6180
+0000
+7F80
+C0C0
+ENDCHAR
+STARTCHAR 0x1371
+ENCODING 4977
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 13 0 -1
+BITMAP
+C3
+7E
+00
+00
+66
+66
+7E
+66
+64
+38
+00
+7E
+C3
+ENDCHAR
+STARTCHAR 0x1372
+ENCODING 4978
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 -1
+BITMAP
+C3
+7E
+00
+18
+18
+18
+18
+18
+18
+00
+7E
+C3
+ENDCHAR
+STARTCHAR 0x1373
+ENCODING 4979
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 -1
+BITMAP
+C0C0
+7F80
+0000
+3F00
+2D00
+0C00
+1E00
+3300
+3300
+0000
+7F80
+C0C0
+ENDCHAR
+STARTCHAR 0x1374
+ENCODING 4980
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 12 0 -1
+BITMAP
+C0C0
+7F80
+0000
+2F00
+6D80
+6D80
+6D80
+6D80
+3980
+0000
+7F80
+C0C0
+ENDCHAR
+STARTCHAR 0x1375
+ENCODING 4981
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 -1
+BITMAP
+C0C0
+7F80
+0000
+6D80
+6D80
+6D80
+3F80
+0180
+0180
+0180
+0000
+7F80
+C0C0
+ENDCHAR
+STARTCHAR 0x1376
+ENCODING 4982
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 13 0 -1
+BITMAP
+C3
+7E
+00
+3E
+66
+3E
+06
+0C
+0C
+0C
+00
+7E
+C3
+ENDCHAR
+STARTCHAR 0x1377
+ENCODING 4983
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 10 13 0 -1
+BITMAP
+C0C0
+7F80
+0000
+7F80
+6D80
+0C00
+0E00
+0600
+7F80
+6180
+0000
+7F80
+C0C0
+ENDCHAR
+STARTCHAR 0x1378
+ENCODING 4984
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 12 0 -1
+BITMAP
+C3
+7E
+00
+3E
+6B
+6E
+60
+66
+3E
+00
+7E
+C3
+ENDCHAR
+STARTCHAR 0x1379
+ENCODING 4985
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 12 0 -1
+BITMAP
+C060
+7FC0
+0000
+7FC0
+5B40
+1B00
+1B00
+1B00
+1B00
+0000
+7FC0
+C060
+ENDCHAR
+STARTCHAR 0x137A
+ENCODING 4986
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 9 14 0 -1
+BITMAP
+C180
+7F00
+0000
+3E00
+3600
+0C00
+0E00
+0600
+0C00
+0C00
+0C00
+0000
+7F00
+C180
+ENDCHAR
+STARTCHAR 0x137B
+ENCODING 4987
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 8 13 0 -1
+BITMAP
+C3
+7E
+00
+3C
+66
+7C
+60
+30
+30
+30
+00
+7E
+C3
+ENDCHAR
+STARTCHAR 0x137C
+ENCODING 4988
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 12 13 0 -1
+BITMAP
+C030
+7FE0
+0000
+79E0
+CF30
+FBE0
+C300
+6180
+6180
+6180
+0000
+7FE0
+C030
+ENDCHAR
+STARTCHAR 0x137F
+ENCODING 4991
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 14 1 -1
+BITMAP
+0FE0
+1838
+37CC
+6CCC
+ECC6
+CCC6
+C8C6
+C8C6
+C8C4
+C8CC
+60F0
+7000
+3800
+0F80
+ENDCHAR
+STARTCHAR 0x1E00
+ENCODING 7680
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 15 0 -4
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0C00
+1200
+1200
+0C00
+ENDCHAR
+STARTCHAR 0x1E01
+ENCODING 7681
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 -4
+BITMAP
+70
+88
+08
+78
+88
+88
+7C
+30
+48
+48
+30
+ENDCHAR
+STARTCHAR 0x1E02
+ENCODING 7682
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+0C00
+0C00
+0000
+FF00
+2080
+2040
+2040
+2080
+3F00
+2080
+2040
+2040
+2080
+FF00
+ENDCHAR
+STARTCHAR 0x1E03
+ENCODING 7683
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 0
+BITMAP
+30
+30
+00
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+78
+ENDCHAR
+STARTCHAR 0x1E04
+ENCODING 7684
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 -3
+BITMAP
+FF00
+2080
+2040
+2040
+2080
+3F00
+2080
+2040
+2040
+2080
+FF00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E05
+ENCODING 7685
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+78
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E06
+ENCODING 7686
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 -2
+BITMAP
+FF00
+2080
+2040
+2040
+2080
+3F00
+2080
+2040
+2040
+2080
+FF00
+0000
+1F00
+ENDCHAR
+STARTCHAR 0x1E07
+ENCODING 7687
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -2
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+78
+00
+7C
+ENDCHAR
+STARTCHAR 0x1E08
+ENCODING 7688
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 19 1 -3
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+0800
+0400
+1C00
+ENDCHAR
+STARTCHAR 0x1E09
+ENCODING 7689
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 -3
+BITMAP
+10
+30
+20
+40
+00
+70
+88
+80
+80
+80
+88
+70
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x1E0A
+ENCODING 7690
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 0
+BITMAP
+0C00
+0C00
+0000
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FE00
+ENDCHAR
+STARTCHAR 0x1E0B
+ENCODING 7691
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 0
+BITMAP
+30
+30
+00
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1E0C
+ENCODING 7692
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 -3
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FE00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E0D
+ENCODING 7693
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -3
+BITMAP
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E0E
+ENCODING 7694
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 -2
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FE00
+0000
+3E00
+ENDCHAR
+STARTCHAR 0x1E0F
+ENCODING 7695
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -2
+BITMAP
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+00
+F8
+ENDCHAR
+STARTCHAR 0x1E10
+ENCODING 7696
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 -3
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FE00
+0800
+0400
+1C00
+ENDCHAR
+STARTCHAR 0x1E11
+ENCODING 7697
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -3
+BITMAP
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+20
+10
+70
+ENDCHAR
+STARTCHAR 0x1E12
+ENCODING 7698
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 -4
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FE00
+0000
+0800
+1C00
+2200
+ENDCHAR
+STARTCHAR 0x1E13
+ENCODING 7699
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+00
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x1E14
+ENCODING 7700
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 18 0 0
+BITMAP
+1000
+1800
+0800
+0400
+0000
+3E00
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1E15
+ENCODING 7701
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+40
+60
+20
+10
+00
+F8
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1E16
+ENCODING 7702
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 18 0 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+3E00
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1E17
+ENCODING 7703
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+10
+30
+20
+40
+00
+F8
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1E18
+ENCODING 7704
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 -4
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+0000
+0800
+1C00
+2200
+ENDCHAR
+STARTCHAR 0x1E19
+ENCODING 7705
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+F8
+80
+80
+88
+70
+00
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x1E1A
+ENCODING 7706
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 -4
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+0000
+1200
+2A00
+2400
+ENDCHAR
+STARTCHAR 0x1E1B
+ENCODING 7707
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 -4
+BITMAP
+70
+88
+F8
+80
+80
+88
+70
+00
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x1E1C
+ENCODING 7708
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 17 0 -3
+BITMAP
+2100
+1E00
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+0800
+0400
+1C00
+ENDCHAR
+STARTCHAR 0x1E1D
+ENCODING 7709
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 13 0 -3
+BITMAP
+84
+78
+00
+38
+44
+7C
+40
+40
+44
+38
+10
+08
+38
+ENDCHAR
+STARTCHAR 0x1E1E
+ENCODING 7710
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 0 0
+BITMAP
+1800
+1800
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2200
+2200
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x1E1F
+ENCODING 7711
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+60
+60
+00
+38
+48
+40
+40
+40
+F0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x1E20
+ENCODING 7712
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+3E00
+0000
+1E80
+2180
+4080
+8080
+8000
+8000
+83C0
+8080
+4080
+2080
+1F80
+ENDCHAR
+STARTCHAR 0x1E21
+ENCODING 7713
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -4
+BITMAP
+7C
+00
+3E
+44
+44
+44
+78
+40
+7C
+82
+82
+82
+7C
+ENDCHAR
+STARTCHAR 0x1E22
+ENCODING 7714
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+0C00
+0C00
+0000
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x1E23
+ENCODING 7715
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 0
+BITMAP
+30
+30
+00
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x1E24
+ENCODING 7716
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E25
+ENCODING 7717
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x1E26
+ENCODING 7718
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+1B00
+1B00
+0000
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x1E27
+ENCODING 7719
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 0
+BITMAP
+D8
+D8
+00
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x1E28
+ENCODING 7720
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+1000
+0800
+3800
+ENDCHAR
+STARTCHAR 0x1E29
+ENCODING 7721
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+40
+20
+E0
+ENDCHAR
+STARTCHAR 0x1E2A
+ENCODING 7722
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+0000
+1080
+0F00
+ENDCHAR
+STARTCHAR 0x1E2B
+ENCODING 7723
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+00
+42
+3C
+ENDCHAR
+STARTCHAR 0x1E2C
+ENCODING 7724
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 -4
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+00
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x1E2D
+ENCODING 7725
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 11 0 -4
+BITMAP
+60
+20
+20
+20
+20
+20
+70
+00
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x1E2E
+ENCODING 7726
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 19 1 0
+BITMAP
+10
+30
+20
+40
+00
+D8
+D8
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x1E2F
+ENCODING 7727
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 15 0 0
+BITMAP
+10
+30
+20
+40
+00
+D8
+D8
+00
+60
+20
+20
+20
+20
+20
+70
+ENDCHAR
+STARTCHAR 0x1E30
+ENCODING 7728
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x1E31
+ENCODING 7729
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 0
+BITMAP
+08
+18
+10
+20
+00
+C0
+40
+40
+40
+40
+5E
+48
+50
+70
+58
+48
+EE
+ENDCHAR
+STARTCHAR 0x1E32
+ENCODING 7730
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1E33
+ENCODING 7731
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+5E
+48
+50
+70
+58
+48
+EE
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E34
+ENCODING 7732
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -2
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2E00
+3200
+2100
+2100
+2080
+F9E0
+0000
+1F00
+ENDCHAR
+STARTCHAR 0x1E35
+ENCODING 7733
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -2
+BITMAP
+C0
+40
+40
+40
+40
+5E
+48
+50
+70
+58
+48
+EE
+00
+7C
+ENDCHAR
+STARTCHAR 0x1E36
+ENCODING 7734
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 14 0 -3
+BITMAP
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x1E37
+ENCODING 7735
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 15 1 -3
+BITMAP
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+E0
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x1E38
+ENCODING 7736
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 16 0 -3
+BITMAP
+F8
+00
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x1E39
+ENCODING 7737
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 17 0 -3
+BITMAP
+F8
+00
+60
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+70
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E3A
+ENCODING 7738
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 -2
+BITMAP
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+00
+3E
+ENDCHAR
+STARTCHAR 0x1E3B
+ENCODING 7739
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 14 0 -2
+BITMAP
+60
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+70
+00
+F8
+ENDCHAR
+STARTCHAR 0x1E3C
+ENCODING 7740
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 15 0 -4
+BITMAP
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+00
+10
+38
+44
+ENDCHAR
+STARTCHAR 0x1E3D
+ENCODING 7741
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 5 16 0 -4
+BITMAP
+60
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+70
+00
+20
+70
+88
+ENDCHAR
+STARTCHAR 0x1E3E
+ENCODING 7742
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 16 1 0
+BITMAP
+0100
+0300
+0200
+0400
+0000
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+ENDCHAR
+STARTCHAR 0x1E3F
+ENCODING 7743
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+FB80
+4440
+4440
+4440
+4440
+4440
+E660
+ENDCHAR
+STARTCHAR 0x1E40
+ENCODING 7744
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 0
+BITMAP
+0300
+0300
+0000
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+ENDCHAR
+STARTCHAR 0x1E41
+ENCODING 7745
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 0
+BITMAP
+0C00
+0C00
+0000
+FB80
+4440
+4440
+4440
+4440
+4440
+E660
+ENDCHAR
+STARTCHAR 0x1E42
+ENCODING 7746
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -3
+BITMAP
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+0000
+0300
+0300
+ENDCHAR
+STARTCHAR 0x1E43
+ENCODING 7747
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 -3
+BITMAP
+FB80
+4440
+4440
+4440
+4440
+4440
+E660
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E44
+ENCODING 7748
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 0
+BITMAP
+0C00
+0C00
+0000
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0x1E45
+ENCODING 7749
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+30
+30
+00
+F8
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x1E46
+ENCODING 7750
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E47
+ENCODING 7751
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+F8
+44
+44
+44
+44
+44
+EE
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x1E48
+ENCODING 7752
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -2
+BITMAP
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+0000
+1F00
+ENDCHAR
+STARTCHAR 0x1E49
+ENCODING 7753
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -2
+BITMAP
+F8
+44
+44
+44
+44
+44
+EE
+00
+7C
+ENDCHAR
+STARTCHAR 0x1E4A
+ENCODING 7754
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 -4
+BITMAP
+E3E0
+3080
+3080
+2880
+2880
+2480
+2280
+2280
+2180
+2180
+F880
+0000
+0400
+0E00
+1100
+ENDCHAR
+STARTCHAR 0x1E4B
+ENCODING 7755
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+F8
+4C
+44
+44
+44
+44
+EE
+00
+10
+38
+44
+ENDCHAR
+STARTCHAR 0x1E4C
+ENCODING 7756
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 20 1 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+1200
+2A00
+2400
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1E4D
+ENCODING 7757
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 16 1 0
+BITMAP
+10
+30
+20
+40
+00
+48
+A8
+90
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1E4E
+ENCODING 7758
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+3600
+3600
+0000
+1200
+2A00
+2400
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1E4F
+ENCODING 7759
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+D8
+D8
+00
+48
+A8
+90
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1E50
+ENCODING 7760
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+1000
+1800
+0800
+0400
+0000
+3E00
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1E51
+ENCODING 7761
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+40
+60
+20
+10
+00
+F8
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1E52
+ENCODING 7762
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+3E00
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1E53
+ENCODING 7763
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+10
+30
+20
+40
+00
+F8
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1E54
+ENCODING 7764
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 0 0
+BITMAP
+0400
+0C00
+0800
+1000
+0000
+FF00
+2180
+2080
+2080
+2180
+3F00
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x1E55
+ENCODING 7765
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -3
+BITMAP
+10
+30
+20
+40
+00
+F8
+44
+44
+44
+44
+44
+78
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x1E56
+ENCODING 7766
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 0 0
+BITMAP
+1800
+1800
+0000
+FF00
+2180
+2080
+2080
+2180
+3F00
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x1E57
+ENCODING 7767
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 -3
+BITMAP
+30
+30
+00
+F8
+44
+44
+44
+44
+44
+78
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x1E58
+ENCODING 7768
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 1 0
+BITMAP
+1800
+1800
+0000
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+ENDCHAR
+STARTCHAR 0x1E59
+ENCODING 7769
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+60
+60
+00
+D0
+68
+40
+40
+40
+40
+F0
+ENDCHAR
+STARTCHAR 0x1E5A
+ENCODING 7770
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 1 -3
+BITMAP
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E5B
+ENCODING 7771
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+D0
+68
+40
+40
+40
+40
+F0
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x1E5C
+ENCODING 7772
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 1 -3
+BITMAP
+3E00
+0000
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E5D
+ENCODING 7773
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 -3
+BITMAP
+F8
+00
+D0
+68
+40
+40
+40
+40
+F0
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x1E5E
+ENCODING 7774
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 1 -2
+BITMAP
+FE00
+2100
+2080
+2080
+2100
+3E00
+2300
+2100
+2100
+2100
+F8E0
+0000
+1F00
+ENDCHAR
+STARTCHAR 0x1E5F
+ENCODING 7775
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 -2
+BITMAP
+D0
+68
+40
+40
+40
+40
+F0
+00
+F8
+ENDCHAR
+STARTCHAR 0x1E60
+ENCODING 7776
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+30
+30
+00
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR 0x1E61
+ENCODING 7777
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+60
+60
+00
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x1E62
+ENCODING 7778
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -3
+BITMAP
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E63
+ENCODING 7779
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+78
+88
+80
+70
+08
+88
+F0
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x1E64
+ENCODING 7780
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 19 1 0
+BITMAP
+30
+30
+00
+08
+18
+10
+20
+00
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR 0x1E65
+ENCODING 7781
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+60
+60
+00
+10
+30
+20
+40
+00
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x1E66
+ENCODING 7782
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 18 1 0
+BITMAP
+30
+30
+00
+44
+38
+10
+00
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+ENDCHAR
+STARTCHAR 0x1E67
+ENCODING 7783
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+60
+60
+00
+88
+70
+20
+00
+78
+88
+80
+70
+08
+88
+F0
+ENDCHAR
+STARTCHAR 0x1E68
+ENCODING 7784
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 17 1 -3
+BITMAP
+30
+30
+00
+7C
+84
+84
+80
+40
+30
+08
+04
+84
+84
+F8
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E69
+ENCODING 7785
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 -3
+BITMAP
+60
+60
+00
+78
+88
+80
+70
+08
+88
+F0
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x1E6A
+ENCODING 7786
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 0
+BITMAP
+1800
+1800
+0000
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+ENDCHAR
+STARTCHAR 0x1E6B
+ENCODING 7787
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 0
+BITMAP
+30
+30
+00
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+ENDCHAR
+STARTCHAR 0x1E6C
+ENCODING 7788
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+1800
+1800
+ENDCHAR
+STARTCHAR 0x1E6D
+ENCODING 7789
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 -3
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E6E
+ENCODING 7790
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 13 1 -2
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+3E00
+ENDCHAR
+STARTCHAR 0x1E6F
+ENCODING 7791
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 -2
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+00
+7C
+ENDCHAR
+STARTCHAR 0x1E70
+ENCODING 7792
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 15 1 -4
+BITMAP
+FF80
+8880
+8880
+8880
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0800
+1C00
+2200
+ENDCHAR
+STARTCHAR 0x1E71
+ENCODING 7793
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -4
+BITMAP
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+00
+10
+38
+44
+ENDCHAR
+STARTCHAR 0x1E72
+ENCODING 7794
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+0000
+1B00
+1B00
+ENDCHAR
+STARTCHAR 0x1E73
+ENCODING 7795
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+CC
+44
+44
+44
+44
+44
+3E
+00
+6C
+6C
+ENDCHAR
+STARTCHAR 0x1E74
+ENCODING 7796
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 -4
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+0000
+0900
+1500
+1200
+ENDCHAR
+STARTCHAR 0x1E75
+ENCODING 7797
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+CC
+44
+44
+44
+44
+44
+3E
+00
+24
+54
+48
+ENDCHAR
+STARTCHAR 0x1E76
+ENCODING 7798
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 -4
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+0000
+0400
+0E00
+1100
+ENDCHAR
+STARTCHAR 0x1E77
+ENCODING 7799
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -4
+BITMAP
+CC
+44
+44
+44
+44
+44
+3E
+00
+10
+38
+44
+ENDCHAR
+STARTCHAR 0x1E78
+ENCODING 7800
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 20 1 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+0900
+1500
+1200
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x1E79
+ENCODING 7801
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+08
+18
+10
+20
+00
+24
+54
+48
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1E7A
+ENCODING 7802
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+1B00
+1B00
+0000
+1F00
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x1E7B
+ENCODING 7803
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+6C
+6C
+00
+7C
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1E7C
+ENCODING 7804
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+0900
+1500
+1200
+0000
+F1E0
+2080
+2080
+1100
+1100
+1100
+0A00
+0A00
+0A00
+0400
+0400
+ENDCHAR
+STARTCHAR 0x1E7D
+ENCODING 7805
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+12
+2A
+24
+00
+E7
+24
+24
+24
+18
+18
+18
+ENDCHAR
+STARTCHAR 0x1E7E
+ENCODING 7806
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+F1E0
+2080
+2080
+1100
+1100
+1100
+0A00
+0A00
+0A00
+0400
+0400
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E7F
+ENCODING 7807
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 -3
+BITMAP
+E7
+24
+24
+24
+18
+18
+18
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x1E80
+ENCODING 7808
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 16 0 0
+BITMAP
+0200
+0300
+0100
+0080
+0000
+F1CF
+2184
+2184
+2244
+1248
+1248
+1248
+1428
+0C30
+0C30
+0810
+ENDCHAR
+STARTCHAR 0x1E81
+ENCODING 7809
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 0
+BITMAP
+0800
+0C00
+0400
+0200
+0000
+EEE0
+2480
+2A80
+2A80
+2A80
+1B00
+1100
+ENDCHAR
+STARTCHAR 0x1E82
+ENCODING 7810
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 16 0 0
+BITMAP
+0080
+0180
+0100
+0200
+0000
+F1CF
+2184
+2184
+2244
+1248
+1248
+1248
+1428
+0C30
+0C30
+0810
+ENDCHAR
+STARTCHAR 0x1E83
+ENCODING 7811
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 0
+BITMAP
+0200
+0600
+0400
+0800
+0000
+EEE0
+2480
+2A80
+2A80
+2A80
+1B00
+1100
+ENDCHAR
+STARTCHAR 0x1E84
+ENCODING 7812
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 14 0 0
+BITMAP
+06C0
+06C0
+0000
+F1CF
+2184
+2184
+2244
+1248
+1248
+1248
+1428
+0C30
+0C30
+0810
+ENDCHAR
+STARTCHAR 0x1E85
+ENCODING 7813
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 10 0 0
+BITMAP
+1B00
+1B00
+0000
+EEE0
+2480
+2A80
+2A80
+2A80
+1B00
+1100
+ENDCHAR
+STARTCHAR 0x1E86
+ENCODING 7814
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 14 0 0
+BITMAP
+0180
+0180
+0000
+F1CF
+2184
+2184
+2244
+1248
+1248
+1248
+1428
+0C30
+0C30
+0810
+ENDCHAR
+STARTCHAR 0x1E87
+ENCODING 7815
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 10 0 0
+BITMAP
+0600
+0600
+0000
+EEE0
+2480
+2A80
+2A80
+2A80
+1B00
+1100
+ENDCHAR
+STARTCHAR 0x1E88
+ENCODING 7816
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 14 0 -3
+BITMAP
+F1CF
+2184
+2184
+2244
+1248
+1248
+1248
+1428
+0C30
+0C30
+0810
+0000
+0180
+0180
+ENDCHAR
+STARTCHAR 0x1E89
+ENCODING 7817
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 10 0 -3
+BITMAP
+EEE0
+2480
+2A80
+2A80
+2A80
+1B00
+1100
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1E8A
+ENCODING 7818
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 1 0
+BITMAP
+0C00
+0C00
+0000
+F3C0
+1100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1E8B
+ENCODING 7819
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 0
+BITMAP
+18
+18
+00
+E7
+24
+18
+18
+18
+24
+E7
+ENDCHAR
+STARTCHAR 0x1E8C
+ENCODING 7820
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 1 0
+BITMAP
+1B00
+1B00
+0000
+F3C0
+1100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1E8D
+ENCODING 7821
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 10 1 0
+BITMAP
+36
+36
+00
+E7
+24
+18
+18
+18
+24
+E7
+ENDCHAR
+STARTCHAR 0x1E8E
+ENCODING 7822
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 0
+BITMAP
+0C00
+0C00
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x1E8F
+ENCODING 7823
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 13 1 -3
+BITMAP
+18
+18
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x1E90
+ENCODING 7824
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 0
+BITMAP
+10
+38
+44
+00
+FE
+C4
+84
+88
+08
+10
+20
+22
+42
+46
+FE
+ENDCHAR
+STARTCHAR 0x1E91
+ENCODING 7825
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+70
+88
+00
+F8
+90
+90
+20
+48
+48
+F8
+ENDCHAR
+STARTCHAR 0x1E92
+ENCODING 7826
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -3
+BITMAP
+FE
+C4
+84
+88
+08
+10
+20
+22
+42
+46
+FE
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1E93
+ENCODING 7827
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+F8
+90
+90
+20
+48
+48
+F8
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x1E94
+ENCODING 7828
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -2
+BITMAP
+FE
+C4
+84
+88
+08
+10
+20
+22
+42
+46
+FE
+00
+7C
+ENDCHAR
+STARTCHAR 0x1E95
+ENCODING 7829
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 -2
+BITMAP
+F8
+90
+90
+20
+48
+48
+F8
+00
+F8
+ENDCHAR
+STARTCHAR 0x1E96
+ENCODING 7830
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 1 -2
+BITMAP
+C0
+40
+40
+40
+40
+78
+44
+44
+44
+44
+44
+EE
+00
+7C
+ENDCHAR
+STARTCHAR 0x1E97
+ENCODING 7831
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 0
+BITMAP
+D8
+D8
+00
+20
+20
+20
+F8
+20
+20
+20
+24
+24
+18
+ENDCHAR
+STARTCHAR 0x1E98
+ENCODING 7832
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 0
+BITMAP
+0600
+0900
+0900
+0600
+0000
+EEE0
+2480
+2A80
+2A80
+2A80
+1B00
+1100
+ENDCHAR
+STARTCHAR 0x1E99
+ENCODING 7833
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 15 1 -3
+BITMAP
+18
+24
+24
+18
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x1E9A
+ENCODING 7834
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+04
+04
+18
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1E9B
+ENCODING 7835
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+60
+60
+00
+38
+48
+40
+40
+40
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x1EA0
+ENCODING 7840
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 -3
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1EA1
+ENCODING 7841
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 -3
+BITMAP
+70
+88
+08
+78
+88
+88
+7C
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1EA2
+ENCODING 7842
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 17 0 0
+BITMAP
+0400
+0A00
+0200
+0400
+0400
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EA3
+ENCODING 7843
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 0
+BITMAP
+20
+50
+10
+20
+20
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EA4
+ENCODING 7844
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+0080
+0500
+0E00
+1100
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EA5
+ENCODING 7845
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+04
+28
+70
+88
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EA6
+ENCODING 7846
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+2000
+1400
+0E00
+1100
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EA7
+ENCODING 7847
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 0
+BITMAP
+80
+50
+38
+44
+00
+38
+44
+04
+3C
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1EA8
+ENCODING 7848
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 18 0 0
+BITMAP
+0100
+0280
+0080
+0500
+0F00
+1100
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EA9
+ENCODING 7849
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+08
+14
+04
+28
+78
+88
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EAA
+ENCODING 7850
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 19 0 0
+BITMAP
+0900
+1500
+1200
+0000
+0400
+0E00
+1100
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EAB
+ENCODING 7851
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 0
+BITMAP
+48
+A8
+90
+00
+20
+70
+88
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EAC
+ENCODING 7852
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 18 0 -3
+BITMAP
+0400
+0E00
+1100
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1EAD
+ENCODING 7853
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 -3
+BITMAP
+20
+70
+88
+00
+70
+88
+08
+78
+88
+88
+7C
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1EAE
+ENCODING 7854
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 18 0 0
+BITMAP
+0100
+0300
+0200
+0400
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EAF
+ENCODING 7855
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+08
+18
+10
+20
+88
+70
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EB0
+ENCODING 7856
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 18 0 0
+BITMAP
+1000
+1800
+0800
+0400
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EB1
+ENCODING 7857
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+80
+C0
+40
+20
+88
+70
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EB2
+ENCODING 7858
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 19 0 0
+BITMAP
+0400
+0A00
+0200
+0400
+0400
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EB3
+ENCODING 7859
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 0
+BITMAP
+20
+50
+10
+20
+20
+88
+70
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EB4
+ENCODING 7860
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 18 0 0
+BITMAP
+0900
+1500
+1200
+0000
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1EB5
+ENCODING 7861
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 14 1 0
+BITMAP
+48
+A8
+90
+00
+88
+70
+00
+70
+88
+08
+78
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x1EB6
+ENCODING 7862
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 17 0 -3
+BITMAP
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0000
+0600
+0600
+ENDCHAR
+STARTCHAR 0x1EB7
+ENCODING 7863
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 -3
+BITMAP
+88
+70
+00
+70
+88
+08
+78
+88
+88
+7C
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1EB8
+ENCODING 7864
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 0 -3
+BITMAP
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1EB9
+ENCODING 7865
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+F8
+80
+80
+88
+70
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1EBA
+ENCODING 7866
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 17 0 0
+BITMAP
+0800
+1400
+0400
+0800
+0800
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1EBB
+ENCODING 7867
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 0
+BITMAP
+20
+50
+10
+20
+20
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1EBC
+ENCODING 7868
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 15 0 0
+BITMAP
+1200
+2A00
+2400
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1EBD
+ENCODING 7869
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+48
+A8
+90
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1EBE
+ENCODING 7870
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+0100
+0A00
+1C00
+2200
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1EBF
+ENCODING 7871
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 1 0
+BITMAP
+04
+28
+70
+88
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1EC0
+ENCODING 7872
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 16 0 0
+BITMAP
+4000
+2800
+1C00
+2200
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1EC1
+ENCODING 7873
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 0 0
+BITMAP
+80
+50
+38
+44
+00
+38
+44
+7C
+40
+40
+44
+38
+ENDCHAR
+STARTCHAR 0x1EC2
+ENCODING 7874
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 18 0 0
+BITMAP
+0200
+0500
+0100
+0A00
+1E00
+2200
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1EC3
+ENCODING 7875
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 1 0
+BITMAP
+08
+14
+04
+28
+78
+88
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1EC4
+ENCODING 7876
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 19 0 0
+BITMAP
+1200
+2A00
+2400
+0000
+0800
+1C00
+2200
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+ENDCHAR
+STARTCHAR 0x1EC5
+ENCODING 7877
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+48
+A8
+90
+00
+20
+70
+88
+00
+70
+88
+F8
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1EC6
+ENCODING 7878
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 18 0 -3
+BITMAP
+0800
+1C00
+2200
+0000
+FF80
+2080
+2080
+2280
+2200
+3E00
+2240
+2240
+2080
+2080
+FF80
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1EC7
+ENCODING 7879
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 -3
+BITMAP
+20
+70
+88
+00
+70
+88
+F8
+80
+80
+88
+70
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1EC8
+ENCODING 7880
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 17 1 0
+BITMAP
+20
+50
+10
+20
+20
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x1EC9
+ENCODING 7881
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 13 1 0
+BITMAP
+40
+A0
+20
+40
+40
+00
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x1ECA
+ENCODING 7882
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 -3
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x1ECB
+ENCODING 7883
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 14 1 -3
+BITMAP
+C0
+C0
+00
+00
+C0
+40
+40
+40
+40
+40
+E0
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0x1ECC
+ENCODING 7884
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 14 1 -3
+BITMAP
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1ECD
+ENCODING 7885
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 -3
+BITMAP
+70
+88
+88
+88
+88
+88
+70
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1ECE
+ENCODING 7886
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 17 1 0
+BITMAP
+0800
+1400
+0400
+0800
+0800
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1ECF
+ENCODING 7887
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 0
+BITMAP
+20
+50
+10
+20
+20
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1ED0
+ENCODING 7888
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+0100
+0A00
+1C00
+2200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1ED1
+ENCODING 7889
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 1 0
+BITMAP
+04
+28
+70
+88
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1ED2
+ENCODING 7890
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 16 1 0
+BITMAP
+4000
+2800
+1C00
+2200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1ED3
+ENCODING 7891
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 12 0 0
+BITMAP
+80
+50
+38
+44
+00
+38
+44
+44
+44
+44
+44
+38
+ENDCHAR
+STARTCHAR 0x1ED4
+ENCODING 7892
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 18 1 0
+BITMAP
+0200
+0500
+0100
+0A00
+1E00
+2200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1ED5
+ENCODING 7893
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 14 1 0
+BITMAP
+08
+14
+04
+28
+78
+88
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1ED6
+ENCODING 7894
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 19 1 0
+BITMAP
+1200
+2A00
+2400
+0000
+0800
+1C00
+2200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1ED7
+ENCODING 7895
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 15 1 0
+BITMAP
+48
+A8
+90
+00
+20
+70
+88
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1ED8
+ENCODING 7896
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 18 1 -3
+BITMAP
+0800
+1C00
+2200
+0000
+1E00
+2100
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1ED9
+ENCODING 7897
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 -3
+BITMAP
+20
+70
+88
+00
+70
+88
+88
+88
+88
+88
+70
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1EDA
+ENCODING 7898
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+0400
+0C00
+0800
+1000
+0060
+1E20
+21C0
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1EDB
+ENCODING 7899
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 12 1 0
+BITMAP
+10
+30
+20
+40
+06
+72
+8C
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1EDC
+ENCODING 7900
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 0
+BITMAP
+1000
+1800
+0800
+0400
+0060
+1E20
+21C0
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1EDD
+ENCODING 7901
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 12 1 0
+BITMAP
+40
+60
+20
+10
+06
+72
+8C
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1EDE
+ENCODING 7902
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 1 0
+BITMAP
+0800
+1400
+0400
+0800
+0800
+0060
+1E20
+21C0
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1EDF
+ENCODING 7903
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 13 1 0
+BITMAP
+20
+50
+10
+20
+20
+06
+72
+8C
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1EE0
+ENCODING 7904
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 0
+BITMAP
+1200
+2A00
+2400
+0060
+1E20
+21C0
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x1EE1
+ENCODING 7905
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 11 1 0
+BITMAP
+48
+A8
+90
+06
+72
+8C
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1EE2
+ENCODING 7906
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 1 -3
+BITMAP
+0060
+1E20
+21C0
+4080
+8040
+8040
+8040
+8040
+8040
+4080
+2100
+1E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1EE3
+ENCODING 7907
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 11 1 -3
+BITMAP
+06
+72
+8C
+88
+88
+88
+88
+70
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x1EE4
+ENCODING 7908
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 -3
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1EE5
+ENCODING 7909
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -3
+BITMAP
+CC
+44
+44
+44
+44
+44
+3E
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x1EE6
+ENCODING 7910
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 1 0
+BITMAP
+0400
+0A00
+0200
+0400
+0400
+0000
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x1EE7
+ENCODING 7911
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 0
+BITMAP
+10
+28
+08
+10
+10
+00
+CC
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1EE8
+ENCODING 7912
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 16 1 0
+BITMAP
+0200
+0600
+0400
+0830
+0010
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x1EE9
+ENCODING 7913
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 1 0
+BITMAP
+04
+0C
+08
+13
+01
+CE
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1EEA
+ENCODING 7914
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 16 1 0
+BITMAP
+0800
+0C00
+0400
+0230
+0010
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x1EEB
+ENCODING 7915
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 1 0
+BITMAP
+40
+60
+20
+13
+01
+CE
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1EEC
+ENCODING 7916
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 17 1 0
+BITMAP
+0400
+0A00
+0200
+0400
+0430
+0010
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x1EED
+ENCODING 7917
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 13 1 0
+BITMAP
+10
+28
+08
+10
+13
+01
+CE
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1EEE
+ENCODING 7918
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 15 1 0
+BITMAP
+0900
+1500
+1230
+0010
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+ENDCHAR
+STARTCHAR 0x1EEF
+ENCODING 7919
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 1 0
+BITMAP
+24
+54
+48
+03
+01
+CE
+44
+44
+44
+44
+44
+3E
+ENDCHAR
+STARTCHAR 0x1EF0
+ENCODING 7920
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 16 1 -3
+BITMAP
+0030
+0010
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1100
+0E00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1EF1
+ENCODING 7921
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 12 1 -3
+BITMAP
+03
+01
+CE
+44
+44
+44
+44
+44
+3E
+00
+18
+18
+ENDCHAR
+STARTCHAR 0x1EF2
+ENCODING 7922
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 0 0
+BITMAP
+0800
+0C00
+0400
+0200
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x1EF3
+ENCODING 7923
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 15 1 -3
+BITMAP
+20
+30
+10
+08
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x1EF4
+ENCODING 7924
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 0 -3
+BITMAP
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+0000
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0x1EF5
+ENCODING 7925
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 10 1 -3
+BITMAP
+E7
+24
+24
+24
+18
+18
+18
+10
+96
+E6
+ENDCHAR
+STARTCHAR 0x1EF6
+ENCODING 7926
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 0 0
+BITMAP
+0400
+0A00
+0200
+0400
+0400
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x1EF7
+ENCODING 7927
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 16 1 -3
+BITMAP
+10
+28
+08
+10
+10
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x1EF8
+ENCODING 7928
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+0900
+1500
+1200
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x1EF9
+ENCODING 7929
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 14 1 -3
+BITMAP
+12
+2A
+24
+00
+E7
+24
+24
+24
+18
+18
+18
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x1F00
+ENCODING 7936
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+18
+18
+08
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F01
+ENCODING 7937
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+30
+30
+20
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F02
+ENCODING 7938
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+68
+68
+24
+44
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F03
+ENCODING 7939
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+68
+68
+44
+24
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F04
+ENCODING 7940
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+64
+64
+28
+48
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F05
+ENCODING 7941
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+64
+64
+48
+28
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F06
+ENCODING 7942
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+24
+54
+48
+00
+18
+18
+08
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F07
+ENCODING 7943
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 0
+BITMAP
+24
+54
+48
+00
+30
+30
+20
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F08
+ENCODING 7944
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+6000
+6000
+2400
+4400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1F09
+ENCODING 7945
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+6000
+6000
+4400
+2400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1F0A
+ENCODING 7946
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 13 0 0
+BITMAP
+D000
+D000
+4A00
+8A00
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F0B
+ENCODING 7947
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 13 0 0
+BITMAP
+D000
+D000
+8A00
+4A00
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F0C
+ENCODING 7948
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 13 0 0
+BITMAP
+C800
+C800
+5200
+9200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F0D
+ENCODING 7949
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 13 0 0
+BITMAP
+C800
+C800
+9200
+5200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F0E
+ENCODING 7950
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+1200
+2200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F0F
+ENCODING 7951
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+2200
+1200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+ENDCHAR
+STARTCHAR 0x1F10
+ENCODING 7952
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+60
+60
+20
+40
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F11
+ENCODING 7953
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+60
+60
+40
+20
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F12
+ENCODING 7954
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+D0
+D0
+48
+88
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F13
+ENCODING 7955
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+D0
+D0
+88
+48
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F14
+ENCODING 7956
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+C8
+C8
+50
+90
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F15
+ENCODING 7957
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+C8
+C8
+90
+50
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F18
+ENCODING 7960
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 0 0
+BITMAP
+C000
+C000
+5FF0
+8410
+0410
+0450
+0440
+07C0
+0448
+0448
+0410
+0410
+1FF0
+ENDCHAR
+STARTCHAR 0x1F19
+ENCODING 7961
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 0 0
+BITMAP
+C000
+C000
+9FF0
+4410
+0410
+0450
+0440
+07C0
+0448
+0448
+0410
+0410
+1FF0
+ENDCHAR
+STARTCHAR 0x1F1A
+ENCODING 7962
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 0 0
+BITMAP
+D000
+D000
+4FFC
+8904
+0104
+0114
+0110
+01F0
+0112
+0112
+0104
+0104
+07FC
+ENDCHAR
+STARTCHAR 0x1F1B
+ENCODING 7963
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 0 0
+BITMAP
+D000
+D000
+8FFC
+4904
+0104
+0114
+0110
+01F0
+0112
+0112
+0104
+0104
+07FC
+ENDCHAR
+STARTCHAR 0x1F1C
+ENCODING 7964
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 0 0
+BITMAP
+C800
+C800
+57FC
+9104
+0104
+0114
+0110
+01F0
+0112
+0112
+0104
+0104
+07FC
+ENDCHAR
+STARTCHAR 0x1F1D
+ENCODING 7965
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 0 0
+BITMAP
+C800
+C800
+97FC
+5104
+0104
+0114
+0110
+01F0
+0112
+0112
+0104
+0104
+07FC
+ENDCHAR
+STARTCHAR 0x1F20
+ENCODING 7968
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+30
+30
+10
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F21
+ENCODING 7969
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+30
+30
+20
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F22
+ENCODING 7970
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+68
+68
+24
+44
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F23
+ENCODING 7971
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+68
+68
+44
+24
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F24
+ENCODING 7972
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+64
+64
+28
+48
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F25
+ENCODING 7973
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+64
+64
+48
+28
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F26
+ENCODING 7974
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 20 1 -4
+BITMAP
+48
+A8
+90
+00
+30
+30
+10
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F27
+ENCODING 7975
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 20 1 -4
+BITMAP
+48
+A8
+90
+00
+30
+30
+20
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F28
+ENCODING 7976
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+C000
+C000
+5F7C
+8410
+0410
+0410
+0410
+07F0
+0410
+0410
+0410
+0410
+1F7C
+ENDCHAR
+STARTCHAR 0x1F29
+ENCODING 7977
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+C000
+C000
+9F7C
+4410
+0410
+0410
+0410
+07F0
+0410
+0410
+0410
+0410
+1F7C
+ENDCHAR
+STARTCHAR 0x1F2A
+ENCODING 7978
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 13 0 0
+BITMAP
+D000
+D000
+4FDF
+8904
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F2B
+ENCODING 7979
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 13 0 0
+BITMAP
+D000
+D000
+8FDF
+4904
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F2C
+ENCODING 7980
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 13 0 0
+BITMAP
+C800
+C800
+57DF
+9104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F2D
+ENCODING 7981
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 13 0 0
+BITMAP
+C800
+C800
+97DF
+5104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F2E
+ENCODING 7982
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+17DF
+2104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F2F
+ENCODING 7983
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+27DF
+1104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+ENDCHAR
+STARTCHAR 0x1F30
+ENCODING 7984
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+60
+60
+20
+40
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F31
+ENCODING 7985
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+60
+60
+40
+20
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F32
+ENCODING 7986
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 12 1 0
+BITMAP
+D0
+D0
+48
+88
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F33
+ENCODING 7987
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 12 1 0
+BITMAP
+D0
+D0
+88
+48
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F34
+ENCODING 7988
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 12 1 0
+BITMAP
+C8
+C8
+50
+90
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F35
+ENCODING 7989
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 12 1 0
+BITMAP
+C8
+C8
+90
+50
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F36
+ENCODING 7990
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 1 0
+BITMAP
+48
+A8
+90
+00
+60
+60
+20
+40
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F37
+ENCODING 7991
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 1 0
+BITMAP
+48
+A8
+90
+00
+60
+60
+40
+20
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F38
+ENCODING 7992
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 0
+BITMAP
+C0
+C0
+5F
+84
+04
+04
+04
+04
+04
+04
+04
+04
+1F
+ENDCHAR
+STARTCHAR 0x1F39
+ENCODING 7993
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 0
+BITMAP
+C0
+C0
+9F
+44
+04
+04
+04
+04
+04
+04
+04
+04
+1F
+ENDCHAR
+STARTCHAR 0x1F3A
+ENCODING 7994
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 0
+BITMAP
+D000
+D000
+4FC0
+8900
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F3B
+ENCODING 7995
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 0
+BITMAP
+D000
+D000
+8FC0
+4900
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F3C
+ENCODING 7996
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 0
+BITMAP
+C800
+C800
+57C0
+9100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F3D
+ENCODING 7997
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 0
+BITMAP
+C800
+C800
+97C0
+5100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F3E
+ENCODING 7998
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+17C0
+2100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F3F
+ENCODING 7999
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+27C0
+1100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F40
+ENCODING 8000
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+60
+60
+20
+40
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F41
+ENCODING 8001
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+60
+60
+40
+20
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F42
+ENCODING 8002
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+D0
+D0
+48
+88
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F43
+ENCODING 8003
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+D0
+D0
+88
+48
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F44
+ENCODING 8004
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+C8
+C8
+50
+90
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F45
+ENCODING 8005
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+C8
+C8
+90
+50
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F48
+ENCODING 8008
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+C000
+C000
+4F00
+9080
+2040
+4020
+4020
+4020
+4020
+4020
+2040
+1080
+0F00
+ENDCHAR
+STARTCHAR 0x1F49
+ENCODING 8009
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+C000
+C000
+8F00
+5080
+2040
+4020
+4020
+4020
+4020
+4020
+2040
+1080
+0F00
+ENDCHAR
+STARTCHAR 0x1F4A
+ENCODING 8010
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+D000
+D000
+49E0
+8A10
+0408
+0804
+0804
+0804
+0804
+0804
+0408
+0210
+01E0
+ENDCHAR
+STARTCHAR 0x1F4B
+ENCODING 8011
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+D000
+D000
+89E0
+4A10
+0408
+0804
+0804
+0804
+0804
+0804
+0408
+0210
+01E0
+ENDCHAR
+STARTCHAR 0x1F4C
+ENCODING 8012
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+C800
+C800
+51E0
+9210
+0408
+0804
+0804
+0804
+0804
+0804
+0408
+0210
+01E0
+ENDCHAR
+STARTCHAR 0x1F4D
+ENCODING 8013
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+C800
+C800
+91E0
+5210
+0408
+0804
+0804
+0804
+0804
+0804
+0408
+0210
+01E0
+ENDCHAR
+STARTCHAR 0x1F50
+ENCODING 8016
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+30
+30
+10
+20
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F51
+ENCODING 8017
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+30
+30
+20
+10
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F52
+ENCODING 8018
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+68
+68
+24
+44
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F53
+ENCODING 8019
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+68
+68
+44
+24
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F54
+ENCODING 8020
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+64
+64
+28
+48
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F55
+ENCODING 8021
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+64
+64
+48
+28
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F56
+ENCODING 8022
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 0
+BITMAP
+48
+A8
+90
+00
+30
+30
+10
+20
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F57
+ENCODING 8023
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 0
+BITMAP
+48
+A8
+90
+00
+30
+30
+20
+10
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F59
+ENCODING 8025
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 0 0
+BITMAP
+C000
+FC78
+4820
+8440
+0440
+0280
+0380
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1F5B
+ENCODING 8027
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 12 0 0
+BITMAP
+D000
+D78F
+8904
+4888
+0088
+0050
+0070
+0020
+0020
+0020
+0020
+00F8
+ENDCHAR
+STARTCHAR 0x1F5D
+ENCODING 8029
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 12 0 0
+BITMAP
+C800
+CF8F
+9104
+5088
+0088
+0050
+0070
+0020
+0020
+0020
+0020
+00F8
+ENDCHAR
+STARTCHAR 0x1F5F
+ENCODING 8031
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 16 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3F1E
+2208
+1110
+0110
+00A0
+00E0
+0040
+0040
+0040
+0040
+01F0
+ENDCHAR
+STARTCHAR 0x1F60
+ENCODING 8032
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+1800
+1800
+0800
+1000
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F61
+ENCODING 8033
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+1800
+1800
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F62
+ENCODING 8034
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+3400
+3400
+1200
+2200
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F63
+ENCODING 8035
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+3400
+3400
+2200
+1200
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F64
+ENCODING 8036
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+3200
+3200
+1400
+2400
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F65
+ENCODING 8037
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+3200
+3200
+2400
+1400
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F66
+ENCODING 8038
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 0
+BITMAP
+2400
+5400
+4800
+0000
+1800
+1800
+0800
+1000
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F67
+ENCODING 8039
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 0
+BITMAP
+2400
+5400
+4800
+0000
+1800
+1800
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F68
+ENCODING 8040
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 0
+BITMAP
+C000
+C000
+4F80
+9040
+2020
+2020
+2020
+2020
+1040
+1040
+0880
+28A0
+38E0
+ENDCHAR
+STARTCHAR 0x1F69
+ENCODING 8041
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 0 0
+BITMAP
+C000
+C000
+8F80
+5040
+2020
+2020
+2020
+2020
+1040
+1040
+0880
+28A0
+38E0
+ENDCHAR
+STARTCHAR 0x1F6A
+ENCODING 8042
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+D000
+D000
+49F0
+8A08
+0404
+0404
+0404
+0404
+0208
+0208
+0110
+0514
+071C
+ENDCHAR
+STARTCHAR 0x1F6B
+ENCODING 8043
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+D000
+D000
+89F0
+4A08
+0404
+0404
+0404
+0404
+0208
+0208
+0110
+0514
+071C
+ENDCHAR
+STARTCHAR 0x1F6C
+ENCODING 8044
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 0 0
+BITMAP
+C800
+C800
+53E0
+9410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+ENDCHAR
+STARTCHAR 0x1F6D
+ENCODING 8045
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 0 0
+BITMAP
+C800
+C800
+93E0
+5410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+ENDCHAR
+STARTCHAR 0x1F6E
+ENCODING 8046
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+13E0
+2410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+ENDCHAR
+STARTCHAR 0x1F6F
+ENCODING 8047
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 17 0 0
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+23E0
+1410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+ENDCHAR
+STARTCHAR 0x1F70
+ENCODING 8048
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+20
+20
+10
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F71
+ENCODING 8049
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+10
+10
+20
+20
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1F72
+ENCODING 8050
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+40
+40
+20
+20
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F73
+ENCODING 8051
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+10
+10
+20
+20
+00
+70
+90
+80
+60
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x1F74
+ENCODING 8052
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+20
+20
+10
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F75
+ENCODING 8053
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+10
+10
+20
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1F76
+ENCODING 8054
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 11 1 0
+BITMAP
+80
+80
+40
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F77
+ENCODING 8055
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 11 1 0
+BITMAP
+20
+20
+40
+00
+40
+C0
+40
+40
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1F78
+ENCODING 8056
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+40
+40
+20
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F79
+ENCODING 8057
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+20
+20
+40
+00
+70
+88
+88
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x1F7A
+ENCODING 8058
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+20
+20
+10
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F7B
+ENCODING 8059
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+10
+10
+20
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1F7C
+ENCODING 8060
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+1000
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F7D
+ENCODING 8061
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+0400
+0400
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1F80
+ENCODING 8064
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+18
+18
+08
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F81
+ENCODING 8065
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+30
+30
+20
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F82
+ENCODING 8066
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+68
+68
+24
+44
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F83
+ENCODING 8067
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+68
+68
+44
+24
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F84
+ENCODING 8068
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+64
+64
+28
+48
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F85
+ENCODING 8069
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+64
+64
+48
+28
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F86
+ENCODING 8070
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 21 1 -5
+BITMAP
+24
+54
+48
+00
+18
+18
+08
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F87
+ENCODING 8071
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 21 1 -5
+BITMAP
+24
+54
+48
+00
+30
+30
+20
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1F88
+ENCODING 8072
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 17 0 -4
+BITMAP
+6000
+6000
+2400
+4400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0C00
+0400
+0500
+0200
+ENDCHAR
+STARTCHAR 0x1F89
+ENCODING 8073
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 17 0 -4
+BITMAP
+6000
+6000
+4400
+2400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0C00
+0400
+0500
+0200
+ENDCHAR
+STARTCHAR 0x1F8A
+ENCODING 8074
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 17 0 -4
+BITMAP
+D000
+D000
+4A00
+8A00
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F8B
+ENCODING 8075
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 17 0 -4
+BITMAP
+D000
+D000
+8A00
+4A00
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F8C
+ENCODING 8076
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 17 0 -4
+BITMAP
+C800
+C800
+5200
+9200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F8D
+ENCODING 8077
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 17 0 -4
+BITMAP
+C800
+C800
+9200
+5200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F8E
+ENCODING 8078
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 21 0 -4
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+1200
+2200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F8F
+ENCODING 8079
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 21 0 -4
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+2200
+1200
+0500
+0500
+0500
+0880
+0880
+0F80
+1040
+1040
+78F0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1F90
+ENCODING 8080
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+30
+30
+10
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F91
+ENCODING 8081
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+30
+30
+20
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F92
+ENCODING 8082
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+68
+68
+24
+44
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F93
+ENCODING 8083
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+68
+68
+44
+24
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F94
+ENCODING 8084
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+64
+64
+28
+48
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F95
+ENCODING 8085
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 16 1 -4
+BITMAP
+64
+64
+48
+28
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F96
+ENCODING 8086
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 20 1 -4
+BITMAP
+48
+A8
+90
+00
+30
+30
+10
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F97
+ENCODING 8087
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 20 1 -4
+BITMAP
+48
+A8
+90
+00
+30
+30
+20
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1F98
+ENCODING 8088
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 18 0 -5
+BITMAP
+C000
+C000
+5F7C
+8410
+0410
+0410
+0410
+07F0
+0410
+0410
+0410
+0410
+1F7C
+0000
+0180
+0080
+00A0
+0040
+ENDCHAR
+STARTCHAR 0x1F99
+ENCODING 8089
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 18 0 -5
+BITMAP
+C000
+C000
+9F7C
+4410
+0410
+0410
+0410
+07F0
+0410
+0410
+0410
+0410
+1F7C
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1F9A
+ENCODING 8090
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 18 0 -5
+BITMAP
+D000
+D000
+4FDF
+8904
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1F9B
+ENCODING 8091
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 18 0 -5
+BITMAP
+D000
+D000
+8FDF
+4904
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1F9C
+ENCODING 8092
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 18 0 -5
+BITMAP
+C800
+C800
+57DF
+9104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1F9D
+ENCODING 8093
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 18 0 -5
+BITMAP
+C800
+C800
+97DF
+5104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1F9E
+ENCODING 8094
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 22 0 -5
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+17DF
+2104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1F9F
+ENCODING 8095
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 22 0 -5
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+27DF
+1104
+0104
+0104
+0104
+01FC
+0104
+0104
+0104
+0104
+07DF
+0000
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1FA0
+ENCODING 8096
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 17 1 -5
+BITMAP
+1800
+1800
+0800
+1000
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA1
+ENCODING 8097
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 17 1 -5
+BITMAP
+1800
+1800
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA2
+ENCODING 8098
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 17 1 -5
+BITMAP
+3400
+3400
+1200
+2200
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA3
+ENCODING 8099
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 17 1 -5
+BITMAP
+3400
+3400
+2200
+1200
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA4
+ENCODING 8100
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 17 1 -5
+BITMAP
+3200
+3200
+1400
+2400
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA5
+ENCODING 8101
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 17 1 -5
+BITMAP
+3200
+3200
+2400
+1400
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA6
+ENCODING 8102
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 21 1 -5
+BITMAP
+2400
+5400
+4800
+0000
+1800
+1800
+0800
+1000
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA7
+ENCODING 8103
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 21 1 -5
+BITMAP
+2400
+5400
+4800
+0000
+1800
+1800
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FA8
+ENCODING 8104
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 0 -4
+BITMAP
+C000
+C000
+4F80
+9040
+2020
+2020
+2020
+2020
+1040
+1040
+0880
+28A0
+38E0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1FA9
+ENCODING 8105
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 17 0 -4
+BITMAP
+C000
+C000
+8F80
+5040
+2020
+2020
+2020
+2020
+1040
+1040
+0880
+28A0
+38E0
+0600
+0200
+0280
+0100
+ENDCHAR
+STARTCHAR 0x1FAA
+ENCODING 8106
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 17 0 -4
+BITMAP
+D000
+D000
+49F0
+8A08
+0404
+0404
+0404
+0404
+0208
+0208
+0110
+0514
+071C
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1FAB
+ENCODING 8107
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 17 0 -4
+BITMAP
+D000
+D000
+89F0
+4A08
+0404
+0404
+0404
+0404
+0208
+0208
+0110
+0514
+071C
+00C0
+0040
+0050
+0020
+ENDCHAR
+STARTCHAR 0x1FAC
+ENCODING 8108
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 17 0 -4
+BITMAP
+C800
+C800
+53E0
+9410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+0180
+0080
+00A0
+0040
+ENDCHAR
+STARTCHAR 0x1FAD
+ENCODING 8109
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 17 0 -4
+BITMAP
+C800
+C800
+93E0
+5410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+0180
+0080
+00A0
+0040
+ENDCHAR
+STARTCHAR 0x1FAE
+ENCODING 8110
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 21 0 -4
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+13E0
+2410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+0180
+0080
+00A0
+0040
+ENDCHAR
+STARTCHAR 0x1FAF
+ENCODING 8111
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 21 0 -4
+BITMAP
+4800
+A800
+9000
+0000
+3000
+3000
+23E0
+1410
+0808
+0808
+0808
+0808
+0410
+0410
+0220
+0A28
+0E38
+0180
+0080
+00A0
+0040
+ENDCHAR
+STARTCHAR 0x1FB0
+ENCODING 8112
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+44
+38
+00
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1FB1
+ENCODING 8113
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 0
+BITMAP
+7C
+00
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1FB2
+ENCODING 8114
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+10
+10
+08
+08
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FB3
+ENCODING 8115
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 -5
+BITMAP
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FB4
+ENCODING 8116
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 17 1 -5
+BITMAP
+08
+08
+10
+10
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FB6
+ENCODING 8118
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+24
+54
+48
+00
+62
+92
+94
+8C
+88
+98
+66
+ENDCHAR
+STARTCHAR 0x1FB7
+ENCODING 8119
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 16 1 -5
+BITMAP
+24
+54
+48
+00
+62
+92
+94
+8C
+88
+98
+66
+00
+60
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FB8
+ENCODING 8120
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 14 0 0
+BITMAP
+1100
+0E00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1FB9
+ENCODING 8121
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+1F00
+0000
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1FBA
+ENCODING 8122
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+4000
+4000
+2400
+2400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1FBB
+ENCODING 8123
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 13 0 0
+BITMAP
+2000
+2000
+4400
+4400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x1FBC
+ENCODING 8124
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 15 0 -4
+BITMAP
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+0C00
+0400
+0500
+0200
+ENDCHAR
+STARTCHAR 0x1FBD
+ENCODING 8125
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 5 1 11
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x1FBE
+ENCODING 8126
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 4 1 -4
+BITMAP
+C0
+40
+50
+20
+ENDCHAR
+STARTCHAR 0x1FBF
+ENCODING 8127
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 5 1 11
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x1FC0
+ENCODING 8128
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 1 11
+BITMAP
+48
+A8
+90
+ENDCHAR
+STARTCHAR 0x1FC1
+ENCODING 8129
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 6 1 11
+BITMAP
+48
+A8
+90
+00
+D8
+D8
+ENDCHAR
+STARTCHAR 0x1FC2
+ENCODING 8130
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -4
+BITMAP
+20
+20
+10
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1FC3
+ENCODING 8131
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 -4
+BITMAP
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1FC4
+ENCODING 8132
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -4
+BITMAP
+10
+10
+20
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1FC6
+ENCODING 8134
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -4
+BITMAP
+24
+54
+48
+00
+98
+64
+44
+44
+44
+44
+44
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x1FC7
+ENCODING 8135
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 -4
+BITMAP
+24
+54
+48
+00
+98
+64
+44
+44
+44
+44
+44
+04
+C4
+44
+64
+ENDCHAR
+STARTCHAR 0x1FC8
+ENCODING 8136
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 0 0
+BITMAP
+8000
+8000
+5FF0
+4410
+0410
+0450
+0440
+07C0
+0448
+0448
+0410
+0410
+1FF0
+ENDCHAR
+STARTCHAR 0x1FC9
+ENCODING 8137
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 13 0 0
+BITMAP
+4000
+4000
+9FF0
+8410
+0410
+0450
+0440
+07C0
+0448
+0448
+0410
+0410
+1FF0
+ENDCHAR
+STARTCHAR 0x1FCA
+ENCODING 8138
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+8000
+8000
+5F7C
+4410
+0410
+0410
+0410
+07F0
+0410
+0410
+0410
+0410
+1F7C
+ENDCHAR
+STARTCHAR 0x1FCB
+ENCODING 8139
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 0 0
+BITMAP
+4000
+4000
+9F7C
+8410
+0410
+0410
+0410
+07F0
+0410
+0410
+0410
+0410
+1F7C
+ENDCHAR
+STARTCHAR 0x1FCC
+ENCODING 8140
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 0 -5
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+3F80
+2080
+2080
+2080
+2080
+FBE0
+0000
+0C00
+0400
+0500
+0200
+ENDCHAR
+STARTCHAR 0x1FCD
+ENCODING 8141
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 11
+BITMAP
+D0
+D0
+48
+88
+ENDCHAR
+STARTCHAR 0x1FCE
+ENCODING 8142
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 11
+BITMAP
+C8
+C8
+50
+90
+ENDCHAR
+STARTCHAR 0x1FCF
+ENCODING 8143
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 8 1 11
+BITMAP
+48
+A8
+90
+00
+30
+30
+10
+20
+ENDCHAR
+STARTCHAR 0x1FD0
+ENCODING 8144
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 11 0 0
+BITMAP
+88
+70
+00
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FD1
+ENCODING 8145
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 10 0 0
+BITMAP
+F8
+00
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FD2
+ENCODING 8146
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 6 13 -1 0
+BITMAP
+20
+20
+DC
+CC
+00
+00
+10
+30
+10
+10
+10
+14
+08
+ENDCHAR
+STARTCHAR 0x1FD3
+ENCODING 8147
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 6 13 -1 0
+BITMAP
+10
+10
+EC
+CC
+00
+00
+10
+30
+10
+10
+10
+14
+08
+ENDCHAR
+STARTCHAR 0x1FD6
+ENCODING 8150
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 12 0 0
+BITMAP
+48
+A8
+90
+00
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FD7
+ENCODING 8151
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 15 0 0
+BITMAP
+48
+A8
+90
+00
+D8
+D8
+00
+00
+20
+60
+20
+20
+20
+28
+10
+ENDCHAR
+STARTCHAR 0x1FD8
+ENCODING 8152
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 14 1 0
+BITMAP
+88
+70
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x1FD9
+ENCODING 8153
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 1 0
+BITMAP
+F8
+00
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x1FDA
+ENCODING 8154
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 0
+BITMAP
+80
+80
+5F
+44
+04
+04
+04
+04
+04
+04
+04
+04
+1F
+ENDCHAR
+STARTCHAR 0x1FDB
+ENCODING 8155
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 0
+BITMAP
+40
+40
+9F
+84
+04
+04
+04
+04
+04
+04
+04
+04
+1F
+ENDCHAR
+STARTCHAR 0x1FDD
+ENCODING 8157
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 11
+BITMAP
+D0
+D0
+88
+48
+ENDCHAR
+STARTCHAR 0x1FDE
+ENCODING 8158
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 4 1 11
+BITMAP
+C8
+C8
+90
+50
+ENDCHAR
+STARTCHAR 0x1FDF
+ENCODING 8159
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 8 1 11
+BITMAP
+48
+A8
+90
+00
+30
+30
+20
+10
+ENDCHAR
+STARTCHAR 0x1FE0
+ENCODING 8160
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+44
+38
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FE1
+ENCODING 8161
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 10 1 0
+BITMAP
+7C
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FE2
+ENCODING 8162
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 0
+BITMAP
+20
+20
+DC
+CC
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FE3
+ENCODING 8163
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 13 1 0
+BITMAP
+10
+10
+EC
+CC
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FE4
+ENCODING 8164
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 17 1 -4
+BITMAP
+30
+30
+10
+20
+00
+00
+70
+88
+88
+88
+88
+88
+F0
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x1FE5
+ENCODING 8165
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 17 1 -4
+BITMAP
+60
+60
+40
+20
+00
+00
+70
+88
+88
+88
+88
+88
+F0
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x1FE6
+ENCODING 8166
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+24
+54
+48
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FE7
+ENCODING 8167
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 15 1 0
+BITMAP
+24
+54
+48
+00
+6C
+6C
+00
+00
+C8
+44
+44
+44
+44
+48
+30
+ENDCHAR
+STARTCHAR 0x1FE8
+ENCODING 8168
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 11 14 0 0
+BITMAP
+1100
+0E00
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x1FE9
+ENCODING 8169
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 11 13 0 0
+BITMAP
+1F00
+0000
+F1E0
+2080
+1100
+1100
+0A00
+0E00
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x1FEA
+ENCODING 8170
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 0 0
+BITMAP
+8000
+BC78
+4820
+4440
+0440
+0280
+0380
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1FEB
+ENCODING 8171
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 0 0
+BITMAP
+4000
+7C78
+8820
+8440
+0440
+0280
+0380
+0100
+0100
+0100
+0100
+07C0
+ENDCHAR
+STARTCHAR 0x1FEC
+ENCODING 8172
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 0 0
+BITMAP
+C000
+C000
+9FE0
+8430
+4410
+0410
+0430
+07E0
+0400
+0400
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0x1FED
+ENCODING 8173
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 4 2 11
+BITMAP
+20
+20
+DC
+CC
+ENDCHAR
+STARTCHAR 0x1FEE
+ENCODING 8174
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 4 2 11
+BITMAP
+10
+10
+EC
+CC
+ENDCHAR
+STARTCHAR 0x1FEF
+ENCODING 8175
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 4 1 11
+BITMAP
+80
+80
+40
+40
+ENDCHAR
+STARTCHAR 0x1FF2
+ENCODING 8178
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 -5
+BITMAP
+1000
+1000
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FF3
+ENCODING 8179
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -5
+BITMAP
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FF4
+ENCODING 8180
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 -5
+BITMAP
+0400
+0400
+0800
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FF6
+ENCODING 8182
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+1200
+2A00
+2400
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+ENDCHAR
+STARTCHAR 0x1FF7
+ENCODING 8183
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 -5
+BITMAP
+1200
+2A00
+2400
+0000
+2200
+4100
+8080
+8880
+8880
+8880
+7700
+0000
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FF8
+ENCODING 8184
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 13 0 0
+BITMAP
+8000
+8000
+4780
+4840
+1020
+2010
+2010
+2010
+2010
+2010
+1020
+0840
+0780
+ENDCHAR
+STARTCHAR 0x1FF9
+ENCODING 8185
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 13 0 0
+BITMAP
+4000
+4000
+8780
+8840
+1020
+2010
+2010
+2010
+2010
+2010
+1020
+0840
+0780
+ENDCHAR
+STARTCHAR 0x1FFA
+ENCODING 8186
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 0 0
+BITMAP
+8000
+8000
+47C0
+4820
+1010
+1010
+1010
+1010
+0820
+0820
+0440
+1450
+1C70
+ENDCHAR
+STARTCHAR 0x1FFB
+ENCODING 8187
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 0 0
+BITMAP
+4000
+4000
+87C0
+8820
+1010
+1010
+1010
+1010
+0820
+0820
+0440
+1450
+1C70
+ENDCHAR
+STARTCHAR 0x1FFC
+ENCODING 8188
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 15 1 -4
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+8080
+4100
+4100
+2200
+A280
+E380
+1800
+0800
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x1FFD
+ENCODING 8189
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 4 1 11
+BITMAP
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0x1FFE
+ENCODING 8190
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 5 1 11
+BITMAP
+C0
+C0
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x200B
+ENCODING 8203
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 3 3 2 4
+BITMAP
+A0
+40
+A0
+ENDCHAR
+STARTCHAR 0x2010
+ENCODING 8208
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 1 1 4
+BITMAP
+F0
+ENDCHAR
+STARTCHAR 0x2011
+ENCODING 8209
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 1 1 4
+BITMAP
+F0
+ENDCHAR
+STARTCHAR 0x2012
+ENCODING 8210
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 1 1 4
+BITMAP
+FE
+ENDCHAR
+STARTCHAR 0x2013
+ENCODING 8211
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 1 1 4
+BITMAP
+FE
+ENDCHAR
+STARTCHAR 0x2014
+ENCODING 8212
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 1 1 4
+BITMAP
+FFFE
+ENDCHAR
+STARTCHAR 0x2015
+ENCODING 8213
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 1 1 4
+BITMAP
+FFFF
+ENDCHAR
+STARTCHAR 0x2016
+ENCODING 8214
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 13 0 0
+BITMAP
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR 0x2017
+ENCODING 8215
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 3 0 -3
+BITMAP
+FFC0
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x2018
+ENCODING 8216
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 5 1 7
+BITMAP
+40
+80
+80
+C0
+C0
+ENDCHAR
+STARTCHAR 0x2019
+ENCODING 8217
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 5 1 7
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x201A
+ENCODING 8218
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 5 1 -3
+BITMAP
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x201B
+ENCODING 8219
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 5 1 7
+BITMAP
+C0
+C0
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x201C
+ENCODING 8220
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 7
+BITMAP
+48
+90
+90
+D8
+D8
+ENDCHAR
+STARTCHAR 0x201D
+ENCODING 8221
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 7
+BITMAP
+D8
+D8
+48
+48
+90
+ENDCHAR
+STARTCHAR 0x201E
+ENCODING 8222
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 -3
+BITMAP
+D8
+D8
+48
+48
+90
+ENDCHAR
+STARTCHAR 0x201F
+ENCODING 8223
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 7
+BITMAP
+D8
+D8
+90
+90
+48
+ENDCHAR
+STARTCHAR 0x2020
+ENCODING 8224
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+10
+38
+10
+10
+54
+FE
+54
+10
+10
+38
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x2021
+ENCODING 8225
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 1 -3
+BITMAP
+10
+38
+10
+10
+54
+FE
+56
+10
+54
+FE
+54
+10
+10
+38
+10
+ENDCHAR
+STARTCHAR 0x2022
+ENCODING 8226
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 4 1 3
+BITMAP
+60
+F0
+F0
+60
+ENDCHAR
+STARTCHAR 0x2023
+ENCODING 8227
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 6 1 2
+BITMAP
+80
+E0
+F8
+F8
+E0
+80
+ENDCHAR
+STARTCHAR 0x2024
+ENCODING 8228
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 2 1 0
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x2025
+ENCODING 8229
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 2 1 0
+BITMAP
+CC
+CC
+ENDCHAR
+STARTCHAR 0x2026
+ENCODING 8230
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 2 1 0
+BITMAP
+CCC0
+CCC0
+ENDCHAR
+STARTCHAR 0x2027
+ENCODING 8231
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 2 1 3
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x2030
+ENCODING 8240
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 13 1 -1
+BITMAP
+6080
+9900
+9700
+9200
+9400
+6400
+0800
+1318
+14A4
+24A4
+44A4
+44A4
+8318
+ENDCHAR
+STARTCHAR 0x2031
+ENCODING 8241
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 19 13 1 -1
+BITMAP
+608000
+990000
+970000
+920000
+940000
+640000
+080000
+1318C0
+14A520
+24A520
+44A520
+44A520
+8318C0
+ENDCHAR
+STARTCHAR 0x2032
+ENCODING 8242
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 4 1 7
+BITMAP
+20
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x2033
+ENCODING 8243
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 4 1 7
+BITMAP
+24
+6C
+48
+90
+ENDCHAR
+STARTCHAR 0x2034
+ENCODING 8244
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 4 1 7
+BITMAP
+2480
+6D80
+4900
+9200
+ENDCHAR
+STARTCHAR 0x2035
+ENCODING 8245
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 4 1 7
+BITMAP
+80
+C0
+40
+20
+ENDCHAR
+STARTCHAR 0x2036
+ENCODING 8246
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 4 1 7
+BITMAP
+90
+D8
+48
+24
+ENDCHAR
+STARTCHAR 0x2037
+ENCODING 8247
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 4 1 7
+BITMAP
+9200
+DB00
+4900
+2480
+ENDCHAR
+STARTCHAR 0x2038
+ENCODING 8248
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 4 1 -2
+BITMAP
+40
+40
+A0
+A0
+ENDCHAR
+STARTCHAR 0x2039
+ENCODING 8249
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 0
+BITMAP
+10
+20
+60
+C0
+60
+20
+10
+ENDCHAR
+STARTCHAR 0x203A
+ENCODING 8250
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 0
+BITMAP
+80
+40
+60
+30
+60
+40
+80
+ENDCHAR
+STARTCHAR 0x203B
+ENCODING 8251
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+8040
+4C80
+4C80
+2100
+1200
+1200
+CCC0
+D2C0
+1200
+2100
+4C80
+4C80
+8040
+ENDCHAR
+STARTCHAR 0x203C
+ENCODING 8252
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 12 1 0
+BITMAP
+D8
+D8
+D8
+D8
+D8
+D8
+D8
+00
+00
+00
+D8
+D8
+ENDCHAR
+STARTCHAR 0x203D
+ENCODING 8253
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+78
+84
+A4
+24
+28
+30
+20
+60
+60
+00
+60
+60
+ENDCHAR
+STARTCHAR 0x203E
+ENCODING 8254
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 1 0 12
+BITMAP
+FFC0
+ENDCHAR
+STARTCHAR 0x203F
+ENCODING 8255
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 3 1 0
+BITMAP
+8020
+4040
+3F80
+ENDCHAR
+STARTCHAR 0x2040
+ENCODING 8256
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 3 1 12
+BITMAP
+3F80
+4040
+8020
+ENDCHAR
+STARTCHAR 0x2041
+ENCODING 8257
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 8 1 -4
+BITMAP
+10
+10
+20
+20
+40
+60
+90
+90
+ENDCHAR
+STARTCHAR 0x2042
+ENCODING 8258
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 10 1 1
+BITMAP
+0400
+1500
+0E00
+1500
+0400
+2080
+AAA0
+71C0
+AAA0
+2080
+ENDCHAR
+STARTCHAR 0x2043
+ENCODING 8259
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 2 1 3
+BITMAP
+F0
+F0
+ENDCHAR
+STARTCHAR 0x2044
+ENCODING 8260
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 16 1 -4
+BITMAP
+01
+01
+02
+02
+04
+04
+08
+08
+10
+10
+20
+20
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0x2045
+ENCODING 8261
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 16 1 -4
+BITMAP
+E0
+80
+80
+80
+80
+80
+80
+E0
+80
+80
+80
+80
+80
+80
+80
+E0
+ENDCHAR
+STARTCHAR 0x2046
+ENCODING 8262
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 16 0 -4
+BITMAP
+E0
+20
+20
+20
+20
+20
+20
+E0
+20
+20
+20
+20
+20
+20
+20
+E0
+ENDCHAR
+STARTCHAR 0x2070
+ENCODING 8304
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+60
+90
+90
+90
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x2074
+ENCODING 8308
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 6
+BITMAP
+10
+30
+50
+90
+F8
+10
+38
+ENDCHAR
+STARTCHAR 0x2075
+ENCODING 8309
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+F0
+80
+A0
+D0
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x2076
+ENCODING 8310
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+60
+90
+80
+E0
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x2077
+ENCODING 8311
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+F0
+90
+20
+20
+40
+40
+40
+ENDCHAR
+STARTCHAR 0x2078
+ENCODING 8312
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+60
+90
+90
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x2079
+ENCODING 8313
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 6
+BITMAP
+60
+90
+90
+70
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x207A
+ENCODING 8314
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 7
+BITMAP
+20
+20
+F8
+20
+20
+ENDCHAR
+STARTCHAR 0x207B
+ENCODING 8315
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 1 1 9
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x207C
+ENCODING 8316
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 1 8
+BITMAP
+F8
+00
+F8
+ENDCHAR
+STARTCHAR 0x207D
+ENCODING 8317
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 7 1 6
+BITMAP
+40
+80
+80
+80
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x207E
+ENCODING 8318
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 7 1 6
+BITMAP
+80
+40
+40
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x207F
+ENCODING 8319
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 6
+BITMAP
+D0
+68
+48
+48
+48
+ENDCHAR
+STARTCHAR 0x2080
+ENCODING 8320
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+60
+90
+90
+90
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x2081
+ENCODING 8321
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 7 1 -4
+BITMAP
+40
+C0
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x2082
+ENCODING 8322
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+60
+90
+10
+10
+20
+40
+F0
+ENDCHAR
+STARTCHAR 0x2083
+ENCODING 8323
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+60
+90
+10
+20
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x2084
+ENCODING 8324
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 -4
+BITMAP
+10
+30
+50
+90
+F8
+10
+38
+ENDCHAR
+STARTCHAR 0x2085
+ENCODING 8325
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+F0
+80
+A0
+D0
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x2086
+ENCODING 8326
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+60
+90
+80
+E0
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x2087
+ENCODING 8327
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+F0
+90
+20
+20
+40
+40
+40
+ENDCHAR
+STARTCHAR 0x2088
+ENCODING 8328
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+60
+90
+90
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x2089
+ENCODING 8329
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 -4
+BITMAP
+60
+90
+90
+70
+10
+90
+60
+ENDCHAR
+STARTCHAR 0x208A
+ENCODING 8330
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 1 -3
+BITMAP
+20
+20
+F8
+20
+20
+ENDCHAR
+STARTCHAR 0x208B
+ENCODING 8331
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 1 1 -1
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0x208C
+ENCODING 8332
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 3 1 -2
+BITMAP
+F8
+00
+F8
+ENDCHAR
+STARTCHAR 0x208D
+ENCODING 8333
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 7 1 -4
+BITMAP
+40
+80
+80
+80
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x208E
+ENCODING 8334
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 2 7 1 -4
+BITMAP
+80
+40
+40
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR 0x20A0
+ENCODING 8352
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 8 12 2 0
+BITMAP
+34
+4C
+84
+80
+9F
+89
+48
+3E
+08
+08
+09
+1F
+ENDCHAR
+STARTCHAR 0x20A1
+ENCODING 8353
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 16 2 -2
+BITMAP
+0500
+0500
+0A00
+1E80
+2B80
+4A80
+9480
+9400
+9400
+9400
+A880
+6880
+2900
+3E00
+5000
+5000
+ENDCHAR
+STARTCHAR 0x20A2
+ENCODING 8354
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 11 2 0
+BITMAP
+1E80
+2180
+4080
+8080
+9A00
+8D00
+8800
+8880
+4880
+2900
+1E00
+ENDCHAR
+STARTCHAR 0x20A3
+ENCODING 8355
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 11 2 0
+BITMAP
+FF80
+2080
+2080
+2000
+2700
+3C80
+2480
+2700
+2500
+2480
+FC80
+ENDCHAR
+STARTCHAR 0x20A4
+ENCODING 8356
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 8 12 2 0
+BITMAP
+06
+09
+11
+10
+7C
+10
+7C
+10
+10
+51
+B2
+CC
+ENDCHAR
+STARTCHAR 0x20A5
+ENCODING 8357
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 11 11 2 -2
+BITMAP
+0100
+0100
+FB80
+4640
+4440
+4440
+4C40
+4C40
+FEE0
+1000
+1000
+ENDCHAR
+STARTCHAR 0x20A6
+ENCODING 8358
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 11 11 2 0
+BITMAP
+E3E0
+3080
+3080
+2880
+FFE0
+2480
+FFE0
+2280
+2180
+2180
+F880
+ENDCHAR
+STARTCHAR 0x20A7
+ENCODING 8359
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 11 11 2 0
+BITMAP
+FF00
+2180
+2080
+FFE0
+2080
+2180
+3F00
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0x20A8
+ENCODING 8360
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 15 11 2 0
+BITMAP
+FE00
+2100
+2080
+FFE0
+209E
+2122
+3E20
+231C
+2102
+2122
+F8FC
+ENDCHAR
+STARTCHAR 0x20A9
+ENCODING 8361
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 16 11 2 0
+BITMAP
+F1CF
+2184
+2184
+2244
+FFFF
+1248
+FFFF
+1428
+0C30
+0C30
+0810
+ENDCHAR
+STARTCHAR 0x20AA
+ENCODING 8362
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 9 2 0
+BITMAP
+FC00
+8600
+9240
+9240
+9240
+9240
+9040
+10C0
+1F80
+ENDCHAR
+STARTCHAR 0x20AB
+ENCODING 8363
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 14 2 -2
+BITMAP
+18
+08
+7C
+08
+08
+78
+48
+88
+88
+88
+48
+7C
+00
+7C
+ENDCHAR
+STARTCHAR 0x20AC
+ENCODING 8364
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 11 11 2 0
+BITMAP
+07A0
+0860
+1020
+2020
+FF80
+2000
+FE00
+2020
+1020
+0840
+0780
+ENDCHAR
+STARTCHAR 0x20D0
+ENCODING 8400
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 2 0 12
+BITMAP
+40
+FC
+ENDCHAR
+STARTCHAR 0x20D1
+ENCODING 8401
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 2 0 12
+BITMAP
+08
+FC
+ENDCHAR
+STARTCHAR 0x20D2
+ENCODING 8402
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 13 0 -2
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x20D3
+ENCODING 8403
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 1 7 0 1
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x20D4
+ENCODING 8404
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 13 5 0 9
+BITMAP
+0780
+1860
+A010
+C008
+E000
+ENDCHAR
+STARTCHAR 0x20D5
+ENCODING 8405
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 13 5 0 9
+BITMAP
+0F00
+30C0
+4028
+8018
+0038
+ENDCHAR
+STARTCHAR 0x20D6
+ENCODING 8406
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 3 0 11
+BITMAP
+40
+FC
+40
+ENDCHAR
+STARTCHAR 0x20D7
+ENCODING 8407
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 3 0 11
+BITMAP
+08
+FC
+08
+ENDCHAR
+STARTCHAR 0x20D8
+ENCODING 8408
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 5 5 0 4
+BITMAP
+70
+88
+88
+88
+70
+ENDCHAR
+STARTCHAR 0x20D9
+ENCODING 8409
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 6 0 4
+BITMAP
+04
+78
+98
+A8
+88
+70
+ENDCHAR
+STARTCHAR 0x20DA
+ENCODING 8410
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 6 0 3
+BITMAP
+70
+88
+A8
+98
+78
+04
+ENDCHAR
+STARTCHAR 0x20DB
+ENCODING 8411
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 8 2 0 11
+BITMAP
+DB
+DB
+ENDCHAR
+STARTCHAR 0x20DC
+ENCODING 8412
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 11 2 0 11
+BITMAP
+DB60
+DB60
+ENDCHAR
+STARTCHAR 0x20DD
+ENCODING 8413
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 17 17 0 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x20DE
+ENCODING 8414
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 17 17 0 -3
+BITMAP
+FFFF80
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+800080
+FFFF80
+ENDCHAR
+STARTCHAR 0x20DF
+ENCODING 8415
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 17 17 0 -3
+BITMAP
+008000
+014000
+022000
+041000
+080800
+100400
+200200
+400100
+800080
+400100
+200200
+100400
+080800
+041000
+022000
+014000
+008000
+ENDCHAR
+STARTCHAR 0x2100
+ENCODING 8448
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+3440
+4840
+8880
+9080
+9500
+6930
+0248
+0280
+0480
+0490
+0060
+ENDCHAR
+STARTCHAR 0x2101
+ENCODING 8449
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+3440
+4840
+8880
+9080
+9500
+6938
+0248
+0220
+0410
+0448
+0070
+ENDCHAR
+STARTCHAR 0x2102
+ENCODING 8450
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1F40
+30C0
+5040
+A040
+A000
+A000
+A000
+A040
+5040
+3080
+1F00
+ENDCHAR
+STARTCHAR 0x2103
+ENCODING 8451
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 12 1 0
+BITMAP
+7000
+887A
+8886
+8902
+7202
+0200
+0200
+0200
+0202
+0102
+0084
+0078
+ENDCHAR
+STARTCHAR 0x2104
+ENCODING 8452
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+7C00
+1000
+3C00
+5200
+9000
+9000
+9000
+5200
+3C00
+1080
+7F00
+ENDCHAR
+STARTCHAR 0x2105
+ENCODING 8453
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+3080
+4880
+8100
+8100
+9200
+6230
+0448
+0488
+0888
+0890
+0060
+ENDCHAR
+STARTCHAR 0x2106
+ENCODING 8454
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 1 0
+BITMAP
+3080
+4880
+8100
+8100
+9200
+6264
+0424
+0424
+0848
+084A
+0034
+ENDCHAR
+STARTCHAR 0x2107
+ENCODING 8455
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+3D
+43
+81
+81
+40
+38
+40
+80
+81
+41
+3E
+ENDCHAR
+STARTCHAR 0x2108
+ENCODING 8456
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+BC00
+C200
+8100
+8080
+0080
+1F80
+0080
+8080
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x2109
+ENCODING 8457
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 12 1 0
+BITMAP
+7000
+8BFE
+8882
+8882
+708A
+0088
+00F8
+0088
+0088
+0080
+0080
+03E0
+ENDCHAR
+STARTCHAR 0x210A
+ENCODING 8458
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 10 1 -4
+BITMAP
+18
+24
+44
+44
+48
+38
+1C
+70
+90
+E0
+ENDCHAR
+STARTCHAR 0x210B
+ENCODING 8459
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 11 1 0
+BITMAP
+0A10
+1610
+0210
+0420
+0420
+1FE0
+2840
+4840
+4840
+9090
+60E0
+ENDCHAR
+STARTCHAR 0x210C
+ENCODING 8460
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 12 1 -1
+BITMAP
+7038
+D850
+8840
+C840
+4840
+4FC0
+0840
+0840
+1840
+F058
+6070
+0060
+ENDCHAR
+STARTCHAR 0x210D
+ENCODING 8461
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 11 1 0
+BITMAP
+F9F0
+50A0
+50A0
+50A0
+50A0
+5FA0
+50A0
+50A0
+50A0
+50A0
+F9F0
+ENDCHAR
+STARTCHAR 0x210E
+ENCODING 8462
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+30
+10
+10
+20
+20
+38
+44
+44
+44
+88
+8A
+8C
+ENDCHAR
+STARTCHAR 0x210F
+ENCODING 8463
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+30
+10
+1C
+30
+E0
+38
+44
+44
+44
+88
+8A
+8C
+ENDCHAR
+STARTCHAR 0x2110
+ENCODING 8464
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+0E
+12
+22
+04
+04
+04
+08
+38
+48
+90
+60
+ENDCHAR
+STARTCHAR 0x2111
+ENCODING 8465
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+7F00
+C200
+8600
+C400
+6600
+2200
+0300
+0180
+4080
+E180
+3F00
+ENDCHAR
+STARTCHAR 0x2112
+ENCODING 8466
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+0380
+0440
+0480
+3F00
+0800
+0800
+0800
+1000
+5000
+B100
+CE00
+ENDCHAR
+STARTCHAR 0x2113
+ENCODING 8467
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 1 0
+BITMAP
+10
+28
+28
+28
+50
+50
+50
+60
+60
+C4
+38
+ENDCHAR
+STARTCHAR 0x2114
+ENCODING 8468
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 12 1 0
+BITMAP
+6600
+2200
+FFE0
+2200
+2200
+23C0
+2220
+2220
+2220
+2220
+2220
+73C0
+ENDCHAR
+STARTCHAR 0x2115
+ENCODING 8469
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+F8F8
+2420
+3420
+2A20
+2A20
+2520
+22A0
+22A0
+2160
+2120
+F8E0
+ENDCHAR
+STARTCHAR 0x2116
+ENCODING 8470
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 11 1 0
+BITMAP
+E3E0
+3080
+3080
+289C
+28A2
+24A2
+22A2
+22A2
+219C
+2180
+F8BE
+ENDCHAR
+STARTCHAR 0x2117
+ENCODING 8471
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 10 1 3
+BITMAP
+3E00
+4100
+BC80
+9280
+9280
+9C80
+9080
+B880
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x2118
+ENCODING 8472
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 13 1 -4
+BITMAP
+4000
+8700
+8880
+9080
+9080
+A480
+AC80
+4900
+A600
+A000
+9000
+9000
+6000
+ENDCHAR
+STARTCHAR 0x2119
+ENCODING 8473
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+FF80
+52C0
+5140
+5140
+5140
+52C0
+5F80
+5000
+5000
+5000
+F800
+ENDCHAR
+STARTCHAR 0x211A
+ENCODING 8474
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 14 1 -3
+BITMAP
+1F00
+3180
+5140
+A0A0
+A0A0
+A0A0
+A0A0
+A0A0
+5540
+3B80
+1F00
+0500
+0520
+03C0
+ENDCHAR
+STARTCHAR 0x211B
+ENCODING 8475
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+01C0
+0620
+0A20
+1440
+2480
+4B00
+4A00
+8A00
+9100
+9120
+60C0
+ENDCHAR
+STARTCHAR 0x211C
+ENCODING 8476
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+7380
+DCC0
+8840
+C8C0
+4880
+4B00
+0B00
+0B00
+1900
+F1C0
+6180
+ENDCHAR
+STARTCHAR 0x211D
+ENCODING 8477
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 11 1 0
+BITMAP
+FF00
+5280
+5140
+5140
+5280
+5F00
+5580
+5280
+5280
+5280
+F970
+ENDCHAR
+STARTCHAR 0x211E
+ENCODING 8478
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+FE00
+2100
+2080
+2080
+2100
+3E20
+2340
+2180
+2100
+2300
+F4E0
+ENDCHAR
+STARTCHAR 0x211F
+ENCODING 8479
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 17 1 -3
+BITMAP
+1800
+0600
+0200
+FE00
+2500
+2480
+2480
+2900
+3E00
+2B00
+2900
+3100
+3100
+F8E0
+1000
+2000
+2000
+ENDCHAR
+STARTCHAR 0x2120
+ENCODING 8480
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 7 1 4
+BITMAP
+7618
+9330
+8330
+62D0
+12D0
+9210
+E738
+ENDCHAR
+STARTCHAR 0x2121
+ENCODING 8481
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 4
+BITMAP
+FBEE00
+A92400
+210400
+21C400
+210400
+212480
+73EF80
+ENDCHAR
+STARTCHAR 0x2122
+ENCODING 8482
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 7 1 4
+BITMAP
+FB0C
+A998
+2198
+2168
+2168
+2108
+739C
+ENDCHAR
+STARTCHAR 0x2123
+ENCODING 8483
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 17 1 -2
+BITMAP
+1800
+0600
+0200
+0400
+F5E0
+2480
+2480
+1900
+1900
+1900
+0A00
+1A00
+1A00
+1400
+1400
+2000
+2000
+ENDCHAR
+STARTCHAR 0x2124
+ENCODING 8484
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+FE
+CA
+8A
+94
+14
+28
+52
+52
+A2
+A6
+FE
+ENDCHAR
+STARTCHAR 0x2125
+ENCODING 8485
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 15 1 -4
+BITMAP
+7C
+08
+10
+20
+7C
+08
+10
+20
+70
+08
+04
+04
+C4
+88
+70
+ENDCHAR
+STARTCHAR 0x2126
+ENCODING 8486
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+8080
+4100
+4100
+2200
+A280
+E380
+ENDCHAR
+STARTCHAR 0x2127
+ENCODING 8487
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+E380
+A280
+2200
+4100
+4100
+8080
+8080
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x2128
+ENCODING 8488
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+78
+84
+02
+22
+44
+38
+44
+02
+02
+64
+98
+ENDCHAR
+STARTCHAR 0x2129
+ENCODING 8489
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 7 1 0
+BITMAP
+40
+A0
+20
+20
+20
+30
+20
+ENDCHAR
+STARTCHAR 0x212A
+ENCODING 8490
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+F9E0
+2180
+2300
+2600
+2C00
+2E00
+3200
+2100
+2100
+2080
+F9E0
+ENDCHAR
+STARTCHAR 0x212B
+ENCODING 8491
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 15 1 0
+BITMAP
+0600
+0900
+0900
+0600
+0400
+0400
+0A00
+0A00
+0A00
+1100
+1100
+1F00
+2080
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x212C
+ENCODING 8492
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+01C0
+0620
+0A20
+1440
+2480
+4BC0
+4C20
+8820
+9020
+9840
+6780
+ENDCHAR
+STARTCHAR 0x212D
+ENCODING 8493
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+1F40
+3180
+6300
+C180
+C080
+C180
+C300
+C000
+6040
+3080
+1F00
+ENDCHAR
+STARTCHAR 0x212E
+ENCODING 8494
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 0
+BITMAP
+38
+44
+C6
+C6
+FE
+C0
+C0
+46
+3C
+ENDCHAR
+STARTCHAR 0x212F
+ENCODING 8495
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 7 1 0
+BITMAP
+1C
+22
+4C
+70
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x2130
+ENCODING 8496
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+0700
+0880
+1080
+1100
+1000
+3C00
+4000
+8F00
+9080
+8100
+7E00
+ENDCHAR
+STARTCHAR 0x2131
+ENCODING 8497
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+1880
+2700
+3100
+0200
+7F80
+0400
+0400
+7C00
+8C00
+9200
+6200
+ENDCHAR
+STARTCHAR 0x2132
+ENCODING 8498
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+0F80
+0200
+0200
+2200
+2200
+3E00
+2200
+A200
+8200
+8200
+FF80
+ENDCHAR
+STARTCHAR 0x2133
+ENCODING 8499
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 16 11 1 0
+BITMAP
+00C6
+00C6
+014A
+014A
+0294
+0294
+04A4
+64A4
+8948
+8949
+7086
+ENDCHAR
+STARTCHAR 0x2134
+ENCODING 8500
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 7 1 0
+BITMAP
+30
+48
+88
+88
+88
+90
+60
+ENDCHAR
+STARTCHAR 0x2135
+ENCODING 8501
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 11 1 0
+BITMAP
+4100
+4100
+6180
+30C0
+1940
+2E40
+4600
+4300
+4180
+6080
+C080
+ENDCHAR
+STARTCHAR 0x2136
+ENCODING 8502
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+4000
+FC00
+7E00
+0600
+0200
+0200
+0200
+0200
+0200
+7F80
+FF00
+ENDCHAR
+STARTCHAR 0x2137
+ENCODING 8503
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 1 0
+BITMAP
+40
+F0
+78
+08
+08
+08
+08
+78
+C8
+8C
+88
+ENDCHAR
+STARTCHAR 0x2138
+ENCODING 8504
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+40
+FE
+7F
+04
+04
+04
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x0069
+ENCODING 8505
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 12 1 0
+BITMAP
+40
+E0
+40
+00
+E0
+E0
+60
+60
+60
+60
+F0
+F0
+ENDCHAR
+STARTCHAR C081
+ENCODING 8506
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 10 1 0
+BITMAP
+1F08
+2084
+4044
+8078
+80A0
+80A0
+80E0
+4040
+2080
+1F00
+ENDCHAR
+STARTCHAR 0x2153
+ENCODING 8531
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+4200
+C200
+4200
+4400
+4400
+44C0
+E920
+0820
+0840
+1020
+1120
+10C0
+ENDCHAR
+STARTCHAR 0x2154
+ENCODING 8532
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+6100
+9100
+1100
+1200
+2200
+4260
+F490
+0410
+0420
+0810
+0890
+0860
+ENDCHAR
+STARTCHAR 0x2155
+ENCODING 8533
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+4200
+C200
+4200
+4400
+4400
+45E0
+E900
+0940
+09A0
+1020
+1120
+10C0
+ENDCHAR
+STARTCHAR 0x2156
+ENCODING 8534
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+6100
+9100
+1100
+1200
+2200
+42F0
+F480
+04A0
+04D0
+0810
+0890
+0860
+ENDCHAR
+STARTCHAR 0x2157
+ENCODING 8535
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+6100
+9100
+1100
+2200
+1200
+92F0
+6480
+04A0
+04D0
+0810
+0890
+0860
+ENDCHAR
+STARTCHAR 0x2158
+ENCODING 8536
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 12 1 0
+BITMAP
+1080
+3080
+5080
+9100
+F900
+1178
+3A40
+0250
+0268
+0408
+0448
+0430
+ENDCHAR
+STARTCHAR 0x2159
+ENCODING 8537
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+4200
+C200
+4200
+4400
+4400
+44C0
+E920
+0900
+09C0
+1120
+1120
+10C0
+ENDCHAR
+STARTCHAR 0x215A
+ENCODING 8538
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+F100
+8100
+A100
+D200
+1200
+9260
+6490
+0480
+04E0
+0890
+0890
+0860
+ENDCHAR
+STARTCHAR 0x215B
+ENCODING 8539
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+4200
+C200
+4200
+4400
+4400
+44C0
+E920
+0920
+08C0
+1120
+1120
+10C0
+ENDCHAR
+STARTCHAR 0x215C
+ENCODING 8540
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+6100
+9100
+1100
+2200
+1200
+9260
+6490
+0490
+0460
+0890
+0890
+0860
+ENDCHAR
+STARTCHAR 0x215D
+ENCODING 8541
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+F100
+8100
+A100
+D200
+1200
+9260
+6490
+0490
+0460
+0890
+0890
+0860
+ENDCHAR
+STARTCHAR 0x215E
+ENCODING 8542
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+F200
+9200
+2200
+2400
+4400
+44C0
+4920
+0920
+08C0
+1120
+1120
+10C0
+ENDCHAR
+STARTCHAR 0x215F
+ENCODING 8543
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+42
+C2
+42
+44
+44
+44
+E8
+08
+08
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x2160
+ENCODING 8544
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0x2161
+ENCODING 8545
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+FF
+24
+24
+24
+24
+24
+24
+24
+24
+24
+FF
+ENDCHAR
+STARTCHAR 0x2162
+ENCODING 8546
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+FFE0
+2480
+2480
+2480
+2480
+2480
+2480
+2480
+2480
+2480
+FFE0
+ENDCHAR
+STARTCHAR 0x2163
+ENCODING 8547
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+FF8F
+2104
+2104
+2088
+2088
+2088
+2050
+2050
+2050
+2020
+F820
+ENDCHAR
+STARTCHAR 0x2164
+ENCODING 8548
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+F1E0
+2080
+2080
+1100
+1100
+1100
+0A00
+0A00
+0A00
+0400
+0400
+ENDCHAR
+STARTCHAR 0x2165
+ENCODING 8549
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+F1FF
+2084
+2084
+1104
+1104
+1104
+0A04
+0A04
+0A04
+0404
+041F
+ENDCHAR
+STARTCHAR 0x2166
+ENCODING 8550
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 11 1 0
+BITMAP
+F3FF80
+211200
+211200
+121200
+121200
+121200
+121200
+141200
+081200
+081200
+087F80
+ENDCHAR
+STARTCHAR 0x2167
+ENCODING 8551
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 11 1 0
+BITMAP
+F3FFF0
+211240
+211240
+121240
+121240
+121240
+121240
+141240
+081240
+081240
+087FF0
+ENDCHAR
+STARTCHAR 0x2168
+ENCODING 8552
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+FF9E
+2088
+2090
+2050
+2060
+2020
+2050
+20D0
+2088
+2104
+FF8F
+ENDCHAR
+STARTCHAR 0x2169
+ENCODING 8553
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+F3C0
+1100
+1200
+0A00
+0C00
+0400
+0A00
+1A00
+1100
+2080
+F1E0
+ENDCHAR
+STARTCHAR 0x216A
+ENCODING 8554
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 11 1 0
+BITMAP
+F3FE
+1108
+1208
+0A08
+0C08
+0408
+0A08
+1A08
+1108
+2088
+F1FE
+ENDCHAR
+STARTCHAR 0x216B
+ENCODING 8555
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 18 11 1 0
+BITMAP
+F3FFC0
+110900
+120900
+0A0900
+0C0900
+040900
+0A0900
+1A0900
+110900
+208900
+F1FFC0
+ENDCHAR
+STARTCHAR 0x216C
+ENCODING 8556
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+F8
+20
+20
+20
+20
+20
+21
+21
+21
+23
+FF
+ENDCHAR
+STARTCHAR 0x216D
+ENCODING 8557
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0x216E
+ENCODING 8558
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+FE00
+2180
+2080
+2040
+2040
+2040
+2040
+2040
+2080
+2180
+FE00
+ENDCHAR
+STARTCHAR 0x216F
+ENCODING 8559
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 1 0
+BITMAP
+F03C
+3030
+3030
+2850
+2850
+2890
+2490
+2490
+2310
+2310
+FB7C
+ENDCHAR
+STARTCHAR 0x2170
+ENCODING 8560
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 11 1 0
+BITMAP
+C0
+C0
+00
+00
+C0
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x2171
+ENCODING 8561
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+CC
+CC
+00
+00
+CC
+44
+44
+44
+44
+44
+EE
+ENDCHAR
+STARTCHAR 0x2172
+ENCODING 8562
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+CCC0
+CCC0
+0000
+0000
+CCC0
+4440
+4440
+4440
+4440
+4440
+EEE0
+ENDCHAR
+STARTCHAR 0x2173
+ENCODING 8563
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+C000
+C000
+0000
+0000
+CE70
+4240
+4240
+4240
+4180
+4180
+E180
+ENDCHAR
+STARTCHAR 0x2174
+ENCODING 8564
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+E7
+24
+24
+24
+18
+18
+18
+ENDCHAR
+STARTCHAR 0x2175
+ENCODING 8565
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+0060
+0060
+0000
+0000
+E760
+2420
+2420
+2420
+1820
+1820
+1870
+ENDCHAR
+STARTCHAR 0x2176
+ENCODING 8566
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+0066
+0066
+0000
+0000
+E766
+2422
+2422
+2422
+1822
+1822
+1877
+ENDCHAR
+STARTCHAR 0x2177
+ENCODING 8567
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 11 1 0
+BITMAP
+006660
+006660
+000000
+000000
+E76660
+242220
+242220
+242220
+182220
+182220
+187770
+ENDCHAR
+STARTCHAR 0x2178
+ENCODING 8568
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+C000
+C000
+0000
+0000
+CE70
+4240
+4180
+4180
+4180
+4240
+EE70
+ENDCHAR
+STARTCHAR 0x2179
+ENCODING 8569
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 7 1 0
+BITMAP
+E7
+24
+18
+18
+18
+24
+E7
+ENDCHAR
+STARTCHAR 0x217A
+ENCODING 8570
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 11 1 0
+BITMAP
+0060
+0060
+0000
+0000
+E760
+2420
+1820
+1820
+1820
+2420
+E770
+ENDCHAR
+STARTCHAR 0x217B
+ENCODING 8571
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+0066
+0066
+0000
+0000
+E766
+2422
+1822
+1822
+1822
+2422
+E777
+ENDCHAR
+STARTCHAR 0x217C
+ENCODING 8572
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 12 1 0
+BITMAP
+C0
+40
+40
+40
+40
+40
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0x217D
+ENCODING 8573
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 7 1 0
+BITMAP
+70
+88
+80
+80
+80
+88
+70
+ENDCHAR
+STARTCHAR 0x217E
+ENCODING 8574
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+18
+08
+08
+08
+08
+78
+88
+88
+88
+88
+88
+7C
+ENDCHAR
+STARTCHAR 0x217F
+ENCODING 8575
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 0
+BITMAP
+FB80
+4440
+4440
+4440
+4440
+4440
+EEE0
+ENDCHAR
+STARTCHAR 0x2180
+ENCODING 8576
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+1FF8
+2186
+4082
+8081
+8081
+8081
+8081
+8081
+4082
+2186
+1FF8
+ENDCHAR
+STARTCHAR 0x2181
+ENCODING 8577
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 0
+BITMAP
+FE00
+2180
+3880
+2440
+2240
+2240
+2240
+2440
+3880
+2180
+FE00
+ENDCHAR
+STARTCHAR 0x2182
+ENCODING 8578
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 11 1 0
+BITMAP
+1FF8
+2186
+43E2
+8491
+8889
+8889
+8889
+8491
+43E2
+2186
+1FF8
+ENDCHAR
+STARTCHAR 0x216D
+ENCODING 8579
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+BC00
+C200
+8100
+8080
+0080
+0080
+0080
+8080
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0x2190
+ENCODING 8592
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+2000
+4000
+FFE0
+4000
+2000
+ENDCHAR
+STARTCHAR 0x2191
+ENCODING 8593
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+70
+A8
+20
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x2192
+ENCODING 8594
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+0080
+0040
+FFE0
+0040
+0080
+ENDCHAR
+STARTCHAR 0x2193
+ENCODING 8595
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+20
+20
+20
+20
+20
+20
+20
+A8
+70
+20
+ENDCHAR
+STARTCHAR 0x2194
+ENCODING 8596
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+2080
+4040
+FFE0
+4040
+2080
+ENDCHAR
+STARTCHAR 0x2195
+ENCODING 8597
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+70
+A8
+20
+20
+20
+20
+20
+A8
+70
+20
+ENDCHAR
+STARTCHAR 0x2196
+ENCODING 8598
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+F000
+C000
+A000
+9000
+0800
+0400
+0200
+0100
+0080
+ENDCHAR
+STARTCHAR 0x2197
+ENCODING 8599
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+0780
+0180
+0280
+0480
+0800
+1000
+2000
+4000
+8000
+ENDCHAR
+STARTCHAR 0x2198
+ENCODING 8600
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+8000
+4000
+2000
+1000
+0800
+0480
+0280
+0180
+0780
+ENDCHAR
+STARTCHAR 0x2199
+ENCODING 8601
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+0080
+0100
+0200
+0400
+0800
+9000
+A000
+C000
+F000
+ENDCHAR
+STARTCHAR 0x219A
+ENCODING 8602
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+2080
+4100
+FFE0
+4200
+2400
+ENDCHAR
+STARTCHAR 0x219B
+ENCODING 8603
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+0480
+0840
+FFE0
+1040
+2080
+ENDCHAR
+STARTCHAR 0x219C
+ENCODING 8604
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 4 1 5
+BITMAP
+F000
+C1C0
+A220
+9C10
+ENDCHAR
+STARTCHAR 0x219D
+ENCODING 8605
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 4 1 5
+BITMAP
+00F0
+3830
+4450
+8390
+ENDCHAR
+STARTCHAR 0x219E
+ENCODING 8606
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+2800
+5000
+FFE0
+5000
+2800
+ENDCHAR
+STARTCHAR 0x219F
+ENCODING 8607
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+70
+A8
+70
+A8
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x21A0
+ENCODING 8608
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+0280
+0140
+FFE0
+0140
+0280
+ENDCHAR
+STARTCHAR 0x21A1
+ENCODING 8609
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+20
+20
+20
+20
+20
+A8
+70
+A8
+70
+20
+ENDCHAR
+STARTCHAR 0x21A2
+ENCODING 8610
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+2060
+4180
+FF00
+4180
+2060
+ENDCHAR
+STARTCHAR 0x21A3
+ENCODING 8611
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+C080
+3040
+1FE0
+3040
+C080
+ENDCHAR
+STARTCHAR 0x21A4
+ENCODING 8612
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+0020
+2020
+4020
+FFE0
+4020
+2020
+0020
+ENDCHAR
+STARTCHAR 0x21A5
+ENCODING 8613
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+10
+38
+54
+10
+10
+10
+10
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0x21A6
+ENCODING 8614
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+8000
+8080
+8040
+FFE0
+8040
+8080
+8000
+ENDCHAR
+STARTCHAR 0x21A7
+ENCODING 8615
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+FE
+10
+10
+10
+10
+10
+10
+10
+54
+38
+10
+ENDCHAR
+STARTCHAR 0x21A8
+ENCODING 8616
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+10
+38
+54
+10
+10
+10
+10
+10
+54
+38
+FE
+ENDCHAR
+STARTCHAR 0x21A9
+ENCODING 8617
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 4
+BITMAP
+01C0
+0020
+2020
+4020
+FFC0
+4000
+2000
+ENDCHAR
+STARTCHAR 0x21AA
+ENCODING 8618
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 4
+BITMAP
+7000
+8000
+8080
+8040
+7FE0
+0040
+0080
+ENDCHAR
+STARTCHAR 0x21AB
+ENCODING 8619
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 4
+BITMAP
+01C0
+0220
+2220
+4220
+FFC0
+4200
+2200
+ENDCHAR
+STARTCHAR 0x21AC
+ENCODING 8620
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 4
+BITMAP
+7000
+8800
+8880
+8840
+7FE0
+0840
+0880
+ENDCHAR
+STARTCHAR 0x21AD
+ENCODING 8621
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 5 1 4
+BITMAP
+2640
+4920
+E970
+50A0
+2040
+ENDCHAR
+STARTCHAR 0x21AE
+ENCODING 8622
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 5 1 4
+BITMAP
+2140
+4220
+FFF0
+4420
+2840
+ENDCHAR
+STARTCHAR 0x21AF
+ENCODING 8623
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 11 1 1
+BITMAP
+10
+10
+20
+40
+B0
+D0
+20
+A0
+A0
+C0
+F0
+ENDCHAR
+STARTCHAR 0x21B0
+ENCODING 8624
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 1
+BITMAP
+20
+40
+FC
+44
+24
+04
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x21B1
+ENCODING 8625
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 1
+BITMAP
+10
+08
+FC
+88
+90
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x21B2
+ENCODING 8626
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 1
+BITMAP
+04
+04
+04
+04
+04
+04
+24
+44
+FC
+40
+20
+ENDCHAR
+STARTCHAR 0x21B3
+ENCODING 8627
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 1
+BITMAP
+80
+80
+80
+80
+80
+80
+90
+88
+FC
+08
+10
+ENDCHAR
+STARTCHAR 0x21B4
+ENCODING 8628
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 6 1 2
+BITMAP
+FC
+04
+04
+15
+0E
+04
+ENDCHAR
+STARTCHAR 0x21B5
+ENCODING 8629
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 8 1 1
+BITMAP
+04
+04
+04
+24
+44
+FC
+40
+20
+ENDCHAR
+STARTCHAR 0x21B6
+ENCODING 8630
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 8 1 1
+BITMAP
+0F80
+1040
+2020
+2020
+2020
+A820
+7000
+2000
+ENDCHAR
+STARTCHAR 0x21B7
+ENCODING 8631
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 8 1 1
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+82A0
+01C0
+0080
+ENDCHAR
+STARTCHAR 0x21B8
+ENCODING 8632
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 1
+BITMAP
+FF80
+0000
+F000
+C000
+A000
+9000
+0800
+0400
+0200
+0100
+0080
+ENDCHAR
+STARTCHAR 0x21B9
+ENCODING 8633
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 13 1 0
+BITMAP
+8000
+9000
+A000
+FFF0
+A000
+9000
+8010
+0090
+0050
+FFF0
+0050
+0090
+0010
+ENDCHAR
+STARTCHAR 0x21BA
+ENCODING 8634
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 2
+BITMAP
+03C0
+4300
+8280
+8280
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x21BB
+ENCODING 8635
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 7 1 2
+BITMAP
+F000
+3080
+5040
+5040
+4040
+2080
+1F00
+ENDCHAR
+STARTCHAR 0x21BC
+ENCODING 8636
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 3 1 6
+BITMAP
+2000
+4000
+FFE0
+ENDCHAR
+STARTCHAR 0x21BD
+ENCODING 8637
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 3 1 6
+BITMAP
+FFE0
+4000
+2000
+ENDCHAR
+STARTCHAR 0x21BE
+ENCODING 8638
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 11 1 1
+BITMAP
+80
+C0
+A0
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x21BF
+ENCODING 8639
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 11 1 1
+BITMAP
+20
+60
+A0
+20
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x21C0
+ENCODING 8640
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 3 1 6
+BITMAP
+0080
+0040
+FFE0
+ENDCHAR
+STARTCHAR 0x21C1
+ENCODING 8641
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 3 1 6
+BITMAP
+FFE0
+0040
+0080
+ENDCHAR
+STARTCHAR 0x21C2
+ENCODING 8642
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 11 1 1
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+A0
+C0
+80
+ENDCHAR
+STARTCHAR 0x21C3
+ENCODING 8643
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 11 1 1
+BITMAP
+20
+20
+20
+20
+20
+20
+20
+20
+A0
+60
+20
+ENDCHAR
+STARTCHAR 0x21C4
+ENCODING 8644
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+0080
+0040
+FFE0
+0040
+0080
+0000
+2000
+4000
+FFE0
+4000
+2000
+ENDCHAR
+STARTCHAR 0x21C5
+ENCODING 8645
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+2080
+7080
+A880
+2080
+2080
+2080
+2080
+2080
+22A0
+21C0
+2080
+ENDCHAR
+STARTCHAR 0x21C6
+ENCODING 8646
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+2000
+4000
+FFE0
+4000
+2000
+0000
+0080
+0040
+FFE0
+0040
+0080
+ENDCHAR
+STARTCHAR 0x21C7
+ENCODING 8647
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+2000
+4000
+FFE0
+4000
+2000
+0000
+2000
+4000
+FFE0
+4000
+2000
+ENDCHAR
+STARTCHAR 0x21C8
+ENCODING 8648
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+2080
+71C0
+AAA0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+ENDCHAR
+STARTCHAR 0x21C9
+ENCODING 8649
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+0080
+0040
+FFE0
+0040
+0080
+0000
+0080
+0040
+FFE0
+0040
+0080
+ENDCHAR
+STARTCHAR 0x21CA
+ENCODING 8650
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+AAA0
+71C0
+2080
+ENDCHAR
+STARTCHAR 0x21CB
+ENCODING 8651
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 8 1 3
+BITMAP
+2000
+4000
+FFE0
+0000
+0000
+FFE0
+0040
+0080
+ENDCHAR
+STARTCHAR 0x21CC
+ENCODING 8652
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 8 1 3
+BITMAP
+0080
+0040
+FFE0
+0000
+0000
+FFE0
+4000
+2000
+ENDCHAR
+STARTCHAR 0x21CD
+ENCODING 8653
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+1080
+2080
+7FE0
+8100
+7FE0
+2200
+1200
+ENDCHAR
+STARTCHAR 0x21CE
+ENCODING 8654
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 7 1 3
+BITMAP
+1140
+2120
+7FF0
+8208
+7FF0
+2420
+1440
+ENDCHAR
+STARTCHAR 0x21CF
+ENCODING 8655
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+0900
+0880
+FFC0
+1020
+FFC0
+2080
+2100
+ENDCHAR
+STARTCHAR 0x21D0
+ENCODING 8656
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+1000
+2000
+7FE0
+8000
+7FE0
+2000
+1000
+ENDCHAR
+STARTCHAR 0x21D1
+ENCODING 8657
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+10
+28
+6C
+AA
+28
+28
+28
+28
+28
+28
+28
+ENDCHAR
+STARTCHAR 0x21D2
+ENCODING 8658
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+0100
+0080
+FFC0
+0020
+FFC0
+0080
+0100
+ENDCHAR
+STARTCHAR 0x21D3
+ENCODING 8659
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+28
+28
+28
+28
+28
+28
+28
+AA
+6C
+28
+10
+ENDCHAR
+STARTCHAR 0x21D4
+ENCODING 8660
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 7 1 3
+BITMAP
+1080
+2040
+7FE0
+8010
+7FE0
+2040
+1080
+ENDCHAR
+STARTCHAR 0x21D5
+ENCODING 8661
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+10
+28
+6C
+AA
+28
+28
+28
+28
+AA
+6C
+28
+10
+ENDCHAR
+STARTCHAR 0x21D6
+ENCODING 8662
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 1
+BITMAP
+F800
+9000
+8800
+C400
+A200
+1100
+0880
+0440
+0200
+0100
+ENDCHAR
+STARTCHAR 0x21D7
+ENCODING 8663
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 1
+BITMAP
+07C0
+0240
+0440
+08C0
+1140
+2200
+4400
+8800
+1000
+2000
+ENDCHAR
+STARTCHAR 0x21D8
+ENCODING 8664
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 1
+BITMAP
+2000
+1000
+8800
+4400
+2200
+1140
+08C0
+0440
+0240
+07C0
+ENDCHAR
+STARTCHAR 0x21D9
+ENCODING 8665
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 1
+BITMAP
+0100
+0200
+0440
+0880
+1100
+A200
+C400
+8800
+9000
+F800
+ENDCHAR
+STARTCHAR 0x21DA
+ENCODING 8666
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+1000
+3FE0
+4000
+FFE0
+4000
+3FE0
+1000
+ENDCHAR
+STARTCHAR 0x21DB
+ENCODING 8667
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 7 1 3
+BITMAP
+0100
+FF80
+0040
+FFE0
+0040
+FF80
+0100
+ENDCHAR
+STARTCHAR 0x21DC
+ENCODING 8668
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 5 1 4
+BITMAP
+2000
+4880
+F550
+4220
+2000
+ENDCHAR
+STARTCHAR 0x21DD
+ENCODING 8669
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 5 1 4
+BITMAP
+0040
+1120
+AAF0
+4420
+0040
+ENDCHAR
+STARTCHAR 0x21DE
+ENCODING 8670
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+70
+A8
+20
+20
+F8
+20
+F8
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x21DF
+ENCODING 8671
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+20
+20
+F8
+20
+F8
+20
+20
+A8
+70
+20
+ENDCHAR
+STARTCHAR 0x21E0
+ENCODING 8672
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+2000
+4000
+EEE0
+4000
+2000
+ENDCHAR
+STARTCHAR 0x21E1
+ENCODING 8673
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+70
+A8
+00
+20
+20
+20
+00
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x21E2
+ENCODING 8674
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 4
+BITMAP
+0080
+0040
+EEE0
+0040
+0080
+ENDCHAR
+STARTCHAR 0x21E3
+ENCODING 8675
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 1
+BITMAP
+20
+20
+20
+00
+20
+20
+20
+00
+A8
+70
+20
+ENDCHAR
+STARTCHAR 0x21E4
+ENCODING 8676
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 7 1 3
+BITMAP
+8000
+9000
+A000
+FFF0
+A000
+9000
+8000
+ENDCHAR
+STARTCHAR 0x21E5
+ENCODING 8677
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 7 1 3
+BITMAP
+0010
+0090
+0050
+FFF0
+0050
+0090
+0010
+ENDCHAR
+STARTCHAR 0x21E6
+ENCODING 8678
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 9 1 2
+BITMAP
+0800
+1800
+2FFF
+4001
+8001
+4001
+2FFF
+1800
+0800
+ENDCHAR
+STARTCHAR 0x21E7
+ENCODING 8679
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+0800
+1400
+2200
+4100
+E380
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+3E00
+ENDCHAR
+STARTCHAR 0x21E8
+ENCODING 8680
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 9 1 2
+BITMAP
+0010
+0018
+FFF4
+8002
+8001
+8002
+FFF4
+0018
+0010
+ENDCHAR
+STARTCHAR 0x21E9
+ENCODING 8681
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+3E00
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+E380
+4100
+2200
+1400
+0800
+ENDCHAR
+STARTCHAR 0x21EA
+ENCODING 8682
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 17 1 0
+BITMAP
+0800
+1400
+2200
+4100
+E380
+2200
+2200
+2200
+2200
+2200
+2200
+3E00
+0000
+3E00
+2200
+2200
+3E00
+ENDCHAR
+STARTCHAR 0x21E7
+ENCODING 8683
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+0800
+1400
+2200
+4100
+E380
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+E380
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x21E7
+ENCODING 8684
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+0800
+1400
+3E00
+4100
+E380
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+E380
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x21E7
+ENCODING 8685
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+0800
+1C00
+2A00
+4900
+EB80
+2A00
+2A00
+2A00
+2A00
+2A00
+2A00
+2A00
+2A00
+EB80
+8880
+FF80
+ENDCHAR
+STARTCHAR 0x21E7
+ENCODING 8686
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+0800
+1400
+2200
+4900
+F780
+2200
+4100
+E380
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+3E00
+ENDCHAR
+STARTCHAR 0x21E7
+ENCODING 8687
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+0800
+1400
+2200
+4900
+F780
+2200
+4100
+E380
+2200
+2200
+2200
+2200
+2200
+E380
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x21E8
+ENCODING 8688
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 9 1 2
+BITMAP
+E010
+A018
+BFF4
+8002
+8001
+8002
+BFF4
+A018
+E010
+ENDCHAR
+STARTCHAR 0x2196
+ENCODING 8689
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+FFE0
+8000
+BC00
+B000
+A800
+A400
+8200
+8100
+8080
+8040
+8020
+ENDCHAR
+STARTCHAR 0x2196
+ENCODING 8690
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 1
+BITMAP
+8020
+4020
+2020
+1020
+0820
+04A0
+02A0
+01A0
+07A0
+0020
+FFE0
+ENDCHAR
+STARTCHAR 0x21E9
+ENCODING 8691
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 16 1 1
+BITMAP
+0800
+1400
+2200
+4100
+E380
+2200
+2200
+2200
+2200
+2200
+2200
+E380
+4100
+2200
+1400
+0800
+ENDCHAR
+STARTCHAR 0x2200
+ENCODING 8704
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+8020
+8020
+4040
+4040
+3F80
+2080
+1100
+1100
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x2201
+ENCODING 8705
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+78
+84
+84
+80
+80
+80
+80
+80
+84
+84
+78
+ENDCHAR
+STARTCHAR 0x2202
+ENCODING 8706
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 1 0
+BITMAP
+60
+10
+10
+08
+38
+48
+88
+88
+88
+90
+60
+ENDCHAR
+STARTCHAR 0x2203
+ENCODING 8707
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+FF
+01
+01
+01
+01
+FF
+01
+01
+01
+01
+FF
+ENDCHAR
+STARTCHAR 0x2204
+ENCODING 8708
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 15 1 -2
+BITMAP
+02
+02
+FF
+05
+05
+05
+09
+FF
+09
+09
+11
+11
+FF
+20
+20
+ENDCHAR
+STARTCHAR 0x2205
+ENCODING 8709
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+1F20
+20C0
+40C0
+8120
+8220
+8420
+8820
+9020
+6040
+6080
+9F00
+ENDCHAR
+STARTCHAR 0x2206
+ENCODING 8710
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0400
+0E00
+0E00
+1300
+1300
+2180
+2180
+40C0
+40C0
+8060
+FFE0
+ENDCHAR
+STARTCHAR 0x2207
+ENCODING 8711
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+FFE0
+8060
+40C0
+40C0
+2180
+2180
+1300
+1300
+0E00
+0E00
+0400
+ENDCHAR
+STARTCHAR 0x2208
+ENCODING 8712
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+1F
+20
+40
+80
+80
+FF
+80
+80
+40
+20
+1F
+ENDCHAR
+STARTCHAR 0x2209
+ENCODING 8713
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 15 1 -2
+BITMAP
+02
+02
+1F
+24
+44
+84
+88
+FF
+88
+88
+50
+30
+1F
+20
+20
+ENDCHAR
+STARTCHAR 0x220A
+ENCODING 8714
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+3E
+40
+80
+FE
+80
+40
+3E
+ENDCHAR
+STARTCHAR 0x220B
+ENCODING 8715
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 1 0
+BITMAP
+F8
+04
+02
+01
+01
+FF
+01
+01
+02
+04
+F8
+ENDCHAR
+STARTCHAR 0x220C
+ENCODING 8716
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 15 1 -2
+BITMAP
+40
+40
+F8
+24
+22
+21
+11
+FF
+11
+11
+0A
+0C
+F8
+04
+04
+ENDCHAR
+STARTCHAR 0x220D
+ENCODING 8717
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+F8
+04
+02
+FE
+02
+04
+F8
+ENDCHAR
+STARTCHAR 0x220E
+ENCODING 8718
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 1
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR 0x220F
+ENCODING 8719
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FFE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+FBE0
+ENDCHAR
+STARTCHAR 0x2210
+ENCODING 8720
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 0 0
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+FFE0
+ENDCHAR
+STARTCHAR 0x2211
+ENCODING 8721
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+FF80
+4180
+2080
+2080
+1000
+1800
+1000
+2080
+2080
+4180
+FF80
+ENDCHAR
+STARTCHAR 0x2212
+ENCODING 8722
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 1 1 5
+BITMAP
+FE
+ENDCHAR
+STARTCHAR 0x2213
+ENCODING 8723
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 1
+BITMAP
+FE
+00
+10
+10
+10
+FE
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x2214
+ENCODING 8724
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 1
+BITMAP
+10
+38
+10
+00
+10
+10
+10
+FE
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x2215
+ENCODING 8725
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 16 1 -4
+BITMAP
+01
+01
+02
+02
+04
+04
+08
+08
+10
+10
+20
+20
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0x2216
+ENCODING 8726
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 0
+BITMAP
+80
+80
+40
+40
+20
+20
+10
+10
+08
+08
+04
+04
+ENDCHAR
+STARTCHAR 0x2217
+ENCODING 8727
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 7 1 2
+BITMAP
+10
+92
+54
+38
+54
+92
+10
+ENDCHAR
+STARTCHAR 0x2218
+ENCODING 8728
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 4 1 4
+BITMAP
+60
+90
+90
+60
+ENDCHAR
+STARTCHAR 0x2219
+ENCODING 8729
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 4 1 4
+BITMAP
+60
+F0
+F0
+60
+ENDCHAR
+STARTCHAR 0x221A
+ENCODING 8730
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0020
+0020
+0040
+0040
+F080
+3080
+1900
+1900
+0E00
+0E00
+0400
+ENDCHAR
+STARTCHAR 0x221B
+ENCODING 8731
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 0
+BITMAP
+0600
+0900
+0100
+0220
+0120
+0940
+0640
+F080
+3080
+1900
+1900
+0E00
+0E00
+0400
+ENDCHAR
+STARTCHAR 0x221C
+ENCODING 8732
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 14 1 0
+BITMAP
+0200
+0600
+0A00
+1220
+1F20
+0240
+0740
+F080
+3080
+1900
+1900
+0E00
+0E00
+0400
+ENDCHAR
+STARTCHAR 0x221D
+ENCODING 8733
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 5 1 3
+BITMAP
+7180
+8A00
+8400
+8A00
+7180
+ENDCHAR
+STARTCHAR 0x221E
+ENCODING 8734
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 5 1 3
+BITMAP
+71C0
+8A20
+8420
+8A20
+71C0
+ENDCHAR
+STARTCHAR 0x221F
+ENCODING 8735
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 7 1 2
+BITMAP
+80
+80
+80
+80
+80
+80
+FE
+ENDCHAR
+STARTCHAR 0x2220
+ENCODING 8736
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 7 1 2
+BITMAP
+04
+08
+10
+20
+40
+80
+FE
+ENDCHAR
+STARTCHAR 0x2221
+ENCODING 8737
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 9 1 0
+BITMAP
+04
+68
+10
+28
+44
+84
+FF
+04
+04
+ENDCHAR
+STARTCHAR 0x2222
+ENCODING 8738
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 1
+BITMAP
+20
+16
+18
+68
+88
+68
+18
+16
+20
+ENDCHAR
+STARTCHAR 0x2223
+ENCODING 8739
+SWIDTH 180 0
+DWIDTH 3 0
+BBX 1 12 1 0
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x2224
+ENCODING 8740
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 12 1 0
+BITMAP
+20
+20
+20
+28
+30
+20
+60
+A0
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0x2225
+ENCODING 8741
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 12 1 0
+BITMAP
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR 0x2226
+ENCODING 8742
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+28
+28
+2A
+2C
+28
+38
+28
+68
+A8
+28
+28
+28
+ENDCHAR
+STARTCHAR 0x2227
+ENCODING 8743
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0400
+0A00
+0A00
+1100
+1100
+2080
+2080
+4040
+4040
+8020
+8020
+ENDCHAR
+STARTCHAR 0x2228
+ENCODING 8744
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+8020
+8020
+4040
+4040
+2080
+2080
+1100
+1100
+0A00
+0A00
+0400
+ENDCHAR
+STARTCHAR 0x2229
+ENCODING 8745
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+3C
+42
+81
+81
+81
+81
+81
+81
+81
+81
+81
+ENDCHAR
+STARTCHAR 0x222A
+ENCODING 8746
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+81
+81
+81
+81
+81
+81
+81
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0x222B
+ENCODING 8747
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 19 1 -4
+BITMAP
+0E
+12
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x222C
+ENCODING 8748
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 19 1 -4
+BITMAP
+0E70
+1290
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+1080
+9480
+E700
+ENDCHAR
+STARTCHAR 0x222D
+ENCODING 8749
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 19 1 -4
+BITMAP
+0E7380
+129480
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+108400
+94A400
+E73800
+ENDCHAR
+STARTCHAR 0x222E
+ENCODING 8750
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 19 1 -4
+BITMAP
+0E
+12
+10
+10
+10
+10
+38
+54
+92
+92
+92
+54
+38
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x222F
+ENCODING 8751
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 19 1 -4
+BITMAP
+0E70
+1290
+1080
+1080
+1080
+1080
+3FC0
+50A0
+9090
+9090
+9090
+50A0
+3FC0
+1080
+1080
+1080
+1080
+9480
+E700
+ENDCHAR
+STARTCHAR 0x2230
+ENCODING 8752
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 19 1 -4
+BITMAP
+0E7380
+129480
+108400
+108400
+108400
+108400
+3FFE00
+508500
+908480
+908480
+908480
+508500
+3FFE00
+108400
+108400
+108400
+108400
+94A400
+E73800
+ENDCHAR
+STARTCHAR 0x2231
+ENCODING 8753
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 19 1 -4
+BITMAP
+0E
+12
+10
+10
+10
+10
+10
+7D
+93
+17
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0x2232
+ENCODING 8754
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 19 1 -4
+BITMAP
+0700
+0900
+0800
+0800
+0800
+0800
+3E80
+4980
+8B80
+8880
+8880
+4900
+3E00
+0800
+0800
+0800
+0800
+4800
+7000
+ENDCHAR
+STARTCHAR 0x2233
+ENCODING 8755
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 19 1 -4
+BITMAP
+0700
+0900
+0800
+0800
+0800
+0800
+3F80
+4B00
+8A80
+8880
+8880
+4900
+3E00
+0800
+0800
+0800
+0800
+4800
+7000
+ENDCHAR
+STARTCHAR 0x2234
+ENCODING 8756
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+0200
+0700
+0200
+0000
+0000
+0000
+0000
+0000
+4010
+E038
+4010
+ENDCHAR
+STARTCHAR 0x2235
+ENCODING 8757
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+4010
+E038
+4010
+0000
+0000
+0000
+0000
+0000
+0200
+0700
+0200
+ENDCHAR
+STARTCHAR 0x2236
+ENCODING 8758
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 11 1 0
+BITMAP
+40
+E0
+40
+00
+00
+00
+00
+00
+40
+E0
+40
+ENDCHAR
+STARTCHAR 0x2237
+ENCODING 8759
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 11 1 0
+BITMAP
+4010
+E038
+4010
+0000
+0000
+0000
+0000
+0000
+4010
+E038
+4010
+ENDCHAR
+STARTCHAR 0x2238
+ENCODING 8760
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 5 1 5
+BITMAP
+0800
+1C00
+0800
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x2239
+ENCODING 8761
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 9 1 1
+BITMAP
+0080
+01C0
+0080
+0000
+FE00
+0000
+0080
+01C0
+0080
+ENDCHAR
+STARTCHAR 0x223A
+ENCODING 8762
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 9 1 1
+BITMAP
+4080
+E1C0
+4080
+0000
+FFC0
+0000
+4080
+E1C0
+4080
+ENDCHAR
+STARTCHAR 0x223B
+ENCODING 8763
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 10 10 1 1
+BITMAP
+0400
+0E00
+0400
+0000
+7840
+8780
+0000
+0400
+0E00
+0400
+ENDCHAR
+STARTCHAR 0x223C
+ENCODING 8764
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 2 1 6
+BITMAP
+7840
+8780
+ENDCHAR
+STARTCHAR 0x223D
+ENCODING 8765
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 2 1 6
+BITMAP
+8780
+7840
+ENDCHAR
+STARTCHAR 0x223E
+ENCODING 8766
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 4 1 4
+BITMAP
+7080
+8840
+8440
+4380
+ENDCHAR
+STARTCHAR 0x223F
+ENCODING 8767
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 8 1 2
+BITMAP
+7000
+8800
+8800
+8800
+0440
+0440
+0440
+0380
+ENDCHAR
+STARTCHAR 0x2240
+ENCODING 8768
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 10 1 2
+BITMAP
+80
+40
+40
+40
+40
+80
+80
+80
+80
+40
+ENDCHAR
+STARTCHAR 0x2241
+ENCODING 8769
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 6 1 4
+BITMAP
+0200
+0200
+7C40
+8780
+0800
+0800
+ENDCHAR
+STARTCHAR 0x2242
+ENCODING 8770
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 4 1 4
+BITMAP
+FFC0
+0000
+7840
+8780
+ENDCHAR
+STARTCHAR 0x2243
+ENCODING 8771
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 4 1 4
+BITMAP
+7840
+8780
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x2244
+ENCODING 8772
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 8 1 2
+BITMAP
+0200
+0200
+7C40
+8780
+0800
+FFC0
+1000
+1000
+ENDCHAR
+STARTCHAR 0x2245
+ENCODING 8773
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 6 1 3
+BITMAP
+7840
+8780
+0000
+FFC0
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x2246
+ENCODING 8774
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 8 1 1
+BITMAP
+7840
+8780
+0400
+FFC0
+0800
+FFC0
+1000
+1000
+ENDCHAR
+STARTCHAR 0x2247
+ENCODING 8775
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 9 1 1
+BITMAP
+0200
+7A40
+8780
+0400
+FFC0
+0800
+FFC0
+1000
+1000
+ENDCHAR
+STARTCHAR 0x2248
+ENCODING 8776
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 5 1 3
+BITMAP
+7840
+8780
+0000
+7840
+8780
+ENDCHAR
+STARTCHAR 0x2249
+ENCODING 8777
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 8 1 1
+BITMAP
+0200
+7A40
+8780
+0400
+7C40
+8F80
+0800
+0800
+ENDCHAR
+STARTCHAR 0x224A
+ENCODING 8778
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 7 1 3
+BITMAP
+7840
+8780
+0000
+7840
+8780
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x224B
+ENCODING 8779
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 8 1 2
+BITMAP
+7840
+8780
+0000
+7840
+8780
+0000
+7840
+8780
+ENDCHAR
+STARTCHAR 0x224C
+ENCODING 8780
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 8 1 2
+BITMAP
+7080
+8840
+8440
+4380
+0000
+FFC0
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x224D
+ENCODING 8781
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 5 1 3
+BITMAP
+C0C0
+3F00
+0000
+3F00
+C0C0
+ENDCHAR
+STARTCHAR 0x224E
+ENCODING 8782
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 7 1 2
+BITMAP
+0C00
+1200
+F3C0
+0000
+F3C0
+1200
+0C00
+ENDCHAR
+STARTCHAR 0x224F
+ENCODING 8783
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 5 1 4
+BITMAP
+0C00
+1200
+F3C0
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x2250
+ENCODING 8784
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 8 1 4
+BITMAP
+0800
+1C00
+0800
+0000
+FF80
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x2251
+ENCODING 8785
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+0800
+1C00
+0800
+0000
+FF80
+0000
+0000
+FF80
+0000
+0800
+1C00
+0800
+ENDCHAR
+STARTCHAR 0x2252
+ENCODING 8786
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+4000
+E000
+4000
+0000
+FF80
+0000
+0000
+FF80
+0000
+0100
+0380
+0100
+ENDCHAR
+STARTCHAR 0x2253
+ENCODING 8787
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+0100
+0380
+0100
+0000
+FF80
+0000
+0000
+FF80
+0000
+4000
+E000
+4000
+ENDCHAR
+STARTCHAR 0x2254
+ENCODING 8788
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 7 1 2
+BITMAP
+4000
+EFF8
+4000
+0000
+4000
+EFF8
+4000
+ENDCHAR
+STARTCHAR 0x2255
+ENCODING 8789
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 7 1 2
+BITMAP
+0010
+FFB8
+0010
+0000
+0010
+FFB8
+0010
+ENDCHAR
+STARTCHAR 0x2256
+ENCODING 8790
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 4 1 4
+BITMAP
+FF80
+1400
+1400
+FF80
+ENDCHAR
+STARTCHAR 0x2257
+ENCODING 8791
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 9 1 4
+BITMAP
+0C00
+1200
+1200
+0C00
+0000
+FFC0
+0000
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x2258
+ENCODING 8792
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 7 1 4
+BITMAP
+1E00
+2100
+0000
+FFC0
+0000
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x2259
+ENCODING 8793
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 9 1 4
+BITMAP
+0800
+1400
+2200
+4100
+0000
+FF80
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x225A
+ENCODING 8794
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 9 1 4
+BITMAP
+4100
+2200
+1400
+0800
+0000
+FF80
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x225B
+ENCODING 8795
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 10 1 4
+BITMAP
+0800
+0800
+3E00
+1C00
+3600
+0000
+FF80
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x225C
+ENCODING 8796
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 10 1 4
+BITMAP
+0800
+1400
+2200
+4100
+7F00
+0000
+FF80
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x225D
+ENCODING 8797
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 12 1 4
+BITMAP
+1040
+10A0
+1480
+7BC0
+9E80
+9880
+7680
+0000
+FFE0
+0000
+0000
+FFE0
+ENDCHAR
+STARTCHAR 0x225E
+ENCODING 8798
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 10 1 4
+BITMAP
+F600
+4900
+4900
+4900
+4900
+0000
+FF80
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x225F
+ENCODING 8799
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 12 1 4
+BITMAP
+1800
+2400
+0C00
+1000
+1000
+0000
+1000
+0000
+FF80
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x2260
+ENCODING 8800
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 8 1 2
+BITMAP
+0400
+0400
+FF80
+0800
+0800
+FF80
+1000
+1000
+ENDCHAR
+STARTCHAR 0x2261
+ENCODING 8801
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 5 1 3
+BITMAP
+FF80
+0000
+FF80
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x2262
+ENCODING 8802
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 9 1 1
+BITMAP
+0400
+0400
+FF80
+0800
+FF80
+1000
+FF80
+2000
+2000
+ENDCHAR
+STARTCHAR 0x2263
+ENCODING 8803
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 7 1 3
+BITMAP
+FF80
+0000
+FF80
+0000
+FF80
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x2264
+ENCODING 8804
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+06
+18
+60
+80
+60
+18
+06
+00
+FE
+ENDCHAR
+STARTCHAR 0x2265
+ENCODING 8805
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+C0
+30
+0C
+02
+0C
+30
+C0
+00
+FE
+ENDCHAR
+STARTCHAR 0x2266
+ENCODING 8806
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+0E
+70
+80
+70
+0E
+00
+FE
+00
+FE
+ENDCHAR
+STARTCHAR 0x2267
+ENCODING 8807
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+E0
+1C
+02
+1C
+E0
+00
+FE
+00
+FE
+ENDCHAR
+STARTCHAR 0x2268
+ENCODING 8808
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 1
+BITMAP
+0E
+70
+80
+70
+0E
+10
+FE
+20
+FE
+40
+ENDCHAR
+STARTCHAR 0x2269
+ENCODING 8809
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 1
+BITMAP
+E0
+1C
+02
+1C
+E0
+08
+FE
+10
+FE
+20
+ENDCHAR
+STARTCHAR 0x226A
+ENCODING 8810
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 7 1 3
+BITMAP
+0630
+18C0
+6300
+8400
+6300
+18C0
+0630
+ENDCHAR
+STARTCHAR 0x226B
+ENCODING 8811
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 12 7 1 3
+BITMAP
+C600
+3180
+0C60
+0210
+0C60
+3180
+C600
+ENDCHAR
+STARTCHAR 0x226C
+ENCODING 8812
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 11 1 1
+BITMAP
+A0
+40
+A0
+A0
+A0
+A0
+A0
+A0
+A0
+40
+A0
+ENDCHAR
+STARTCHAR 0x226D
+ENCODING 8813
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 7 1 2
+BITMAP
+0200
+C2C0
+3F00
+0400
+3F00
+C8C0
+0800
+ENDCHAR
+STARTCHAR 0x226E
+ENCODING 8814
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 2
+BITMAP
+08
+08
+0E
+18
+70
+90
+60
+38
+26
+20
+ENDCHAR
+STARTCHAR 0x226F
+ENCODING 8815
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+08
+C8
+38
+14
+12
+1C
+30
+E0
+20
+ENDCHAR
+STARTCHAR 0x2270
+ENCODING 8816
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 1
+BITMAP
+08
+08
+0E
+18
+70
+90
+60
+B8
+66
+78
+46
+ENDCHAR
+STARTCHAR 0x2271
+ENCODING 8817
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+08
+C8
+38
+14
+12
+1C
+32
+EC
+30
+E0
+20
+ENDCHAR
+STARTCHAR 0x2272
+ENCODING 8818
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 10 1 1
+BITMAP
+06
+18
+60
+80
+60
+18
+06
+00
+71
+8E
+ENDCHAR
+STARTCHAR 0x2273
+ENCODING 8819
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 10 1 1
+BITMAP
+60
+18
+06
+01
+06
+18
+60
+00
+71
+8E
+ENDCHAR
+STARTCHAR 0x2274
+ENCODING 8820
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 0
+BITMAP
+04
+04
+06
+18
+68
+88
+70
+38
+16
+20
+71
+AE
+20
+ENDCHAR
+STARTCHAR 0x2275
+ENCODING 8821
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 0
+BITMAP
+02
+02
+62
+1C
+06
+05
+0E
+18
+68
+10
+71
+9E
+20
+ENDCHAR
+STARTCHAR 0x2276
+ENCODING 8822
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 1
+BITMAP
+0E
+70
+80
+70
+0E
+E0
+1C
+02
+1C
+E0
+ENDCHAR
+STARTCHAR 0x2277
+ENCODING 8823
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 10 1 1
+BITMAP
+E0
+1C
+02
+1C
+E0
+0E
+70
+80
+70
+0E
+ENDCHAR
+STARTCHAR 0x2278
+ENCODING 8824
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 1 -1
+BITMAP
+10
+10
+1E
+70
+90
+70
+1E
+F0
+1C
+12
+1C
+F0
+10
+10
+ENDCHAR
+STARTCHAR 0x2279
+ENCODING 8825
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 1 -1
+BITMAP
+10
+10
+F0
+1C
+12
+1C
+F0
+1E
+70
+90
+70
+1E
+10
+10
+ENDCHAR
+STARTCHAR 0x227A
+ENCODING 8826
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 2
+BITMAP
+0080
+0100
+0600
+3800
+C000
+3800
+0600
+0100
+0080
+ENDCHAR
+STARTCHAR 0x227B
+ENCODING 8827
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 2
+BITMAP
+8000
+4000
+3000
+0E00
+0180
+0E00
+3000
+4000
+8000
+ENDCHAR
+STARTCHAR 0x227C
+ENCODING 8828
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+0080
+0100
+0600
+3800
+C000
+3800
+C600
+3900
+0480
+0200
+0100
+ENDCHAR
+STARTCHAR 0x227D
+ENCODING 8829
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+8000
+4000
+3000
+0E00
+0180
+0E00
+3180
+4E00
+9000
+2000
+4000
+ENDCHAR
+STARTCHAR 0x227E
+ENCODING 8830
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 1
+BITMAP
+0040
+0080
+0300
+1C00
+6000
+1C00
+0300
+0080
+0040
+0000
+7840
+8780
+ENDCHAR
+STARTCHAR 0x227F
+ENCODING 8831
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 1 1
+BITMAP
+8000
+4000
+3000
+0E00
+0180
+0E00
+3000
+4000
+8000
+0000
+7840
+8780
+ENDCHAR
+STARTCHAR 0x2280
+ENCODING 8832
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 2
+BITMAP
+0400
+0480
+0500
+0E00
+3800
+C800
+3800
+1600
+1100
+1080
+ENDCHAR
+STARTCHAR 0x2281
+ENCODING 8833
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+8200
+4200
+3400
+0E00
+0980
+0E00
+3000
+5000
+A000
+2000
+ENDCHAR
+STARTCHAR 0x2282
+ENCODING 8834
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 9 1 2
+BITMAP
+3F
+40
+80
+80
+80
+80
+80
+40
+3F
+ENDCHAR
+STARTCHAR 0x2283
+ENCODING 8835
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 9 1 2
+BITMAP
+FC
+02
+01
+01
+01
+01
+01
+02
+FC
+ENDCHAR
+STARTCHAR 0x2284
+ENCODING 8836
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 0
+BITMAP
+02
+02
+3F
+44
+84
+88
+88
+90
+90
+60
+3F
+40
+40
+ENDCHAR
+STARTCHAR 0x2285
+ENCODING 8837
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 0
+BITMAP
+02
+02
+FC
+06
+09
+09
+11
+11
+21
+22
+FC
+40
+40
+ENDCHAR
+STARTCHAR 0x2286
+ENCODING 8838
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+3F
+40
+80
+80
+80
+80
+80
+40
+3F
+00
+FF
+ENDCHAR
+STARTCHAR 0x2287
+ENCODING 8839
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+FC
+02
+01
+01
+01
+01
+01
+02
+FC
+00
+FF
+ENDCHAR
+STARTCHAR 0x2288
+ENCODING 8840
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 14 1 -1
+BITMAP
+02
+02
+3F
+44
+84
+88
+88
+90
+90
+60
+3F
+40
+FF
+80
+ENDCHAR
+STARTCHAR 0x2289
+ENCODING 8841
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 14 1 -1
+BITMAP
+02
+02
+FC
+06
+09
+09
+11
+11
+21
+22
+FC
+40
+FF
+80
+ENDCHAR
+STARTCHAR 0x228A
+ENCODING 8842
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 12 1 -1
+BITMAP
+3F
+40
+80
+80
+80
+80
+80
+40
+3F
+08
+FF
+10
+ENDCHAR
+STARTCHAR 0x228B
+ENCODING 8843
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 12 1 -1
+BITMAP
+FC
+02
+01
+01
+01
+01
+01
+02
+FC
+08
+FF
+10
+ENDCHAR
+STARTCHAR 0x228C
+ENCODING 8844
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+8080
+8080
+8080
+8080
+9080
+B080
+FF80
+B080
+9080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x228D
+ENCODING 8845
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+8080
+8080
+8080
+8080
+8080
+9C80
+9C80
+9C80
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x228E
+ENCODING 8846
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+8080
+8080
+8080
+8080
+8880
+8880
+BE80
+8880
+8880
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x228F
+ENCODING 8847
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 10 1 2
+BITMAP
+FF
+80
+80
+80
+80
+80
+80
+80
+80
+FF
+ENDCHAR
+STARTCHAR 0x2290
+ENCODING 8848
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 10 1 2
+BITMAP
+FF
+01
+01
+01
+01
+01
+01
+01
+01
+FF
+ENDCHAR
+STARTCHAR 0x2291
+ENCODING 8849
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 12 1 0
+BITMAP
+FF
+80
+80
+80
+80
+80
+80
+80
+80
+FF
+00
+FF
+ENDCHAR
+STARTCHAR 0x2292
+ENCODING 8850
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 12 1 0
+BITMAP
+FF
+01
+01
+01
+01
+01
+01
+01
+01
+FF
+00
+FF
+ENDCHAR
+STARTCHAR 0x2293
+ENCODING 8851
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 10 1 2
+BITMAP
+FF80
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+ENDCHAR
+STARTCHAR 0x2294
+ENCODING 8852
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 10 1 2
+BITMAP
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x2295
+ENCODING 8853
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3260
+6230
+4210
+8208
+8208
+FFF8
+8208
+8208
+4210
+6230
+3260
+0F80
+ENDCHAR
+STARTCHAR 0x2296
+ENCODING 8854
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+4010
+8008
+8008
+FFF8
+8008
+8008
+4010
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x2297
+ENCODING 8855
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+5050
+8888
+8508
+8208
+8508
+8888
+5050
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x2298
+ENCODING 8856
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+4050
+8088
+8108
+8208
+8408
+8808
+5010
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x2299
+ENCODING 8857
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+4010
+8008
+8708
+8708
+8708
+8008
+4010
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x229A
+ENCODING 8858
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+4010
+8708
+8888
+8888
+8888
+8708
+4010
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x229B
+ENCODING 8859
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+4210
+9248
+8A88
+8708
+8A88
+9248
+4210
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x229C
+ENCODING 8860
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+4010
+8008
+9FC8
+8008
+9FC8
+8008
+4010
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x229D
+ENCODING 8861
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0F80
+3060
+6030
+4010
+8008
+8008
+9FC8
+8008
+8008
+4010
+6030
+3060
+0F80
+ENDCHAR
+STARTCHAR 0x229E
+ENCODING 8862
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+FFE0
+8420
+8420
+8420
+8420
+FFE0
+8420
+8420
+8420
+8420
+FFE0
+ENDCHAR
+STARTCHAR 0x229F
+ENCODING 8863
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+FFE0
+8020
+8020
+8020
+8020
+FFE0
+8020
+8020
+8020
+8020
+FFE0
+ENDCHAR
+STARTCHAR 0x22A0
+ENCODING 8864
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+FFE0
+C060
+A0A0
+9120
+8A20
+8420
+8A20
+9120
+A0A0
+C060
+FFE0
+ENDCHAR
+STARTCHAR 0x22A1
+ENCODING 8865
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+FFE0
+8020
+8020
+8020
+8420
+8E20
+8420
+8020
+8020
+8020
+FFE0
+ENDCHAR
+STARTCHAR 0x22A2
+ENCODING 8866
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+8000
+8000
+8000
+8000
+8000
+FFE0
+8000
+8000
+8000
+8000
+8000
+ENDCHAR
+STARTCHAR 0x22A3
+ENCODING 8867
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+0020
+0020
+0020
+0020
+0020
+FFE0
+0020
+0020
+0020
+0020
+0020
+ENDCHAR
+STARTCHAR 0x22A4
+ENCODING 8868
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+FFE0
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+ENDCHAR
+STARTCHAR 0x22A5
+ENCODING 8869
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+0400
+FFE0
+ENDCHAR
+STARTCHAR 0x22A6
+ENCODING 8870
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 1 0
+BITMAP
+80
+80
+80
+80
+80
+FC
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x22A7
+ENCODING 8871
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 12 1 0
+BITMAP
+80
+80
+80
+80
+FE
+80
+80
+FE
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x22A8
+ENCODING 8872
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 12 1 0
+BITMAP
+8000
+8000
+8000
+8000
+FFE0
+8000
+8000
+FFE0
+8000
+8000
+8000
+8000
+ENDCHAR
+STARTCHAR 0x22A9
+ENCODING 8873
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+9000
+9000
+9000
+9000
+9000
+9FE0
+9000
+9000
+9000
+9000
+9000
+ENDCHAR
+STARTCHAR 0x22AA
+ENCODING 8874
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+9200
+9200
+9200
+9200
+9200
+93E0
+9200
+9200
+9200
+9200
+9200
+ENDCHAR
+STARTCHAR 0x22AB
+ENCODING 8875
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 12 1 0
+BITMAP
+9000
+9000
+9000
+9000
+9FE0
+9000
+9000
+9FE0
+9000
+9000
+9000
+9000
+ENDCHAR
+STARTCHAR 0x22AC
+ENCODING 8876
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 14 1 -2
+BITMAP
+0080
+8080
+8100
+8100
+8200
+8200
+FFE0
+8400
+8800
+8800
+9000
+9000
+2000
+2000
+ENDCHAR
+STARTCHAR 0x22AD
+ENCODING 8877
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 16 1 -2
+BITMAP
+0080
+0080
+8100
+8100
+8200
+8200
+FFE0
+8400
+8400
+FFE0
+8800
+8800
+9000
+9000
+2000
+2000
+ENDCHAR
+STARTCHAR 0x22AE
+ENCODING 8878
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 14 1 -2
+BITMAP
+0040
+9040
+9080
+9080
+9100
+9100
+9FE0
+9200
+9400
+9400
+9800
+9800
+1000
+1000
+ENDCHAR
+STARTCHAR 0x22AF
+ENCODING 8879
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 16 1 -2
+BITMAP
+0040
+0040
+9080
+9080
+9100
+9100
+9FE0
+9200
+9200
+9FE0
+9400
+9400
+9800
+9800
+1000
+1000
+ENDCHAR
+STARTCHAR 0x22B0
+ENCODING 8880
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 1
+BITMAP
+02
+05
+01
+06
+38
+C0
+38
+06
+01
+05
+02
+ENDCHAR
+STARTCHAR 0x22B1
+ENCODING 8881
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 1
+BITMAP
+40
+A0
+80
+60
+1C
+03
+1C
+60
+80
+A0
+40
+ENDCHAR
+STARTCHAR 0x22B2
+ENCODING 8882
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 6 1 3
+BITMAP
+0380
+1C80
+E080
+E080
+1C80
+0380
+ENDCHAR
+STARTCHAR 0x22B3
+ENCODING 8883
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 6 1 3
+BITMAP
+E000
+9C00
+8380
+8380
+9C00
+E000
+ENDCHAR
+STARTCHAR 0x22B4
+ENCODING 8884
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 9 1 0
+BITMAP
+0380
+1C80
+E080
+E080
+1C80
+0380
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x22B5
+ENCODING 8885
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+E000
+9C00
+8380
+8380
+9C00
+E000
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0x22B6
+ENCODING 8886
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 5 1 3
+BITMAP
+6018
+903C
+9FFC
+903C
+6018
+ENDCHAR
+STARTCHAR 0x22B7
+ENCODING 8887
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 5 1 3
+BITMAP
+6018
+F024
+FFE4
+F024
+6018
+ENDCHAR
+STARTCHAR 0x22B8
+ENCODING 8888
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 5 1 3
+BITMAP
+00C0
+0120
+FF20
+0120
+00C0
+ENDCHAR
+STARTCHAR 0x22B9
+ENCODING 8889
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 13 13 1 0
+BITMAP
+0200
+0200
+0200
+0200
+0200
+0000
+F8F8
+0000
+0200
+0200
+0200
+0200
+0200
+ENDCHAR
+STARTCHAR 0x22BA
+ENCODING 8890
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 11 1 0
+BITMAP
+FE
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x22BB
+ENCODING 8891
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+82
+82
+44
+44
+28
+28
+10
+00
+FE
+ENDCHAR
+STARTCHAR 0x22BC
+ENCODING 8892
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+FE
+00
+10
+28
+28
+44
+44
+82
+82
+ENDCHAR
+STARTCHAR 0x22BD
+ENCODING 8893
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+FE
+00
+82
+82
+44
+44
+28
+28
+10
+ENDCHAR
+STARTCHAR 0x22BE
+ENCODING 8894
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+8000
+8000
+8000
+E000
+9800
+8400
+8200
+8200
+8100
+8100
+FFE0
+ENDCHAR
+STARTCHAR 0x22BF
+ENCODING 8895
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+0020
+0060
+00A0
+0120
+0220
+0420
+0820
+1020
+2020
+4020
+FFE0
+ENDCHAR
+STARTCHAR 0x22C0
+ENCODING 8896
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 8 1 3
+BITMAP
+0800
+1C00
+3600
+3600
+6300
+6300
+C180
+C180
+ENDCHAR
+STARTCHAR 0x22C1
+ENCODING 8897
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 8 1 3
+BITMAP
+C180
+C180
+6300
+6300
+3600
+3600
+1C00
+0800
+ENDCHAR
+STARTCHAR 0x22C2
+ENCODING 8898
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 3
+BITMAP
+38
+7C
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+ENDCHAR
+STARTCHAR 0x22C3
+ENCODING 8899
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 3
+BITMAP
+C6
+C6
+C6
+C6
+C6
+C6
+C6
+7C
+38
+ENDCHAR
+STARTCHAR 0x22C4
+ENCODING 8900
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 10 1 2
+BITMAP
+20
+20
+50
+50
+88
+88
+50
+50
+20
+20
+ENDCHAR
+STARTCHAR 0x22C5
+ENCODING 8901
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 2 2 1 5
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0x22C6
+ENCODING 8902
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 5 1 4
+BITMAP
+20
+20
+F8
+70
+D8
+ENDCHAR
+STARTCHAR 0x22C7
+ENCODING 8903
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+8420
+4E40
+2480
+1100
+0A00
+FFE0
+0A00
+1100
+2480
+4E40
+8420
+ENDCHAR
+STARTCHAR 0x22C8
+ENCODING 8904
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+8020
+C060
+A0A0
+9120
+8A20
+8420
+8A20
+9120
+A0A0
+C060
+8020
+ENDCHAR
+STARTCHAR 0x22C9
+ENCODING 8905
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+8020
+C040
+A080
+9100
+8A00
+8400
+8A00
+9100
+A080
+C040
+8020
+ENDCHAR
+STARTCHAR 0x22CA
+ENCODING 8906
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+8020
+4060
+20A0
+1120
+0A20
+0420
+0A20
+1120
+20A0
+4060
+8020
+ENDCHAR
+STARTCHAR 0x22CB
+ENCODING 8907
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+8000
+4000
+2000
+1000
+0800
+0400
+0A00
+1100
+2080
+4040
+8020
+ENDCHAR
+STARTCHAR 0x22CC
+ENCODING 8908
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 0
+BITMAP
+0020
+0040
+0080
+0100
+0200
+0400
+0A00
+1100
+2080
+4040
+8020
+ENDCHAR
+STARTCHAR 0x22CD
+ENCODING 8909
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 4 1 4
+BITMAP
+8780
+7840
+0000
+FFC0
+ENDCHAR
+STARTCHAR 0x22CE
+ENCODING 8910
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 9 1 2
+BITMAP
+8080
+4100
+2200
+2200
+1400
+1400
+1400
+0800
+0800
+ENDCHAR
+STARTCHAR 0x22CF
+ENCODING 8911
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 9 1 2
+BITMAP
+0800
+0800
+1400
+1400
+1400
+2200
+2200
+4100
+8080
+ENDCHAR
+STARTCHAR 0x22D0
+ENCODING 8912
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 9 1 2
+BITMAP
+3F
+40
+9F
+A0
+A0
+A0
+9F
+40
+3F
+ENDCHAR
+STARTCHAR 0x22D1
+ENCODING 8913
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 9 1 2
+BITMAP
+FC
+02
+F9
+05
+05
+05
+F9
+02
+FC
+ENDCHAR
+STARTCHAR 0x22D2
+ENCODING 8914
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+3C
+42
+99
+A5
+A5
+A5
+A5
+A5
+A5
+A5
+A5
+ENDCHAR
+STARTCHAR 0x22D3
+ENCODING 8915
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+A5
+A5
+A5
+A5
+A5
+A5
+A5
+A5
+99
+42
+3C
+ENDCHAR
+STARTCHAR 0x22D4
+ENCODING 8916
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 13 1 0
+BITMAP
+10
+10
+10
+38
+54
+92
+92
+92
+92
+92
+92
+92
+92
+ENDCHAR
+STARTCHAR 0x22D5
+ENCODING 8917
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 12 1 0
+BITMAP
+1400
+1400
+1400
+1400
+FF80
+1400
+1400
+FF80
+1400
+1400
+1400
+1400
+ENDCHAR
+STARTCHAR 0x22D6
+ENCODING 8918
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 7 1 4
+BITMAP
+0380
+1C00
+6200
+8700
+6200
+1C00
+0380
+ENDCHAR
+STARTCHAR 0x22D7
+ENCODING 8919
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 7 1 4
+BITMAP
+E000
+1C00
+2300
+7080
+2300
+1C00
+E000
+ENDCHAR
+STARTCHAR 0x22D8
+ENCODING 8920
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+063180
+18C600
+631800
+842000
+631800
+18C600
+063180
+ENDCHAR
+STARTCHAR 0x22D9
+ENCODING 8921
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+C63000
+318C00
+0C6300
+021080
+0C6300
+318C00
+C63000
+ENDCHAR
+STARTCHAR 0x22DA
+ENCODING 8922
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 13 1 1
+BITMAP
+0E
+70
+80
+70
+0E
+00
+FE
+00
+E0
+1C
+02
+1C
+E0
+ENDCHAR
+STARTCHAR 0x22DB
+ENCODING 8923
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 13 1 1
+BITMAP
+E0
+1C
+02
+1C
+E0
+00
+FE
+00
+0E
+70
+80
+70
+0E
+ENDCHAR
+STARTCHAR 0x22DC
+ENCODING 8924
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+FE
+00
+06
+18
+60
+80
+60
+18
+06
+ENDCHAR
+STARTCHAR 0x22DD
+ENCODING 8925
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 9 1 2
+BITMAP
+FE
+00
+C0
+30
+0C
+02
+0C
+30
+C0
+ENDCHAR
+STARTCHAR 0x22DE
+ENCODING 8926
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+0100
+0200
+0480
+3900
+C600
+3800
+C000
+3800
+0600
+0100
+0080
+ENDCHAR
+STARTCHAR 0x22DF
+ENCODING 8927
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+4000
+2000
+9000
+4E00
+3180
+0E00
+0180
+0E00
+3000
+4000
+8000
+ENDCHAR
+STARTCHAR 0x22E0
+ENCODING 8928
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 0
+BITMAP
+0400
+0480
+0500
+0E00
+3800
+C800
+3800
+D600
+3900
+1480
+1200
+0100
+ENDCHAR
+STARTCHAR 0x22E1
+ENCODING 8929
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 1 0
+BITMAP
+8200
+4200
+3400
+0E00
+0980
+0E00
+3180
+5E00
+9000
+2000
+6000
+ENDCHAR
+STARTCHAR 0x22E2
+ENCODING 8930
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 16 1 -2
+BITMAP
+02
+02
+FF
+84
+84
+84
+88
+88
+88
+88
+90
+FF
+10
+FF
+20
+20
+ENDCHAR
+STARTCHAR 0x22E3
+ENCODING 8931
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 16 1 -2
+BITMAP
+40
+40
+FF
+21
+21
+21
+11
+11
+11
+11
+09
+FF
+08
+FF
+04
+04
+ENDCHAR
+STARTCHAR 0x22E4
+ENCODING 8932
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 -1
+BITMAP
+FF
+80
+80
+80
+80
+80
+80
+80
+80
+FF
+08
+FF
+20
+ENDCHAR
+STARTCHAR 0x22E5
+ENCODING 8933
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 13 1 -1
+BITMAP
+FF
+01
+01
+01
+01
+01
+01
+01
+01
+FF
+08
+FF
+10
+ENDCHAR
+STARTCHAR 0x22E6
+ENCODING 8934
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+06
+18
+60
+80
+60
+18
+06
+04
+79
+9E
+20
+ENDCHAR
+STARTCHAR 0x22E7
+ENCODING 8935
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 11 1 0
+BITMAP
+60
+18
+06
+01
+06
+18
+60
+04
+79
+9E
+20
+ENDCHAR
+STARTCHAR 0x22E8
+ENCODING 8936
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 0 0
+BITMAP
+0040
+0080
+0300
+1C00
+6000
+1C00
+0300
+0080
+0040
+0200
+7C40
+8F80
+1000
+ENDCHAR
+STARTCHAR 0x22E9
+ENCODING 8937
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 0
+BITMAP
+8000
+4000
+3000
+0E00
+0180
+0E00
+3000
+4000
+8000
+0200
+7C40
+8F80
+1000
+ENDCHAR
+STARTCHAR 0x22EA
+ENCODING 8938
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 10 1 1
+BITMAP
+0200
+0200
+0380
+1C80
+E480
+E480
+1C80
+0B80
+0800
+0800
+ENDCHAR
+STARTCHAR 0x22EB
+ENCODING 8939
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 9 9 1 1
+BITMAP
+0400
+E400
+9C00
+8B80
+8B80
+9C00
+F000
+1000
+1000
+ENDCHAR
+STARTCHAR 0x22EC
+ENCODING 8940
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 13 1 -2
+BITMAP
+0100
+0100
+01C0
+0E40
+7240
+7240
+0E40
+05C0
+0400
+0400
+FFC0
+0800
+0800
+ENDCHAR
+STARTCHAR 0x22ED
+ENCODING 8941
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 12 1 -2
+BITMAP
+0400
+E400
+9C00
+8B80
+8B80
+9C00
+E800
+1000
+1000
+FFC0
+1000
+2000
+ENDCHAR
+STARTCHAR 0x22EE
+ENCODING 8942
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 11 1 0
+BITMAP
+40
+E0
+40
+00
+40
+E0
+40
+00
+40
+E0
+40
+ENDCHAR
+STARTCHAR 0x22EF
+ENCODING 8943
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 3 1 5
+BITMAP
+4440
+EEE0
+4440
+ENDCHAR
+STARTCHAR 0x22F0
+ENCODING 8944
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 13 1 0
+BITMAP
+0040
+00E0
+0040
+0000
+0000
+0400
+0E00
+0400
+0000
+0000
+4000
+E000
+4000
+ENDCHAR
+STARTCHAR 0x22F1
+ENCODING 8945
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 13 1 0
+BITMAP
+4000
+E000
+4000
+0000
+0000
+0400
+0E00
+0400
+0000
+0000
+0040
+00E0
+0040
+ENDCHAR
+STARTCHAR 0x2300
+ENCODING 8960
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 8 1 2
+BITMAP
+3D
+42
+85
+89
+91
+A1
+42
+BC
+ENDCHAR
+STARTCHAR 0x2302
+ENCODING 8962
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 12 1 0
+BITMAP
+0400
+0A00
+1100
+2080
+4040
+8020
+8020
+8020
+8020
+8020
+8020
+FFE0
+ENDCHAR
+STARTCHAR 0x2303
+ENCODING 8963
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 5
+BITMAP
+10
+28
+28
+44
+44
+82
+82
+ENDCHAR
+STARTCHAR 0x2304
+ENCODING 8964
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 0
+BITMAP
+82
+82
+44
+44
+28
+28
+10
+ENDCHAR
+STARTCHAR 0x2305
+ENCODING 8965
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 2
+BITMAP
+FE
+00
+10
+28
+28
+44
+44
+82
+82
+ENDCHAR
+STARTCHAR 0x2306
+ENCODING 8966
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 2
+BITMAP
+FE
+00
+FE
+00
+10
+28
+28
+44
+44
+82
+82
+ENDCHAR
+STARTCHAR 0x2308
+ENCODING 8968
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+F0
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x2309
+ENCODING 8969
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+F0
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x230A
+ENCODING 8970
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+F0
+ENDCHAR
+STARTCHAR 0x230B
+ENCODING 8971
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 12 1 0
+BITMAP
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+F0
+ENDCHAR
+STARTCHAR 0x230C
+ENCODING 8972
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 0
+BITMAP
+3C
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x230D
+ENCODING 8973
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 0
+BITMAP
+F0
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0x230E
+ENCODING 8974
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 6
+BITMAP
+80
+80
+80
+80
+80
+3C
+ENDCHAR
+STARTCHAR 0x230F
+ENCODING 8975
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 6 1 6
+BITMAP
+04
+04
+04
+04
+04
+F0
+ENDCHAR
+STARTCHAR 0x2310
+ENCODING 8976
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 4 1 2
+BITMAP
+FC
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x2400
+ENCODING 9216
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+8A2800
+8A2800
+CA2800
+AA2800
+9A2800
+8A2800
+89CF80
+ENDCHAR
+STARTCHAR 0x2401
+ENCODING 9217
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+71C880
+8A2880
+822880
+722F80
+0A2880
+8A2880
+71C880
+ENDCHAR
+STARTCHAR 0x2402
+ENCODING 9218
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+73E880
+888880
+808500
+708200
+088500
+888880
+708880
+ENDCHAR
+STARTCHAR 0x2403
+ENCODING 9219
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+FBE880
+808880
+808500
+F08200
+808500
+808880
+F88880
+ENDCHAR
+STARTCHAR 0x2404
+ENCODING 9220
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F9CF80
+822200
+822200
+F22200
+822200
+822200
+F9C200
+ENDCHAR
+STARTCHAR 0x2405
+ENCODING 9221
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 8 1 2
+BITMAP
+FA2700
+822880
+832880
+F2A880
+826880
+822A80
+FA2700
+000080
+ENDCHAR
+STARTCHAR 0x2406
+ENCODING 9222
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+21C880
+522900
+8A0A00
+8A0C00
+FA0A00
+8A2900
+89C880
+ENDCHAR
+STARTCHAR 0x2407
+ENCODING 9223
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F3E800
+4A0800
+4A0800
+73C800
+4A0800
+4A0800
+F3EF80
+ENDCHAR
+STARTCHAR 0x2408
+ENCODING 9224
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+F1C0
+4A20
+4A00
+71C0
+4820
+4A20
+F1C0
+ENDCHAR
+STARTCHAR 0x2409
+ENCODING 9225
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+8BE0
+8880
+8880
+F880
+8880
+8880
+8880
+ENDCHAR
+STARTCHAR 0x240A
+ENCODING 9226
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+83E0
+8200
+8200
+83C0
+8200
+8200
+FA00
+ENDCHAR
+STARTCHAR 0x240B
+ENCODING 9227
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 4
+BITMAP
+8BE0
+8880
+8880
+5080
+5080
+5080
+2080
+ENDCHAR
+STARTCHAR 0x240C
+ENCODING 9228
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+FBE0
+8200
+8200
+F3C0
+8200
+8200
+8200
+ENDCHAR
+STARTCHAR 0x240D
+ENCODING 9229
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+73C0
+8A20
+8220
+83C0
+8280
+8A40
+7220
+ENDCHAR
+STARTCHAR 0x240E
+ENCODING 9230
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+71C0
+8A20
+8220
+7220
+0A20
+8A20
+71C0
+ENDCHAR
+STARTCHAR 0x240F
+ENCODING 9231
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 7 1 3
+BITMAP
+7380
+8900
+8100
+7100
+0900
+8900
+7380
+ENDCHAR
+STARTCHAR 0x2410
+ENCODING 9232
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F20F80
+4A0800
+4A0800
+4A0F00
+4A0800
+4A0800
+F3EF80
+ENDCHAR
+STARTCHAR 0x2411
+ENCODING 9233
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F1C200
+4A2600
+4A0A00
+4A0200
+4A0200
+4A2200
+F1CF80
+ENDCHAR
+STARTCHAR 0x2412
+ENCODING 9234
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F1C700
+4A2880
+4A0080
+4A0300
+4A0400
+4A2800
+F1CF80
+ENDCHAR
+STARTCHAR 0x2413
+ENCODING 9235
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F1CF80
+4A2080
+4A0100
+4A0300
+4A0080
+4A2880
+F1C700
+ENDCHAR
+STARTCHAR 0x2414
+ENCODING 9236
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F1C100
+4A2300
+4A0500
+4A0900
+4A0F80
+4A2100
+F1C100
+ENDCHAR
+STARTCHAR 0x2415
+ENCODING 9237
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+888880
+894900
+CA2A00
+AA2C00
+9BEA00
+8A2900
+8A2880
+ENDCHAR
+STARTCHAR 0x2416
+ENCODING 9238
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+722880
+8A2880
+814C80
+708A80
+088980
+888880
+708880
+ENDCHAR
+STARTCHAR 0x2417
+ENCODING 9239
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+FBEF00
+808480
+808480
+F08700
+808480
+808480
+F88F00
+ENDCHAR
+STARTCHAR 0x2418
+ENCODING 9240
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+708880
+894880
+822C80
+822A80
+83E980
+8A2880
+722880
+ENDCHAR
+STARTCHAR 0x2419
+ENCODING 9241
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+FA20
+8220
+8360
+F2A0
+8220
+8220
+FA20
+ENDCHAR
+STARTCHAR 0x241A
+ENCODING 9242
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+722F00
+8A2480
+822480
+722700
+0A2480
+8A2480
+71CF00
+ENDCHAR
+STARTCHAR 0x241B
+ENCODING 9243
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F9C700
+822880
+820800
+F1C800
+802800
+822880
+F9C700
+ENDCHAR
+STARTCHAR 0x241C
+ENCODING 9244
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+F9C0
+8220
+8200
+F1C0
+8020
+8220
+81C0
+ENDCHAR
+STARTCHAR 0x241D
+ENCODING 9245
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+71C0
+8A20
+8200
+81C0
+9820
+8A20
+71C0
+ENDCHAR
+STARTCHAR 0x241E
+ENCODING 9246
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+F1C0
+8A20
+8A00
+F1C0
+A020
+9220
+89C0
+ENDCHAR
+STARTCHAR 0x241F
+ENCODING 9247
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+89C0
+8A20
+8A00
+89C0
+8820
+8A20
+71C0
+ENDCHAR
+STARTCHAR 0x2420
+ENCODING 9248
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 7 1 3
+BITMAP
+73C0
+8A20
+8220
+73C0
+0A00
+8A00
+7200
+ENDCHAR
+STARTCHAR 0x2421
+ENCODING 9249
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 17 7 1 3
+BITMAP
+F3E800
+4A0800
+4A0800
+4BC800
+4A0800
+4A0800
+F3EF80
+ENDCHAR
+STARTCHAR 0x2422
+ENCODING 9250
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -3
+BITMAP
+C8
+48
+48
+78
+54
+54
+54
+64
+64
+78
+20
+40
+40
+ENDCHAR
+STARTCHAR 0x2423
+ENCODING 9251
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 3 1 -2
+BITMAP
+8080
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x2424
+ENCODING 9252
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 11 11 1 1
+BITMAP
+8800
+8800
+C800
+A800
+9A00
+8A00
+8A00
+0200
+0200
+0200
+03E0
+ENDCHAR
+STARTCHAR 0x002F
+ENCODING 9253
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 0
+BITMAP
+0120
+0240
+0480
+0920
+1240
+2480
+4900
+9200
+2400
+4800
+9000
+ENDCHAR
+STARTCHAR 0x003F
+ENCODING 9254
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 1 0
+BITMAP
+70
+F8
+C8
+C0
+60
+30
+30
+30
+00
+00
+30
+30
+ENDCHAR
+STARTCHAR 0x2440
+ENCODING 9280
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+1E
+12
+12
+12
+10
+10
+10
+90
+90
+90
+F0
+ENDCHAR
+STARTCHAR 0x2441
+ENCODING 9281
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+02
+02
+02
+02
+02
+FE
+82
+82
+82
+82
+82
+ENDCHAR
+STARTCHAR 0x2442
+ENCODING 9282
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+82
+82
+82
+82
+82
+FE
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0x2443
+ENCODING 9283
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+FE
+92
+92
+92
+10
+10
+10
+92
+92
+92
+FE
+ENDCHAR
+STARTCHAR 0x2444
+ENCODING 9284
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 5 1 7
+BITMAP
+C6
+AA
+92
+AA
+C6
+ENDCHAR
+STARTCHAR 0x2445
+ENCODING 9285
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 2
+BITMAP
+0E
+CE
+CE
+C0
+C0
+C0
+CE
+CE
+0E
+ENDCHAR
+STARTCHAR 0x2446
+ENCODING 9286
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 1
+BITMAP
+06
+06
+06
+16
+16
+10
+D0
+D0
+C0
+C0
+C0
+ENDCHAR
+STARTCHAR 0x2447
+ENCODING 9287
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 8 1 2
+BITMAP
+0E
+0E
+AE
+AE
+AE
+A0
+A0
+A0
+ENDCHAR
+STARTCHAR 0x2448
+ENCODING 9288
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 5 1 4
+BITMAP
+DA
+DA
+DA
+DA
+DA
+ENDCHAR
+STARTCHAR 0x2449
+ENCODING 9289
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+90
+90
+48
+48
+48
+48
+24
+24
+24
+24
+12
+12
+ENDCHAR
+STARTCHAR 0x2460
+ENCODING 9312
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+408100
+438100
+808080
+808080
+808080
+808080
+808080
+808080
+808080
+408100
+43E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2461
+ENCODING 9313
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41C100
+422100
+822080
+822080
+802080
+804080
+804080
+808080
+812080
+412100
+43E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2462
+ENCODING 9314
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41C100
+422100
+822080
+802080
+802080
+80C080
+802080
+802080
+822080
+422100
+41C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2463
+ENCODING 9315
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+40C100
+40C100
+814080
+814080
+824080
+864080
+87F080
+804080
+804080
+404100
+41F100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2464
+ENCODING 9316
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+422100
+43C100
+820080
+820080
+83C080
+832080
+802080
+802080
+822080
+424100
+418100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2465
+ENCODING 9317
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+40C100
+412100
+810080
+820080
+83C080
+822080
+822080
+822080
+822080
+414100
+41C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2466
+ENCODING 9318
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+220200
+43F100
+421100
+822080
+804080
+804080
+804080
+808080
+808080
+808080
+408100
+408100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2467
+ENCODING 9319
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41C100
+422100
+822080
+822080
+814080
+81C080
+822080
+822080
+822080
+422100
+41C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2468
+ENCODING 9320
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41C100
+414100
+822080
+822080
+822080
+822080
+81E080
+802080
+804080
+424100
+418100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2469
+ENCODING 9321
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+447100
+5C5100
+848880
+848880
+848880
+848880
+848880
+848880
+848880
+445100
+5F7100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x246A
+ENCODING 9322
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+441100
+5C7100
+841080
+841080
+841080
+841080
+841080
+841080
+841080
+441100
+5F7D00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x246B
+ENCODING 9323
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+447100
+5C8900
+848880
+848880
+840880
+841080
+841080
+842080
+844880
+444900
+5FF900
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x246C
+ENCODING 9324
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+447100
+5C8900
+848880
+840880
+840880
+843080
+840880
+840880
+848880
+448900
+5F7100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x246D
+ENCODING 9325
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+443100
+5C3100
+845080
+845080
+849080
+859080
+85FC80
+841080
+841080
+441100
+5F7D00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x246E
+ENCODING 9326
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+448900
+5CF100
+848080
+848080
+84F080
+84C880
+840880
+840880
+848880
+449100
+5F6100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x246F
+ENCODING 9327
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+443100
+5C4900
+844080
+848080
+84F080
+848880
+848880
+848880
+848880
+445100
+5F7100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2470
+ENCODING 9328
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+208200
+44FD00
+5C8500
+848880
+841080
+841080
+841080
+842080
+842080
+842080
+442100
+5F2100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2471
+ENCODING 9329
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+447100
+5C8900
+848880
+848880
+845080
+847080
+848880
+848880
+848880
+448900
+5F7100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2472
+ENCODING 9330
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+447100
+5C5100
+848880
+848880
+848880
+848880
+847880
+840880
+841080
+449100
+5F6100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2473
+ENCODING 9331
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+4E3900
+512900
+914480
+914480
+814480
+824480
+824480
+844480
+894480
+492900
+5F3900
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x2474
+ENCODING 9332
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+208200
+438100
+408100
+808080
+808080
+808080
+808080
+808080
+808080
+808080
+43E100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2475
+ENCODING 9333
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+21C200
+422100
+422100
+822080
+802080
+804080
+804080
+808080
+812080
+812080
+43E100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2476
+ENCODING 9334
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+21C200
+422100
+422100
+802080
+802080
+80C080
+802080
+802080
+822080
+822080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2477
+ENCODING 9335
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+20C200
+40C100
+414100
+814080
+824080
+864080
+87F080
+804080
+804080
+804080
+41F100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2478
+ENCODING 9336
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+222200
+43C100
+420100
+820080
+83C080
+832080
+802080
+802080
+822080
+824080
+418100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2479
+ENCODING 9337
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+20C200
+412100
+410100
+820080
+83C080
+822080
+822080
+822080
+822080
+814080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x247A
+ENCODING 9338
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+120400
+23F200
+421100
+422100
+804080
+804080
+804080
+808080
+808080
+808080
+808080
+408100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x247B
+ENCODING 9339
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+21C200
+422100
+422100
+822080
+814080
+81C080
+822080
+822080
+822080
+822080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x247C
+ENCODING 9340
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+21C200
+414100
+422100
+822080
+822080
+822080
+81E080
+802080
+804080
+824080
+418100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x247D
+ENCODING 9341
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+247200
+5C5100
+448900
+848880
+848880
+848880
+848880
+848880
+848880
+845080
+5F7100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x247E
+ENCODING 9342
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+241200
+5C7100
+441100
+841080
+841080
+841080
+841080
+841080
+841080
+841080
+5F7D00
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x247F
+ENCODING 9343
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+247200
+5C8900
+448900
+848880
+840880
+841080
+841080
+842080
+844880
+844880
+5FF900
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2480
+ENCODING 9344
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+247200
+5C8900
+448900
+840880
+840880
+843080
+840880
+840880
+848880
+848880
+5F7100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2481
+ENCODING 9345
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+243200
+5C3100
+445100
+845080
+849080
+859080
+85F880
+841080
+841080
+841080
+5F7900
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2482
+ENCODING 9346
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+248A00
+5CF100
+448100
+848080
+84F080
+84C880
+840880
+840880
+848880
+849080
+5F6100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2483
+ENCODING 9347
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+243200
+5C4900
+444100
+848080
+84F080
+848880
+848880
+848880
+848880
+845080
+5F7100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2484
+ENCODING 9348
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+108400
+24FE00
+5C8500
+448900
+841080
+841080
+841080
+842080
+842080
+842080
+842080
+5F2100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2485
+ENCODING 9349
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+247200
+5C8900
+448900
+848880
+845080
+847080
+848880
+848880
+848880
+848880
+5F7100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2486
+ENCODING 9350
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+247200
+5C5100
+448900
+848880
+848880
+848880
+847880
+840880
+841080
+849080
+5F6100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2487
+ENCODING 9351
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+2E3A00
+512900
+514500
+914480
+814480
+824480
+824480
+844480
+894480
+892880
+5F3900
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x2488
+ENCODING 9352
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 9 11 3 0
+BITMAP
+2000
+E000
+2000
+2000
+2000
+2000
+2000
+2000
+2000
+2180
+F980
+ENDCHAR
+STARTCHAR 0x2489
+ENCODING 9353
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 9 11 3 0
+BITMAP
+7000
+8800
+8800
+8800
+0800
+1000
+1000
+2000
+4800
+4980
+F980
+ENDCHAR
+STARTCHAR 0x248A
+ENCODING 9354
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 9 11 3 0
+BITMAP
+7000
+8800
+8800
+0800
+0800
+3000
+0800
+0800
+8800
+8980
+7180
+ENDCHAR
+STARTCHAR 0x248B
+ENCODING 9355
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 11 11 3 0
+BITMAP
+1800
+1800
+2800
+2800
+4800
+C800
+FE00
+0800
+0800
+0860
+3E60
+ENDCHAR
+STARTCHAR 0x248C
+ENCODING 9356
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 9 11 3 0
+BITMAP
+8800
+F000
+8000
+8000
+F000
+C800
+0800
+0800
+8800
+9180
+6180
+ENDCHAR
+STARTCHAR 0x248D
+ENCODING 9357
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 9 11 3 0
+BITMAP
+3000
+4800
+4000
+8000
+F000
+8800
+8800
+8800
+8800
+5180
+7180
+ENDCHAR
+STARTCHAR 0x248E
+ENCODING 9358
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 7 12 3 0
+BITMAP
+80
+FC
+84
+88
+10
+10
+10
+20
+20
+20
+26
+26
+ENDCHAR
+STARTCHAR 0x248F
+ENCODING 9359
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 9 11 3 0
+BITMAP
+7000
+8800
+8800
+8800
+5000
+7000
+8800
+8800
+8800
+8980
+7180
+ENDCHAR
+STARTCHAR 0x2490
+ENCODING 9360
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 8 11 3 0
+BITMAP
+70
+50
+88
+88
+88
+88
+78
+08
+10
+93
+63
+ENDCHAR
+STARTCHAR 0x2491
+ENCODING 9361
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 13 11 3 0
+BITMAP
+2380
+E280
+2440
+2440
+2440
+2440
+2440
+2440
+2440
+2298
+FB98
+ENDCHAR
+STARTCHAR 0x2492
+ENCODING 9362
+SWIDTH 1200 0
+DWIDTH 20 0
+BBX 15 11 3 0
+BITMAP
+2080
+E380
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2086
+FBE6
+ENDCHAR
+STARTCHAR 0x2493
+ENCODING 9363
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 14 11 3 0
+BITMAP
+2380
+E440
+2440
+2440
+2040
+2080
+2080
+2100
+2240
+224C
+FFCC
+ENDCHAR
+STARTCHAR 0x2494
+ENCODING 9364
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 14 11 3 0
+BITMAP
+2380
+E440
+2440
+2040
+2040
+2180
+2040
+2040
+2440
+244C
+FB8C
+ENDCHAR
+STARTCHAR 0x2495
+ENCODING 9365
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 14 11 3 0
+BITMAP
+2180
+E180
+2280
+2280
+2480
+2C80
+2FC0
+2080
+2080
+208C
+FBCC
+ENDCHAR
+STARTCHAR 0x2496
+ENCODING 9366
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 13 11 3 0
+BITMAP
+2440
+E780
+2400
+2400
+2780
+2640
+2040
+2040
+2440
+2498
+FB18
+ENDCHAR
+STARTCHAR 0x2497
+ENCODING 9367
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 13 11 3 0
+BITMAP
+2180
+E240
+2200
+2400
+2780
+2440
+2440
+2440
+2440
+2298
+FB98
+ENDCHAR
+STARTCHAR 0x2498
+ENCODING 9368
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 12 3 0
+BITMAP
+0400
+27E0
+E420
+2440
+2080
+2080
+2080
+2100
+2100
+2100
+2130
+F930
+ENDCHAR
+STARTCHAR 0x2499
+ENCODING 9369
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 14 11 3 0
+BITMAP
+2380
+E440
+2440
+2440
+2280
+2380
+2440
+2440
+2440
+244C
+FB8C
+ENDCHAR
+STARTCHAR 0x249A
+ENCODING 9370
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 13 11 3 0
+BITMAP
+2380
+E280
+2440
+2440
+2440
+2440
+23C0
+2040
+2080
+2498
+FB18
+ENDCHAR
+STARTCHAR 0x249B
+ENCODING 9371
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 14 11 3 0
+BITMAP
+71C0
+8940
+8A20
+8A20
+0A20
+1220
+1220
+2220
+4A20
+494C
+F9CC
+ENDCHAR
+STARTCHAR 0x249C
+ENCODING 9372
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+838080
+844080
+804080
+83C080
+844080
+844080
+43E100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x249D
+ENCODING 9373
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+160400
+220200
+420100
+420100
+820080
+83C080
+822080
+822080
+822080
+822080
+822080
+43C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x249E
+ENCODING 9374
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+81C080
+822080
+820080
+820080
+820080
+822080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x249F
+ENCODING 9375
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+10C400
+204200
+404100
+404100
+804080
+83C080
+844080
+844080
+844080
+844080
+844080
+43E100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A0
+ENCODING 9376
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+81C080
+822080
+83E080
+820080
+820080
+822080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A1
+ENCODING 9377
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+10E400
+212200
+410100
+410100
+810080
+83C080
+810080
+810080
+810080
+810080
+810080
+438100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A2
+ENCODING 9378
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 16 1 -4
+BITMAP
+100400
+200200
+400100
+400100
+800080
+81F080
+822080
+822080
+822080
+83C080
+820080
+43E100
+441100
+241200
+141400
+03E000
+ENDCHAR
+STARTCHAR 0x24A3
+ENCODING 9379
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+160400
+220200
+420100
+420100
+820080
+83C080
+822080
+822080
+822080
+822080
+822080
+477100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A4
+ENCODING 9380
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+218200
+418100
+400100
+800080
+818080
+808080
+808080
+808080
+808080
+808080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A5
+ENCODING 9381
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+20C200
+40C100
+400100
+800080
+80C080
+804080
+804080
+804080
+804080
+804080
+404100
+404100
+224200
+138400
+ENDCHAR
+STARTCHAR 0x24A6
+ENCODING 9382
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+160400
+220200
+420100
+420100
+820080
+82F080
+824080
+828080
+838080
+82C080
+824080
+477100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A7
+ENCODING 9383
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+118400
+208200
+408100
+408100
+808080
+808080
+808080
+808080
+808080
+808080
+808080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A8
+ENCODING 9384
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+9F7080
+888880
+888880
+888880
+888880
+888880
+5DDD00
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24A9
+ENCODING 9385
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+87C080
+822080
+822080
+822080
+822080
+822080
+477100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24AA
+ENCODING 9386
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+81C080
+822080
+822080
+822080
+822080
+822080
+41C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24AB
+ENCODING 9387
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+87C080
+822080
+822080
+822080
+822080
+822080
+43C100
+420100
+220200
+170400
+ENDCHAR
+STARTCHAR 0x24AC
+ENCODING 9388
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+83C080
+844080
+844080
+844080
+844080
+844080
+43C100
+404100
+204200
+10E400
+ENDCHAR
+STARTCHAR 0x24AD
+ENCODING 9389
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+834080
+81A080
+810080
+810080
+810080
+810080
+43C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24AE
+ENCODING 9390
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+81E080
+822080
+820080
+81C080
+802080
+822080
+43C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24AF
+ENCODING 9391
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+410100
+410100
+830080
+87C080
+810080
+810080
+810080
+812080
+812080
+40C100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24B0
+ENCODING 9392
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+866080
+822080
+822080
+822080
+822080
+822080
+41F100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24B1
+ENCODING 9393
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+8E7080
+824080
+824080
+824080
+818080
+818080
+418100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24B2
+ENCODING 9394
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+9DDC80
+849080
+855080
+855080
+855080
+836080
+422100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24B3
+ENCODING 9395
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+8E7080
+824080
+818080
+818080
+818080
+824080
+4E7100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24B4
+ENCODING 9396
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+873880
+812080
+812080
+812080
+80C080
+80C080
+40C100
+408100
+248200
+170400
+ENDCHAR
+STARTCHAR 0x24B5
+ENCODING 9397
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 15 1 -3
+BITMAP
+100400
+200200
+400100
+400100
+800080
+83E080
+824080
+824080
+808080
+812080
+812080
+43E100
+400100
+200200
+100400
+ENDCHAR
+STARTCHAR 0x24B6
+ENCODING 9398
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+408100
+408100
+814080
+814080
+814080
+822080
+822080
+83E080
+841080
+441100
+5E3D00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24B7
+ENCODING 9399
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5FE100
+441100
+840880
+840880
+841080
+87E080
+841080
+840880
+840880
+441100
+5FE100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24B8
+ENCODING 9400
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41E900
+421900
+840880
+880880
+880080
+880080
+880080
+880880
+840880
+421100
+41E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24B9
+ENCODING 9401
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5FC100
+443100
+841080
+840880
+840880
+840880
+840880
+840880
+841080
+443100
+5FC100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24BA
+ENCODING 9402
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5FF100
+441100
+841080
+845080
+844080
+87C080
+844880
+844880
+841080
+441100
+5FF100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24BB
+ENCODING 9403
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+4FF900
+420900
+820880
+822880
+822080
+83E080
+822080
+822080
+820080
+420100
+4F8100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24BC
+ENCODING 9404
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+43D100
+443100
+881080
+901080
+900080
+900080
+907880
+901080
+881080
+441100
+43F100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24BD
+ENCODING 9405
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5F7D00
+441100
+841080
+841080
+841080
+87F080
+841080
+841080
+841080
+441100
+5F7D00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24BE
+ENCODING 9406
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+43E100
+408100
+808080
+808080
+808080
+808080
+808080
+808080
+808080
+408100
+43E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24BF
+ENCODING 9407
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41F100
+404100
+804080
+804080
+804080
+804080
+804080
+804080
+804080
+424100
+438100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C0
+ENCODING 9408
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5F3D00
+441100
+842080
+844080
+848080
+85C080
+864080
+842080
+842080
+441100
+5F3D00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C1
+ENCODING 9409
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+47C100
+410100
+810080
+810080
+810080
+810080
+810880
+810880
+810880
+411900
+47F900
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C2
+ENCODING 9410
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5C1D00
+4C1900
+8C1880
+8A2880
+8A2880
+8A4880
+894880
+894880
+888880
+488900
+5C9D00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C3
+ENCODING 9411
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5C7D00
+461100
+861080
+851080
+851080
+849080
+845080
+845080
+843080
+443100
+5F1100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C4
+ENCODING 9412
+SWIDTH 2100 0
+DWIDTH 35 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+43C100
+442100
+881080
+900880
+900880
+900880
+900880
+900880
+881080
+442100
+43C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C5
+ENCODING 9413
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+4FF100
+421900
+820880
+820880
+821880
+83F080
+820080
+820080
+820080
+420100
+4F8100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C6
+ENCODING 9414
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+43C100
+442100
+881080
+900880
+900880
+900880
+900880
+900880
+8B9080
+466100
+43C100
+204A00
+183C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C7
+ENCODING 9415
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+4FE100
+421100
+820880
+820880
+821080
+83E080
+823080
+821080
+821080
+421100
+4F8F00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C8
+ENCODING 9416
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+43E100
+442100
+842080
+840080
+820080
+818080
+804080
+802080
+842080
+442100
+47C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24C9
+ENCODING 9417
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+4FF900
+488900
+888880
+888880
+808080
+808080
+808080
+808080
+808080
+408100
+43E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24CA
+ENCODING 9418
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5F7D00
+441100
+841080
+841080
+841080
+841080
+841080
+841080
+841080
+422100
+41C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24CB
+ENCODING 9419
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5E3D00
+441100
+841080
+822080
+822080
+822080
+814080
+814080
+814080
+408100
+408100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24CC
+ENCODING 9420
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+788F00
+908480
+908480
+914480
+894880
+894880
+894880
+8A2880
+463100
+463100
+241200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24CD
+ENCODING 9421
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5E7900
+422100
+824080
+814080
+818080
+808080
+814080
+834080
+822080
+441100
+5E3D00
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24CE
+ENCODING 9422
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+5E3D00
+441100
+822080
+822080
+814080
+81C080
+808080
+808080
+808080
+408100
+43E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24CF
+ENCODING 9423
+SWIDTH 2100 0
+DWIDTH 35 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+47F100
+462100
+842080
+844080
+804080
+808080
+811080
+811080
+821080
+423100
+47F100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D0
+ENCODING 9424
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+838080
+844080
+804080
+83C080
+844080
+844080
+83E080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D1
+ENCODING 9425
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+230200
+410100
+410100
+810080
+810080
+81E080
+811080
+811080
+811080
+811080
+411100
+41E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D2
+ENCODING 9426
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+81C080
+822080
+820080
+820080
+820080
+822080
+81C080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D3
+ENCODING 9427
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+20C200
+404100
+404100
+804080
+804080
+83C080
+844080
+844080
+844080
+844080
+444100
+43E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D4
+ENCODING 9428
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+81C080
+822080
+83E080
+820080
+820080
+822080
+81C080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D5
+ENCODING 9429
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+20E200
+412100
+410100
+810080
+810080
+83C080
+810080
+810080
+810080
+810080
+410100
+438100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D6
+ENCODING 9430
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41F100
+422100
+822080
+822080
+83C080
+820080
+83E080
+841080
+841080
+441100
+43E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D7
+ENCODING 9431
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+260200
+420100
+420100
+820080
+820080
+83C080
+822080
+822080
+822080
+822080
+422100
+477100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D8
+ENCODING 9432
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+418100
+418100
+800080
+800080
+818080
+808080
+808080
+808080
+808080
+408100
+41C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24D9
+ENCODING 9433
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+20C200
+40C100
+400100
+800080
+80C080
+804080
+804080
+804080
+804080
+804080
+404100
+424100
+238200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24DA
+ENCODING 9434
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+260200
+420100
+420100
+820080
+820080
+82F080
+824080
+828080
+838080
+82C080
+424100
+477100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24DB
+ENCODING 9435
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+218200
+408100
+408100
+808080
+808080
+808080
+808080
+808080
+808080
+808080
+408100
+41C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24DC
+ENCODING 9436
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+9F7080
+888880
+888880
+888880
+888880
+888880
+9DDC80
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24DD
+ENCODING 9437
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+87C080
+822080
+822080
+822080
+822080
+822080
+877080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24DE
+ENCODING 9438
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+81C080
+822080
+822080
+822080
+822080
+822080
+81C080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24DF
+ENCODING 9439
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+47C100
+822080
+822080
+822080
+822080
+822080
+83C080
+820080
+420100
+470100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E0
+ENCODING 9440
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+43C100
+844080
+844080
+844080
+844080
+844080
+83C080
+804080
+404100
+40E100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E1
+ENCODING 9441
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+834080
+81A080
+810080
+810080
+810080
+810080
+83C080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E2
+ENCODING 9442
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+81E080
+822080
+820080
+81C080
+802080
+822080
+83C080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E3
+ENCODING 9443
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+410100
+410100
+830080
+87C080
+810080
+810080
+810080
+812080
+812080
+40C100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E4
+ENCODING 9444
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+866080
+822080
+822080
+822080
+822080
+822080
+81F080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E5
+ENCODING 9445
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+873880
+812080
+812080
+812080
+80C080
+80C080
+80C080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E6
+ENCODING 9446
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+9DDC80
+849080
+855080
+855080
+855080
+836080
+822080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E7
+ENCODING 9447
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+8E7080
+824080
+818080
+818080
+818080
+824080
+8E7080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E8
+ENCODING 9448
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+473900
+812080
+812080
+812080
+80C080
+80C080
+80C080
+808080
+448100
+470100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24E9
+ENCODING 9449
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+400100
+400100
+83E080
+824080
+824080
+808080
+812080
+812080
+83E080
+400100
+400100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x24EA
+ENCODING 9450
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 17 1 -3
+BITMAP
+07F000
+180C00
+200200
+41C100
+414100
+822080
+822080
+822080
+822080
+822080
+822080
+822080
+414100
+41C100
+200200
+180C00
+07F000
+ENDCHAR
+STARTCHAR 0x25A0
+ENCODING 9632
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR 0x25A1
+ENCODING 9633
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x25A2
+ENCODING 9634
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+7F00
+8080
+8080
+8080
+8080
+8080
+8080
+8080
+7F00
+ENDCHAR
+STARTCHAR 0x25A3
+ENCODING 9635
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8080
+BE80
+BE80
+BE80
+BE80
+BE80
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x25A4
+ENCODING 9636
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8080
+FF80
+8080
+FF80
+8080
+FF80
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x25A5
+ENCODING 9637
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+AA80
+AA80
+AA80
+AA80
+AA80
+AA80
+AA80
+FF80
+ENDCHAR
+STARTCHAR 0x25A6
+ENCODING 9638
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+AA80
+FF80
+AA80
+FF80
+AA80
+FF80
+AA80
+FF80
+ENDCHAR
+STARTCHAR 0x25A7
+ENCODING 9639
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+9280
+C980
+A480
+9280
+C980
+A480
+9280
+FF80
+ENDCHAR
+STARTCHAR 0x25A8
+ENCODING 9640
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+A480
+C980
+9280
+A480
+C980
+9280
+A480
+FF80
+ENDCHAR
+STARTCHAR 0x25A9
+ENCODING 9641
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+D580
+AA80
+D580
+AA80
+D580
+AA80
+D580
+FF80
+ENDCHAR
+STARTCHAR 0x25AA
+ENCODING 9642
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 3 3
+BITMAP
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR 0x25AB
+ENCODING 9643
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 3 3
+BITMAP
+F8
+88
+88
+88
+F8
+ENDCHAR
+STARTCHAR 0x25AC
+ENCODING 9644
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 3
+BITMAP
+FFC0
+FFC0
+FFC0
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR 0x25AD
+ENCODING 9645
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 3
+BITMAP
+FFC0
+8040
+8040
+8040
+FFC0
+ENDCHAR
+STARTCHAR 0x25AE
+ENCODING 9646
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+F8
+ENDCHAR
+STARTCHAR 0x25AF
+ENCODING 9647
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 1 0
+BITMAP
+F8
+88
+88
+88
+88
+88
+88
+88
+88
+F8
+ENDCHAR
+STARTCHAR 0x25B0
+ENCODING 9648
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 5 1 3
+BITMAP
+1FF0
+3FE0
+7FE0
+7FC0
+FF80
+ENDCHAR
+STARTCHAR 0x25B1
+ENCODING 9649
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 5 1 3
+BITMAP
+1FF0
+2010
+4020
+8040
+FF80
+ENDCHAR
+STARTCHAR 0x25B2
+ENCODING 9650
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+0800
+0800
+1C00
+1C00
+3E00
+3E00
+7F00
+7F00
+FF80
+FF80
+ENDCHAR
+STARTCHAR 0x25B3
+ENCODING 9651
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+0800
+0800
+1400
+1400
+2200
+2200
+4100
+4100
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x25B4
+ENCODING 9652
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+10
+38
+38
+7C
+7C
+FE
+FE
+ENDCHAR
+STARTCHAR 0x25B5
+ENCODING 9653
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+10
+28
+28
+44
+44
+82
+FE
+ENDCHAR
+STARTCHAR 0x25B6
+ENCODING 9654
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 1
+BITMAP
+C000
+F000
+FC00
+FF00
+FFC0
+FF00
+FC00
+F000
+C000
+ENDCHAR
+STARTCHAR 0x25B7
+ENCODING 9655
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 1
+BITMAP
+C000
+B000
+8C00
+8300
+80C0
+8300
+8C00
+B000
+C000
+ENDCHAR
+STARTCHAR 0x25B8
+ENCODING 9656
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+C0
+F0
+FC
+FE
+FC
+F0
+C0
+ENDCHAR
+STARTCHAR 0x25B9
+ENCODING 9657
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+C0
+B0
+8C
+82
+8C
+B0
+C0
+ENDCHAR
+STARTCHAR 0x25BA
+ENCODING 9658
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 3
+BITMAP
+F000
+FF00
+FFC0
+FF00
+F000
+ENDCHAR
+STARTCHAR 0x25BB
+ENCODING 9659
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 3
+BITMAP
+F000
+8F00
+80C0
+8F00
+F000
+ENDCHAR
+STARTCHAR 0x25BC
+ENCODING 9660
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+FF80
+FF80
+7F00
+7F00
+3E00
+3E00
+1C00
+1C00
+0800
+0800
+ENDCHAR
+STARTCHAR 0x25BD
+ENCODING 9661
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+FF80
+8080
+4100
+4100
+2200
+2200
+1400
+1400
+0800
+0800
+ENDCHAR
+STARTCHAR 0x25BE
+ENCODING 9662
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+FE
+FE
+7C
+7C
+38
+38
+10
+ENDCHAR
+STARTCHAR 0x25BF
+ENCODING 9663
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+FE
+82
+44
+44
+28
+28
+10
+ENDCHAR
+STARTCHAR 0x25C0
+ENCODING 9664
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 1
+BITMAP
+00C0
+03C0
+0FC0
+3FC0
+FFC0
+3FC0
+0FC0
+03C0
+00C0
+ENDCHAR
+STARTCHAR 0x25C1
+ENCODING 9665
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 1
+BITMAP
+00C0
+0340
+0C40
+3040
+C040
+3040
+0C40
+0340
+00C0
+ENDCHAR
+STARTCHAR 0x25C2
+ENCODING 9666
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+06
+1E
+7E
+FE
+7E
+1E
+06
+ENDCHAR
+STARTCHAR 0x25C3
+ENCODING 9667
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+06
+1A
+62
+82
+62
+1A
+06
+ENDCHAR
+STARTCHAR 0x25C4
+ENCODING 9668
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 3
+BITMAP
+03C0
+3FC0
+FFC0
+3FC0
+03C0
+ENDCHAR
+STARTCHAR 0x25C5
+ENCODING 9669
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 3
+BITMAP
+03C0
+3C40
+C040
+3C40
+03C0
+ENDCHAR
+STARTCHAR 0x25C6
+ENCODING 9670
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+0800
+1C00
+3E00
+7F00
+FF80
+7F00
+3E00
+1C00
+0800
+ENDCHAR
+STARTCHAR 0x25C7
+ENCODING 9671
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+0800
+1400
+2200
+4100
+8080
+4100
+2200
+1400
+0800
+ENDCHAR
+STARTCHAR 0x25C8
+ENCODING 9672
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+0800
+1400
+2A00
+5D00
+BE80
+5D00
+2A00
+1400
+0800
+ENDCHAR
+STARTCHAR 0x25C9
+ENCODING 9673
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4100
+9C80
+BE80
+BE80
+BE80
+9C80
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x25CA
+ENCODING 9674
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 0
+BITMAP
+10
+28
+28
+44
+44
+82
+82
+44
+44
+28
+28
+10
+ENDCHAR
+STARTCHAR 0x25CB
+ENCODING 9675
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x25CC
+ENCODING 9676
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3600
+0000
+8080
+8080
+0000
+8080
+8080
+0000
+3600
+ENDCHAR
+STARTCHAR 0x25CD
+ENCODING 9677
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+6B00
+AA80
+AA80
+AA80
+AA80
+AA80
+6B00
+3E00
+ENDCHAR
+STARTCHAR 0x25CE
+ENCODING 9678
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4100
+9C80
+A280
+A280
+A280
+9C80
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x25CF
+ENCODING 9679
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+7F00
+FF80
+FF80
+FF80
+FF80
+FF80
+7F00
+3E00
+ENDCHAR
+STARTCHAR 0x25D0
+ENCODING 9680
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+7100
+F080
+F080
+F080
+F080
+F080
+7100
+3E00
+ENDCHAR
+STARTCHAR 0x25D1
+ENCODING 9681
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4700
+8780
+8780
+8780
+8780
+8780
+4700
+3E00
+ENDCHAR
+STARTCHAR 0x25D2
+ENCODING 9682
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+7F00
+FF80
+FF80
+8080
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x25D3
+ENCODING 9683
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+FF80
+FF80
+7F00
+3E00
+ENDCHAR
+STARTCHAR 0x25D4
+ENCODING 9684
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4F00
+8F80
+8F80
+8F80
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x25D5
+ENCODING 9685
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4700
+8780
+8780
+8780
+FF80
+FF80
+7F00
+3E00
+ENDCHAR
+STARTCHAR 0x25D6
+ENCODING 9686
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 9 1 1
+BITMAP
+30
+70
+F0
+F0
+F0
+F0
+F0
+70
+30
+ENDCHAR
+STARTCHAR 0x25D7
+ENCODING 9687
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 9 1 1
+BITMAP
+C0
+E0
+F0
+F0
+F0
+F0
+F0
+E0
+C0
+ENDCHAR
+STARTCHAR 0x25D8
+ENCODING 9688
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+FF80
+E380
+C180
+C180
+C180
+E380
+FF80
+FF80
+ENDCHAR
+STARTCHAR 0x25D9
+ENCODING 9689
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+E380
+DD80
+BE80
+BE80
+BE80
+DD80
+E380
+FF80
+ENDCHAR
+STARTCHAR 0x25DA
+ENCODING 9690
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 5 1 0
+BITMAP
+FF80
+E380
+DD80
+BE80
+BE80
+ENDCHAR
+STARTCHAR 0x25DB
+ENCODING 9691
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 5 1 0
+BITMAP
+BE80
+BE80
+DD80
+E380
+FF80
+ENDCHAR
+STARTCHAR 0x25DC
+ENCODING 9692
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 5 0 0
+BITMAP
+38
+40
+80
+80
+80
+ENDCHAR
+STARTCHAR 0x25DD
+ENCODING 9693
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 0 0
+BITMAP
+E0
+10
+08
+08
+08
+ENDCHAR
+STARTCHAR 0x25DE
+ENCODING 9694
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 5 0 0
+BITMAP
+08
+08
+08
+10
+E0
+ENDCHAR
+STARTCHAR 0x25DF
+ENCODING 9695
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 5 0 0
+BITMAP
+80
+80
+80
+40
+38
+ENDCHAR
+STARTCHAR 0x25E0
+ENCODING 9696
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 5 1 -1
+BITMAP
+3E00
+4100
+8080
+8080
+8080
+ENDCHAR
+STARTCHAR 0x25E1
+ENCODING 9697
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 5 1 0
+BITMAP
+8080
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x25E2
+ENCODING 9698
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+0080
+0180
+0380
+0780
+0F80
+1F80
+3F80
+7F80
+FF80
+ENDCHAR
+STARTCHAR 0x25E3
+ENCODING 9699
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+8000
+C000
+E000
+F000
+F800
+FC00
+FE00
+FF00
+FF80
+ENDCHAR
+STARTCHAR 0x25E4
+ENCODING 9700
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+FF00
+FE00
+FC00
+F800
+F000
+E000
+C000
+8000
+ENDCHAR
+STARTCHAR 0x25E5
+ENCODING 9701
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+7F80
+3F80
+1F80
+0F80
+0780
+0380
+0180
+0080
+ENDCHAR
+STARTCHAR 0x25E6
+ENCODING 9702
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 1 2
+BITMAP
+38
+44
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0x25E7
+ENCODING 9703
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+F080
+F080
+F080
+F080
+F080
+F080
+F080
+FF80
+ENDCHAR
+STARTCHAR 0x25E8
+ENCODING 9704
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8780
+8780
+8780
+8780
+8780
+8780
+8780
+FF80
+ENDCHAR
+STARTCHAR 0x25E9
+ENCODING 9705
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+FF80
+FE80
+FC80
+F880
+F080
+E080
+C080
+FF80
+ENDCHAR
+STARTCHAR 0x25EA
+ENCODING 9706
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8180
+8380
+8780
+8F80
+9F80
+BF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR 0x25EB
+ENCODING 9707
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8880
+8880
+8880
+8880
+8880
+8880
+8880
+FF80
+ENDCHAR
+STARTCHAR 0x25EC
+ENCODING 9708
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+0800
+0800
+1400
+1400
+2200
+2A00
+5D00
+4900
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x25ED
+ENCODING 9709
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+0800
+0800
+1C00
+1C00
+3A00
+3A00
+7900
+7900
+F880
+FF80
+ENDCHAR
+STARTCHAR 0x25EE
+ENCODING 9710
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 1 1
+BITMAP
+0800
+0800
+1C00
+1C00
+2E00
+2E00
+4F00
+4F00
+8F80
+FF80
+ENDCHAR
+STARTCHAR 0x25EF
+ENCODING 9711
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 0
+BITMAP
+1E00
+6180
+4080
+8040
+8040
+8040
+8040
+4080
+6180
+1E00
+ENDCHAR
+STARTCHAR 0x25A1
+ENCODING 9712
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8880
+8880
+8880
+F880
+8080
+8080
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x25A1
+ENCODING 9713
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8080
+8080
+8080
+F880
+8880
+8880
+8880
+FF80
+ENDCHAR
+STARTCHAR 0x25A1
+ENCODING 9714
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8080
+8080
+8080
+8F80
+8880
+8880
+8880
+FF80
+ENDCHAR
+STARTCHAR 0x25A1
+ENCODING 9715
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+FF80
+8880
+8880
+8880
+8F80
+8080
+8080
+8080
+FF80
+ENDCHAR
+STARTCHAR 0x25CB
+ENCODING 9716
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4900
+8880
+8880
+F880
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0x25CB
+ENCODING 9717
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4100
+8080
+8080
+F880
+8880
+8880
+4900
+3E00
+ENDCHAR
+STARTCHAR 0x25CB
+ENCODING 9718
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4100
+8080
+8080
+8F80
+8880
+8880
+4900
+3E00
+ENDCHAR
+STARTCHAR 0x25CB
+ENCODING 9719
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 1
+BITMAP
+3E00
+4900
+8880
+8880
+8F80
+8080
+8080
+4100
+3E00
+ENDCHAR
+STARTCHAR 0xFB00
+ENCODING 64256
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 12 0 0
+BITMAP
+1B80
+2480
+2400
+2400
+2400
+FF00
+2400
+2400
+2400
+2400
+2400
+7E00
+ENDCHAR
+STARTCHAR 0xFB01
+ENCODING 64257
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 0 0
+BITMAP
+1C
+24
+20
+20
+20
+FC
+2C
+24
+24
+24
+24
+7E
+ENDCHAR
+STARTCHAR 0xFB02
+ENCODING 64258
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 0
+BITMAP
+1C
+24
+24
+24
+24
+FC
+24
+24
+24
+24
+24
+7E
+ENDCHAR
+STARTCHAR 0xFB03
+ENCODING 64259
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 0 0
+BITMAP
+0EC0
+1140
+2200
+2200
+2200
+FFE0
+2260
+2220
+2220
+2220
+2220
+7770
+ENDCHAR
+STARTCHAR 0xFB04
+ENCODING 64260
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 12 0 0
+BITMAP
+0EE0
+1120
+2220
+2220
+2220
+FFE0
+2220
+2220
+2220
+2220
+2220
+7770
+ENDCHAR
+STARTCHAR 0xFB05
+ENCODING 64261
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 0
+BITMAP
+30
+48
+48
+48
+48
+DE
+48
+48
+48
+49
+49
+E6
+ENDCHAR
+STARTCHAR 0xFB06
+ENCODING 64262
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 0
+BITMAP
+1E00
+2100
+2080
+2080
+1180
+7BE0
+8880
+8080
+7080
+0890
+8890
+F060
+ENDCHAR
+STARTCHAR 0xFB13
+ENCODING 64275
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 1 0
+BITMAP
+3380
+34C0
+2440
+2400
+1F80
+C498
+4488
+4488
+4488
+4C98
+346C
+ENDCHAR
+STARTCHAR 0xFB14
+ENCODING 64276
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 1 0
+BITMAP
+0380
+0480
+0480
+0480
+C4F0
+4480
+4488
+4488
+4488
+4C98
+366C
+ENDCHAR
+STARTCHAR 0xFB15
+ENCODING 64277
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -3
+BITMAP
+0380
+0480
+0480
+0480
+C4A0
+44D0
+4488
+4488
+4488
+4C88
+349C
+0080
+0080
+01C0
+ENDCHAR
+STARTCHAR 0xFB16
+ENCODING 64278
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 14 1 -3
+BITMAP
+1400
+3400
+2400
+2400
+DF80
+4498
+4488
+4488
+4488
+4C98
+346C
+0400
+0400
+0600
+ENDCHAR
+STARTCHAR 0xFB17
+ENCODING 64279
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 17 14 0 -3
+BITMAP
+038000
+048000
+048000
+048000
+C4A300
+44D100
+449100
+449100
+449100
+4C9100
+348F80
+008000
+008000
+01C000
+ENDCHAR
+STARTCHAR 0xFB1E
+ENCODING 64286
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 2 -1 12
+BITMAP
+84
+78
+ENDCHAR
+STARTCHAR 0xFB1F
+ENCODING 64287
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+44
+EE
+33
+11
+11
+11
+22
+00
+7F
+ENDCHAR
+STARTCHAR 0xFB20
+ENCODING 64288
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 0
+BITMAP
+42
+46
+42
+22
+22
+12
+14
+14
+18
+F0
+ENDCHAR
+STARTCHAR 0xFB21
+ENCODING 64289
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 0
+BITMAP
+8020
+8020
+6020
+3820
+4E40
+4180
+4040
+4020
+E020
+ENDCHAR
+STARTCHAR 0xFB22
+ENCODING 64290
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+4000
+FFC0
+0100
+0100
+0100
+0100
+0100
+0100
+0100
+ENDCHAR
+STARTCHAR 0xFB23
+ENCODING 64291
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 0
+BITMAP
+4000
+FFC0
+0060
+0020
+4020
+4020
+4020
+4020
+4020
+ENDCHAR
+STARTCHAR 0xFB24
+ENCODING 64292
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+4000
+FF00
+0180
+0080
+0080
+0080
+0080
+0180
+FF00
+ENDCHAR
+STARTCHAR 0xFB25
+ENCODING 64293
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 11 1 0
+BITMAP
+8000
+8000
+8000
+FF00
+0180
+0080
+0080
+0080
+0100
+0200
+0C00
+ENDCHAR
+STARTCHAR 0xFB26
+ENCODING 64294
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 9 1 0
+BITMAP
+4000
+FFE0
+4030
+4010
+4010
+4010
+4010
+4030
+7FE0
+ENDCHAR
+STARTCHAR 0xFB27
+ENCODING 64295
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 0
+BITMAP
+4000
+FF80
+00C0
+0040
+0040
+0040
+0040
+0040
+0040
+ENDCHAR
+STARTCHAR 0xFB28
+ENCODING 64296
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 9 1 0
+BITMAP
+4000
+FFC0
+2060
+2020
+2020
+2020
+2020
+2020
+E020
+ENDCHAR
+STARTCHAR 0xFB29
+ENCODING 64297
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 6 2 0
+BITMAP
+0800
+0800
+0800
+0800
+0800
+FF80
+ENDCHAR
+STARTCHAR 0xFB2A
+ENCODING 64298
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 0
+BITMAP
+01
+01
+00
+00
+89
+8B
+89
+49
+49
+51
+62
+24
+38
+ENDCHAR
+STARTCHAR 0xFB2B
+ENCODING 64299
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 0
+BITMAP
+80
+80
+00
+00
+89
+8B
+89
+49
+49
+51
+62
+24
+38
+ENDCHAR
+STARTCHAR 0xFB2C
+ENCODING 64300
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 0
+BITMAP
+01
+01
+00
+00
+91
+93
+91
+55
+55
+61
+62
+24
+38
+ENDCHAR
+STARTCHAR 0xFB2D
+ENCODING 64301
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 0
+BITMAP
+80
+00
+00
+91
+93
+91
+55
+55
+61
+62
+24
+38
+ENDCHAR
+STARTCHAR 0xFB2E
+ENCODING 64302
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 -3
+BITMAP
+81
+81
+61
+39
+4A
+44
+42
+41
+E1
+00
+00
+3E
+ENDCHAR
+STARTCHAR 0xFB2F
+ENCODING 64303
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 14 1 -5
+BITMAP
+81
+81
+61
+39
+4A
+44
+42
+41
+E1
+00
+00
+3E
+08
+08
+ENDCHAR
+STARTCHAR 0xFB30
+ENCODING 64304
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+81
+81
+61
+39
+4A
+44
+42
+49
+E9
+ENDCHAR
+STARTCHAR 0xFB31
+ENCODING 64305
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+80
+F8
+04
+04
+24
+24
+04
+04
+FE
+ENDCHAR
+STARTCHAR 0xFB32
+ENCODING 64306
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 1 0
+BITMAP
+40
+F0
+10
+50
+50
+18
+28
+48
+88
+ENDCHAR
+STARTCHAR 0xFB33
+ENCODING 64307
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+40
+FE
+08
+08
+48
+48
+08
+08
+08
+ENDCHAR
+STARTCHAR 0xFB34
+ENCODING 64308
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+40
+FE
+03
+01
+49
+49
+41
+41
+41
+ENDCHAR
+STARTCHAR 0xFB35
+ENCODING 64309
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 9 1 0
+BITMAP
+40
+E0
+20
+20
+A0
+A0
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFB36
+ENCODING 64310
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 10 1 0
+BITMAP
+40
+60
+30
+28
+A0
+A0
+20
+30
+10
+10
+ENDCHAR
+STARTCHAR 0xFB38
+ENCODING 64312
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 9 1 0
+BITMAP
+0700
+C980
+4080
+4880
+4880
+2080
+2100
+3600
+1C00
+ENDCHAR
+STARTCHAR 0xFB39
+ENCODING 64313
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 7 1 2
+BITMAP
+40
+E0
+30
+90
+90
+10
+20
+ENDCHAR
+STARTCHAR 0xFB3A
+ENCODING 64314
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -4
+BITMAP
+40
+FE
+04
+04
+24
+24
+04
+04
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0xFB3B
+ENCODING 64315
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 9 1 0
+BITMAP
+80
+F8
+0C
+04
+24
+24
+04
+0C
+F8
+ENDCHAR
+STARTCHAR 0xFB3C
+ENCODING 64316
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+80
+80
+80
+F8
+0C
+04
+24
+24
+08
+10
+60
+ENDCHAR
+STARTCHAR 0xFB3E
+ENCODING 64318
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+4E
+D3
+71
+21
+49
+49
+41
+43
+1E
+ENDCHAR
+STARTCHAR 0xFB40
+ENCODING 64320
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 9 1 0
+BITMAP
+40
+60
+30
+10
+90
+90
+10
+30
+E0
+ENDCHAR
+STARTCHAR 0xFB41
+ENCODING 64321
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+80
+FF
+81
+81
+49
+49
+42
+64
+38
+ENDCHAR
+STARTCHAR 0xFB43
+ENCODING 64323
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 -3
+BITMAP
+70
+CC
+84
+92
+92
+C2
+42
+02
+02
+02
+02
+02
+ENDCHAR
+STARTCHAR 0xFB44
+ENCODING 64324
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+30
+6C
+44
+52
+52
+02
+02
+06
+FC
+ENDCHAR
+STARTCHAR 0xFB46
+ENCODING 64326
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 1 0
+BITMAP
+44
+C2
+22
+14
+48
+44
+04
+04
+FC
+ENDCHAR
+STARTCHAR 0xFB47
+ENCODING 64327
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 12 1 -3
+BITMAP
+40
+FE
+03
+01
+51
+52
+42
+44
+58
+40
+40
+40
+ENDCHAR
+STARTCHAR 0xFB48
+ENCODING 64328
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 0
+BITMAP
+40
+FC
+06
+02
+22
+22
+02
+02
+02
+ENDCHAR
+STARTCHAR 0xFB49
+ENCODING 64329
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+91
+93
+91
+55
+55
+51
+62
+24
+38
+ENDCHAR
+STARTCHAR 0xFB4A
+ENCODING 64330
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 0
+BITMAP
+40
+FE
+23
+21
+29
+29
+21
+21
+E1
+ENDCHAR
+STARTCHAR 0xFB4B
+ENCODING 64331
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 12 1 0
+BITMAP
+80
+80
+00
+40
+E0
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFB4C
+ENCODING 64332
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+78
+00
+80
+FC
+04
+04
+04
+04
+04
+04
+FE
+ENDCHAR
+STARTCHAR 0xFB4D
+ENCODING 64333
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 0
+BITMAP
+78
+00
+80
+F8
+0C
+04
+04
+04
+04
+0C
+F8
+ENDCHAR
+STARTCHAR 0xFB4E
+ENCODING 64334
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 0
+BITMAP
+78
+00
+30
+6C
+44
+42
+62
+02
+02
+06
+FC
+ENDCHAR
+STARTCHAR 0xFB4F
+ENCODING 64335
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 0 0
+BITMAP
+4000
+C000
+4000
+4080
+4080
+3080
+1C80
+2500
+2200
+2100
+2080
+7080
+ENDCHAR
+STARTCHAR 0xFB50
+ENCODING 64336
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 16 0 0
+BITMAP
+10
+28
+78
+80
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFB51
+ENCODING 64337
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 17 0 -1
+BITMAP
+10
+28
+78
+80
+00
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+20
+1C
+ENDCHAR
+STARTCHAR 0xFB52
+ENCODING 64338
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 10 0 -5
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0600
+0000
+0600
+ENDCHAR
+STARTCHAR 0xFB53
+ENCODING 64339
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 10 1 -5
+BITMAP
+0020
+8020
+8010
+8010
+4070
+3F8C
+0000
+0600
+0000
+0600
+ENDCHAR
+STARTCHAR 0xFB54
+ENCODING 64340
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -5
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+30
+00
+30
+ENDCHAR
+STARTCHAR 0xFB55
+ENCODING 64341
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 -5
+BITMAP
+20
+20
+10
+10
+10
+EE
+00
+30
+00
+30
+ENDCHAR
+STARTCHAR 0xFB56
+ENCODING 64342
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 10 0 -5
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0D80
+0000
+0300
+ENDCHAR
+STARTCHAR 0xFB57
+ENCODING 64343
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 10 1 -5
+BITMAP
+0020
+8020
+8010
+8010
+4070
+3F8C
+0000
+0D80
+0000
+0300
+ENDCHAR
+STARTCHAR 0xFB58
+ENCODING 64344
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 10 0 -5
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+6C
+00
+18
+ENDCHAR
+STARTCHAR 0xFB59
+ENCODING 64345
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 -5
+BITMAP
+20
+20
+10
+10
+10
+EE
+00
+6C
+00
+18
+ENDCHAR
+STARTCHAR 0xFB5A
+ENCODING 64346
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 10 0 -5
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0D80
+0000
+0D80
+ENDCHAR
+STARTCHAR 0xFB5B
+ENCODING 64347
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 10 1 -5
+BITMAP
+0020
+8020
+8010
+8010
+4070
+3F8C
+0000
+0D80
+0000
+0D80
+ENDCHAR
+STARTCHAR 0xFB5C
+ENCODING 64348
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 10 0 -5
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+6C
+00
+6C
+ENDCHAR
+STARTCHAR 0xFB5D
+ENCODING 64349
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 -5
+BITMAP
+20
+20
+10
+10
+10
+EE
+00
+6C
+00
+6C
+ENDCHAR
+STARTCHAR 0xFB5E
+ENCODING 64350
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 12 0 -1
+BITMAP
+0400
+0400
+0000
+0400
+0400
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFB5F
+ENCODING 64351
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 12 1 -1
+BITMAP
+0400
+0400
+0000
+0400
+0400
+0000
+0020
+8020
+8010
+8010
+4070
+3F8C
+ENDCHAR
+STARTCHAR 0xFB60
+ENCODING 64352
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 0 -1
+BITMAP
+20
+20
+00
+20
+20
+00
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFB61
+ENCODING 64353
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 13 0 -1
+BITMAP
+20
+20
+00
+20
+20
+00
+00
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0xFB62
+ENCODING 64354
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 9 0 -1
+BITMAP
+0A00
+0A00
+0000
+0A20
+8A10
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFB63
+ENCODING 64355
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 9 1 -1
+BITMAP
+0A00
+0A00
+0000
+0A20
+8A20
+8010
+8010
+4070
+3F8C
+ENDCHAR
+STARTCHAR 0xFB64
+ENCODING 64356
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 0 -1
+BITMAP
+28
+28
+00
+28
+28
+00
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFB65
+ENCODING 64357
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 13 0 -1
+BITMAP
+50
+50
+00
+50
+50
+00
+00
+20
+20
+10
+10
+10
+EE
+ENDCHAR
+STARTCHAR 0xFB66
+ENCODING 64358
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 11 0 -1
+BITMAP
+0800
+0800
+0E00
+0E00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFB67
+ENCODING 64359
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 1 -1
+BITMAP
+0800
+0800
+0E00
+0E00
+0000
+0020
+8020
+8010
+8010
+4070
+3F8C
+ENDCHAR
+STARTCHAR 0xFB68
+ENCODING 64360
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 0 -1
+BITMAP
+20
+20
+38
+38
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFB69
+ENCODING 64361
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 11 0 -1
+BITMAP
+40
+40
+70
+70
+00
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0xFB6A
+ENCODING 64362
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 13 14 0 -1
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0xFB6B
+ENCODING 64363
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 1 -1
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FFE
+ENDCHAR
+STARTCHAR 0xFB6C
+ENCODING 64364
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 0 -1
+BITMAP
+08
+08
+00
+14
+14
+00
+00
+0C
+16
+12
+16
+0A
+02
+FC
+ENDCHAR
+STARTCHAR 0xFB6D
+ENCODING 64365
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 14 0 -1
+BITMAP
+0800
+0800
+0000
+1400
+1400
+0000
+0000
+0C00
+1600
+1200
+1600
+0A00
+0200
+FF80
+ENDCHAR
+STARTCHAR 0xFB6E
+ENCODING 64366
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 13 14 0 -1
+BITMAP
+0050
+0050
+0000
+0050
+0050
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0xFB6F
+ENCODING 64367
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 14 1 -1
+BITMAP
+0050
+0050
+0000
+0050
+0050
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FFE
+ENDCHAR
+STARTCHAR 0xFB70
+ENCODING 64368
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 0 -1
+BITMAP
+14
+14
+00
+14
+14
+00
+00
+0C
+16
+12
+16
+0A
+02
+FC
+ENDCHAR
+STARTCHAR 0xFB71
+ENCODING 64369
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 14 0 -1
+BITMAP
+1400
+1400
+0000
+1400
+1400
+0000
+0000
+0C00
+1600
+1200
+1600
+0A00
+0200
+FF80
+ENDCHAR
+STARTCHAR 0xFB72
+ENCODING 64370
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 -6
+BITMAP
+7E
+B0
+40
+C0
+98
+80
+98
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0xFB73
+ENCODING 64371
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -6
+BITMAP
+7F00
+B200
+4200
+C200
+99C0
+8000
+9800
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0xFB74
+ENCODING 64372
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 0 -5
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFC0
+0000
+0C00
+0000
+0C00
+ENDCHAR
+STARTCHAR 0xFB75
+ENCODING 64373
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 10 0 -5
+BITMAP
+1800
+2400
+4200
+0100
+0180
+FFE0
+0000
+0C00
+0000
+0C00
+ENDCHAR
+STARTCHAR 0xFB76
+ENCODING 64374
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 -6
+BITMAP
+7E
+B0
+40
+C0
+80
+94
+94
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0xFB77
+ENCODING 64375
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -6
+BITMAP
+7F00
+B200
+4200
+C200
+81C0
+9400
+9400
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0xFB78
+ENCODING 64376
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 0 -4
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFC0
+0000
+1400
+1400
+ENDCHAR
+STARTCHAR 0xFB79
+ENCODING 64377
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 9 0 -4
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFE0
+0000
+1400
+1400
+ENDCHAR
+STARTCHAR 0xFB7A
+ENCODING 64378
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 -6
+BITMAP
+7E
+B0
+40
+CA
+8A
+80
+84
+84
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0xFB7B
+ENCODING 64379
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -6
+BITMAP
+7F00
+B200
+4200
+C200
+95C0
+9400
+8800
+C800
+6100
+3E00
+ENDCHAR
+STARTCHAR 0xFB7C
+ENCODING 64380
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 -7
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFC0
+0000
+1400
+1400
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0xFB7D
+ENCODING 64381
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 -7
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFE0
+0000
+1400
+1400
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0xFB7E
+ENCODING 64382
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 -6
+BITMAP
+7E
+B0
+40
+D4
+94
+80
+94
+94
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0xFB7F
+ENCODING 64383
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -6
+BITMAP
+7F00
+B200
+4200
+D600
+95C0
+8000
+9400
+D400
+6100
+3E00
+ENDCHAR
+STARTCHAR 0xFB80
+ENCODING 64384
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 0 -5
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFC0
+0000
+3600
+0000
+3600
+ENDCHAR
+STARTCHAR 0xFB81
+ENCODING 64385
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 10 0 -5
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFE0
+0000
+3600
+0000
+3600
+ENDCHAR
+STARTCHAR 0xFB82
+ENCODING 64386
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 9 0 -4
+BITMAP
+10
+10
+08
+08
+88
+78
+00
+50
+50
+ENDCHAR
+STARTCHAR 0xFB83
+ENCODING 64387
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 9 1 -4
+BITMAP
+10
+10
+08
+08
+8C
+7A
+00
+50
+50
+ENDCHAR
+STARTCHAR 0xFB84
+ENCODING 64388
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 10 0 -1
+BITMAP
+50
+50
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0xFB85
+ENCODING 64389
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 10 1 -1
+BITMAP
+50
+50
+00
+00
+10
+10
+08
+08
+8C
+7A
+ENDCHAR
+STARTCHAR 0xFB86
+ENCODING 64390
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 13 0 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0xFB87
+ENCODING 64391
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 13 1 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+10
+10
+08
+08
+8C
+7A
+ENDCHAR
+STARTCHAR 0xFB88
+ENCODING 64392
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 12 0 -1
+BITMAP
+20
+20
+38
+38
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0xFB89
+ENCODING 64393
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 -1
+BITMAP
+20
+20
+38
+38
+00
+00
+10
+10
+08
+08
+8C
+7A
+ENDCHAR
+STARTCHAR 0xFB8A
+ENCODING 64394
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 15 0 -4
+BITMAP
+04
+04
+00
+0A
+0A
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0xFB8B
+ENCODING 64395
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 15 1 -4
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0000
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+ENDCHAR
+STARTCHAR 0xFB8C
+ENCODING 64396
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 14 0 -4
+BITMAP
+08
+08
+0E
+0E
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0xFB8D
+ENCODING 64397
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -4
+BITMAP
+0800
+0800
+0E00
+0E00
+0000
+0000
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+ENDCHAR
+STARTCHAR 0xFB8E
+ENCODING 64398
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 12 0 -1
+BITMAP
+0006
+0018
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFB8F
+ENCODING 64399
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 12 1 -1
+BITMAP
+0006
+0018
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+ENDCHAR
+STARTCHAR 0xFB90
+ENCODING 64400
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 12 0 -1
+BITMAP
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0xFB91
+ENCODING 64401
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 12 0 -1
+BITMAP
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0xFB92
+ENCODING 64402
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 14 0 -1
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFB93
+ENCODING 64403
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 14 1 -1
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+ENDCHAR
+STARTCHAR 0xFB94
+ENCODING 64404
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 14 0 -1
+BITMAP
+0180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0xFB95
+ENCODING 64405
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 14 0 -1
+BITMAP
+0180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0xFB96
+ENCODING 64406
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 18 0 -5
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+0000
+0C00
+0000
+0C00
+ENDCHAR
+STARTCHAR 0xFB97
+ENCODING 64407
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 18 1 -5
+BITMAP
+0006
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+0000
+0600
+0000
+0600
+ENDCHAR
+STARTCHAR 0xFB98
+ENCODING 64408
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 18 0 -5
+BITMAP
+0180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+0000
+0C00
+0000
+0C00
+ENDCHAR
+STARTCHAR 0xFB99
+ENCODING 64409
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 18 0 -5
+BITMAP
+0180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+0000
+0C00
+0000
+0C00
+ENDCHAR
+STARTCHAR 0xFB9A
+ENCODING 64410
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 15 16 0 -1
+BITMAP
+0010
+0050
+0046
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFB9B
+ENCODING 64411
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 16 1 -1
+BITMAP
+0010
+0050
+0046
+0018
+0066
+0098
+0060
+0080
+0080
+0060
+4010
+8010
+8010
+8010
+4068
+3F87
+ENDCHAR
+STARTCHAR 0xFB9C
+ENCODING 64412
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 16 0 -1
+BITMAP
+0400
+1400
+1180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0xFB9D
+ENCODING 64413
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 16 0 -1
+BITMAP
+0400
+1400
+1180
+0600
+1980
+2600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0xFB9E
+ENCODING 64414
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 8 1 -4
+BITMAP
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0xFB9F
+ENCODING 64415
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 8 1 -4
+BITMAP
+0200
+0200
+4100
+8180
+8140
+8200
+8600
+7800
+ENDCHAR
+STARTCHAR 0xFBA0
+ENCODING 64416
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 13 1 -4
+BITMAP
+20
+20
+38
+38
+00
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0xFBA1
+ENCODING 64417
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 -4
+BITMAP
+2000
+2000
+3800
+3800
+0000
+0200
+0200
+4100
+8180
+8140
+8200
+8600
+7800
+ENDCHAR
+STARTCHAR 0xFBA2
+ENCODING 64418
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 0 -1
+BITMAP
+20
+20
+38
+38
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFBA3
+ENCODING 64419
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 11 0 -1
+BITMAP
+40
+40
+70
+70
+00
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0xFBA6
+ENCODING 64422
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 0 -1
+BITMAP
+18
+04
+1A
+2A
+2A
+32
+CC
+ENDCHAR
+STARTCHAR 0xFBA7
+ENCODING 64423
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 4 1 0
+BITMAP
+18
+3C
+46
+83
+ENDCHAR
+STARTCHAR 0xFBA8
+ENCODING 64424
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -5
+BITMAP
+20
+20
+20
+20
+20
+D8
+00
+10
+20
+30
+ENDCHAR
+STARTCHAR 0xFBA9
+ENCODING 64425
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 8 0 -7
+BITMAP
+40
+CC
+30
+20
+20
+24
+28
+0C
+ENDCHAR
+STARTCHAR 0xFBAA
+ENCODING 64426
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 5 0 -2
+BITMAP
+1B00
+2480
+2480
+9F00
+6000
+ENDCHAR
+STARTCHAR 0xFBAB
+ENCODING 64427
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 5 1 -2
+BITMAP
+1B00
+2480
+2480
+9F60
+6000
+ENDCHAR
+STARTCHAR 0xFBAC
+ENCODING 64428
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 4 0 -1
+BITMAP
+1B00
+2480
+2480
+FF00
+ENDCHAR
+STARTCHAR 0xFBAD
+ENCODING 64429
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 4 0 -1
+BITMAP
+1B00
+2480
+2480
+FF60
+ENDCHAR
+STARTCHAR 0xFBAE
+ENCODING 64430
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 8 1 -4
+BITMAP
+0200
+0500
+0500
+1800
+6000
+8000
+8000
+7FF8
+ENDCHAR
+STARTCHAR 0xFBAF
+ENCODING 64431
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 8 1 -4
+BITMAP
+0200
+0500
+0500
+1900
+60E0
+8000
+8000
+7FE0
+ENDCHAR
+STARTCHAR 0xFBB0
+ENCODING 64432
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 11 1 -4
+BITMAP
+3000
+4000
+3000
+4200
+0500
+0500
+1800
+6000
+8000
+8000
+7FF8
+ENDCHAR
+STARTCHAR 0xFBB1
+ENCODING 64433
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 11 1 -4
+BITMAP
+3000
+4000
+3000
+4200
+0500
+0500
+1900
+60E0
+8000
+8000
+7FE0
+ENDCHAR
+STARTCHAR 0xFBD3
+ENCODING 64467
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 16 0 -1
+BITMAP
+0800
+0800
+0000
+1400
+1480
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+ENDCHAR
+STARTCHAR 0xFBD4
+ENCODING 64468
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 16 1 -1
+BITMAP
+0800
+0800
+0000
+1400
+1480
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+40E0
+3F30
+ENDCHAR
+STARTCHAR 0xFBD5
+ENCODING 64469
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 17 0 -1
+BITMAP
+1000
+1000
+0400
+1400
+1000
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0xFBD6
+ENCODING 64470
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 17 0 -1
+BITMAP
+1000
+1000
+0400
+1400
+1000
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0xFBD7
+ENCODING 64471
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 0 -3
+BITMAP
+04
+0A
+04
+0A
+10
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFBD8
+ENCODING 64472
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+0400
+0A00
+0400
+0A00
+1000
+0000
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFBD9
+ENCODING 64473
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 12 0 -3
+BITMAP
+12
+0C
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFBDA
+ENCODING 64474
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -3
+BITMAP
+1200
+0C00
+0000
+0000
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFBDB
+ENCODING 64475
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 0 -3
+BITMAP
+04
+04
+04
+04
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFBDC
+ENCODING 64476
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+0400
+0400
+0400
+0400
+0000
+0000
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFBDD
+ENCODING 64477
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 13 0 -3
+BITMAP
+1000
+28C0
+1100
+28C0
+4100
+0400
+0A00
+0A00
+0E00
+0200
+0200
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFBDE
+ENCODING 64478
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 15 0 -3
+BITMAP
+04
+04
+00
+0A
+0A
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFBDF
+ENCODING 64479
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 15 1 -3
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0000
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFBE0
+ENCODING 64480
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 8 0 -3
+BITMAP
+04
+0A
+0A
+0E
+02
+3E
+84
+78
+ENDCHAR
+STARTCHAR 0xFBE1
+ENCODING 64481
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 8 1 -3
+BITMAP
+0400
+0A00
+0A00
+0E00
+0300
+3E80
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFBE2
+ENCODING 64482
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 7 12 0 -3
+BITMAP
+0C
+12
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFBE3
+ENCODING 64483
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 1 -3
+BITMAP
+0C00
+1200
+0000
+0000
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFBE4
+ENCODING 64484
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 12 0 -7
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+0000
+3000
+0000
+3000
+ENDCHAR
+STARTCHAR 0xFBE5
+ENCODING 64485
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 1 -9
+BITMAP
+41C0
+8300
+8080
+8300
+7C00
+0000
+3000
+0000
+3000
+ENDCHAR
+STARTCHAR 0xFBE6
+ENCODING 64486
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -5
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+30
+00
+30
+ENDCHAR
+STARTCHAR 0xFBE7
+ENCODING 64487
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 -5
+BITMAP
+20
+20
+10
+10
+10
+FE
+00
+30
+00
+30
+ENDCHAR
+STARTCHAR 0xFBE8
+ENCODING 64488
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 6 0 -1
+BITMAP
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFBE9
+ENCODING 64489
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 6 0 -1
+BITMAP
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0xFBFC
+ENCODING 64508
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 8 0 -3
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0xFBFD
+ENCODING 64509
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 -5
+BITMAP
+41C0
+8300
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0xFBFE
+ENCODING 64510
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 0 -4
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+50
+50
+ENDCHAR
+STARTCHAR 0xFBFF
+ENCODING 64511
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 0 -4
+BITMAP
+20
+20
+10
+10
+10
+FE
+00
+28
+28
+ENDCHAR
+STARTCHAR 0xFD3E
+ENCODING 64830
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 20 1 -6
+BITMAP
+0180
+0300
+0600
+0600
+0C00
+0C00
+3400
+2400
+5D00
+E700
+A500
+7A00
+2C00
+3400
+0C00
+0C00
+0600
+0600
+0300
+0080
+ENDCHAR
+STARTCHAR 0xFD3F
+ENCODING 64831
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 20 1 -6
+BITMAP
+C000
+6000
+3000
+3000
+1800
+1800
+1600
+1200
+5D00
+7380
+5280
+2F00
+1A00
+1600
+1800
+1800
+3000
+3000
+6000
+8000
+ENDCHAR
+STARTCHAR 0xFDF2
+ENCODING 65010
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 16 0 0
+BITMAP
+0800
+0800
+0400
+0400
+0000
+0A00
+0E00
+0000
+0020
+04A0
+04A0
+24A0
+64A0
+A4A0
+64A0
+1B20
+ENDCHAR
+STARTCHAR 0xFE20
+ENCODING 65056
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 3 0 12
+BITMAP
+3C
+40
+80
+ENDCHAR
+STARTCHAR 0xFE21
+ENCODING 65057
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 6 3 0 12
+BITMAP
+F0
+08
+04
+ENDCHAR
+STARTCHAR 0xFE22
+ENCODING 65058
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 3 0 12
+BITMAP
+3C
+42
+80
+ENDCHAR
+STARTCHAR 0xFE23
+ENCODING 65059
+SWIDTH 0 0
+DWIDTH 0 0
+BBX 7 3 0 12
+BITMAP
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFE50
+ENCODING 65104
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 3 1 -2
+BITMAP
+40
+40
+80
+ENDCHAR
+STARTCHAR 0xFE51
+ENCODING 65105
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 3 3 1 0
+BITMAP
+80
+40
+20
+ENDCHAR
+STARTCHAR 0xFE52
+ENCODING 65106
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 1 2 1 0
+BITMAP
+80
+80
+ENDCHAR
+STARTCHAR 0xFE54
+ENCODING 65108
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 7 1 -2
+BITMAP
+40
+40
+00
+00
+40
+40
+80
+ENDCHAR
+STARTCHAR 0xFE55
+ENCODING 65109
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 1 6 1 1
+BITMAP
+80
+80
+00
+00
+80
+80
+ENDCHAR
+STARTCHAR 0xFE56
+ENCODING 65110
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 4 9 1 0
+BITMAP
+60
+90
+10
+20
+40
+40
+00
+40
+40
+ENDCHAR
+STARTCHAR 0xFE57
+ENCODING 65111
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 1 9 2 0
+BITMAP
+80
+80
+80
+80
+80
+80
+00
+80
+80
+ENDCHAR
+STARTCHAR 0xFE58
+ENCODING 65112
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 1 1 4
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0xFE59
+ENCODING 65113
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 10 0 -1
+BITMAP
+20
+40
+80
+80
+80
+80
+80
+80
+40
+20
+ENDCHAR
+STARTCHAR 0xFE5A
+ENCODING 65114
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 3 10 1 -1
+BITMAP
+80
+40
+20
+20
+20
+20
+20
+20
+40
+80
+ENDCHAR
+STARTCHAR 0xFE5B
+ENCODING 65115
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 10 0 -1
+BITMAP
+30
+40
+40
+40
+80
+40
+40
+40
+40
+30
+ENDCHAR
+STARTCHAR 0xFE5C
+ENCODING 65116
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 4 10 1 -1
+BITMAP
+C0
+20
+20
+20
+10
+20
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0xFE5D
+ENCODING 65117
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 9 0 -1
+BITMAP
+E0
+80
+80
+80
+80
+80
+80
+80
+E0
+ENDCHAR
+STARTCHAR 0xFE5E
+ENCODING 65118
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 3 9 1 -1
+BITMAP
+E0
+20
+20
+20
+20
+20
+20
+20
+E0
+ENDCHAR
+STARTCHAR 0xFE5F
+ENCODING 65119
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 6 7 1 1
+BITMAP
+14
+28
+FC
+50
+FC
+50
+A0
+ENDCHAR
+STARTCHAR 0xFE62
+ENCODING 65122
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 5 1 2
+BITMAP
+20
+20
+F8
+20
+20
+ENDCHAR
+STARTCHAR 0xFE63
+ENCODING 65123
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 4 1 1 4
+BITMAP
+F0
+ENDCHAR
+STARTCHAR 0xFE66
+ENCODING 65126
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 3 1 3
+BITMAP
+F8
+00
+F8
+ENDCHAR
+STARTCHAR 0xFE70
+ENCODING 65136
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 4 1 10
+BITMAP
+30
+C0
+30
+C0
+ENDCHAR
+STARTCHAR 0xFE71
+ENCODING 65137
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 10 0 4
+BITMAP
+0C00
+3000
+0C00
+3000
+0000
+0000
+0000
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0xFE72
+ENCODING 65138
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 6 1 10
+BITMAP
+0C
+14
+5C
+C8
+50
+60
+ENDCHAR
+STARTCHAR 0xFE74
+ENCODING 65140
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 4 1 -6
+BITMAP
+30
+C0
+30
+C0
+ENDCHAR
+STARTCHAR 0xFE76
+ENCODING 65142
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 2 1 10
+BITMAP
+30
+C0
+ENDCHAR
+STARTCHAR 0xFE77
+ENCODING 65143
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 8 0 4
+BITMAP
+0C00
+3000
+0000
+0000
+0000
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0xFE78
+ENCODING 65144
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 7 1 10
+BITMAP
+20
+50
+50
+38
+20
+40
+80
+ENDCHAR
+STARTCHAR 0xFE79
+ENCODING 65145
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 13 0 4
+BITMAP
+0800
+1400
+1400
+0E00
+0800
+1000
+2000
+0000
+0000
+0000
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0xFE7A
+ENCODING 65146
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 3 1 -4
+BITMAP
+10
+60
+80
+ENDCHAR
+STARTCHAR 0xFE7B
+ENCODING 65147
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 9 0 -4
+BITMAP
+FF80
+0000
+0000
+0000
+0000
+0000
+0800
+3000
+4000
+ENDCHAR
+STARTCHAR 0xFE7C
+ENCODING 65148
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 5 1 10
+BITMAP
+08
+A8
+A8
+B0
+40
+ENDCHAR
+STARTCHAR 0xFE7D
+ENCODING 65149
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 9 11 0 4
+BITMAP
+0200
+2A00
+2A00
+2C00
+1000
+0000
+0000
+0000
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0xFE7E
+ENCODING 65150
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 5 1 10
+BITMAP
+60
+90
+90
+90
+60
+ENDCHAR
+STARTCHAR 0xFE7F
+ENCODING 65151
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 11 0 4
+BITMAP
+1800
+2400
+2400
+2400
+1800
+0000
+0000
+0000
+0000
+0000
+FF80
+ENDCHAR
+STARTCHAR 0xFE80
+ENCODING 65152
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 6 1 0
+BITMAP
+70
+80
+80
+70
+C0
+80
+ENDCHAR
+STARTCHAR 0xFE81
+ENCODING 65153
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 6 14 0 0
+BITMAP
+04
+78
+80
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFE82
+ENCODING 65154
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 15 0 -1
+BITMAP
+04
+78
+80
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+20
+1C
+ENDCHAR
+STARTCHAR 0xFE83
+ENCODING 65155
+SWIDTH 240 0
+DWIDTH 4 0
+BBX 3 17 1 0
+BITMAP
+60
+80
+60
+80
+00
+00
+40
+40
+60
+40
+40
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR 0xFE84
+ENCODING 65156
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 18 1 -1
+BITMAP
+60
+80
+60
+80
+00
+00
+40
+40
+60
+40
+40
+40
+40
+40
+40
+40
+40
+38
+ENDCHAR
+STARTCHAR 0xFE85
+ENCODING 65157
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 14 0 -3
+BITMAP
+06
+08
+06
+08
+00
+00
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFE86
+ENCODING 65158
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 14 1 -3
+BITMAP
+0600
+0800
+0600
+0800
+0000
+0000
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFE87
+ENCODING 65159
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 3 17 1 -6
+BITMAP
+40
+40
+60
+40
+40
+40
+40
+40
+40
+40
+40
+00
+00
+60
+80
+60
+80
+ENDCHAR
+STARTCHAR 0xFE88
+ENCODING 65160
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 17 1 -6
+BITMAP
+40
+40
+60
+40
+40
+40
+40
+40
+40
+40
+40
+38
+00
+60
+80
+60
+80
+ENDCHAR
+STARTCHAR 0xFE89
+ENCODING 65161
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 10 13 0 -3
+BITMAP
+1800
+2000
+1800
+2000
+0000
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0xFE8A
+ENCODING 65162
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 -5
+BITMAP
+1800
+2000
+1800
+2000
+0000
+0000
+41C0
+8300
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0xFE8B
+ENCODING 65163
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 12 0 -1
+BITMAP
+18
+20
+18
+20
+00
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFE8C
+ENCODING 65164
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 -1
+BITMAP
+30
+40
+30
+40
+00
+00
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0xFE8D
+ENCODING 65165
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 2 11 2 0
+BITMAP
+80
+80
+C0
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0xFE8E
+ENCODING 65166
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 4 12 2 -1
+BITMAP
+80
+80
+C0
+80
+80
+80
+80
+80
+80
+80
+80
+70
+ENDCHAR
+STARTCHAR 0xFE8F
+ENCODING 65167
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 9 0 -4
+BITMAP
+0020
+8010
+8010
+8010
+4060
+3F80
+0000
+0400
+0400
+ENDCHAR
+STARTCHAR 0xFE90
+ENCODING 65168
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 9 1 -4
+BITMAP
+0020
+8020
+8010
+8010
+4070
+3F8C
+0000
+0200
+0200
+ENDCHAR
+STARTCHAR 0xFE91
+ENCODING 65169
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 0 -4
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+10
+10
+ENDCHAR
+STARTCHAR 0xFE92
+ENCODING 65170
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 0 -4
+BITMAP
+20
+20
+10
+10
+10
+EE
+00
+10
+10
+ENDCHAR
+STARTCHAR 0xFE93
+ENCODING 65171
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 10 1 0
+BITMAP
+50
+50
+00
+00
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0xFE94
+ENCODING 65172
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 12 1 -1
+BITMAP
+28
+28
+00
+00
+10
+30
+50
+90
+90
+70
+10
+0C
+ENDCHAR
+STARTCHAR 0xFE95
+ENCODING 65173
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 9 0 -1
+BITMAP
+0A00
+0A00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFE96
+ENCODING 65174
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 9 1 -1
+BITMAP
+0A00
+0A00
+0000
+0020
+8020
+8010
+8010
+4070
+3F8C
+ENDCHAR
+STARTCHAR 0xFE97
+ENCODING 65175
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -1
+BITMAP
+28
+28
+00
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFE98
+ENCODING 65176
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 -1
+BITMAP
+50
+50
+00
+00
+20
+20
+10
+10
+10
+EE
+ENDCHAR
+STARTCHAR 0xFE99
+ENCODING 65177
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 12 12 0 -1
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0020
+8010
+8010
+8010
+4060
+3F80
+ENDCHAR
+STARTCHAR 0xFE9A
+ENCODING 65178
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 12 1 -1
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0020
+8020
+8010
+8010
+4070
+3F8C
+ENDCHAR
+STARTCHAR 0xFE9B
+ENCODING 65179
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 13 0 -1
+BITMAP
+10
+10
+00
+28
+28
+00
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFE9C
+ENCODING 65180
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 13 0 -1
+BITMAP
+20
+20
+00
+50
+50
+00
+00
+20
+20
+10
+10
+10
+EE
+ENDCHAR
+STARTCHAR 0xFE9D
+ENCODING 65181
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 -6
+BITMAP
+7E
+B0
+40
+C0
+80
+88
+88
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0xFE9E
+ENCODING 65182
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -6
+BITMAP
+7F00
+B200
+4200
+C200
+81C0
+8800
+8800
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0xFE9F
+ENCODING 65183
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 9 0 -4
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFC0
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0xFEA0
+ENCODING 65184
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 9 0 -4
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFE0
+0000
+0800
+0800
+ENDCHAR
+STARTCHAR 0xFEA1
+ENCODING 65185
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 11 0 -6
+BITMAP
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0xFEA2
+ENCODING 65186
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 1 -6
+BITMAP
+7F00
+B200
+4200
+C200
+81C0
+8000
+8000
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0xFEA3
+ENCODING 65187
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 6 0 -1
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFC0
+ENDCHAR
+STARTCHAR 0xFEA4
+ENCODING 65188
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 6 0 -1
+BITMAP
+1800
+2400
+4200
+0100
+0080
+FFE0
+ENDCHAR
+STARTCHAR 0xFEA5
+ENCODING 65189
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 15 0 -6
+BITMAP
+10
+10
+00
+00
+7E
+B0
+40
+C0
+80
+80
+80
+80
+C0
+61
+3E
+ENDCHAR
+STARTCHAR 0xFEA6
+ENCODING 65190
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 14 1 -6
+BITMAP
+1000
+1000
+0000
+0000
+7F00
+B200
+4200
+C200
+81C0
+8000
+8000
+C000
+6100
+3E00
+ENDCHAR
+STARTCHAR 0xFEA7
+ENCODING 65191
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 10 0 -1
+BITMAP
+1000
+1000
+0000
+0000
+1800
+2400
+4200
+0100
+0080
+FFC0
+ENDCHAR
+STARTCHAR 0xFEA8
+ENCODING 65192
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 10 0 -1
+BITMAP
+1000
+1000
+0000
+0000
+1800
+2400
+4200
+0100
+0080
+FFE0
+ENDCHAR
+STARTCHAR 0xFEA9
+ENCODING 65193
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 6 0 -1
+BITMAP
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0xFEAA
+ENCODING 65194
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 6 0 -1
+BITMAP
+10
+10
+08
+08
+8C
+7A
+ENDCHAR
+STARTCHAR 0xFEAB
+ENCODING 65195
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 10 0 -1
+BITMAP
+20
+20
+00
+00
+10
+10
+08
+08
+88
+78
+ENDCHAR
+STARTCHAR 0xFEAC
+ENCODING 65196
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 10 0 -1
+BITMAP
+20
+20
+00
+00
+10
+10
+08
+08
+8C
+7A
+ENDCHAR
+STARTCHAR 0xFEAD
+ENCODING 65197
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 8 0 -4
+BITMAP
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0xFEAE
+ENCODING 65198
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 8 0 -4
+BITMAP
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+ENDCHAR
+STARTCHAR 0xFEAF
+ENCODING 65199
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 12 0 -4
+BITMAP
+08
+08
+00
+00
+04
+06
+02
+02
+02
+04
+8C
+78
+ENDCHAR
+STARTCHAR 0xFEB0
+ENCODING 65200
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 12 0 -4
+BITMAP
+0800
+0800
+0000
+0000
+0400
+0600
+0200
+0300
+0280
+0400
+8C00
+7800
+ENDCHAR
+STARTCHAR 0xFEB1
+ENCODING 65201
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 7 0 -4
+BITMAP
+0004
+4124
+8124
+81FC
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0xFEB2
+ENCODING 65202
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 7 1 -4
+BITMAP
+0004
+4124
+8124
+81FE
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0xFEB3
+ENCODING 65203
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 4 0 -1
+BITMAP
+0080
+2480
+2480
+FF80
+ENDCHAR
+STARTCHAR 0xFEB4
+ENCODING 65204
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 4 0 -1
+BITMAP
+0080
+2480
+2480
+FFC0
+ENDCHAR
+STARTCHAR 0xFEB5
+ENCODING 65205
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 14 13 0 -4
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0004
+4124
+8124
+81FC
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0xFEB6
+ENCODING 65206
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 13 1 -4
+BITMAP
+0020
+0020
+0000
+0050
+0050
+0000
+0004
+4124
+8124
+81FE
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0xFEB7
+ENCODING 65207
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 10 0 -1
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0080
+2480
+2480
+FF80
+ENDCHAR
+STARTCHAR 0xFEB8
+ENCODING 65208
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 10 0 -1
+BITMAP
+0400
+0400
+0000
+0A00
+0A00
+0000
+0080
+2480
+2480
+FFC0
+ENDCHAR
+STARTCHAR 0xFEB9
+ENCODING 65209
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 19 7 0 -4
+BITMAP
+000380
+410C40
+811020
+81FFE0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0xFEBA
+ENCODING 65210
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 7 1 -4
+BITMAP
+000380
+410C40
+811020
+81FFF0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0xFEBB
+ENCODING 65211
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 4 0 -1
+BITMAP
+0038
+10C4
+1102
+EFFE
+ENDCHAR
+STARTCHAR 0xFEBC
+ENCODING 65212
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 4 0 -1
+BITMAP
+0038
+10C4
+1102
+EFFF
+ENDCHAR
+STARTCHAR 0xFEBD
+ENCODING 65213
+SWIDTH 1140 0
+DWIDTH 19 0
+BBX 19 11 0 -4
+BITMAP
+000800
+000800
+000000
+000000
+000380
+410C40
+811020
+81FFE0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0xFEBE
+ENCODING 65214
+SWIDTH 1260 0
+DWIDTH 21 0
+BBX 20 11 1 -4
+BITMAP
+000800
+000800
+000000
+000000
+000380
+410C40
+811020
+81FFF0
+810000
+420000
+3C0000
+ENDCHAR
+STARTCHAR 0xFEBF
+ENCODING 65215
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 15 8 0 -1
+BITMAP
+0080
+0080
+0000
+0000
+0038
+10C4
+1102
+EFFE
+ENDCHAR
+STARTCHAR 0xFEC0
+ENCODING 65216
+SWIDTH 960 0
+DWIDTH 16 0
+BBX 16 8 0 -1
+BITMAP
+0080
+0080
+0000
+0000
+0038
+10C4
+1102
+EFFF
+ENDCHAR
+STARTCHAR 0xFEC1
+ENCODING 65217
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 -1
+BITMAP
+1000
+1000
+1800
+1000
+1000
+1000
+1000
+1380
+1440
+1840
+1040
+FF80
+ENDCHAR
+STARTCHAR 0xFEC2
+ENCODING 65218
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 -1
+BITMAP
+1000
+1000
+1800
+1000
+1000
+1000
+1000
+1380
+1440
+1840
+1040
+FFF0
+ENDCHAR
+STARTCHAR 0xFEC3
+ENCODING 65219
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 0 -1
+BITMAP
+2000
+2000
+3000
+2000
+2000
+2000
+2000
+2700
+2880
+3080
+2080
+FF00
+ENDCHAR
+STARTCHAR 0xFEC4
+ENCODING 65220
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 -1
+BITMAP
+2000
+2000
+3000
+2000
+2000
+2000
+2000
+2700
+2880
+3080
+2080
+FFE0
+ENDCHAR
+STARTCHAR 0xFEC5
+ENCODING 65221
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 -1
+BITMAP
+1000
+1000
+1800
+1100
+1100
+1000
+1000
+1380
+1440
+1840
+1040
+FF80
+ENDCHAR
+STARTCHAR 0xFEC6
+ENCODING 65222
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 -1
+BITMAP
+1000
+1000
+1800
+1100
+1100
+1000
+1000
+1380
+1440
+1840
+1040
+FFF0
+ENDCHAR
+STARTCHAR 0xFEC7
+ENCODING 65223
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 9 12 0 -1
+BITMAP
+2000
+2000
+3000
+2200
+2200
+2000
+2000
+2700
+2880
+3080
+2080
+FF00
+ENDCHAR
+STARTCHAR 0xFEC8
+ENCODING 65224
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 11 12 0 -1
+BITMAP
+2000
+2000
+3000
+2200
+2200
+2000
+2000
+2700
+2880
+3080
+2080
+FFE0
+ENDCHAR
+STARTCHAR 0xFEC9
+ENCODING 65225
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 0 -5
+BITMAP
+38
+40
+40
+38
+60
+40
+80
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0xFECA
+ENCODING 65226
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 1 -5
+BITMAP
+70
+78
+38
+70
+8F
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0xFECB
+ENCODING 65227
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 5 0 -1
+BITMAP
+1C
+22
+20
+10
+FF
+ENDCHAR
+STARTCHAR 0xFECC
+ENCODING 65228
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 5 0 -1
+BITMAP
+38
+3C
+1C
+18
+E7
+ENDCHAR
+STARTCHAR 0xFECD
+ENCODING 65229
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 15 0 -5
+BITMAP
+10
+10
+00
+00
+38
+40
+40
+38
+60
+40
+80
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0xFECE
+ENCODING 65230
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 1 -5
+BITMAP
+20
+20
+00
+00
+70
+78
+38
+70
+8F
+80
+80
+82
+7C
+ENDCHAR
+STARTCHAR 0xFECF
+ENCODING 65231
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 9 0 -1
+BITMAP
+08
+08
+00
+00
+1C
+22
+20
+10
+FF
+ENDCHAR
+STARTCHAR 0xFED0
+ENCODING 65232
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 9 0 -1
+BITMAP
+10
+10
+00
+00
+38
+3C
+1C
+18
+E7
+ENDCHAR
+STARTCHAR 0xFED1
+ENCODING 65233
+SWIDTH 840 0
+DWIDTH 14 0
+BBX 13 11 0 -1
+BITMAP
+0040
+0040
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FF0
+ENDCHAR
+STARTCHAR 0xFED2
+ENCODING 65234
+SWIDTH 900 0
+DWIDTH 15 0
+BBX 14 11 1 -1
+BITMAP
+0040
+0040
+0000
+0000
+0030
+0058
+8048
+8058
+8028
+4008
+3FFC
+ENDCHAR
+STARTCHAR 0xFED3
+ENCODING 65235
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 11 0 -1
+BITMAP
+40
+40
+00
+00
+30
+58
+48
+58
+28
+08
+F0
+ENDCHAR
+STARTCHAR 0xFED4
+ENCODING 65236
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 11 0 -1
+BITMAP
+40
+40
+00
+00
+30
+58
+48
+58
+28
+08
+FC
+ENDCHAR
+STARTCHAR 0xFED5
+ENCODING 65237
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 -4
+BITMAP
+0A
+0A
+00
+00
+06
+0B
+09
+0B
+85
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0xFED6
+ENCODING 65238
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -4
+BITMAP
+0A00
+0A00
+0000
+0000
+0600
+0B00
+0900
+0B00
+85C0
+8160
+8100
+4200
+3C00
+ENDCHAR
+STARTCHAR 0xFED7
+ENCODING 65239
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 10 0 -1
+BITMAP
+50
+50
+00
+00
+30
+58
+48
+58
+28
+F0
+ENDCHAR
+STARTCHAR 0xFED8
+ENCODING 65240
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 10 0 -1
+BITMAP
+50
+50
+00
+00
+30
+58
+48
+58
+28
+FC
+ENDCHAR
+STARTCHAR 0xFED9
+ENCODING 65241
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 12 0 -1
+BITMAP
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+4080
+3F00
+ENDCHAR
+STARTCHAR 0xFEDA
+ENCODING 65242
+SWIDTH 780 0
+DWIDTH 13 0
+BBX 12 12 1 -1
+BITMAP
+0080
+0080
+00C0
+0080
+0480
+0C80
+0480
+0C80
+8080
+8080
+40E0
+3F30
+ENDCHAR
+STARTCHAR 0xFEDB
+ENCODING 65243
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 9 12 0 -1
+BITMAP
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1800
+E000
+ENDCHAR
+STARTCHAR 0xFEDC
+ENCODING 65244
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 12 0 -1
+BITMAP
+0180
+0600
+1800
+2000
+2000
+1800
+0400
+0400
+0400
+0400
+1A00
+E1C0
+ENDCHAR
+STARTCHAR 0xFEDD
+ENCODING 65245
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 8 13 0 -3
+BITMAP
+02
+02
+03
+02
+02
+02
+02
+02
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0xFEDE
+ENCODING 65246
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 13 1 -3
+BITMAP
+0200
+0200
+0300
+0200
+0200
+0200
+0200
+0200
+8200
+8380
+82C0
+4400
+3800
+ENDCHAR
+STARTCHAR 0xFEDF
+ENCODING 65247
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 4 11 0 -1
+BITMAP
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0xFEE0
+ENCODING 65248
+SWIDTH 300 0
+DWIDTH 5 0
+BBX 5 11 0 -1
+BITMAP
+20
+20
+30
+20
+20
+20
+20
+20
+20
+20
+D8
+ENDCHAR
+STARTCHAR 0xFEE1
+ENCODING 65249
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 11 1 -8
+BITMAP
+20
+70
+18
+FC
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0xFEE2
+ENCODING 65250
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -8
+BITMAP
+20
+70
+18
+FE
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0xFEE3
+ENCODING 65251
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 5 0 -1
+BITMAP
+0C
+0A
+12
+12
+EE
+ENDCHAR
+STARTCHAR 0xFEE4
+ENCODING 65252
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 5 0 -1
+BITMAP
+0C00
+0A00
+1200
+1200
+EF80
+ENDCHAR
+STARTCHAR 0xFEE5
+ENCODING 65253
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 8 11 1 -4
+BITMAP
+10
+10
+00
+02
+02
+41
+81
+81
+82
+86
+78
+ENDCHAR
+STARTCHAR 0xFEE6
+ENCODING 65254
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 11 1 -4
+BITMAP
+1000
+1000
+0000
+0200
+0200
+4100
+8180
+8140
+8200
+8600
+7800
+ENDCHAR
+STARTCHAR 0xFEE7
+ENCODING 65255
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 0 -1
+BITMAP
+10
+10
+00
+10
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFEE8
+ENCODING 65256
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 0 -1
+BITMAP
+20
+20
+00
+20
+20
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0xFEE9
+ENCODING 65257
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 5 6 1 0
+BITMAP
+20
+30
+50
+98
+88
+78
+ENDCHAR
+STARTCHAR 0xFEEA
+ENCODING 65258
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 6 8 1 -1
+BITMAP
+10
+30
+50
+90
+90
+70
+10
+0C
+ENDCHAR
+STARTCHAR 0xFEEB
+ENCODING 65259
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 7 0 -1
+BITMAP
+18
+04
+1A
+2A
+2A
+32
+CC
+ENDCHAR
+STARTCHAR 0xFEEC
+ENCODING 65260
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 6 11 0 -6
+BITMAP
+18
+28
+28
+28
+30
+FC
+30
+28
+28
+28
+10
+ENDCHAR
+STARTCHAR 0xFEED
+ENCODING 65261
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 8 0 -3
+BITMAP
+04
+0A
+0A
+0E
+02
+02
+84
+78
+ENDCHAR
+STARTCHAR 0xFEEE
+ENCODING 65262
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 9 8 0 -3
+BITMAP
+0400
+0A00
+0A00
+0E00
+0300
+0280
+8400
+7800
+ENDCHAR
+STARTCHAR 0xFEEF
+ENCODING 65263
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 8 0 -3
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0xFEF0
+ENCODING 65264
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 5 1 -5
+BITMAP
+41C0
+8300
+8080
+8300
+7C00
+ENDCHAR
+STARTCHAR 0xFEF1
+ENCODING 65265
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 10 11 0 -6
+BITMAP
+01C0
+4200
+4400
+8700
+8080
+8080
+8300
+7C00
+0000
+2800
+2800
+ENDCHAR
+STARTCHAR 0xFEF2
+ENCODING 65266
+SWIDTH 660 0
+DWIDTH 11 0
+BBX 10 8 1 -8
+BITMAP
+41C0
+8300
+8080
+8300
+7C00
+0000
+2800
+2800
+ENDCHAR
+STARTCHAR 0xFEF3
+ENCODING 65267
+SWIDTH 360 0
+DWIDTH 6 0
+BBX 5 9 0 -4
+BITMAP
+10
+08
+08
+08
+08
+F0
+00
+50
+50
+ENDCHAR
+STARTCHAR 0xFEF4
+ENCODING 65268
+SWIDTH 420 0
+DWIDTH 7 0
+BBX 7 9 0 -4
+BITMAP
+20
+20
+10
+10
+10
+FE
+00
+28
+28
+ENDCHAR
+STARTCHAR 0xFEF5
+ENCODING 65269
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 12 0 -1
+BITMAP
+52
+A3
+02
+62
+72
+14
+0C
+0C
+0C
+14
+24
+38
+ENDCHAR
+STARTCHAR 0xFEF6
+ENCODING 65270
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -2
+BITMAP
+5200
+A200
+0300
+6200
+7200
+1200
+1200
+0A00
+0A00
+0D00
+1900
+70E0
+C000
+ENDCHAR
+STARTCHAR 0xFEF7
+ENCODING 65271
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 8 15 0 -1
+BITMAP
+60
+80
+60
+82
+03
+02
+62
+72
+14
+0C
+0C
+0C
+14
+24
+38
+ENDCHAR
+STARTCHAR 0xFEF8
+ENCODING 65272
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 16 1 -2
+BITMAP
+6000
+8000
+6000
+8200
+0200
+0300
+6200
+7200
+1200
+1200
+0A00
+0A00
+0D00
+1900
+70E0
+C000
+ENDCHAR
+STARTCHAR 0xFEF9
+ENCODING 65273
+SWIDTH 540 0
+DWIDTH 9 0
+BBX 7 17 1 -6
+BITMAP
+04
+06
+04
+C4
+E4
+28
+18
+18
+18
+28
+48
+70
+00
+60
+80
+60
+80
+ENDCHAR
+STARTCHAR 0xFEFA
+ENCODING 65274
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 18 1 -7
+BITMAP
+0200
+0200
+0300
+6200
+7200
+1200
+1200
+0A00
+0A00
+0D00
+1900
+70E0
+C000
+0000
+1800
+2000
+1800
+2000
+ENDCHAR
+STARTCHAR 0xFEFB
+ENCODING 65275
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 12 1 -1
+BITMAP
+04
+06
+04
+C4
+E4
+28
+18
+18
+18
+28
+48
+70
+ENDCHAR
+STARTCHAR 0xFEFC
+ENCODING 65276
+SWIDTH 720 0
+DWIDTH 12 0
+BBX 11 13 1 -2
+BITMAP
+0200
+0200
+0300
+6200
+7200
+1200
+1200
+0A00
+0A00
+0D00
+1900
+70E0
+C000
+ENDCHAR
+STARTCHAR 0xFF01
+ENCODING 65281
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 2 12 7 -1
+BITMAP
+C0
+C0
+C0
+C0
+40
+40
+40
+80
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0xFF02
+ENCODING 65282
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 4 1 8
+BITMAP
+90
+90
+90
+90
+ENDCHAR
+STARTCHAR 0xFF03
+ENCODING 65283
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 13 3 -2
+BITMAP
+0100
+1100
+1100
+7FC0
+1200
+1200
+2200
+2200
+2200
+FF80
+2200
+2200
+2200
+ENDCHAR
+STARTCHAR 0xFF04
+ENCODING 65284
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 15 5 -3
+BITMAP
+10
+78
+94
+94
+90
+D0
+70
+38
+14
+12
+92
+92
+94
+78
+10
+ENDCHAR
+STARTCHAR 0xFF05
+ENCODING 65285
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 13 2 -2
+BITMAP
+7010
+8820
+8840
+8880
+8900
+8A00
+74E0
+0910
+1110
+2110
+4110
+8110
+00E0
+ENDCHAR
+STARTCHAR 0xFF06
+ENCODING 65286
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 13 2 -2
+BITMAP
+0E00
+1100
+1100
+1100
+1600
+08F0
+3840
+4440
+8640
+8240
+C180
+6190
+1E60
+ENDCHAR
+STARTCHAR 0xFF07
+ENCODING 65287
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 1 4 1 8
+BITMAP
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0xFF08
+ENCODING 65288
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 14 10 -2
+BITMAP
+10
+20
+40
+40
+80
+80
+80
+80
+80
+80
+40
+40
+20
+10
+ENDCHAR
+STARTCHAR 0xFF09
+ENCODING 65289
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 14 3 -2
+BITMAP
+80
+40
+20
+20
+10
+10
+10
+10
+10
+10
+20
+20
+40
+80
+ENDCHAR
+STARTCHAR 0xFF0A
+ENCODING 65290
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 10 3 0
+BITMAP
+0C00
+0C00
+C8C0
+6D80
+1E00
+0C00
+7F80
+C8C0
+0C00
+0C00
+ENDCHAR
+STARTCHAR 0xFF0B
+ENCODING 65291
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 9 3 0
+BITMAP
+0800
+0800
+0800
+0800
+FF80
+0800
+0800
+0800
+0800
+ENDCHAR
+STARTCHAR 0xFF0C
+ENCODING 65292
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 2 4 1 -2
+BITMAP
+C0
+C0
+40
+80
+ENDCHAR
+STARTCHAR 0xFF0D
+ENCODING 65293
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 1 2 4
+BITMAP
+FFF0
+ENDCHAR
+STARTCHAR 0xFF0E
+ENCODING 65294
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 2 2 1 -1
+BITMAP
+C0
+C0
+ENDCHAR
+STARTCHAR 0xFF0F
+ENCODING 65295
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 14 14 1 -2
+BITMAP
+0004
+0008
+0010
+0020
+0040
+0080
+0100
+0200
+0400
+0800
+1000
+2000
+4000
+8000
+ENDCHAR
+STARTCHAR 0xFF10
+ENCODING 65296
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 13 4 -1
+BITMAP
+38
+44
+82
+82
+82
+82
+82
+82
+82
+82
+82
+44
+38
+ENDCHAR
+STARTCHAR 0xFF11
+ENCODING 65297
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 13 5 -1
+BITMAP
+30
+D0
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+FE
+ENDCHAR
+STARTCHAR 0xFF12
+ENCODING 65298
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 13 4 -1
+BITMAP
+3C
+42
+81
+81
+C1
+01
+02
+0C
+30
+40
+80
+81
+FF
+ENDCHAR
+STARTCHAR 0xFF13
+ENCODING 65299
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 13 4 -1
+BITMAP
+3C
+42
+81
+C1
+01
+02
+1C
+02
+01
+C1
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0xFF14
+ENCODING 65300
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 13 3 -1
+BITMAP
+0100
+0300
+0500
+0500
+0900
+1100
+1100
+2100
+4100
+FF80
+0100
+0100
+0780
+ENDCHAR
+STARTCHAR 0xFF15
+ENCODING 65301
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 13 4 -1
+BITMAP
+FF
+80
+80
+80
+80
+BC
+C2
+01
+01
+01
+C1
+82
+7C
+ENDCHAR
+STARTCHAR 0xFF16
+ENCODING 65302
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 13 5 -1
+BITMAP
+38
+44
+82
+86
+80
+80
+FC
+82
+82
+82
+82
+82
+7C
+ENDCHAR
+STARTCHAR 0xFF17
+ENCODING 65303
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 13 3 -1
+BITMAP
+FFC0
+8080
+8080
+0100
+0200
+0200
+0400
+0400
+0400
+0800
+0800
+0800
+0800
+ENDCHAR
+STARTCHAR 0xFF18
+ENCODING 65304
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 13 4 -1
+BITMAP
+3C
+42
+81
+81
+C1
+62
+3C
+46
+83
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0xFF19
+ENCODING 65305
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 13 4 -1
+BITMAP
+3C
+42
+81
+81
+81
+81
+81
+43
+3D
+01
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0xFF1A
+ENCODING 65306
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 2 8 7 -1
+BITMAP
+C0
+C0
+00
+00
+00
+00
+C0
+C0
+ENDCHAR
+STARTCHAR 0xFF1B
+ENCODING 65307
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 2 10 7 -3
+BITMAP
+C0
+C0
+00
+00
+00
+C0
+C0
+40
+40
+80
+ENDCHAR
+STARTCHAR 0xFF1C
+ENCODING 65308
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 11 3 -1
+BITMAP
+0080
+0300
+0C00
+3000
+4000
+8000
+4000
+3000
+0C00
+0300
+0080
+ENDCHAR
+STARTCHAR 0xFF1D
+ENCODING 65309
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 4 2 3
+BITMAP
+FFF0
+0000
+0000
+FFF0
+ENDCHAR
+STARTCHAR 0xFF1E
+ENCODING 65310
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 11 4 -1
+BITMAP
+8000
+6000
+1800
+0600
+0180
+0040
+0180
+0600
+1800
+6000
+8000
+ENDCHAR
+STARTCHAR 0xFF1F
+ENCODING 65311
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 13 4 -2
+BITMAP
+7E
+81
+81
+C1
+02
+04
+08
+08
+00
+00
+00
+18
+18
+ENDCHAR
+STARTCHAR 0xFF20
+ENCODING 65312
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 14 15 1 -3
+BITMAP
+0380
+1C60
+2010
+4108
+42E8
+C444
+8844
+8848
+8848
+4894
+4FE8
+6008
+3010
+0C60
+0380
+ENDCHAR
+STARTCHAR 0xFF21
+ENCODING 65313
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 12 2 -1
+BITMAP
+0600
+0600
+0900
+0900
+0900
+1080
+1080
+1F80
+30C0
+2040
+2040
+F0F0
+ENDCHAR
+STARTCHAR 0xFF22
+ENCODING 65314
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 12 3 -1
+BITMAP
+FF00
+2080
+2040
+2040
+2080
+3F00
+2080
+2040
+2040
+2040
+2080
+FF00
+ENDCHAR
+STARTCHAR 0xFF23
+ENCODING 65315
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 12 3 -1
+BITMAP
+1E80
+2180
+4080
+8080
+8000
+8000
+8000
+8000
+8080
+4080
+2100
+1E00
+ENDCHAR
+STARTCHAR 0xFF24
+ENCODING 65316
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 11 12 2 -1
+BITMAP
+FF00
+20C0
+2040
+2020
+2020
+2020
+2020
+2020
+2020
+2040
+20C0
+FF00
+ENDCHAR
+STARTCHAR 0xFF25
+ENCODING 65317
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 12 3 -1
+BITMAP
+FFC0
+2040
+2040
+2200
+2200
+3E00
+2200
+2200
+2000
+2040
+2040
+FFC0
+ENDCHAR
+STARTCHAR 0xFF26
+ENCODING 65318
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 12 3 -1
+BITMAP
+FFC0
+2040
+2040
+2200
+2200
+3E00
+2200
+2200
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0xFF27
+ENCODING 65319
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 12 3 -1
+BITMAP
+1F80
+2080
+4040
+8000
+8000
+8000
+83C0
+8080
+8080
+4080
+2080
+1F00
+ENDCHAR
+STARTCHAR 0xFF28
+ENCODING 65320
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 13 12 1 -1
+BITMAP
+F8F8
+2020
+2020
+2020
+2020
+3FE0
+2020
+2020
+2020
+2020
+2020
+F8F8
+ENDCHAR
+STARTCHAR 0xFF29
+ENCODING 65321
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 5 12 6 -1
+BITMAP
+F8
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0xFF2A
+ENCODING 65322
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 6 12 5 -1
+BITMAP
+7C
+10
+10
+10
+10
+10
+10
+10
+10
+10
+90
+E0
+ENDCHAR
+STARTCHAR 0xFF2B
+ENCODING 65323
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 12 2 -1
+BITMAP
+F9E0
+2080
+2100
+2200
+2400
+2A00
+3200
+2100
+2080
+2080
+2040
+F9F0
+ENDCHAR
+STARTCHAR 0xFF2C
+ENCODING 65324
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 12 3 -1
+BITMAP
+F800
+2000
+2000
+2000
+2000
+2000
+2000
+2000
+2040
+2040
+2040
+FFC0
+ENDCHAR
+STARTCHAR 0xFF2D
+ENCODING 65325
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 12 0 -1
+BITMAP
+F00E
+2818
+2818
+2828
+2428
+2448
+2648
+2288
+2288
+2188
+2108
+F93E
+ENDCHAR
+STARTCHAR 0xFF2E
+ENCODING 65326
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 13 12 1 -1
+BITMAP
+F0F8
+2820
+2420
+2420
+2220
+2120
+21A0
+20A0
+2060
+2060
+2020
+F820
+ENDCHAR
+STARTCHAR 0xFF2F
+ENCODING 65327
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 12 3 -1
+BITMAP
+1E00
+6180
+4080
+8040
+8040
+8040
+8040
+8040
+8040
+4080
+6180
+1E00
+ENDCHAR
+STARTCHAR 0xFF30
+ENCODING 65328
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 12 3 -1
+BITMAP
+FF00
+2080
+2040
+2040
+2040
+2080
+3F00
+2000
+2000
+2000
+2000
+F800
+ENDCHAR
+STARTCHAR 0xFF31
+ENCODING 65329
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 14 3 -3
+BITMAP
+1E00
+6180
+4080
+8040
+8040
+8040
+8040
+8040
+9C40
+6480
+6380
+1E00
+0100
+0080
+ENDCHAR
+STARTCHAR 0xFF32
+ENCODING 65330
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 12 2 -1
+BITMAP
+FF80
+2040
+2040
+2040
+2040
+3F80
+2200
+2100
+2100
+2080
+2040
+F8F0
+ENDCHAR
+STARTCHAR 0xFF33
+ENCODING 65331
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 12 2 -1
+BITMAP
+3E
+41
+41
+40
+20
+18
+06
+01
+81
+81
+41
+3E
+ENDCHAR
+STARTCHAR 0xFF34
+ENCODING 65332
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 13 12 2 -1
+BITMAP
+FFF8
+8208
+8208
+0200
+0200
+0200
+0200
+0200
+0200
+0200
+0200
+0F80
+ENDCHAR
+STARTCHAR 0xFF35
+ENCODING 65333
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 11 12 3 -1
+BITMAP
+FBE0
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+2080
+1F00
+ENDCHAR
+STARTCHAR 0xFF36
+ENCODING 65334
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 11 2 0
+BITMAP
+F9F0
+2040
+1080
+1080
+1080
+0900
+0900
+0900
+0600
+0600
+0600
+ENDCHAR
+STARTCHAR 0xFF37
+ENCODING 65335
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 15 12 1 -1
+BITMAP
+F83E
+2108
+2310
+2310
+2490
+14A0
+14A0
+14A0
+18A0
+1840
+0840
+0840
+ENDCHAR
+STARTCHAR 0xFF38
+ENCODING 65336
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 12 2 -1
+BITMAP
+79E0
+1080
+0900
+0D00
+0600
+0200
+0600
+0900
+0980
+1080
+2040
+F9F0
+ENDCHAR
+STARTCHAR 0xFF39
+ENCODING 65337
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 12 2 -1
+BITMAP
+FDF0
+3040
+1080
+1880
+0900
+0D00
+0600
+0600
+0600
+0600
+0600
+1F80
+ENDCHAR
+STARTCHAR 0xFF3A
+ENCODING 65338
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 12 4 -1
+BITMAP
+FF
+81
+82
+84
+04
+08
+10
+20
+21
+41
+81
+FF
+ENDCHAR
+STARTCHAR 0xFF3B
+ENCODING 65339
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 15 10 -3
+BITMAP
+F0
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+F0
+ENDCHAR
+STARTCHAR 0xFF3C
+ENCODING 65340
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 14 14 1 -2
+BITMAP
+8000
+4000
+2000
+1000
+0800
+0400
+0200
+0100
+0080
+0040
+0020
+0010
+0008
+0004
+ENDCHAR
+STARTCHAR 0xFF3D
+ENCODING 65341
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 15 2 -3
+BITMAP
+F0
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+10
+F0
+ENDCHAR
+STARTCHAR 0xFF3E
+ENCODING 65342
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 4 4 10
+BITMAP
+10
+28
+44
+82
+ENDCHAR
+STARTCHAR 0xFF3F
+ENCODING 65343
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 14 1 1 -4
+BITMAP
+FFFC
+ENDCHAR
+STARTCHAR 0xFF40
+ENCODING 65344
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 4 7 10
+BITMAP
+80
+40
+20
+10
+ENDCHAR
+STARTCHAR 0xFF41
+ENCODING 65345
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 9 4 -1
+BITMAP
+18
+64
+42
+02
+3E
+42
+82
+8E
+72
+ENDCHAR
+STARTCHAR 0xFF42
+ENCODING 65346
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 12 4 -1
+BITMAP
+C0
+40
+40
+40
+5C
+62
+41
+41
+41
+41
+42
+3C
+ENDCHAR
+STARTCHAR 0xFF43
+ENCODING 65347
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 6 9 5 -1
+BITMAP
+38
+44
+84
+80
+80
+80
+80
+44
+38
+ENDCHAR
+STARTCHAR 0xFF44
+ENCODING 65348
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 12 4 -1
+BITMAP
+0600
+0200
+0200
+1A00
+6600
+8200
+8200
+8200
+8200
+8200
+4200
+3D80
+ENDCHAR
+STARTCHAR 0xFF45
+ENCODING 65349
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 6 9 5 -1
+BITMAP
+78
+84
+84
+84
+F8
+80
+80
+44
+38
+ENDCHAR
+STARTCHAR 0xFF46
+ENCODING 65350
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 5 13 6 -1
+BITMAP
+10
+28
+40
+40
+40
+E0
+40
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0xFF47
+ENCODING 65351
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 12 4 -4
+BITMAP
+3900
+4680
+8200
+8200
+4200
+4400
+7800
+7000
+8E00
+8100
+8200
+7C00
+ENDCHAR
+STARTCHAR 0xFF48
+ENCODING 65352
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 12 4 -1
+BITMAP
+C0
+40
+40
+4C
+72
+42
+42
+42
+42
+42
+42
+E7
+ENDCHAR
+STARTCHAR 0xFF49
+ENCODING 65353
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 5 12 6 -1
+BITMAP
+60
+60
+00
+20
+E0
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0xFF4A
+ENCODING 65354
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 5 15 5 -4
+BITMAP
+18
+18
+00
+08
+38
+08
+08
+08
+08
+08
+08
+08
+08
+88
+70
+ENDCHAR
+STARTCHAR 0xFF4B
+ENCODING 65355
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 12 4 -1
+BITMAP
+C000
+4000
+4000
+4000
+4600
+4800
+5000
+6800
+4800
+4400
+4200
+E780
+ENDCHAR
+STARTCHAR 0xFF4C
+ENCODING 65356
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 5 12 6 -1
+BITMAP
+E0
+20
+20
+20
+20
+20
+20
+20
+20
+20
+20
+F8
+ENDCHAR
+STARTCHAR 0xFF4D
+ENCODING 65357
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 13 9 2 -1
+BITMAP
+58C0
+E730
+4210
+4210
+4210
+4210
+4210
+4210
+E738
+ENDCHAR
+STARTCHAR 0xFF4E
+ENCODING 65358
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 9 9 4 -1
+BITMAP
+0C00
+F200
+4100
+4100
+4100
+4100
+4100
+4100
+E380
+ENDCHAR
+STARTCHAR 0xFF4F
+ENCODING 65359
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 9 4 -1
+BITMAP
+3C
+42
+81
+81
+81
+81
+81
+42
+3C
+ENDCHAR
+STARTCHAR 0xFF50
+ENCODING 65360
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 11 4 -4
+BITMAP
+FC
+42
+41
+41
+41
+41
+42
+7C
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0xFF51
+ENCODING 65361
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 11 4 -4
+BITMAP
+3E
+42
+82
+82
+82
+82
+42
+3E
+02
+02
+07
+ENDCHAR
+STARTCHAR 0xFF52
+ENCODING 65362
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 6 8 5 -1
+BITMAP
+58
+64
+40
+40
+40
+40
+40
+E0
+ENDCHAR
+STARTCHAR 0xFF53
+ENCODING 65363
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 6 9 5 -1
+BITMAP
+78
+84
+84
+80
+78
+04
+84
+84
+78
+ENDCHAR
+STARTCHAR 0xFF54
+ENCODING 65364
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 5 11 6 -1
+BITMAP
+40
+40
+40
+E0
+40
+40
+40
+40
+40
+48
+30
+ENDCHAR
+STARTCHAR 0xFF55
+ENCODING 65365
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 8 5 -1
+BITMAP
+84
+84
+84
+84
+84
+84
+84
+7E
+ENDCHAR
+STARTCHAR 0xFF56
+ENCODING 65366
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 7 4 0
+BITMAP
+C3
+42
+24
+24
+18
+18
+18
+ENDCHAR
+STARTCHAR 0xFF57
+ENCODING 65367
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 11 7 2 0
+BITMAP
+C460
+4440
+4A40
+2A80
+2A80
+3180
+1100
+ENDCHAR
+STARTCHAR 0xFF58
+ENCODING 65368
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 8 8 4 -1
+BITMAP
+E7
+42
+24
+18
+18
+24
+42
+E7
+ENDCHAR
+STARTCHAR 0xFF59
+ENCODING 65369
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 7 10 4 -3
+BITMAP
+62
+24
+24
+14
+18
+18
+08
+10
+90
+60
+ENDCHAR
+STARTCHAR 0xFF5A
+ENCODING 65370
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 6 8 5 -1
+BITMAP
+FC
+84
+08
+10
+20
+40
+84
+FC
+ENDCHAR
+STARTCHAR 0xFF5B
+ENCODING 65371
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 16 11 -3
+BITMAP
+30
+40
+40
+40
+40
+40
+40
+80
+80
+40
+40
+40
+40
+40
+40
+30
+ENDCHAR
+STARTCHAR 0xFF5C
+ENCODING 65372
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 1 13 7 -2
+BITMAP
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0xFF5D
+ENCODING 65373
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 4 16 1 -3
+BITMAP
+C0
+20
+20
+20
+20
+20
+20
+10
+10
+20
+20
+20
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0xFF5E
+ENCODING 65374
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 4 2 3
+BITMAP
+3800
+4410
+8220
+01C0
+ENDCHAR
+STARTCHAR 0xFF66
+ENCODING 65382
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 13 2 -2
+BITMAP
+08
+F8
+08
+08
+08
+10
+F0
+10
+20
+20
+20
+40
+80
+ENDCHAR
+STARTCHAR 0xFF67
+ENCODING 65383
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 10 2 -2
+BITMAP
+10
+E8
+10
+20
+20
+40
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0xFF68
+ENCODING 65384
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 4 11 2 -3
+BITMAP
+10
+10
+20
+20
+60
+A0
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF69
+ENCODING 65385
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 9 2 -2
+BITMAP
+40
+F8
+90
+90
+90
+10
+20
+20
+40
+ENDCHAR
+STARTCHAR 0xFF6A
+ENCODING 65386
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 8 2 -1
+BITMAP
+10
+E0
+40
+40
+40
+40
+78
+80
+ENDCHAR
+STARTCHAR 0xFF6B
+ENCODING 65387
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 11 2 -3
+BITMAP
+20
+20
+38
+E0
+20
+60
+A0
+A0
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF6C
+ENCODING 65388
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 1 -3
+BITMAP
+20
+20
+2C
+34
+E0
+20
+20
+20
+20
+10
+10
+ENDCHAR
+STARTCHAR 0xFF6D
+ENCODING 65389
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 7 2 -1
+BITMAP
+30
+50
+10
+20
+20
+38
+C0
+ENDCHAR
+STARTCHAR 0xFF6E
+ENCODING 65390
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 4 9 3 -2
+BITMAP
+70
+A0
+20
+20
+E0
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0xFF6F
+ENCODING 65391
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 9 2 -2
+BITMAP
+48
+C8
+B0
+90
+10
+20
+20
+40
+40
+ENDCHAR
+STARTCHAR 0xFF70
+ENCODING 65392
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 1 1 4
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0xFF71
+ENCODING 65393
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 2 -1
+BITMAP
+7C
+88
+10
+10
+20
+40
+40
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0xFF72
+ENCODING 65394
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 13 2 -2
+BITMAP
+08
+10
+10
+20
+20
+60
+A0
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF73
+ENCODING 65395
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+10
+10
+1C
+E4
+84
+84
+84
+08
+08
+08
+10
+10
+20
+ENDCHAR
+STARTCHAR 0xFF74
+ENCODING 65396
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 9 1 0
+BITMAP
+08
+70
+20
+20
+20
+20
+20
+2C
+D0
+ENDCHAR
+STARTCHAR 0xFF75
+ENCODING 65397
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+10
+10
+10
+3C
+D0
+30
+30
+50
+50
+90
+10
+30
+10
+ENDCHAR
+STARTCHAR 0xFF76
+ENCODING 65398
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+10
+10
+10
+1C
+E4
+24
+24
+24
+44
+44
+48
+98
+08
+ENDCHAR
+STARTCHAR 0xFF77
+ENCODING 65399
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 14 1 -3
+BITMAP
+20
+20
+20
+18
+E0
+20
+24
+38
+E0
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0xFF78
+ENCODING 65400
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+20
+20
+3C
+44
+48
+88
+88
+10
+10
+20
+20
+40
+40
+ENDCHAR
+STARTCHAR 0xFF79
+ENCODING 65401
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 12 1 -1
+BITMAP
+20
+20
+40
+7C
+50
+90
+90
+10
+10
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF7A
+ENCODING 65402
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 9 1 0
+BITMAP
+1C
+64
+04
+04
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFF7B
+ENCODING 65403
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+08
+48
+48
+48
+7C
+C8
+48
+48
+48
+10
+10
+10
+20
+ENDCHAR
+STARTCHAR 0xFF7C
+ENCODING 65404
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -2
+BITMAP
+20
+10
+02
+44
+24
+08
+08
+10
+20
+A0
+40
+ENDCHAR
+STARTCHAR 0xFF7D
+ENCODING 65405
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 12 1 -2
+BITMAP
+08
+78
+08
+08
+10
+10
+10
+28
+24
+44
+84
+80
+ENDCHAR
+STARTCHAR 0xFF7E
+ENCODING 65406
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 1 -2
+BITMAP
+40
+44
+5C
+28
+48
+D0
+50
+40
+40
+20
+1C
+ENDCHAR
+STARTCHAR 0xFF7F
+ENCODING 65407
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 12 2 -2
+BITMAP
+08
+08
+88
+90
+90
+10
+20
+20
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0xFF80
+ENCODING 65408
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 13 2 -2
+BITMAP
+08
+F8
+08
+08
+08
+10
+F0
+10
+20
+20
+20
+40
+80
+ENDCHAR
+STARTCHAR 0xFF81
+ENCODING 65409
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 10 2 -2
+BITMAP
+10
+E8
+10
+20
+20
+40
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0xFF82
+ENCODING 65410
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 4 11 2 -3
+BITMAP
+10
+10
+20
+20
+60
+A0
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF83
+ENCODING 65411
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 9 2 -2
+BITMAP
+40
+F8
+90
+90
+90
+10
+20
+20
+40
+ENDCHAR
+STARTCHAR 0xFF84
+ENCODING 65412
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 8 2 -1
+BITMAP
+10
+E0
+40
+40
+40
+40
+78
+80
+ENDCHAR
+STARTCHAR 0xFF85
+ENCODING 65413
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 11 2 -3
+BITMAP
+20
+20
+38
+E0
+20
+60
+A0
+A0
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF86
+ENCODING 65414
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 1 -3
+BITMAP
+20
+20
+2C
+34
+E0
+20
+20
+20
+20
+10
+10
+ENDCHAR
+STARTCHAR 0xFF87
+ENCODING 65415
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 7 2 -1
+BITMAP
+30
+50
+10
+20
+20
+38
+C0
+ENDCHAR
+STARTCHAR 0xFF88
+ENCODING 65416
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 4 9 3 -2
+BITMAP
+70
+A0
+20
+20
+E0
+20
+20
+20
+C0
+ENDCHAR
+STARTCHAR 0xFF89
+ENCODING 65417
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 9 2 -2
+BITMAP
+48
+C8
+B0
+90
+10
+20
+20
+40
+40
+ENDCHAR
+STARTCHAR 0xFF8A
+ENCODING 65418
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 1 1 4
+BITMAP
+F8
+ENDCHAR
+STARTCHAR 0xFF8B
+ENCODING 65419
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 2 -1
+BITMAP
+7C
+88
+10
+10
+20
+40
+40
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0xFF8C
+ENCODING 65420
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 13 2 -2
+BITMAP
+08
+10
+10
+20
+20
+60
+A0
+20
+20
+20
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF8D
+ENCODING 65421
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+10
+10
+1C
+E4
+84
+84
+84
+08
+08
+08
+10
+10
+20
+ENDCHAR
+STARTCHAR 0xFF8E
+ENCODING 65422
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 9 1 0
+BITMAP
+08
+70
+20
+20
+20
+20
+20
+2C
+D0
+ENDCHAR
+STARTCHAR 0xFF8F
+ENCODING 65423
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+10
+10
+10
+3C
+D0
+30
+30
+50
+50
+90
+10
+30
+10
+ENDCHAR
+STARTCHAR 0xFF90
+ENCODING 65424
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+10
+10
+10
+1C
+E4
+24
+24
+24
+44
+44
+48
+98
+08
+ENDCHAR
+STARTCHAR 0xFF91
+ENCODING 65425
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 14 1 -3
+BITMAP
+20
+20
+20
+18
+E0
+20
+24
+38
+E0
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0xFF92
+ENCODING 65426
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+20
+20
+3C
+44
+48
+88
+88
+10
+10
+20
+20
+40
+40
+ENDCHAR
+STARTCHAR 0xFF93
+ENCODING 65427
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 12 1 -1
+BITMAP
+20
+20
+40
+7C
+50
+90
+90
+10
+10
+20
+20
+20
+ENDCHAR
+STARTCHAR 0xFF94
+ENCODING 65428
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 9 1 0
+BITMAP
+1C
+64
+04
+04
+08
+08
+08
+08
+F0
+ENDCHAR
+STARTCHAR 0xFF95
+ENCODING 65429
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 13 1 -2
+BITMAP
+08
+48
+48
+48
+7C
+C8
+48
+48
+48
+10
+10
+10
+20
+ENDCHAR
+STARTCHAR 0xFF96
+ENCODING 65430
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 7 11 1 -2
+BITMAP
+20
+10
+02
+44
+24
+08
+08
+10
+20
+A0
+40
+ENDCHAR
+STARTCHAR 0xFF97
+ENCODING 65431
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 12 1 -2
+BITMAP
+08
+78
+08
+08
+10
+10
+10
+28
+24
+44
+84
+80
+ENDCHAR
+STARTCHAR 0xFF98
+ENCODING 65432
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 6 11 1 -2
+BITMAP
+40
+44
+5C
+28
+48
+D0
+50
+40
+40
+20
+1C
+ENDCHAR
+STARTCHAR 0xFF99
+ENCODING 65433
+SWIDTH 480 0
+DWIDTH 8 0
+BBX 5 12 2 -2
+BITMAP
+08
+08
+88
+90
+90
+10
+20
+20
+40
+40
+80
+80
+ENDCHAR
+STARTCHAR 0xFFE0
+ENCODING 65504
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 10 13 3 -2
+BITMAP
+0780
+0840
+1840
+1000
+1000
+1800
+7F00
+0800
+0800
+6800
+9840
+9480
+6300
+ENDCHAR
+STARTCHAR 0xFFE1
+ENCODING 65505
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 12 9 2 0
+BITMAP
+FFF0
+0010
+0010
+0010
+0010
+0010
+0010
+0010
+0010
+ENDCHAR
+STARTCHAR 0xFFE2
+ENCODING 65506
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 16 1 0 12
+BITMAP
+FFFF
+ENDCHAR
+STARTCHAR 0xFFE3
+ENCODING 65507
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 1 14 7 -2
+BITMAP
+80
+80
+80
+80
+00
+00
+00
+00
+00
+00
+80
+80
+80
+80
+ENDCHAR
+STARTCHAR 0xFFE4
+ENCODING 65508
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 11 12 2 -1
+BITMAP
+F1E0
+2080
+1100
+0A00
+0400
+7FC0
+0400
+0400
+7FC0
+0400
+0400
+1F00
+ENDCHAR
+STARTCHAR 0xFFE5
+ENCODING 65509
+SWIDTH 1020 0
+DWIDTH 17 0
+BBX 14 12 1 -1
+BITMAP
+739C
+2108
+2310
+FFFC
+2290
+FFFC
+14A0
+14A0
+1860
+0840
+0840
+0840
+ENDCHAR
+STARTCHAR 0xFFFD
+ENCODING 65533
+SWIDTH 1080 0
+DWIDTH 18 0
+BBX 15 15 2 0
+BITMAP
+0100
+0380
+07C0
+0C60
+1BB0
+3BB8
+7F7C
+FEFE
+7EFC
+3FF8
+1EF0
+0C60
+06C0
+0380
+0100
+ENDCHAR
+STARTCHAR C072
+ENCODING 65534
+SWIDTH 600 0
+DWIDTH 10 0
+BBX 7 11 2 0
+BITMAP
+AA
+00
+82
+00
+82
+00
+82
+00
+82
+00
+AA
+ENDCHAR
+ENDFONT
diff --git a/xc/extras/fonts/arabic24/README b/xc/extras/fonts/arabic24/README
new file mode 100644
index 000000000..52717900a
--- /dev/null
+++ b/xc/extras/fonts/arabic24/README
@@ -0,0 +1,72 @@
+#
+# From: Id: README,v 1.2 1999/05/03 14:21:32 mleisher Exp $
+#
+# Copyright 1996, 1997, 1998, 1999 Computing Research Labs,
+# New Mexico State University
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+# THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+This is a 100dpi, 24 point (approximately) font that is meant to act as
+an example of what glyphs are needed to minimally support (almost) all
+of the Arabic characters available in Unicode.
+
+The encoding of this font is the encoding of Arabic from Unicode 2.0
+with the addition of some contextual forms and some other convenient
+glyphs that do not exist in Unicode. An additional file, "uniarab.txt",
+has been provided to describe the encoding of the extra contextual
+glyphs.
+
+Version: 1.3
+
+CHANGES FROM 1.2
+----------------
+ o Changed CHARSET_REGISTRY to be ISO10646.
+
+CHANGES FROM 1.1
+----------------
+
+ o Added FBE8 and FBE9 which are Uighur/Kazakh/Kirghiz positional variants
+ of ALEF MAKSURA.
+
+CHANGES FROM 1.0
+----------------
+
+ o Added the following missing glyph:
+
+ E6B2 ARABIC LETTER U WITH HAMZA ABOVE FINAL FORM
+
+ o Added the following glyphs for applications generating text for Omega:
+
+ E6D0 ARABIC LIGATURE LAM SMALL V WITH ALEF ISOLATED FORM
+ E6D1 ARABIC LIGATURE LAM SMALL V WITH ALEF ISOLATED FORM
+ E6D2 ARABIC LIGATURE LAM DOT ABOVE WITH ALEF ISOLATED FORM
+ E6D3 ARABIC LIGATURE LAM DOT ABOVE WITH ALEF FINAL FORM
+ E6D4 ARABIC LIGATURE LAM THREE DOTS ABOVE WITH ALEF ISOLATED FORM
+ E6D5 ARABIC LIGATURE LAM THREE DOTS ABOVE WITH ALEF FINAL FORM
+
+ o Added the following glyph simply for convenience:
+
+ E6F4 EXTENDED URDU-INDIC DIGIT FOUR
+
+ o Cleaned up and improved a number of glyphs, particularly some
+ Persian and Urdu glyphs.
+
+08 February 1999
+mleisher@crl.nmsu.edu (Mark Leisher)
diff --git a/xc/extras/fonts/arabic24/arabic24.bdf b/xc/extras/fonts/arabic24/arabic24.bdf
new file mode 100644
index 000000000..90b419cc6
--- /dev/null
+++ b/xc/extras/fonts/arabic24/arabic24.bdf
@@ -0,0 +1,14298 @@
+STARTFONT 2.1
+COMMENT
+COMMENT From: Id: arabic24.bdf,v 1.2 1999/05/03 14:21:32 mleisher Exp $
+COMMENT
+COMMENT Copyright 1996, 1997, 1998, 1999 Computing Research Labs,
+COMMENT New Mexico State University
+COMMENT
+COMMENT Permission is hereby granted, free of charge, to any person
+COMMENT obtaining a copy of this software and associated documentation
+COMMENT files (the "Software"), to deal in the Software without
+COMMENT restriction, including without limitation the rights to use,
+COMMENT copy, modify, merge, publish, distribute, sublicense, and/or
+COMMENT sell copies of the Software, and to permit persons to whom the
+COMMENT Software is furnished to do so, subject to the following
+COMMENT conditions:
+COMMENT
+COMMENT The above copyright notice and this permission notice shall be
+COMMENT included in all copies or substantial portions of the Software.
+COMMENT
+COMMENT THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+COMMENT EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+COMMENT OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+COMMENT NONINFRINGEMENT. IN NO EVENT SHALL THE COMPUTING RESEARCH LAB
+COMMENT OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY CLAIM, DAMAGES
+COMMENT OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+COMMENT OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+COMMENT SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+COMMENT
+FONT -Arabic-Newspaper-Medium-R-Normal--32-246-100-100-p-137-ISO10646-1
+SIZE 25 100 100
+FONTBOUNDINGBOX 34 39 -2 -15
+STARTPROPERTIES 18
+FONTNAME_REGISTRY ""
+FOUNDRY "Arabic"
+FAMILY_NAME "Newspaper"
+WEIGHT_NAME "Medium"
+SLANT "R"
+SETWIDTH_NAME "Normal"
+ADD_STYLE_NAME ""
+PIXEL_SIZE 32
+POINT_SIZE 246
+RESOLUTION_X 100
+RESOLUTION_Y 100
+SPACING "p"
+AVERAGE_WIDTH 137
+CHARSET_REGISTRY "ISO10646"
+CHARSET_ENCODING "1"
+FONT_ASCENT 24
+FONT_DESCENT 11
+_XMBDFED_INFO "Edited with xmbdfed 3.8."
+ENDPROPERTIES
+CHARS 614
+STARTCHAR 060C
+ENCODING 1548
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 3 7 2 0
+BITMAP
+40
+40
+40
+80
+E0
+E0
+60
+ENDCHAR
+STARTCHAR 061B
+ENCODING 1563
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 3 11 3 1
+BITMAP
+20
+40
+C0
+E0
+E0
+80
+00
+00
+C0
+E0
+C0
+ENDCHAR
+STARTCHAR 061F
+ENCODING 1567
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 8 17 2 0
+BITMAP
+1C
+7E
+47
+C7
+82
+80
+C0
+70
+78
+3C
+0C
+04
+00
+00
+0C
+0C
+04
+ENDCHAR
+STARTCHAR 0621
+ENCODING 1569
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 7 9 3 -1
+BITMAP
+38
+78
+40
+80
+FE
+FC
+60
+80
+80
+ENDCHAR
+STARTCHAR 0622
+ENCODING 1570
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 17 0 0
+BITMAP
+34
+78
+80
+10
+30
+30
+30
+30
+30
+30
+30
+30
+30
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0623
+ENCODING 1571
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 5 19 0 0
+BITMAP
+70
+C0
+F8
+70
+40
+10
+10
+20
+30
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0624
+ENCODING 1572
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 22 -2 -6
+BITMAP
+0380
+0600
+07C0
+0380
+0200
+0000
+0000
+0000
+0000
+0040
+00E0
+01B0
+0130
+01B0
+01F0
+00F0
+0030
+0030
+8060
+61C0
+3F80
+0F00
+ENDCHAR
+STARTCHAR 0625
+ENCODING 1573
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 5 23 1 -7
+BITMAP
+20
+60
+60
+60
+60
+60
+60
+60
+60
+60
+20
+20
+20
+20
+20
+20
+00
+00
+60
+80
+D8
+F0
+C0
+ENDCHAR
+STARTCHAR 0626
+ENCODING 1574
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 19 1 -6
+BITMAP
+0380
+0600
+07C0
+0380
+0200
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR 0627
+ENCODING 1575
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 2 16 2 0
+BITMAP
+C0
+80
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR 0628
+ENCODING 1576
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 -6
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0000
+0000
+0100
+0380
+0180
+ENDCHAR
+STARTCHAR 0629
+ENCODING 1577
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 15 1 -1
+BITMAP
+6C
+7E
+24
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR 062A
+ENCODING 1578
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 10 1 0
+BITMAP
+06C0
+07E0
+0240
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR 062B
+ENCODING 1579
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 0
+BITMAP
+0100
+0380
+0180
+0000
+0240
+07E0
+0360
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR 062C
+ENCODING 1580
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 12 17 2 -9
+BITMAP
+7860
+7FC0
+FFC0
+3800
+6000
+4000
+4000
+8000
+8600
+8700
+8200
+8000
+C000
+C000
+7070
+3FC0
+1F00
+ENDCHAR
+STARTCHAR 062D
+ENCODING 1581
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+4000
+4000
+4000
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR 062E
+ENCODING 1582
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 12 24 2 -9
+BITMAP
+0400
+0E00
+0600
+0000
+0000
+0000
+0000
+7860
+7FC0
+FFC0
+3800
+6000
+4000
+4000
+8000
+8000
+8000
+8000
+8000
+C000
+C000
+7070
+3FC0
+1F00
+ENDCHAR
+STARTCHAR 062F
+ENCODING 1583
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 10 2 0
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR 0630
+ENCODING 1584
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 16 2 0
+BITMAP
+10
+38
+18
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR 0631
+ENCODING 1585
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 11 -2 -5
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0632
+ENCODING 1586
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 18 -2 -5
+BITMAP
+0400
+0E00
+0600
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0633
+ENCODING 1587
+SWIDTH 691 0
+DWIDTH 24 0
+BBX 22 12 1 -6
+BITMAP
+000084
+00208C
+00208C
+40318C
+403FFC
+401FFC
+801000
+801000
+806000
+E1E000
+7FC000
+3E0000
+ENDCHAR
+STARTCHAR 0634
+ENCODING 1588
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 21 1 -6
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000120
+0003F0
+0001B0
+000000
+000000
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801800
+803000
+E0F000
+7FC000
+3F0000
+ENDCHAR
+STARTCHAR 0635
+ENCODING 1589
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 13 1 -6
+BITMAP
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR 0636
+ENCODING 1590
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 19 1 -6
+BITMAP
+00000400
+00000E00
+00000600
+00000000
+00000000
+00000000
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR 0637
+ENCODING 1591
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 17 1 0
+BITMAP
+0800
+0800
+0C00
+0E00
+0C00
+0C00
+0C00
+0C00
+0400
+0400
+0478
+05FE
+059E
+0707
+1E07
+FFFE
+7FFE
+ENDCHAR
+STARTCHAR 0638
+ENCODING 1592
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 17 1 0
+BITMAP
+0800
+0800
+0C00
+0E00
+0C20
+0C70
+0C30
+0C00
+0400
+0400
+0478
+05FE
+059E
+0707
+1E07
+FFFE
+7FFE
+ENDCHAR
+STARTCHAR 0639
+ENCODING 1593
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 20 1 -10
+BITMAP
+1C00
+3E00
+3100
+4000
+7180
+7F80
+3F00
+1C00
+3000
+6000
+4000
+8000
+8000
+8000
+8000
+8000
+8000
+6018
+7FE0
+1F80
+ENDCHAR
+STARTCHAR 063A
+ENCODING 1594
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 25 1 -10
+BITMAP
+1000
+3800
+1800
+0000
+0000
+1C00
+3E00
+3100
+4000
+7180
+7F80
+3F00
+1C00
+3000
+6000
+4000
+8000
+8000
+8000
+8000
+8000
+8000
+6018
+7FE0
+1F80
+ENDCHAR
+STARTCHAR 0640
+ENCODING 1600
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 2 0 0
+BITMAP
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR 0641
+ENCODING 1601
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 16 1 -1
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR 0642
+ENCODING 1602
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 20 1 -7
+BITMAP
+0120
+03F0
+01B0
+0000
+0000
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FC
+807C
+8004
+8004
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR 0643
+ENCODING 1603
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 17 1 0
+BITMAP
+0008
+0018
+0018
+0018
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+ENDCHAR
+STARTCHAR 0644
+ENCODING 1604
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 21 1 -4
+BITMAP
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR 0645
+ENCODING 1605
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 10 17 1 -10
+BITMAP
+0C00
+1C00
+3E00
+2700
+0380
+7FC0
+FFC0
+C000
+C000
+C000
+4000
+6000
+6000
+6000
+2000
+2000
+2000
+ENDCHAR
+STARTCHAR 0646
+ENCODING 1606
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 18 1 -6
+BITMAP
+0200
+0700
+0300
+0000
+0000
+0000
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR 0647
+ENCODING 1607
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 10 1 -1
+BITMAP
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR 0648
+ENCODING 1608
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 0649
+ENCODING 1609
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 14 1 -6
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR 064A
+ENCODING 1610
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 19 1 -11
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+0000
+0000
+3600
+3F00
+1200
+ENDCHAR
+STARTCHAR 064B
+ENCODING 1611
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 7 1 17
+BITMAP
+04
+18
+30
+CC
+38
+60
+80
+ENDCHAR
+STARTCHAR 064C
+ENCODING 1612
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 7 7 1 17
+BITMAP
+08
+1C
+1C
+F8
+AC
+32
+60
+ENDCHAR
+STARTCHAR 064D
+ENCODING 1613
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 7 1 -8
+BITMAP
+04
+08
+30
+CC
+38
+60
+80
+ENDCHAR
+STARTCHAR 064E
+ENCODING 1614
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 4 1 17
+BITMAP
+0C
+10
+60
+80
+ENDCHAR
+STARTCHAR 064F
+ENCODING 1615
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 7 1 17
+BITMAP
+0C
+1C
+14
+1C
+1C
+30
+60
+ENDCHAR
+STARTCHAR 0650
+ENCODING 1616
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 4 1 -5
+BITMAP
+04
+08
+30
+C0
+ENDCHAR
+STARTCHAR 0651
+ENCODING 1617
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 6 1 17
+BITMAP
+04
+14
+94
+BC
+F8
+E0
+ENDCHAR
+STARTCHAR 0652
+ENCODING 1618
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 5 6 1 17
+BITMAP
+70
+78
+98
+88
+F8
+F0
+ENDCHAR
+STARTCHAR 0660
+ENCODING 1632
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 4 4 3 5
+BITMAP
+40
+E0
+E0
+60
+ENDCHAR
+STARTCHAR 0661
+ENCODING 1633
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 6 16 2 0
+BITMAP
+40
+60
+60
+70
+70
+38
+38
+18
+1C
+0C
+0C
+0C
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0662
+ENCODING 1634
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 9 15 2 0
+BITMAP
+4080
+C080
+FB80
+7F00
+7E00
+3000
+3800
+1800
+1800
+0C00
+0C00
+0C00
+0C00
+0400
+0400
+ENDCHAR
+STARTCHAR char1635
+ENCODING 1635
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 15 1 0
+BITMAP
+4110
+E1A0
+FFE0
+7EC0
+7800
+3800
+3800
+1800
+1800
+0C00
+0C00
+0C00
+0C00
+0400
+0400
+ENDCHAR
+STARTCHAR 0664
+ENCODING 1636
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 7 15 3 0
+BITMAP
+10
+30
+70
+C0
+C0
+E0
+F8
+70
+30
+60
+C0
+80
+C2
+FC
+F8
+ENDCHAR
+STARTCHAR 0665
+ENCODING 1637
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 8 9 2 3
+BITMAP
+1C
+3E
+67
+43
+C1
+C1
+C7
+7E
+3C
+ENDCHAR
+STARTCHAR 0666
+ENCODING 1638
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 11 16 2 0
+BITMAP
+8000
+FE00
+7E00
+0600
+0700
+0300
+0300
+0300
+0300
+0300
+0380
+0180
+01C0
+01C0
+00E0
+00C0
+ENDCHAR
+STARTCHAR 0667
+ENCODING 1639
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 12 15 2 0
+BITMAP
+C020
+C060
+E060
+60E0
+70C0
+3180
+3180
+1B00
+1B00
+0E00
+0E00
+0E00
+0C00
+0400
+0400
+ENDCHAR
+STARTCHAR 0668
+ENCODING 1640
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 12 15 2 0
+BITMAP
+0400
+0400
+0400
+0E00
+0E00
+0E00
+1B00
+1B00
+1980
+3180
+30C0
+60E0
+E060
+C070
+4020
+ENDCHAR
+STARTCHAR 0669
+ENCODING 1641
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 9 15 2 0
+BITMAP
+3800
+7C00
+7C00
+CC00
+8C00
+FC00
+7600
+0600
+0600
+0600
+0300
+0300
+0380
+0180
+0100
+ENDCHAR
+STARTCHAR 066A
+ENCODING 1642
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 21 0 0
+BITMAP
+0010
+6010
+F020
+F020
+6040
+0040
+0080
+0080
+0100
+0100
+0200
+0200
+0400
+0C00
+083C
+183C
+103C
+3018
+2000
+6000
+4000
+ENDCHAR
+STARTCHAR char1643
+ENCODING 1643
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 6 7 2 -4
+BITMAP
+0C
+0C
+0C
+04
+0C
+18
+F0
+ENDCHAR
+STARTCHAR char1644
+ENCODING 1644
+SWIDTH 144 0
+DWIDTH 5 0
+BBX 2 7 2 -4
+BITMAP
+C0
+C0
+C0
+40
+40
+40
+80
+ENDCHAR
+STARTCHAR char1645
+ENCODING 1645
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 9 2 3
+BITMAP
+0800
+0800
+1C00
+FF80
+7F00
+1C00
+3E00
+3E00
+6300
+ENDCHAR
+STARTCHAR 0670
+ENCODING 1648
+SWIDTH 86 0
+DWIDTH 3 0
+BBX 2 6 0 17
+BITMAP
+40
+80
+C0
+C0
+40
+40
+ENDCHAR
+STARTCHAR 0671
+ENCODING 1649
+SWIDTH 144 0
+DWIDTH 5 0
+BBX 7 18 -1 0
+BITMAP
+0E
+72
+9C
+00
+10
+10
+20
+30
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR 0672
+ENCODING 1650
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 20 -1 0
+BITMAP
+0E
+1C
+10
+1F
+5C
+B0
+04
+04
+08
+0C
+0C
+0C
+0C
+0C
+04
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0673
+ENCODING 1651
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 21 -1 -7
+BITMAP
+04
+04
+08
+0C
+0C
+0C
+0C
+0C
+04
+04
+04
+04
+04
+04
+00
+0E
+1C
+10
+1F
+5C
+B0
+ENDCHAR
+STARTCHAR 0674
+ENCODING 1652
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 5 6 1 17
+BITMAP
+70
+E0
+80
+F8
+60
+40
+ENDCHAR
+STARTCHAR 0675
+ENCODING 1653
+SWIDTH 86 0
+DWIDTH 3 0
+BBX 8 17 0 0
+BITMAP
+0E
+1C
+10
+5F
+4C
+88
+C0
+C0
+C0
+C0
+C0
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR 0676
+ENCODING 1654
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 17 18 -2 -6
+BITMAP
+000700
+000E00
+000800
+000F80
+000600
+004400
+00E000
+01B000
+013000
+01B000
+01F000
+00F000
+003000
+003000
+806000
+61C000
+3F8000
+0F0000
+ENDCHAR
+STARTCHAR 0677
+ENCODING 1655
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 17 18 -2 -6
+BITMAP
+030700
+070E00
+050800
+070F80
+070600
+0C4400
+18E000
+01B000
+013000
+01B000
+01F000
+00F000
+003000
+003000
+806000
+61C000
+3F8000
+0F0000
+ENDCHAR
+STARTCHAR 0678
+ENCODING 1656
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 21 20 1 -6
+BITMAP
+000070
+0000E0
+000080
+0000F8
+000060
+000040
+000700
+001F00
+207A00
+20C000
+408000
+418000
+41F800
+81FE00
+803E00
+800E00
+C07C00
+E3F800
+7FE000
+3F0000
+ENDCHAR
+STARTCHAR 0679
+ENCODING 1657
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 11 1 0
+BITMAP
+0400
+0500
+0680
+0780
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR 067A
+ENCODING 1658
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 0
+BITMAP
+0100
+0380
+0180
+0100
+0380
+0180
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR 067B
+ENCODING 1659
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 -7
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0080
+01C0
+00C0
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR 067C
+ENCODING 1660
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 -3
+BITMAP
+06C0
+07E0
+0240
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+06C0
+06C0
+0380
+ENDCHAR
+STARTCHAR 067D
+ENCODING 1661
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 0
+BITMAP
+0480
+0FC0
+06C0
+0100
+0380
+0180
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR 067E
+ENCODING 1662
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 -7
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0240
+07E0
+0360
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR 067F
+ENCODING 1663
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 0
+BITMAP
+0480
+0FC0
+06C0
+0480
+0FC0
+06C0
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR 0680
+ENCODING 1664
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 -7
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0480
+0FC0
+06C0
+0480
+0FC0
+06C0
+ENDCHAR
+STARTCHAR 0681
+ENCODING 1665
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 12 23 2 -9
+BITMAP
+0700
+0C00
+0F80
+0700
+0400
+0000
+7860
+7FC0
+FFC0
+3800
+6000
+4000
+4000
+8000
+8000
+8000
+8000
+8000
+C000
+C000
+7070
+3FC0
+1F00
+ENDCHAR
+STARTCHAR 0682
+ENCODING 1666
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 24 1 -9
+BITMAP
+0400
+0E00
+0600
+0400
+0E00
+0600
+0000
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+4000
+4000
+4000
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR 0683
+ENCODING 1667
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+46C0
+47E0
+4240
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR 0684
+ENCODING 1668
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2180
+41C0
+4080
+4180
+41C0
+4080
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR 0685
+ENCODING 1669
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 24 1 -9
+BITMAP
+0200
+0700
+0300
+0480
+0FC0
+06C0
+0000
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+4000
+4000
+4000
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR 0686
+ENCODING 1670
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+46C0
+47E0
+4240
+4180
+41C0
+6080
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR 0687
+ENCODING 1671
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+46C0
+47E0
+4240
+46C0
+47E0
+6240
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR 0688
+ENCODING 1672
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 15 2 0
+BITMAP
+10
+14
+1A
+1E
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR 0689
+ENCODING 1673
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 13 2 -2
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7E
+1B
+1B
+0E
+ENDCHAR
+STARTCHAR 068A
+ENCODING 1674
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 14 2 -4
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+00
+04
+0E
+06
+ENDCHAR
+STARTCHAR 068B
+ENCODING 1675
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 -4
+BITMAP
+10
+14
+1A
+1E
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+00
+04
+0E
+06
+ENDCHAR
+STARTCHAR 068C
+ENCODING 1676
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 16 2 0
+BITMAP
+24
+7E
+36
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR 068D
+ENCODING 1677
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 14 2 -4
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+00
+24
+7E
+36
+ENDCHAR
+STARTCHAR 068E
+ENCODING 1678
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 0
+BITMAP
+10
+38
+18
+24
+7E
+36
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR 068F
+ENCODING 1679
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 0
+BITMAP
+24
+7E
+36
+08
+1C
+0C
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR 0690
+ENCODING 1680
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 0
+BITMAP
+24
+7E
+36
+24
+7E
+36
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR 0691
+ENCODING 1681
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 18 -2 -5
+BITMAP
+0400
+0500
+0680
+0780
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0692
+ENCODING 1682
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 17 -2 -5
+BITMAP
+0440
+06C0
+0380
+0100
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0693
+ENCODING 1683
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 12 -2 -6
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+81E0
+7FB0
+1FB0
+00E0
+ENDCHAR
+STARTCHAR 0694
+ENCODING 1684
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 12 -2 -6
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F20
+1E70
+0030
+ENDCHAR
+STARTCHAR 0695
+ENCODING 1685
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 16 -2 -10
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+0000
+1100
+1B00
+0E00
+0400
+ENDCHAR
+STARTCHAR 0696
+ENCODING 1686
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 12 -2 -6
+BITMAP
+0080
+00C0
+00C0
+0060
+0860
+1C60
+0C60
+00C0
+8180
+7F20
+1E70
+0030
+ENDCHAR
+STARTCHAR 0697
+ENCODING 1687
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 18 -2 -5
+BITMAP
+0120
+03F0
+01B0
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0698
+ENCODING 1688
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 21 -2 -5
+BITMAP
+0080
+01C0
+00C0
+0120
+03F0
+01B0
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR 0699
+ENCODING 1689
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 21 -2 -5
+BITMAP
+0480
+0FC0
+06C0
+0480
+0FC0
+06C0
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR 069A
+ENCODING 1690
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 17 1 -6
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000000
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801880
+8031C0
+E0F0C0
+7FC000
+3F0000
+ENDCHAR
+STARTCHAR 069B
+ENCODING 1691
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 13 1 -7
+BITMAP
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801920
+8033F0
+E0F1B0
+7FC040
+3F00E0
+000060
+ENDCHAR
+STARTCHAR 069C
+ENCODING 1692
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 22 1 -7
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000120
+0003F0
+0001B0
+000000
+000000
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801920
+8033F0
+E0F1B0
+7FC040
+3F00E0
+000060
+ENDCHAR
+STARTCHAR 069D
+ENCODING 1693
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 13 1 -6
+BITMAP
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80082400
+C0107E00
+E0F03600
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR 069E
+ENCODING 1694
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 20 1 -6
+BITMAP
+00000400
+00000E00
+00000600
+00000900
+00001F80
+00000D80
+00000000
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR 069F
+ENCODING 1695
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 17 1 0
+BITMAP
+0800
+0800
+0C00
+0E20
+0C70
+0C30
+0C48
+0CFC
+046C
+0400
+0478
+05FE
+059E
+0707
+1E07
+FFFE
+7FFE
+ENDCHAR
+STARTCHAR 06A0
+ENCODING 1696
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 27 1 -11
+BITMAP
+0800
+1C00
+0C00
+1200
+3F00
+1B00
+0000
+1C00
+3E00
+7100
+6000
+7180
+7F80
+3F00
+1C00
+3000
+6000
+4000
+8000
+8000
+8000
+8000
+8000
+8000
+6018
+7FE0
+1F80
+ENDCHAR
+STARTCHAR 06A1
+ENCODING 1697
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 11 1 -1
+BITMAP
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR 06A2
+ENCODING 1698
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 21 14 1 -4
+BITMAP
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+000010
+000038
+000018
+ENDCHAR
+STARTCHAR 06A3
+ENCODING 1699
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 21 19 1 -5
+BITMAP
+000200
+000700
+000300
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+000000
+001000
+003800
+001800
+ENDCHAR
+STARTCHAR 06A4
+ENCODING 1700
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 18 1 -1
+BITMAP
+000100
+000380
+000180
+000240
+0007E0
+000360
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR 06A5
+ENCODING 1701
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 22 17 1 -7
+BITMAP
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+000048
+0000FC
+00006C
+000010
+000038
+000018
+ENDCHAR
+STARTCHAR 06A6
+ENCODING 1702
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 18 1 -1
+BITMAP
+000900
+001F80
+000D80
+000900
+001F80
+000D80
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR 06A7
+ENCODING 1703
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 20 1 -7
+BITMAP
+0100
+0380
+0180
+0000
+0000
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FC
+807C
+8004
+8004
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR 06A8
+ENCODING 1704
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 21 1 -8
+BITMAP
+0100
+0380
+0180
+0240
+07E0
+0360
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FC
+807C
+8004
+8004
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1705
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 17 0 0
+BITMAP
+0001
+0007
+003F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1706
+SWIDTH 576 0
+DWIDTH 20 0
+BBX 20 15 0 0
+BITMAP
+003000
+00F000
+01C000
+030000
+060000
+0C0000
+080000
+080000
+0FFFC0
+87FFE0
+800030
+800010
+C00030
+FFFFE0
+3FFFC0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1707
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 17 0 0
+BITMAP
+0001
+0007
+003F
+00FE
+03FB
+039B
+070E
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR 06AC
+ENCODING 1708
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 17 1 0
+BITMAP
+0008
+0218
+0718
+0318
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+ENDCHAR
+STARTCHAR 06AD
+ENCODING 1709
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 19 1 0
+BITMAP
+0400
+0E00
+0608
+0918
+1F98
+0D98
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+ENDCHAR
+STARTCHAR 06AE
+ENCODING 1710
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 24 1 -7
+BITMAP
+0008
+0018
+0018
+0018
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+0000
+0240
+07E0
+0360
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1711
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 19 0 0
+BITMAP
+000C
+0038
+00E1
+0387
+063F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1712
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 19 0 0
+BITMAP
+0006
+001C
+0071
+01C7
+033F
+00FE
+03FB
+039B
+070E
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1713
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 21 0 0
+BITMAP
+0080
+05C0
+0ECC
+0638
+00E1
+0387
+063F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1714
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 23 0 -4
+BITMAP
+0006
+001C
+0071
+01C7
+033F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+0000
+0120
+03F0
+01B0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1715
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 26 0 -7
+BITMAP
+000C
+0038
+00E1
+0387
+063F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+0000
+0100
+0380
+0180
+0100
+0380
+0180
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1716
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 23 0 0
+BITMAP
+0200
+0700
+0340
+02E0
+0766
+031C
+0071
+01C7
+033F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR 06B5
+ENCODING 1717
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 26 1 -4
+BITMAP
+0110
+01B0
+00E0
+0040
+0000
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR 06B6
+ENCODING 1718
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 25 1 -4
+BITMAP
+0040
+00E0
+0060
+0000
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR 06B7
+ENCODING 1719
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 28 1 -4
+BITMAP
+0080
+01C0
+00C0
+0120
+03F0
+01B0
+0000
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR 06BA
+ENCODING 1722
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 12 1 -6
+BITMAP
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR 06BB
+ENCODING 1723
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 18 1 -6
+BITMAP
+0400
+0500
+0680
+0780
+0000
+0000
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR 06BC
+ENCODING 1724
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 20 1 -8
+BITMAP
+0600
+0700
+0200
+0000
+0000
+0000
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F60
+0360
+01C0
+ENDCHAR
+STARTCHAR 06BD
+ENCODING 1725
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 18 1 -6
+BITMAP
+0600
+0700
+0200
+0D80
+0FC0
+0480
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR 06BE
+ENCODING 1726
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 7 0 0
+BITMAP
+0E00
+0FC0
+13E0
+1260
+9F20
+FFE0
+79E0
+ENDCHAR
+STARTCHAR 06C0
+ENCODING 1728
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 17 1 -1
+BITMAP
+38
+60
+7C
+38
+20
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR 06C1
+ENCODING 1729
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 11 11 0 -1
+BITMAP
+0600
+0700
+0780
+0FC0
+0FC0
+12E0
+1260
+1F20
+FFE0
+FBE0
+0040
+ENDCHAR
+STARTCHAR 06C2
+ENCODING 1730
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 17 1 -1
+BITMAP
+38
+60
+7C
+38
+20
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR 06C3
+ENCODING 1731
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 15 1 -1
+BITMAP
+6C
+7E
+24
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR 06C4
+ENCODING 1732
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0760
+8DE0
+4DC0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06C5
+ENCODING 1733
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+07E0
+8FE0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06C6
+ENCODING 1734
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 18 -2 -6
+BITMAP
+0220
+0360
+01C0
+0080
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06C7
+ENCODING 1735
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 21 -2 -6
+BITMAP
+0060
+00E0
+00A0
+00E0
+00E0
+0180
+0300
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06C8
+ENCODING 1736
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 20 -2 -6
+BITMAP
+0080
+0100
+0180
+0180
+0080
+0080
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06C9
+ENCODING 1737
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 18 -2 -6
+BITMAP
+0040
+00E0
+01B0
+0110
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06CA
+ENCODING 1738
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 18 -2 -6
+BITMAP
+0240
+07E0
+0360
+0000
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06CB
+ENCODING 1739
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 21 -2 -6
+BITMAP
+0400
+0E00
+0600
+0900
+1F80
+0D80
+0000
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR 06CC
+ENCODING 1740
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 14 1 -6
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR 06CD
+ENCODING 1741
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 19 14 1 -6
+BITMAP
+0000E0
+0003E0
+040F40
+041800
+081000
+183000
+383F00
+703FC0
+D007C0
+1001C0
+180F80
+1C7F00
+0FFC00
+07E000
+ENDCHAR
+STARTCHAR 06CE
+ENCODING 1742
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 16 1 -6
+BITMAP
+0880
+0D80
+0707
+021F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR 06D0
+ENCODING 1744
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 21 1 -13
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+0000
+0080
+01C0
+00C0
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR 06D1
+ENCODING 1745
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 21 1 -13
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+0000
+0480
+0FC0
+06C0
+0100
+0380
+0180
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1746
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 14 10 1 -6
+BITMAP
+0030
+0078
+1FC8
+3F80
+6000
+C000
+8000
+8000
+FFFC
+7FF8
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 1747
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 14 18 1 -6
+BITMAP
+00E0
+01C0
+0100
+01F0
+00C0
+0080
+0000
+0000
+0030
+0078
+1FC8
+3F80
+6000
+C000
+8000
+8000
+FFFC
+7FF8
+ENDCHAR
+STARTCHAR 06D4
+ENCODING 1748
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 2 0 9
+BITMAP
+7F
+FE
+ENDCHAR
+STARTCHAR 06D5
+ENCODING 1749
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 10 1 -1
+BITMAP
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR 06F0
+ENCODING 1776
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 4 4 3 5
+BITMAP
+40
+E0
+E0
+60
+ENDCHAR
+STARTCHAR 06F1
+ENCODING 1777
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 6 16 2 0
+BITMAP
+40
+60
+60
+70
+70
+38
+38
+18
+1C
+0C
+0C
+0C
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR 0662
+ENCODING 1778
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 9 15 2 0
+BITMAP
+4080
+C080
+FB80
+7F00
+7E00
+3000
+3800
+1800
+1800
+0C00
+0C00
+0C00
+0C00
+0400
+0400
+ENDCHAR
+STARTCHAR char1779
+ENCODING 1779
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 15 1 0
+BITMAP
+4110
+E1A0
+FFE0
+7EC0
+7800
+3800
+3800
+1800
+1800
+0C00
+0C00
+0C00
+0C00
+0400
+0400
+ENDCHAR
+STARTCHAR char1780
+ENCODING 1780
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 11 15 1 0
+BITMAP
+43C0
+E600
+F620
+7E60
+7FC0
+3B00
+3800
+1800
+1800
+0C00
+0C00
+0C00
+0C00
+0400
+0400
+ENDCHAR
+STARTCHAR char1781
+ENCODING 1781
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 11 16 1 -1
+BITMAP
+0800
+1E00
+1F00
+1F80
+3BC0
+31C0
+70C0
+60E0
+6060
+C060
+C060
+C460
+E4E0
+FFC0
+7BC0
+3380
+ENDCHAR
+STARTCHAR char1782
+ENCODING 1782
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 11 15 1 0
+BITMAP
+0700
+1F80
+1C00
+3000
+3020
+38E0
+1FE0
+0F80
+1E00
+3800
+3000
+6000
+4000
+C000
+8000
+ENDCHAR
+STARTCHAR 06F7
+ENCODING 1783
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 11 2 0
+BITMAP
+000E
+003E
+00F8
+03E0
+3F00
+FC00
+1F00
+03C0
+00F0
+003C
+001E
+ENDCHAR
+STARTCHAR 06F8
+ENCODING 1784
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 12 15 2 0
+BITMAP
+0400
+0400
+0400
+0E00
+0E00
+0E00
+1B00
+1B00
+1980
+3180
+30C0
+60E0
+E060
+C070
+4020
+ENDCHAR
+STARTCHAR 06F9
+ENCODING 1785
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 9 15 2 0
+BITMAP
+3800
+7C00
+7C00
+CC00
+8C00
+FC00
+7600
+0600
+0600
+0600
+0300
+0300
+0380
+0180
+0100
+ENDCHAR
+STARTCHAR E600
+ENCODING 58880
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 20 -1 0
+BITMAP
+0E
+1C
+10
+1F
+5C
+B0
+04
+04
+08
+0C
+0C
+0C
+0C
+0C
+04
+04
+04
+04
+04
+04
+ENDCHAR
+STARTCHAR E601
+ENCODING 58881
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 21 -1 0
+BITMAP
+0E
+1C
+10
+1F
+5C
+B0
+00
+08
+18
+18
+18
+08
+08
+08
+08
+08
+08
+08
+0C
+07
+07
+ENDCHAR
+STARTCHAR E602
+ENCODING 58882
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 21 -1 -7
+BITMAP
+04
+04
+08
+0C
+0C
+0C
+0C
+0C
+04
+04
+04
+04
+04
+04
+00
+0E
+1C
+10
+1F
+5C
+B0
+ENDCHAR
+STARTCHAR E603
+ENCODING 58883
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 21 -1 -7
+BITMAP
+08
+18
+18
+18
+08
+08
+08
+08
+08
+08
+08
+0C
+07
+07
+00
+0E
+1C
+10
+1F
+5C
+B0
+ENDCHAR
+STARTCHAR E604
+ENCODING 58884
+SWIDTH 86 0
+DWIDTH 3 0
+BBX 8 17 0 0
+BITMAP
+0E
+1C
+10
+5F
+4C
+88
+C0
+C0
+C0
+C0
+C0
+40
+40
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR E605
+ENCODING 58885
+SWIDTH 144 0
+DWIDTH 5 0
+BBX 8 17 0 0
+BITMAP
+0E
+1C
+10
+5F
+CC
+C8
+C0
+40
+40
+40
+40
+40
+40
+40
+60
+38
+38
+ENDCHAR
+STARTCHAR E606
+ENCODING 58886
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 17 18 -2 -6
+BITMAP
+000700
+000E00
+000800
+000F80
+000600
+004400
+00E000
+01B000
+013000
+01B000
+01F000
+00F000
+003000
+003000
+806000
+61C000
+3F8000
+0F0000
+ENDCHAR
+STARTCHAR E607
+ENCODING 58887
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 17 18 -2 -6
+BITMAP
+000700
+000E00
+000800
+000F80
+000600
+00C400
+01E000
+01E000
+033000
+03B000
+03F800
+01F800
+003000
+006000
+80E000
+41C000
+3F8000
+1E0000
+ENDCHAR
+STARTCHAR E608
+ENCODING 58888
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 21 20 1 -6
+BITMAP
+000070
+0000E0
+000080
+0000F8
+000060
+000040
+000700
+001F00
+207A00
+20C000
+408000
+418000
+41F800
+81FE00
+803E00
+800E00
+C07C00
+E3F800
+7FE000
+3F0000
+ENDCHAR
+STARTCHAR E609
+ENCODING 58889
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 22 16 1 -8
+BITMAP
+000038
+000070
+000040
+00007C
+000030
+000020
+401F80
+407F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+ENDCHAR
+STARTCHAR E60A
+ENCODING 58890
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 11 13 -1 0
+BITMAP
+01C0
+0380
+0200
+03E0
+0180
+0500
+0400
+0400
+0600
+0600
+0600
+7E00
+7C00
+ENDCHAR
+STARTCHAR E60B
+ENCODING 58891
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 13 0 0
+BITMAP
+01C0
+0380
+0200
+03E0
+0180
+0500
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR E60C
+ENCODING 58892
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 -3
+BITMAP
+06C0
+07E0
+0240
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+06C0
+06C0
+0380
+ENDCHAR
+STARTCHAR E60D
+ENCODING 58893
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 14 1 -4
+BITMAP
+048000
+07C000
+06C000
+024000
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+06C000
+06C000
+038000
+ENDCHAR
+STARTCHAR E60E
+ENCODING 58894
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 16 0 -3
+BITMAP
+6C
+7E
+22
+00
+00
+00
+06
+06
+07
+07
+03
+FF
+FE
+6C
+6C
+38
+ENDCHAR
+STARTCHAR E60F
+ENCODING 58895
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 16 0 -3
+BITMAP
+6800
+7C00
+2400
+0000
+0000
+0000
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+6C00
+6C00
+3800
+ENDCHAR
+STARTCHAR E610
+ENCODING 58896
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 0
+BITMAP
+0480
+0FC0
+06C0
+0100
+0380
+0180
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR E611
+ENCODING 58897
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 13 1 -1
+BITMAP
+024000
+07E000
+036000
+008000
+01C000
+00C000
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+ENDCHAR
+STARTCHAR E612
+ENCODING 58898
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 15 0 0
+BITMAP
+24
+7E
+36
+08
+1C
+0C
+00
+00
+06
+06
+07
+07
+03
+FF
+FE
+ENDCHAR
+STARTCHAR E613
+ENCODING 58899
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 15 0 0
+BITMAP
+2400
+7E00
+3600
+0800
+1C00
+0C00
+0000
+0000
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+ENDCHAR
+STARTCHAR E614
+ENCODING 58900
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 24 1 -9
+BITMAP
+0380
+0700
+0400
+07C0
+0300
+0200
+0000
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+4000
+4000
+4000
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR E615
+ENCODING 58901
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 22 1 -9
+BITMAP
+0700
+0E00
+0800
+0F80
+0600
+0400
+0000
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8000
+8000
+8000
+8000
+8000
+C000
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR E616
+ENCODING 58902
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 0
+BITMAP
+0700
+0E00
+0800
+0F80
+0600
+0400
+0000
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR E617
+ENCODING 58903
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 0
+BITMAP
+0E00
+1C00
+1000
+1F00
+0C00
+0800
+0000
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR E618
+ENCODING 58904
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 24 1 -9
+BITMAP
+0400
+0E00
+0600
+0400
+0E00
+0600
+0000
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+4000
+4000
+4000
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR E619
+ENCODING 58905
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 22 1 -9
+BITMAP
+0400
+0E00
+0600
+0400
+0E00
+0600
+0000
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8000
+8000
+8000
+8000
+8000
+C000
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR E61A
+ENCODING 58906
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 0
+BITMAP
+0400
+0E00
+0600
+0400
+0E00
+0600
+0000
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR E61B
+ENCODING 58907
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 0
+BITMAP
+0800
+1C00
+0C00
+0800
+1C00
+0C00
+0000
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR E61C
+ENCODING 58908
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 24 1 -9
+BITMAP
+0200
+0700
+0300
+0480
+0FC0
+06C0
+0000
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+4000
+4000
+4000
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR E61D
+ENCODING 58909
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 22 1 -9
+BITMAP
+0200
+0700
+0300
+0480
+0FC0
+06C0
+0000
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8000
+8000
+8000
+8000
+8000
+C000
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR E61E
+ENCODING 58910
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 0
+BITMAP
+0200
+0700
+0300
+0480
+0FC0
+06C0
+0000
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR E61F
+ENCODING 58911
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 0
+BITMAP
+0400
+0E00
+0600
+0900
+1F80
+0D80
+0000
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR E620
+ENCODING 58912
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 13 2 -2
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7E
+1B
+1B
+0E
+ENDCHAR
+STARTCHAR E621
+ENCODING 58913
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 14 1 -3
+BITMAP
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7F00
+0D80
+0D80
+0700
+ENDCHAR
+STARTCHAR E622
+ENCODING 58914
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 14 2 -4
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+00
+04
+0E
+06
+ENDCHAR
+STARTCHAR E623
+ENCODING 58915
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 15 1 -5
+BITMAP
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+0000
+0200
+0700
+0300
+ENDCHAR
+STARTCHAR E624
+ENCODING 58916
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 -4
+BITMAP
+10
+14
+1A
+1E
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+00
+04
+0E
+06
+ENDCHAR
+STARTCHAR E625
+ENCODING 58917
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 20 1 -5
+BITMAP
+0800
+0A00
+0D00
+0F00
+0000
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+0000
+0200
+0700
+0300
+ENDCHAR
+STARTCHAR E626
+ENCODING 58918
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 0
+BITMAP
+24
+7E
+36
+08
+1C
+0C
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR E627
+ENCODING 58919
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 19 1 -1
+BITMAP
+2400
+7E00
+3600
+0800
+1C00
+0C00
+0000
+0000
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+ENDCHAR
+STARTCHAR E628
+ENCODING 58920
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 0
+BITMAP
+24
+7E
+36
+24
+7E
+36
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR E629
+ENCODING 58921
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 19 1 -1
+BITMAP
+2400
+7E00
+3600
+2400
+7E00
+3600
+0000
+0000
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+ENDCHAR
+STARTCHAR E62A
+ENCODING 58922
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 17 -2 -5
+BITMAP
+0440
+06C0
+0380
+0100
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR E62B
+ENCODING 58923
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 17 -2 -5
+BITMAP
+0440
+06C0
+0380
+0100
+0000
+0000
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+ENDCHAR
+STARTCHAR E62C
+ENCODING 58924
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 12 -2 -6
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+81E0
+7FB0
+1FB0
+00E0
+ENDCHAR
+STARTCHAR E62D
+ENCODING 58925
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 12 -2 -6
+BITMAP
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F60
+1F60
+01C0
+ENDCHAR
+STARTCHAR E62E
+ENCODING 58926
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 12 -2 -6
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F20
+1E70
+0030
+ENDCHAR
+STARTCHAR E62F
+ENCODING 58927
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 12 -2 -6
+BITMAP
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F20
+1C70
+0030
+ENDCHAR
+STARTCHAR E630
+ENCODING 58928
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 16 -2 -10
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+0000
+1100
+1B00
+0E00
+0400
+ENDCHAR
+STARTCHAR E631
+ENCODING 58929
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 16 -2 -10
+BITMAP
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+0000
+1100
+1B00
+0E00
+0400
+ENDCHAR
+STARTCHAR E632
+ENCODING 58930
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 12 -2 -6
+BITMAP
+0080
+00C0
+00C0
+0060
+0860
+1C60
+0C60
+00C0
+8180
+7F20
+1E70
+0030
+ENDCHAR
+STARTCHAR E633
+ENCODING 58931
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 12 -2 -6
+BITMAP
+0080
+01C0
+00C0
+0060
+0878
+1C78
+0C60
+00C0
+83C0
+7F20
+1C70
+0030
+ENDCHAR
+STARTCHAR E634
+ENCODING 58932
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 18 -2 -5
+BITMAP
+0120
+03F0
+01B0
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR E635
+ENCODING 58933
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 18 -2 -5
+BITMAP
+0120
+03F0
+01B0
+0000
+0000
+0000
+0000
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+ENDCHAR
+STARTCHAR E636
+ENCODING 58934
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 21 -2 -5
+BITMAP
+0480
+0FC0
+06C0
+0480
+0FC0
+06C0
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR E637
+ENCODING 58935
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 21 -2 -5
+BITMAP
+0480
+0FC0
+06C0
+0480
+0FC0
+06C0
+0000
+0000
+0000
+0000
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+ENDCHAR
+STARTCHAR E638
+ENCODING 58936
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 17 1 -6
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000000
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801880
+8031C0
+E0F0C0
+7FC000
+3F0000
+ENDCHAR
+STARTCHAR E639
+ENCODING 58937
+SWIDTH 748 0
+DWIDTH 26 0
+BBX 25 17 1 -6
+BITMAP
+00008000
+0001C000
+0000C000
+00000000
+00000000
+00004200
+00104600
+00304600
+4038C700
+401FFF80
+401FFF80
+80080000
+80188000
+8031C000
+E0F0C000
+7FC00000
+3F000000
+ENDCHAR
+STARTCHAR E63A
+ENCODING 58938
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 17 15 0 -4
+BITMAP
+004000
+00E000
+006000
+000000
+000000
+102180
+102180
+102180
+307380
+FFFF80
+FFFF00
+000000
+004000
+00E000
+006000
+ENDCHAR
+STARTCHAR E63B
+ENCODING 58939
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 15 0 -4
+BITMAP
+004000
+00E000
+006000
+000000
+000000
+102180
+102180
+102180
+307380
+FFFFE0
+FFFFE0
+000000
+004000
+00E000
+006000
+ENDCHAR
+STARTCHAR E63C
+ENCODING 58940
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 13 1 -7
+BITMAP
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801920
+8033F0
+E0F1B0
+7FC040
+3F00E0
+000060
+ENDCHAR
+STARTCHAR E63D
+ENCODING 58941
+SWIDTH 748 0
+DWIDTH 26 0
+BBX 25 13 1 -7
+BITMAP
+00004200
+00104600
+00304600
+4038C700
+401FFF80
+401FFF80
+80080000
+80192000
+8033F000
+E0F1B000
+7FC04000
+3F00E000
+00006000
+ENDCHAR
+STARTCHAR E63E
+ENCODING 58942
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 17 13 0 -7
+BITMAP
+102180
+102180
+102180
+307380
+FFFF80
+FFFF00
+000000
+004800
+00FC00
+006C00
+001000
+003800
+001800
+ENDCHAR
+STARTCHAR E63F
+ENCODING 58943
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 13 0 -7
+BITMAP
+102180
+102180
+102180
+307380
+FFFFE0
+FFFFE0
+000000
+004800
+00FC00
+006C00
+001000
+003800
+001800
+ENDCHAR
+STARTCHAR E640
+ENCODING 58944
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 22 1 -7
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000120
+0003F0
+0001B0
+000000
+000000
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801920
+8033F0
+E0F1B0
+7FC040
+3F00E0
+000060
+ENDCHAR
+STARTCHAR E641
+ENCODING 58945
+SWIDTH 748 0
+DWIDTH 26 0
+BBX 25 22 1 -7
+BITMAP
+00008000
+0001C000
+0000C000
+00000000
+00012000
+0003F000
+0001B000
+00000000
+00000000
+00004200
+00104600
+00304600
+4038C700
+401FFF80
+401FFF80
+80080000
+80192000
+8033F000
+E0F1B000
+7FC04000
+3F00E000
+00006000
+ENDCHAR
+STARTCHAR E642
+ENCODING 58946
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 17 22 0 -7
+BITMAP
+002000
+007000
+003000
+000000
+004800
+00FC00
+006C00
+000000
+000000
+102180
+102180
+102180
+307380
+FFFF80
+FFFF00
+000000
+004800
+00FC00
+006C00
+001000
+003800
+001800
+ENDCHAR
+STARTCHAR E643
+ENCODING 58947
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 22 0 -7
+BITMAP
+002000
+007000
+003000
+000000
+004800
+00FC00
+006C00
+000000
+000000
+102180
+102180
+102180
+307380
+FFFFE0
+FFFFE0
+000000
+004800
+00FC00
+006C00
+001000
+003800
+001800
+ENDCHAR
+STARTCHAR E644
+ENCODING 58948
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 13 1 -6
+BITMAP
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80082400
+C0107E00
+E0F03600
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR E645
+ENCODING 58949
+SWIDTH 921 0
+DWIDTH 32 0
+BBX 31 13 1 -6
+BITMAP
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFFE
+400FFFF6
+80080000
+80081200
+C0103F00
+E0F01B00
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR E646
+ENCODING 58950
+SWIDTH 691 0
+DWIDTH 24 0
+BBX 22 11 0 -4
+BITMAP
+0001C0
+1007F0
+101E78
+10381C
+30700C
+FFFFFC
+FFFFF8
+000000
+000480
+000FC0
+0006C0
+ENDCHAR
+STARTCHAR E647
+ENCODING 58951
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 25 11 0 -4
+BITMAP
+0001C000
+1007F000
+101E7800
+10381C00
+30700C00
+FFFFFF80
+FFFFFF80
+00000000
+00048000
+000FC000
+0006C000
+ENDCHAR
+STARTCHAR E648
+ENCODING 58952
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 20 1 -6
+BITMAP
+00000400
+00000E00
+00000600
+00000900
+00001F80
+00000D80
+00000000
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR E649
+ENCODING 58953
+SWIDTH 921 0
+DWIDTH 32 0
+BBX 31 20 1 -6
+BITMAP
+00000400
+00000E00
+00000600
+00000900
+00001F80
+00000D80
+00000000
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFFE
+400FFFF6
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR E64A
+ENCODING 58954
+SWIDTH 691 0
+DWIDTH 24 0
+BBX 22 14 0 0
+BITMAP
+000200
+000700
+000300
+000480
+000FC0
+0006C0
+000000
+0001C0
+1007F0
+101E78
+10381C
+30700C
+FFFFFC
+FFFFF8
+ENDCHAR
+STARTCHAR E64B
+ENCODING 58955
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 25 14 0 0
+BITMAP
+00020000
+00070000
+00030000
+00048000
+000FC000
+0006C000
+00000000
+0001C000
+1007F000
+101E7800
+10381C00
+30700C00
+FFFFFF80
+FFFFFF80
+ENDCHAR
+STARTCHAR E64C
+ENCODING 58956
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 17 1 0
+BITMAP
+0800
+0800
+0C00
+0E20
+0C70
+0C30
+0C48
+0CFC
+046C
+0400
+0478
+05FE
+059E
+0707
+1E07
+FFFE
+7FFE
+ENDCHAR
+STARTCHAR E64D
+ENCODING 58957
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 17 1 0
+BITMAP
+080000
+080000
+0C0000
+0E2000
+0C7000
+0C3000
+0C4800
+0CFC00
+046C00
+040000
+047800
+05FE00
+059E00
+070700
+1E0700
+FFFFC0
+7FFFC0
+ENDCHAR
+STARTCHAR E64E
+ENCODING 58958
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 17 0 0
+BITMAP
+2000
+2000
+2000
+3880
+31C0
+30C0
+3120
+13F0
+11B0
+1000
+11E0
+13F8
+1678
+1C1C
+381C
+FFFC
+FFF8
+ENDCHAR
+STARTCHAR E64F
+ENCODING 58959
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 17 0 0
+BITMAP
+2000
+2000
+2000
+3880
+31C0
+30C0
+3120
+13F0
+11B0
+1000
+11E0
+13F8
+1678
+1C1C
+381C
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR E650
+ENCODING 58960
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 27 1 -11
+BITMAP
+0800
+1C00
+0C00
+1200
+3F00
+1B00
+0000
+1C00
+3E00
+7100
+6000
+7180
+7F80
+3F00
+1C00
+3000
+6000
+4000
+8000
+8000
+8000
+8000
+8000
+8000
+6018
+7FE0
+1F80
+ENDCHAR
+STARTCHAR E651
+ENCODING 58961
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 26 0 -10
+BITMAP
+0800
+1C00
+0C00
+1200
+3F00
+1B00
+0000
+0000
+0400
+1F00
+3F00
+3F00
+1E00
+1F80
+33F8
+20F8
+4000
+4000
+C000
+8000
+8000
+C000
+C000
+7000
+3FC0
+0F00
+ENDCHAR
+STARTCHAR E652
+ENCODING 58962
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 11 16 0 0
+BITMAP
+0800
+1C00
+0C00
+1200
+3F00
+1B00
+0000
+0E00
+1F00
+3980
+7000
+7000
+7000
+3C20
+FFE0
+FFC0
+ENDCHAR
+STARTCHAR E653
+ENCODING 58963
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 15 0 0
+BITMAP
+0800
+1C00
+0C00
+1200
+3F00
+1B00
+0000
+1E00
+3F00
+3F00
+1F00
+0F00
+3F80
+FFE0
+E1E0
+ENDCHAR
+STARTCHAR E654
+ENCODING 58964
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 11 1 -1
+BITMAP
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR E655
+ENCODING 58965
+SWIDTH 662 0
+DWIDTH 23 0
+BBX 22 10 1 -1
+BITMAP
+0000C0
+0001E0
+000370
+800230
+800390
+8003F0
+C001F0
+FFFFFC
+7FFFFC
+3FFFC0
+ENDCHAR
+STARTCHAR E656
+ENCODING 58966
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 10 0 0
+BITMAP
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+ENDCHAR
+STARTCHAR E657
+ENCODING 58967
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 10 0 0
+BITMAP
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR E658
+ENCODING 58968
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 21 14 1 -4
+BITMAP
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+000010
+000038
+000018
+ENDCHAR
+STARTCHAR E659
+ENCODING 58969
+SWIDTH 662 0
+DWIDTH 23 0
+BBX 22 13 1 -4
+BITMAP
+0000C0
+0001E0
+000370
+800230
+800390
+8003F0
+C001F0
+FFFFFC
+7FFFFC
+3FFFC0
+000010
+000038
+000018
+ENDCHAR
+STARTCHAR E65A
+ENCODING 58970
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 13 0 -3
+BITMAP
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR E65B
+ENCODING 58971
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 13 0 -3
+BITMAP
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+0200
+0700
+0300
+ENDCHAR
+STARTCHAR E65C
+ENCODING 58972
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 21 19 1 -5
+BITMAP
+000200
+000700
+000300
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+000000
+001000
+003800
+001800
+ENDCHAR
+STARTCHAR E65D
+ENCODING 58973
+SWIDTH 662 0
+DWIDTH 23 0
+BBX 22 18 1 -5
+BITMAP
+000100
+000380
+000180
+000000
+0000C0
+0001E0
+000370
+800230
+800390
+8003F0
+C001F0
+FFFFFC
+7FFFFC
+3FFFC0
+000000
+002000
+007000
+003000
+ENDCHAR
+STARTCHAR E65E
+ENCODING 58974
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 18 0 -4
+BITMAP
+0800
+1C00
+0C00
+0000
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+0000
+4000
+E000
+6000
+ENDCHAR
+STARTCHAR E65F
+ENCODING 58975
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 18 0 -4
+BITMAP
+1000
+3800
+1800
+0000
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+0000
+4000
+E000
+6000
+ENDCHAR
+STARTCHAR E660
+ENCODING 58976
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 22 17 1 -7
+BITMAP
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+000048
+0000FC
+00006C
+000010
+000038
+000018
+ENDCHAR
+STARTCHAR E661
+ENCODING 58977
+SWIDTH 662 0
+DWIDTH 23 0
+BBX 22 17 1 -8
+BITMAP
+0000C0
+0001E0
+000370
+800230
+800390
+8003F0
+C001F0
+FFFFFC
+7FFFFC
+3FFFC0
+000000
+000024
+00007E
+000036
+000008
+00001C
+00000C
+ENDCHAR
+STARTCHAR E662
+ENCODING 58978
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 17 0 -7
+BITMAP
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+0000
+0240
+07E0
+0360
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR E663
+ENCODING 58979
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 17 0 -7
+BITMAP
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+0000
+0480
+0FC0
+06C0
+0100
+0380
+0180
+ENDCHAR
+STARTCHAR E664
+ENCODING 58980
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 20 1 -7
+BITMAP
+0100
+0380
+0180
+0000
+0000
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FC
+807C
+8004
+8004
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR E665
+ENCODING 58981
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 20 1 -7
+BITMAP
+0100
+0380
+0180
+0000
+0000
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FF
+807F
+800C
+800C
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR E666
+ENCODING 58982
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 15 0 0
+BITMAP
+1000
+3800
+1800
+0000
+0000
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+ENDCHAR
+STARTCHAR E667
+ENCODING 58983
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 0
+BITMAP
+2000
+7000
+3000
+0000
+0000
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR E668
+ENCODING 58984
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 21 1 -8
+BITMAP
+0100
+0380
+0180
+0240
+07E0
+0360
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FC
+807C
+8004
+8004
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR E669
+ENCODING 58985
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 21 1 -8
+BITMAP
+0100
+0380
+0180
+0240
+07E0
+0360
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FF
+807F
+800C
+800C
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR E66A
+ENCODING 58986
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 17 0 0
+BITMAP
+1000
+3800
+1800
+2400
+7E00
+3600
+0000
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+ENDCHAR
+STARTCHAR E66B
+ENCODING 58987
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 17 0 0
+BITMAP
+2000
+7000
+3000
+4800
+FC00
+6C00
+0000
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 58988
+SWIDTH 576 0
+DWIDTH 20 0
+BBX 20 15 0 0
+BITMAP
+003000
+00F000
+01C000
+030000
+060000
+0C0000
+080000
+080000
+0FFFC0
+87FFE0
+800030
+800010
+C00030
+FFFFE0
+3FFFC0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 58989
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 22 15 0 0
+BITMAP
+003000
+00F000
+01C000
+030000
+060000
+0C0000
+080000
+080000
+0FFFC0
+87FFE0
+800030
+800010
+C00030
+FFFFFC
+3FFFFC
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 58990
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 15 0 0
+BITMAP
+00C000
+03C000
+070000
+0C0000
+180000
+300000
+200000
+200000
+3FFF00
+1FFF80
+0000C0
+000040
+0000C0
+FFFF80
+FFFF00
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 58991
+SWIDTH 576 0
+DWIDTH 20 0
+BBX 20 15 0 0
+BITMAP
+00C000
+03C000
+070000
+0C0000
+180000
+300000
+200000
+200000
+3FFF00
+1FFF80
+0000C0
+000040
+0000C0
+FFFFF0
+FFFFF0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 58992
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 17 0 0
+BITMAP
+0001
+0007
+003F
+00FE
+03FB
+039B
+070E
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 58993
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 17 0 0
+BITMAP
+000100
+000700
+003F00
+00FE00
+03FB00
+039B00
+070E00
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 58994
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 17 -1 0
+BITMAP
+0020
+00E0
+07E0
+1FC0
+7F60
+7360
+E1C0
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 58995
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 17 -1 0
+BITMAP
+0020
+00E0
+07E0
+1FC0
+7F60
+7360
+E1C0
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR E674
+ENCODING 58996
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 17 1 0
+BITMAP
+0008
+0218
+0718
+0318
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+ENDCHAR
+STARTCHAR E675
+ENCODING 58997
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 17 1 0
+BITMAP
+0008
+0218
+0738
+0318
+0018
+0018
+0218
+0218
+0718
+0118
+8208
+8008
+8008
+C008
+E038
+7FFE
+7FF6
+ENDCHAR
+STARTCHAR E676
+ENCODING 58998
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 21 -1 0
+BITMAP
+0800
+1C00
+0C00
+0000
+0020
+00E0
+07E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR E677
+ENCODING 58999
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 21 -1 0
+BITMAP
+0800
+1C00
+0C00
+0000
+0020
+00E0
+07E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR E678
+ENCODING 59000
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 24 1 -7
+BITMAP
+0008
+0018
+0018
+0018
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+0000
+0240
+07E0
+0360
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR E679
+ENCODING 59001
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 24 1 -7
+BITMAP
+0008
+0018
+0038
+0018
+0018
+0018
+0218
+0218
+0718
+0118
+8208
+8008
+8008
+C008
+E038
+7FFE
+7FF6
+0000
+0240
+07E0
+0360
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR E67A
+ENCODING 59002
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 24 -1 -7
+BITMAP
+0020
+00E0
+07E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+0000
+0900
+1F80
+0D80
+0200
+0700
+0300
+ENDCHAR
+STARTCHAR E67B
+ENCODING 59003
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 24 -1 -7
+BITMAP
+0020
+00E0
+07E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+0000
+0480
+0FC0
+06C0
+0100
+0380
+0180
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59004
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 19 0 0
+BITMAP
+0006
+001C
+0071
+01C7
+033F
+00FE
+03FB
+039B
+070E
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59005
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+000600
+001C00
+007100
+01C700
+033F00
+00FE00
+03FB00
+039B00
+070E00
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59006
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 19 -1 0
+BITMAP
+00C0
+0380
+0E20
+38E0
+67E0
+1FC0
+7F60
+7360
+E1C0
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 59007
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 19 -1 0
+BITMAP
+00C0
+0380
+0E20
+38E0
+67E0
+1FC0
+7F60
+7360
+E1C0
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59008
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 23 0 -4
+BITMAP
+0006
+001C
+0071
+01C7
+033F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+0000
+0120
+03F0
+01B0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59009
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 23 0 -4
+BITMAP
+000600
+001C00
+007100
+01C700
+033F00
+00F800
+03E000
+038000
+070000
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+000000
+012000
+03F000
+01B000
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59010
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 23 -1 -4
+BITMAP
+00C0
+0380
+0E20
+38E0
+67E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+0000
+0900
+1F80
+0D80
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 59011
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 23 -1 -4
+BITMAP
+00C0
+0380
+0E20
+38E0
+67E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+0000
+0480
+0FC0
+06C0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59012
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 23 0 0
+BITMAP
+0200
+0700
+0340
+02E0
+0766
+031C
+0071
+01C7
+033F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59013
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 23 0 0
+BITMAP
+020000
+070000
+034000
+02E000
+076600
+031C00
+007100
+01C700
+033F00
+00F800
+03E000
+038000
+070000
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 59014
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 23 -1 0
+BITMAP
+4000
+E000
+6800
+5C00
+ECC0
+6380
+0E20
+38E0
+67E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 59015
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 23 -1 0
+BITMAP
+4000
+E000
+6800
+5C00
+ECC0
+6380
+0E20
+38E0
+67E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR E688
+ENCODING 59016
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 26 1 -4
+BITMAP
+0110
+01B0
+00E0
+0040
+0000
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR E689
+ENCODING 59017
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 27 1 -5
+BITMAP
+0088
+00D8
+0070
+0020
+0000
+0020
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+4010
+4010
+801E
+801E
+8010
+C030
+60E0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR E68A
+ENCODING 59018
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 22 0 0
+BITMAP
+44
+6C
+38
+10
+00
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+18
+18
+18
+F8
+F0
+ENDCHAR
+STARTCHAR E68B
+ENCODING 59019
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 7 22 0 0
+BITMAP
+44
+6C
+38
+10
+00
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+10
+18
+18
+FE
+EE
+ENDCHAR
+STARTCHAR E68C
+ENCODING 59020
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 25 1 -4
+BITMAP
+0040
+00E0
+0060
+0000
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR E68D
+ENCODING 59021
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 26 1 -5
+BITMAP
+0040
+00E0
+0060
+0000
+0020
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+4010
+4010
+801E
+801E
+8010
+C030
+60E0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR E68E
+ENCODING 59022
+SWIDTH 144 0
+DWIDTH 5 0
+BBX 5 21 0 0
+BITMAP
+20
+70
+30
+00
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+18
+18
+18
+F8
+F0
+ENDCHAR
+STARTCHAR E68F
+ENCODING 59023
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 7 21 0 0
+BITMAP
+20
+70
+30
+00
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+10
+18
+18
+FE
+EE
+ENDCHAR
+STARTCHAR E690
+ENCODING 59024
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 28 1 -4
+BITMAP
+0080
+01C0
+00C0
+0120
+03F0
+01B0
+0000
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR E691
+ENCODING 59025
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 29 1 -5
+BITMAP
+0040
+00E0
+0060
+0090
+01F8
+00D8
+0000
+0020
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+4010
+4010
+801E
+801E
+8010
+C030
+60E0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR E692
+ENCODING 59026
+SWIDTH 86 0
+DWIDTH 3 0
+BBX 6 24 0 0
+BITMAP
+20
+70
+30
+48
+FC
+6C
+00
+00
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+18
+18
+18
+F8
+ENDCHAR
+STARTCHAR E693
+ENCODING 59027
+SWIDTH 86 0
+DWIDTH 3 0
+BBX 7 24 0 0
+BITMAP
+20
+70
+30
+48
+FC
+6C
+00
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+10
+18
+18
+FE
+EE
+ENDCHAR
+STARTCHAR E694
+ENCODING 59028
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 20 1 -8
+BITMAP
+0600
+0700
+0200
+0000
+0000
+0000
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F60
+0360
+01C0
+ENDCHAR
+STARTCHAR E695
+ENCODING 59029
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 20 0 -8
+BITMAP
+0200
+0700
+0300
+0000
+0000
+0000
+0000
+0018
+2018
+201C
+400E
+400E
+C00C
+C008
+E018
+F8F0
+7FF0
+1FB0
+01B0
+00E0
+ENDCHAR
+STARTCHAR E696
+ENCODING 59030
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 6 17 0 -3
+BITMAP
+40
+70
+30
+00
+00
+00
+08
+08
+18
+0C
+0C
+04
+FC
+F8
+D8
+D8
+70
+ENDCHAR
+STARTCHAR E697
+ENCODING 59031
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 17 0 -3
+BITMAP
+1000
+3800
+1800
+0000
+0000
+0000
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+6C00
+6C00
+3800
+ENDCHAR
+STARTCHAR E698
+ENCODING 59032
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 18 1 -6
+BITMAP
+0600
+0700
+0200
+0D80
+0FC0
+0480
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR E699
+ENCODING 59033
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 18 0 -6
+BITMAP
+0200
+0700
+0300
+0480
+0FC0
+06C0
+0000
+0018
+2018
+201C
+400E
+400E
+C00C
+C008
+E018
+F8F0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR E69A
+ENCODING 59034
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 6 15 0 -7
+BITMAP
+08
+08
+18
+0C
+0C
+04
+FC
+F8
+00
+48
+FC
+6C
+10
+38
+18
+ENDCHAR
+STARTCHAR E69B
+ENCODING 59035
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 -7
+BITMAP
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+0000
+2400
+7E00
+3600
+0800
+1C00
+0C00
+ENDCHAR
+STARTCHAR E69C
+ENCODING 59036
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 18 1 -1
+BITMAP
+38
+70
+40
+7C
+30
+20
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR E69D
+ENCODING 59037
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 20 0 0
+BITMAP
+3800
+7000
+4000
+7C00
+3000
+2000
+0000
+0000
+0400
+0400
+0400
+1C00
+3C00
+6400
+E400
+FC00
+7C00
+1600
+07C0
+03C0
+ENDCHAR
+STARTCHAR E69E
+ENCODING 59038
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 18 1 -1
+BITMAP
+38
+70
+40
+7C
+30
+20
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR E69F
+ENCODING 59039
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 12 13 0 0
+BITMAP
+0E00
+1C00
+1000
+1F00
+0C00
+0800
+0000
+0000
+0E00
+1F00
+3380
+61F0
+C0F0
+ENDCHAR
+STARTCHAR E6A0
+ENCODING 59040
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 15 1 -1
+BITMAP
+6C
+FE
+24
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR E6A1
+ENCODING 59041
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 12 10 0 0
+BITMAP
+1200
+3F00
+1B00
+0000
+0000
+0E00
+1F00
+3380
+61F0
+C0F0
+ENDCHAR
+STARTCHAR E6A2
+ENCODING 59042
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0760
+8DE0
+4DC0
+3F80
+1F00
+ENDCHAR
+STARTCHAR E6A3
+ENCODING 59043
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0760
+8DE0
+4DC0
+3F80
+1F00
+ENDCHAR
+STARTCHAR E6A4
+ENCODING 59044
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 18 -2 -6
+BITMAP
+0240
+07E0
+0360
+0000
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR E6A5
+ENCODING 59045
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 18 -2 -6
+BITMAP
+0240
+07E0
+0360
+0000
+0000
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0060
+80E0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR E6A6
+ENCODING 59046
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 19 14 1 -6
+BITMAP
+0000E0
+0003E0
+040F40
+041800
+081000
+183000
+383F00
+703FC0
+D007C0
+1001C0
+180F80
+1C7F00
+0FFC00
+07E000
+ENDCHAR
+STARTCHAR E6A7
+ENCODING 59047
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 20 10 1 -8
+BITMAP
+0803F0
+080FF0
+100C00
+301E00
+701F80
+D80F80
+1C0780
+1E3F00
+0FFC00
+03F000
+ENDCHAR
+STARTCHAR E6A8
+ENCODING 59048
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 16 1 -6
+BITMAP
+0880
+0D80
+0707
+021F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR E6A9
+ENCODING 59049
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 17 12 1 -8
+BITMAP
+110000
+1B0000
+4E1F80
+447F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+ENDCHAR
+STARTCHAR E6AA
+ENCODING 59050
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 7 13 -1 0
+BITMAP
+44
+6C
+38
+10
+00
+04
+04
+04
+06
+06
+06
+7E
+7C
+ENDCHAR
+STARTCHAR E6AB
+ENCODING 59051
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 13 0 0
+BITMAP
+4400
+6C00
+3800
+1000
+0000
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR E6AC
+ENCODING 59052
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 21 1 -13
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+0000
+0900
+1F80
+0D80
+0200
+0700
+0300
+ENDCHAR
+STARTCHAR E6AD
+ENCODING 59053
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 17 17 1 -15
+BITMAP
+401F80
+407F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+000000
+048000
+0FC000
+06C000
+010000
+038000
+018000
+ENDCHAR
+STARTCHAR E6AE
+ENCODING 59054
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 15 0 -7
+BITMAP
+08
+08
+08
+0C
+0C
+0C
+FC
+F8
+00
+48
+FC
+6C
+10
+38
+18
+ENDCHAR
+STARTCHAR E6AF
+ENCODING 59055
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 -7
+BITMAP
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+0000
+2400
+7E00
+3600
+0800
+1C00
+0C00
+ENDCHAR
+STARTCHAR E6AA
+ENCODING 59056
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 8 0 0
+BITMAP
+08
+08
+08
+0C
+0C
+0C
+FC
+F8
+ENDCHAR
+STARTCHAR E6AB
+ENCODING 59057
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 8 0 0
+BITMAP
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FBDD
+ENCODING 59058
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 17 18 -2 -6
+BITMAP
+030700
+070E00
+050800
+070F80
+070600
+0CC400
+19E000
+01F000
+033000
+03B000
+03F800
+01F800
+003000
+007000
+80E000
+61C000
+3F8000
+1F0000
+ENDCHAR
+STARTCHAR FEFB
+ENCODING 59088
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 22 0 0
+BITMAP
+0044
+006C
+0038
+0010
+0000
+0010
+4030
+F038
+7838
+7830
+3C30
+0620
+0320
+03A0
+01E0
+00C0
+00C0
+01E0
+0320
+0620
+0FE0
+0FC0
+ENDCHAR
+STARTCHAR FEFC
+ENCODING 59089
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 23 1 -1
+BITMAP
+0088
+00D8
+0070
+0020
+0000
+0020
+E020
+F020
+F020
+7820
+3C30
+0C30
+0630
+0630
+0330
+0370
+0370
+01F0
+01B0
+0398
+031E
+0F0E
+7C00
+ENDCHAR
+STARTCHAR FEFB
+ENCODING 59090
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 21 0 0
+BITMAP
+0010
+0038
+0018
+0000
+0010
+4030
+F038
+7838
+7830
+3C30
+0620
+0320
+03A0
+01E0
+00C0
+00C0
+01E0
+0320
+0620
+0FE0
+0FC0
+ENDCHAR
+STARTCHAR FEFC
+ENCODING 59091
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 22 1 -1
+BITMAP
+0020
+0070
+0030
+0000
+0020
+E020
+F020
+F020
+7820
+3C30
+0C30
+0630
+0630
+0330
+0370
+0370
+01F0
+01B0
+0398
+031E
+0F0E
+7C00
+ENDCHAR
+STARTCHAR FEFB
+ENCODING 59092
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 24 0 0
+BITMAP
+0020
+0070
+0030
+0048
+00FC
+006C
+0000
+0010
+4030
+F038
+7838
+7830
+3C30
+0620
+0320
+03A0
+01E0
+00C0
+00C0
+01E0
+0320
+0620
+0FE0
+0FC0
+ENDCHAR
+STARTCHAR FEFC
+ENCODING 59093
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 25 1 -1
+BITMAP
+0040
+00E0
+0060
+0090
+01F8
+00D8
+0000
+0020
+E020
+F020
+F020
+7820
+3C30
+0C30
+0630
+0630
+0330
+0370
+0370
+01F0
+01B0
+0398
+031E
+0F0E
+7C00
+ENDCHAR
+STARTCHAR E6F0
+ENCODING 59120
+SWIDTH 921 0
+DWIDTH 32 0
+BBX 32 21 0 -5
+BITMAP
+00220000
+00660000
+00660000
+00660000
+00660000
+00260000
+00220000
+00220800
+00320800
+00320800
+00320804
+00320C06
+40320C06
+40330C03
+8011FC03
+8011F803
+80100003
+80304806
+C0E0FC0C
+7FC06FF8
+1E0000F0
+ENDCHAR
+STARTCHAR 0661
+ENCODING 59124
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 10 16 2 0
+BITMAP
+7000
+F840
+FC40
+8E80
+C780
+6300
+6200
+6000
+7000
+3000
+3000
+3000
+1000
+1000
+1000
+1000
+ENDCHAR
+STARTCHAR FB50
+ENCODING 64336
+SWIDTH 144 0
+DWIDTH 5 0
+BBX 7 18 -1 0
+BITMAP
+0E
+72
+9C
+00
+10
+10
+20
+30
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR FB51
+ENCODING 64337
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 18 -1 0
+BITMAP
+0E
+72
+9C
+00
+10
+30
+30
+30
+10
+10
+10
+10
+10
+10
+10
+18
+0E
+0E
+ENDCHAR
+STARTCHAR FB52
+ENCODING 64338
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 -7
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0080
+01C0
+00C0
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR FB53
+ENCODING 64339
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 14 1 -8
+BITMAP
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+000000
+004000
+00E000
+006000
+004000
+00E000
+006000
+ENDCHAR
+STARTCHAR FB54
+ENCODING 64340
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 14 0 -7
+BITMAP
+06
+06
+07
+07
+03
+FF
+FE
+00
+08
+1C
+0C
+08
+1C
+0C
+ENDCHAR
+STARTCHAR FB55
+ENCODING 64341
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 14 0 -7
+BITMAP
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+0000
+0800
+1C00
+0C00
+0800
+1C00
+0C00
+ENDCHAR
+STARTCHAR FB56
+ENCODING 64342
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 -7
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0240
+07E0
+0360
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR FB57
+ENCODING 64343
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 14 1 -8
+BITMAP
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+000000
+012000
+03F000
+01B000
+004000
+00E000
+006000
+ENDCHAR
+STARTCHAR FB58
+ENCODING 64344
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 14 0 -7
+BITMAP
+06
+06
+07
+07
+03
+FF
+FE
+00
+24
+7E
+36
+08
+1C
+0C
+ENDCHAR
+STARTCHAR FB59
+ENCODING 64345
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 14 0 -7
+BITMAP
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+0000
+2400
+7E00
+3600
+0800
+1C00
+0C00
+ENDCHAR
+STARTCHAR FB5A
+ENCODING 64346
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 -7
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0480
+0FC0
+06C0
+0480
+0FC0
+06C0
+ENDCHAR
+STARTCHAR FB5B
+ENCODING 64347
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 14 1 -8
+BITMAP
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+000000
+024000
+07E000
+036000
+024000
+07E000
+036000
+ENDCHAR
+STARTCHAR FB5C
+ENCODING 64348
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 14 0 -7
+BITMAP
+06
+06
+07
+07
+03
+FF
+FE
+00
+24
+7E
+36
+24
+7E
+36
+ENDCHAR
+STARTCHAR FB5D
+ENCODING 64349
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 14 0 -7
+BITMAP
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+0000
+2400
+7E00
+3600
+2400
+7E00
+3600
+ENDCHAR
+STARTCHAR FB5E
+ENCODING 64350
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 0
+BITMAP
+0100
+0380
+0180
+0100
+0380
+0180
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR FB5F
+ENCODING 64351
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 13 1 -1
+BITMAP
+008000
+01C000
+00C000
+008000
+01C000
+00C000
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+ENDCHAR
+STARTCHAR FB60
+ENCODING 64352
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 15 0 0
+BITMAP
+08
+1C
+0C
+08
+1C
+0C
+00
+00
+06
+06
+07
+07
+03
+FF
+FE
+ENDCHAR
+STARTCHAR FB61
+ENCODING 64353
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 15 0 0
+BITMAP
+0800
+1C00
+0C00
+0800
+1C00
+0C00
+0000
+0000
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+ENDCHAR
+STARTCHAR FB62
+ENCODING 64354
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 0
+BITMAP
+0480
+0FC0
+06C0
+0480
+0FC0
+06C0
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR FB63
+ENCODING 64355
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 13 1 -1
+BITMAP
+048000
+0FC000
+06C000
+048000
+0FC000
+06C000
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+ENDCHAR
+STARTCHAR FB64
+ENCODING 64356
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 15 0 0
+BITMAP
+48
+FC
+6C
+48
+FC
+6C
+00
+00
+06
+06
+07
+07
+03
+FF
+FE
+ENDCHAR
+STARTCHAR FB65
+ENCODING 64357
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 15 0 0
+BITMAP
+4800
+FC00
+6C00
+4800
+FC00
+6C00
+0000
+0000
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+ENDCHAR
+STARTCHAR FB66
+ENCODING 64358
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 11 1 0
+BITMAP
+0400
+0500
+0680
+0780
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR FB67
+ENCODING 64359
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 11 1 -1
+BITMAP
+020000
+028000
+034000
+03C000
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+ENDCHAR
+STARTCHAR FB68
+ENCODING 64360
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 13 0 0
+BITMAP
+20
+28
+34
+3C
+00
+00
+06
+06
+07
+07
+03
+FF
+FE
+ENDCHAR
+STARTCHAR FB69
+ENCODING 64361
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 13 0 0
+BITMAP
+2000
+2800
+3400
+3C00
+0000
+0000
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+ENDCHAR
+STARTCHAR FB6A
+ENCODING 64362
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 18 1 -1
+BITMAP
+000100
+000380
+000180
+000240
+0007E0
+000360
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR FB6B
+ENCODING 64363
+SWIDTH 662 0
+DWIDTH 23 0
+BBX 22 17 1 -1
+BITMAP
+000100
+000380
+000180
+000240
+0007E0
+000360
+000000
+0000C0
+0001E0
+000370
+800230
+800390
+8003F0
+C001F0
+FFFFFC
+7FFFFC
+3FFFC0
+ENDCHAR
+STARTCHAR FB6C
+ENCODING 64364
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 17 0 0
+BITMAP
+0800
+1C00
+0C00
+1200
+3F00
+1B00
+0000
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+ENDCHAR
+STARTCHAR FB6D
+ENCODING 64365
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 17 0 0
+BITMAP
+1000
+3800
+1800
+2400
+7E00
+3600
+0000
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FB6E
+ENCODING 64366
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 18 1 -1
+BITMAP
+000900
+001F80
+000D80
+000900
+001F80
+000D80
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR FB6F
+ENCODING 64367
+SWIDTH 662 0
+DWIDTH 23 0
+BBX 22 17 1 -1
+BITMAP
+000900
+001F80
+000D80
+000900
+001F80
+000D80
+000000
+0000C0
+0001E0
+000370
+800230
+800390
+8003F0
+C001F0
+FFFFFC
+7FFFFC
+3FFFC0
+ENDCHAR
+STARTCHAR FB70
+ENCODING 64368
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 17 0 0
+BITMAP
+4800
+FC00
+6C00
+4800
+FC00
+6C00
+0000
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+ENDCHAR
+STARTCHAR FB71
+ENCODING 64369
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 17 0 0
+BITMAP
+4800
+FC00
+6C00
+4800
+FC00
+6C00
+0000
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FB72
+ENCODING 64370
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2180
+41C0
+4080
+4180
+41C0
+4080
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR FB73
+ENCODING 64371
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 16 1 -9
+BITMAP
+3FC0
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8600
+8700
+8200
+8600
+8700
+C200
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR FB74
+ENCODING 64372
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 -7
+BITMAP
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+0000
+0300
+0380
+0100
+0300
+0380
+0100
+ENDCHAR
+STARTCHAR FB75
+ENCODING 64373
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 -7
+BITMAP
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+0000
+0300
+0380
+0100
+0300
+0380
+0100
+ENDCHAR
+STARTCHAR FB76
+ENCODING 64374
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+46C0
+47E0
+4240
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR FB77
+ENCODING 64375
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 16 1 -9
+BITMAP
+3FC0
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8000
+8000
+8D80
+8FC0
+8480
+C000
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR FB78
+ENCODING 64376
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 -7
+BITMAP
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+0000
+0000
+0000
+0000
+0D80
+0FC0
+0480
+ENDCHAR
+STARTCHAR FB79
+ENCODING 64377
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 -7
+BITMAP
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+0000
+0000
+0000
+0000
+0D80
+0FC0
+0480
+ENDCHAR
+STARTCHAR FB7A
+ENCODING 64378
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+46C0
+47E0
+4240
+4180
+41C0
+6080
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR FB7B
+ENCODING 64379
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 16 1 -9
+BITMAP
+3FC0
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8D80
+8FC0
+8480
+8300
+8380
+C100
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR FB7C
+ENCODING 64380
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 -7
+BITMAP
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+0000
+0D80
+0FC0
+0480
+0300
+0380
+0100
+ENDCHAR
+STARTCHAR FB7D
+ENCODING 64381
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 -7
+BITMAP
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+0000
+0D80
+0FC0
+0480
+0300
+0380
+0100
+ENDCHAR
+STARTCHAR FB7E
+ENCODING 64382
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+46C0
+47E0
+4240
+46C0
+47E0
+6240
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR FB7F
+ENCODING 64383
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 16 1 -9
+BITMAP
+3FC0
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8D80
+8FC0
+8480
+8D80
+8FC0
+C480
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR FB80
+ENCODING 64384
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 -7
+BITMAP
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+0000
+0D80
+0FC0
+0480
+0D80
+0FC0
+0480
+ENDCHAR
+STARTCHAR FB81
+ENCODING 64385
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 -7
+BITMAP
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+0000
+0D80
+0FC0
+0480
+0D80
+0FC0
+0480
+ENDCHAR
+STARTCHAR FB82
+ENCODING 64386
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 14 2 -4
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+00
+24
+7E
+36
+ENDCHAR
+STARTCHAR FB83
+ENCODING 64387
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 15 1 -5
+BITMAP
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+0000
+2400
+7E00
+3600
+ENDCHAR
+STARTCHAR FB84
+ENCODING 64388
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 16 2 0
+BITMAP
+24
+7E
+36
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR FB85
+ENCODING 64389
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 16 1 -1
+BITMAP
+2400
+7E00
+3600
+0000
+0000
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+ENDCHAR
+STARTCHAR FB86
+ENCODING 64390
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 19 2 0
+BITMAP
+10
+38
+18
+24
+7E
+36
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR FB87
+ENCODING 64391
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 19 1 -1
+BITMAP
+1000
+3800
+1800
+2400
+7E00
+3600
+0000
+0000
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+ENDCHAR
+STARTCHAR FB88
+ENCODING 64392
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 15 2 0
+BITMAP
+10
+14
+1A
+1E
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR FB89
+ENCODING 64393
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 16 1 -1
+BITMAP
+0800
+0A00
+0D00
+0F00
+0000
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+ENDCHAR
+STARTCHAR FB8A
+ENCODING 64394
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 12 21 -2 -5
+BITMAP
+0080
+01C0
+00C0
+0120
+03F0
+01B0
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR FB8B
+ENCODING 64395
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 21 -2 -5
+BITMAP
+0080
+01C0
+00C0
+0120
+03F0
+01B0
+0000
+0000
+0000
+0000
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+ENDCHAR
+STARTCHAR FB8C
+ENCODING 64396
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 18 -2 -5
+BITMAP
+0400
+0500
+0680
+0780
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR FB8D
+ENCODING 64397
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 18 -2 -5
+BITMAP
+0400
+0500
+0680
+0780
+0000
+0000
+0000
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64398
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 17 0 0
+BITMAP
+0001
+0007
+003F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64399
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 17 0 0
+BITMAP
+000100
+000700
+003F00
+00F800
+03E000
+038000
+070000
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64400
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 17 -1 0
+BITMAP
+0020
+00E0
+07E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 64401
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 17 -1 0
+BITMAP
+0020
+00E0
+07E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64402
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 19 0 0
+BITMAP
+000C
+0038
+00E1
+0387
+063F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64403
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 19 0 0
+BITMAP
+000C00
+003800
+00E100
+038700
+063F00
+00F800
+03E000
+038000
+070000
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64404
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 19 -1 0
+BITMAP
+0180
+0700
+1C20
+70E0
+C7E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 64405
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 19 -1 0
+BITMAP
+0180
+0700
+1C20
+70E0
+C7E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64406
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 26 0 -7
+BITMAP
+000C
+0038
+00E1
+0387
+063F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+0000
+0100
+0380
+0180
+0100
+0380
+0180
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64407
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 26 0 -7
+BITMAP
+000C00
+003800
+00E100
+038700
+063F00
+00F800
+03E000
+038000
+070000
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+000000
+010000
+038000
+018000
+010000
+038000
+018000
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64408
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 11 26 -1 -7
+BITMAP
+0180
+0700
+1C20
+70E0
+C7E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+0000
+0400
+0E00
+0600
+0400
+0E00
+0600
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 64409
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 26 -1 -7
+BITMAP
+0180
+0700
+1C20
+70E0
+C7E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+0000
+0400
+0E00
+0600
+0400
+0E00
+0600
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64410
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 21 0 0
+BITMAP
+0080
+05C0
+0ECC
+0638
+00E1
+0387
+063F
+00F8
+03E0
+0380
+0700
+0780
+03C0
+01F0
+0078
+801C
+800E
+8007
+C003
+FFFF
+3FFE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64411
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 21 0 0
+BITMAP
+008000
+05C000
+0ECC00
+063800
+00E100
+038700
+063F00
+00F800
+03E000
+038000
+070000
+078000
+03C000
+01F000
+007800
+801C00
+800E00
+800700
+C00380
+FFFFE0
+3FFFE0
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64412
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 12 21 -2 0
+BITMAP
+0800
+5C00
+ECC0
+6380
+0E10
+3870
+63F0
+0F80
+3E00
+3800
+7000
+7800
+3C00
+1F00
+0780
+01C0
+00E0
+0070
+0030
+3FF0
+3FF0
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 64413
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 15 21 -2 0
+BITMAP
+0800
+5C00
+ECC0
+6380
+0E10
+3870
+63F0
+0FC0
+3E00
+3800
+7000
+7800
+3C00
+1F00
+0780
+01C0
+00E0
+0070
+0038
+3FFE
+3FFE
+ENDCHAR
+STARTCHAR FB9E
+ENCODING 64414
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 12 1 -6
+BITMAP
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR FB9F
+ENCODING 64415
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 11 0 -6
+BITMAP
+0018
+2018
+201C
+400E
+400E
+C00C
+C008
+E018
+F8F0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR FBA0
+ENCODING 64416
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 18 1 -6
+BITMAP
+0400
+0500
+0680
+0780
+0000
+0000
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR FBA1
+ENCODING 64417
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 18 0 -6
+BITMAP
+0400
+0500
+0680
+0780
+0000
+0000
+0000
+0018
+2018
+201C
+400E
+400E
+C00C
+C008
+E018
+F8F0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR FBA2
+ENCODING 64418
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 6 14 0 0
+BITMAP
+80
+A0
+D0
+F0
+00
+00
+08
+08
+18
+0C
+0C
+04
+FC
+F8
+ENDCHAR
+STARTCHAR FBA3
+ENCODING 64419
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 14 0 0
+BITMAP
+4000
+5000
+6800
+7800
+0000
+0000
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FBA6
+ENCODING 64422
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 11 11 0 -1
+BITMAP
+0600
+0700
+0780
+0FC0
+0FC0
+12E0
+1260
+1F20
+FFE0
+FBE0
+0040
+ENDCHAR
+STARTCHAR E69F
+ENCODING 64423
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 12 5 0 0
+BITMAP
+0E00
+1F00
+3380
+61F0
+C0F0
+ENDCHAR
+STARTCHAR FBA8
+ENCODING 64424
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 15 0 -5
+BITMAP
+18
+18
+18
+18
+18
+18
+18
+1C
+FF
+E7
+00
+08
+10
+18
+18
+ENDCHAR
+STARTCHAR FBA9
+ENCODING 64425
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 11 0 -8
+BITMAP
+1000
+F1C0
+F3C0
+1E00
+1C00
+1800
+1800
+1900
+1A00
+0B00
+0300
+ENDCHAR
+STARTCHAR FBAA
+ENCODING 64426
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 7 0 0
+BITMAP
+0E00
+0FC0
+13E0
+1260
+9F20
+FFE0
+79E0
+ENDCHAR
+STARTCHAR FBAB
+ENCODING 64427
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 7 0 0
+BITMAP
+0E00
+0FC0
+13E0
+1260
+9F20
+FFFE
+79FE
+ENDCHAR
+STARTCHAR FBAC
+ENCODING 64428
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 7 0 0
+BITMAP
+0E00
+0FC0
+13E0
+1260
+1F20
+FFE0
+F9E0
+ENDCHAR
+STARTCHAR FBAD
+ENCODING 64429
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 7 0 0
+BITMAP
+0E00
+0FC0
+13E0
+1260
+1F20
+FFFE
+F9FE
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64430
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 14 10 1 -6
+BITMAP
+0030
+0078
+1FC8
+3F80
+6000
+C000
+8000
+8000
+FFFC
+7FF8
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64431
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 14 10 1 -6
+BITMAP
+0030
+0078
+1FCC
+3F8C
+6000
+C000
+8000
+8000
+FFFC
+7FF8
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64432
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 14 18 1 -6
+BITMAP
+00E0
+01C0
+0100
+01F0
+00C0
+0080
+0000
+0000
+0030
+0078
+1FC8
+3F80
+6000
+C000
+8000
+8000
+FFFC
+7FF8
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 64433
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 14 18 1 -6
+BITMAP
+00E0
+01C0
+0100
+01F0
+00C0
+0080
+0000
+0000
+0030
+0078
+1FCC
+3F8C
+6000
+C000
+8000
+8000
+FFFC
+7FF8
+ENDCHAR
+STARTCHAR FBD3
+ENCODING 64467
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 19 1 0
+BITMAP
+0400
+0E00
+0608
+0918
+1F98
+0D98
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+ENDCHAR
+STARTCHAR FBD4
+ENCODING 64468
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 19 1 0
+BITMAP
+0400
+0E00
+0608
+0918
+1FB8
+0D98
+0018
+0018
+0218
+0218
+0718
+0118
+8208
+8008
+8008
+C008
+E038
+7FFE
+7FF6
+ENDCHAR
+STARTCHAR FBD5
+ENCODING 64469
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 22 -1 0
+BITMAP
+2000
+7000
+3400
+2E00
+7600
+3020
+00E0
+07E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0700
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR FBD6
+ENCODING 64470
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 22 -1 0
+BITMAP
+2000
+7000
+3400
+2E00
+7600
+3020
+00E0
+07E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0700
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR FBD7
+ENCODING 64471
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 21 -2 -6
+BITMAP
+0060
+00E0
+00A0
+00E0
+00E0
+0180
+0300
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBD8
+ENCODING 64472
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 13 21 -2 -6
+BITMAP
+0060
+00E0
+00A0
+00E0
+00E0
+0180
+0300
+0000
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0060
+80E0
+41C0
+3F80
+1E00
+ENDCHAR
+STARTCHAR FBD9
+ENCODING 64473
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 18 -2 -6
+BITMAP
+0220
+0360
+01C0
+0080
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBDA
+ENCODING 64474
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 18 -2 -6
+BITMAP
+0220
+0360
+01C0
+0080
+0000
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0060
+80E0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBDB
+ENCODING 64475
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 20 -2 -6
+BITMAP
+0080
+0100
+0180
+0180
+0080
+0080
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBDC
+ENCODING 64476
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 20 -2 -6
+BITMAP
+0080
+0100
+0180
+0180
+0080
+0080
+0000
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0060
+80E0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBDD
+ENCODING 64477
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 17 18 -2 -6
+BITMAP
+030700
+070E00
+050800
+070F80
+070600
+0C4400
+18E000
+01B000
+013000
+01B000
+01F000
+00F000
+003000
+003000
+806000
+61C000
+3F8000
+0F0000
+ENDCHAR
+STARTCHAR FBDE
+ENCODING 64478
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 21 -2 -6
+BITMAP
+0100
+0380
+0180
+0240
+07E0
+0360
+0000
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBDF
+ENCODING 64479
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 21 -2 -6
+BITMAP
+0100
+0380
+0180
+0240
+07E0
+0360
+0000
+0000
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0060
+80E0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBE0
+ENCODING 64480
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+07E0
+8FE0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBE1
+ENCODING 64481
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+07E0
+8FE0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBE2
+ENCODING 64482
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 18 -2 -6
+BITMAP
+0040
+00E0
+01B0
+0110
+0000
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBE3
+ENCODING 64483
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 18 -2 -6
+BITMAP
+0040
+00E0
+01B0
+0110
+0000
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0060
+80E0
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FBE4
+ENCODING 64484
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 21 1 -13
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+0000
+0080
+01C0
+00C0
+0080
+01C0
+00C0
+ENDCHAR
+STARTCHAR FBE5
+ENCODING 64485
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 17 17 1 -15
+BITMAP
+401F80
+407F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+000000
+004000
+00E000
+006000
+004000
+00E000
+006000
+ENDCHAR
+STARTCHAR FBE6
+ENCODING 64486
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 7 15 -1 -7
+BITMAP
+04
+04
+04
+06
+06
+06
+7E
+7C
+00
+10
+38
+18
+10
+38
+18
+ENDCHAR
+STARTCHAR FBE7
+ENCODING 64487
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 -7
+BITMAP
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+0000
+0800
+1C00
+0C00
+0800
+1C00
+0C00
+ENDCHAR
+STARTCHAR FBE6
+ENCODING 64488
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 8 0 0
+BITMAP
+08
+08
+08
+0C
+0C
+0C
+FC
+F8
+ENDCHAR
+STARTCHAR FBE7
+ENCODING 64489
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 8 0 0
+BITMAP
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FBFC
+ENCODING 64508
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 14 1 -6
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR FBFD
+ENCODING 64509
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 17 10 1 -8
+BITMAP
+401F80
+407F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+ENDCHAR
+STARTCHAR E6AE
+ENCODING 64510
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 12 0 -4
+BITMAP
+08
+08
+08
+0C
+0C
+0C
+FC
+F8
+00
+48
+FC
+6C
+ENDCHAR
+STARTCHAR E6AF
+ENCODING 64511
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 12 0 -4
+BITMAP
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+0000
+2400
+7E00
+3600
+ENDCHAR
+STARTCHAR FDF2
+ENCODING 65010
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 24 1 0
+BITMAP
+010000
+010000
+018000
+018000
+008000
+009000
+005000
+025000
+02F030
+03E020
+038030
+002130
+006330
+006330
+086330
+086330
+386330
+786330
+C82130
+C82130
+F82110
+7C7310
+0FFF10
+07FE10
+ENDCHAR
+STARTCHAR FE70
+ENCODING 65136
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 7 1 17
+BITMAP
+04
+18
+30
+CC
+38
+60
+80
+ENDCHAR
+STARTCHAR FE72
+ENCODING 65138
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 7 7 1 17
+BITMAP
+08
+1C
+1C
+F8
+AC
+32
+60
+ENDCHAR
+STARTCHAR FE74
+ENCODING 65140
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 7 1 -8
+BITMAP
+04
+08
+30
+CC
+38
+60
+80
+ENDCHAR
+STARTCHAR FE76
+ENCODING 65142
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 4 1 17
+BITMAP
+0C
+10
+60
+80
+ENDCHAR
+STARTCHAR FE78
+ENCODING 65144
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 7 1 17
+BITMAP
+0C
+1C
+14
+1C
+1C
+30
+60
+ENDCHAR
+STARTCHAR FE7A
+ENCODING 65146
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 4 1 -5
+BITMAP
+04
+08
+30
+C0
+ENDCHAR
+STARTCHAR FE7C
+ENCODING 65148
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 6 1 17
+BITMAP
+04
+14
+94
+BC
+F8
+E0
+ENDCHAR
+STARTCHAR FE7E
+ENCODING 65150
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 5 6 1 17
+BITMAP
+70
+78
+98
+88
+F8
+F0
+ENDCHAR
+STARTCHAR FE80
+ENCODING 65152
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 7 9 3 -1
+BITMAP
+38
+78
+40
+80
+FE
+FC
+60
+80
+80
+ENDCHAR
+STARTCHAR FE81
+ENCODING 65153
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 17 0 0
+BITMAP
+34
+78
+80
+10
+30
+30
+30
+30
+30
+30
+30
+30
+30
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR FE82
+ENCODING 65154
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 6 18 0 0
+BITMAP
+04
+7C
+F0
+00
+40
+40
+40
+40
+40
+40
+40
+40
+60
+60
+60
+60
+3C
+3C
+ENDCHAR
+STARTCHAR FE83
+ENCODING 65155
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 5 19 0 0
+BITMAP
+70
+C0
+F8
+70
+40
+10
+10
+20
+30
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+ENDCHAR
+STARTCHAR FE84
+ENCODING 65156
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 6 20 3 0
+BITMAP
+70
+C0
+F8
+70
+40
+00
+20
+60
+60
+60
+20
+20
+20
+20
+20
+20
+20
+30
+1C
+1C
+ENDCHAR
+STARTCHAR FE85
+ENCODING 65157
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 20 -2 -6
+BITMAP
+01C0
+0300
+03E0
+01C0
+0100
+0000
+0000
+0040
+00E0
+01B0
+0130
+01B0
+01F0
+00F0
+0030
+0030
+8060
+61C0
+3F80
+0F00
+ENDCHAR
+STARTCHAR FE86
+ENCODING 65158
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 20 -2 -6
+BITMAP
+01C0
+0300
+03E0
+01C0
+0100
+0000
+0000
+00C0
+01E0
+01E0
+0330
+03B0
+03F8
+01F8
+0030
+0060
+80E0
+41C0
+3F80
+1E00
+ENDCHAR
+STARTCHAR FE87
+ENCODING 65159
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 5 23 1 -7
+BITMAP
+20
+60
+60
+60
+60
+60
+60
+60
+60
+60
+20
+20
+20
+20
+20
+20
+00
+00
+70
+C0
+F8
+70
+40
+ENDCHAR
+STARTCHAR FE88
+ENCODING 65160
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 6 23 2 -7
+BITMAP
+40
+40
+C0
+40
+40
+40
+40
+40
+40
+40
+60
+60
+60
+60
+3C
+3C
+00
+00
+38
+60
+7C
+38
+20
+ENDCHAR
+STARTCHAR FE89
+ENCODING 65161
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 19 1 -6
+BITMAP
+0380
+0600
+07C0
+0380
+0200
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR FE8A
+ENCODING 65162
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 17 17 1 -8
+BITMAP
+070000
+0C0000
+0F8000
+070000
+040000
+000000
+000000
+401F80
+407F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+ENDCHAR
+STARTCHAR FE8B
+ENCODING 65163
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 15 0 0
+BITMAP
+1C
+30
+3E
+1C
+10
+00
+00
+02
+06
+06
+07
+03
+07
+FF
+FE
+ENDCHAR
+STARTCHAR FE8C
+ENCODING 65164
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 0
+BITMAP
+1C00
+3000
+3E00
+1C00
+1000
+0000
+0000
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FE8D
+ENCODING 65165
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 2 16 2 0
+BITMAP
+C0
+80
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+C0
+40
+40
+40
+40
+ENDCHAR
+STARTCHAR FE8E
+ENCODING 65166
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 5 16 3 0
+BITMAP
+40
+C0
+C0
+C0
+C0
+C0
+40
+40
+40
+40
+40
+40
+40
+60
+38
+38
+ENDCHAR
+STARTCHAR FE8F
+ENCODING 65167
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 13 1 -6
+BITMAP
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+0000
+0000
+0000
+0300
+0380
+0100
+ENDCHAR
+STARTCHAR FE90
+ENCODING 65168
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 14 1 -7
+BITMAP
+000200
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+000000
+000000
+000000
+030000
+038000
+010000
+ENDCHAR
+STARTCHAR FE91
+ENCODING 65169
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 6 13 0 -6
+BITMAP
+08
+18
+18
+0C
+04
+FC
+F8
+00
+00
+00
+60
+70
+20
+ENDCHAR
+STARTCHAR FE92
+ENCODING 65170
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 13 0 -6
+BITMAP
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+0000
+0000
+0000
+3000
+3800
+1000
+ENDCHAR
+STARTCHAR FE93
+ENCODING 65171
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 15 1 -1
+BITMAP
+6C
+7E
+24
+00
+00
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR FE94
+ENCODING 65172
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 17 0 0
+BITMAP
+3600
+3F00
+1200
+0000
+0000
+0400
+0400
+0400
+1C00
+3C00
+6400
+E400
+FC00
+7C00
+1600
+07C0
+03C0
+ENDCHAR
+STARTCHAR FE95
+ENCODING 65173
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 10 1 0
+BITMAP
+06C0
+07E0
+0240
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR FE96
+ENCODING 65174
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 10 1 -1
+BITMAP
+06C000
+07E000
+024000
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+ENDCHAR
+STARTCHAR FE97
+ENCODING 65175
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 13 0 0
+BITMAP
+6C
+7E
+24
+00
+00
+00
+06
+06
+07
+07
+03
+FF
+FE
+ENDCHAR
+STARTCHAR FE98
+ENCODING 65176
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 13 0 0
+BITMAP
+6C00
+7E00
+2400
+0000
+0000
+0000
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+ENDCHAR
+STARTCHAR FE99
+ENCODING 65177
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 15 14 1 0
+BITMAP
+0200
+0700
+0300
+0000
+06C0
+07E0
+0240
+0004
+8004
+8002
+8002
+C00E
+FFFC
+3FF8
+ENDCHAR
+STARTCHAR FE9A
+ENCODING 65178
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 14 1 -1
+BITMAP
+020000
+070000
+030000
+000000
+06C000
+07E000
+024000
+000200
+800700
+800300
+800100
+E00FC0
+7FFFC0
+3FF000
+ENDCHAR
+STARTCHAR FE9B
+ENCODING 65179
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 8 16 0 0
+BITMAP
+20
+70
+30
+00
+6C
+7E
+24
+00
+00
+06
+06
+07
+07
+03
+FF
+FE
+ENDCHAR
+STARTCHAR FE9C
+ENCODING 65180
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 9 16 0 0
+BITMAP
+2000
+7000
+3000
+0000
+6C00
+7E00
+2400
+0000
+0000
+0400
+0400
+0600
+0600
+0200
+FF80
+FF80
+ENDCHAR
+STARTCHAR FE9D
+ENCODING 65181
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 12 17 2 -9
+BITMAP
+7860
+7FC0
+FFC0
+3800
+6000
+4000
+4000
+8000
+8600
+8700
+8200
+8000
+C000
+C000
+7070
+3FC0
+1F00
+ENDCHAR
+STARTCHAR FE9E
+ENCODING 65182
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 16 1 -9
+BITMAP
+3FC0
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8000
+8000
+8600
+8700
+8200
+C000
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR FE9F
+ENCODING 65183
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 -7
+BITMAP
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+0000
+0000
+0000
+0000
+0C00
+0E00
+0400
+ENDCHAR
+STARTCHAR FEA0
+ENCODING 65184
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 -7
+BITMAP
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+0000
+0000
+0000
+0000
+0C00
+0E00
+0400
+ENDCHAR
+STARTCHAR FEA1
+ENCODING 65185
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 17 1 -9
+BITMAP
+3C30
+3FE0
+7FE0
+1C00
+3000
+2000
+2000
+4000
+4000
+4000
+4000
+4000
+6000
+6000
+3838
+1FE0
+0F80
+ENDCHAR
+STARTCHAR FEA2
+ENCODING 65186
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 16 1 -9
+BITMAP
+3FC0
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8000
+8000
+8000
+8000
+8000
+C000
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR FEA3
+ENCODING 65187
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 7 0 0
+BITMAP
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR FEA4
+ENCODING 65188
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 7 0 0
+BITMAP
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR FEA5
+ENCODING 65189
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 12 23 2 -9
+BITMAP
+0C00
+0E00
+0400
+0000
+0000
+0000
+7860
+7FC0
+FFC0
+3800
+6000
+4000
+4000
+8000
+8000
+8000
+8000
+8000
+C000
+C000
+7070
+3FC0
+1F00
+ENDCHAR
+STARTCHAR FEA6
+ENCODING 65190
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 13 23 1 -9
+BITMAP
+0C00
+0E00
+0400
+0000
+0000
+0000
+0000
+0000
+7FC0
+FFC0
+9D00
+2100
+41F8
+40F8
+8000
+8000
+8000
+8000
+8000
+C000
+7018
+3FE0
+1F80
+ENDCHAR
+STARTCHAR FEA7
+ENCODING 65191
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 14 0 0
+BITMAP
+0C00
+0E00
+0400
+0000
+0000
+0000
+0000
+1E00
+3F80
+23C0
+00F0
+007C
+FFFE
+FFFE
+ENDCHAR
+STARTCHAR FEA8
+ENCODING 65192
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 14 14 0 0
+BITMAP
+1800
+1C00
+0800
+0000
+0000
+0000
+0000
+3C00
+7F00
+4780
+01E0
+00F0
+FFFC
+FFFC
+ENDCHAR
+STARTCHAR FEA9
+ENCODING 65193
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 10 2 0
+BITMAP
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR FEAA
+ENCODING 65194
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 11 1 -1
+BITMAP
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+ENDCHAR
+STARTCHAR FEAB
+ENCODING 65195
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 8 16 2 0
+BITMAP
+10
+38
+18
+00
+00
+00
+04
+06
+06
+02
+03
+01
+81
+CF
+FF
+7C
+ENDCHAR
+STARTCHAR FEAC
+ENCODING 65196
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 17 1 -1
+BITMAP
+0800
+1C00
+0C00
+0000
+0000
+0000
+0200
+0200
+0600
+0300
+0300
+0300
+8100
+8180
+CFC0
+FFC0
+7C00
+ENDCHAR
+STARTCHAR FEAD
+ENCODING 65197
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 11 -2 -5
+BITMAP
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR FEAE
+ENCODING 65198
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 11 -2 -5
+BITMAP
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+ENDCHAR
+STARTCHAR FEAF
+ENCODING 65199
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 11 18 -2 -5
+BITMAP
+0400
+0E00
+0600
+0000
+0000
+0000
+0000
+0080
+00C0
+00C0
+0060
+0060
+0060
+0060
+00C0
+8180
+7F00
+1E00
+ENDCHAR
+STARTCHAR FEB0
+ENCODING 65200
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 13 18 -2 -5
+BITMAP
+0400
+0E00
+0600
+0000
+0000
+0000
+0000
+0080
+01C0
+00C0
+0060
+0078
+0078
+0060
+00C0
+83C0
+7F00
+1C00
+ENDCHAR
+STARTCHAR FEB1
+ENCODING 65201
+SWIDTH 691 0
+DWIDTH 24 0
+BBX 22 12 1 -6
+BITMAP
+000084
+00208C
+00208C
+40318C
+403FFC
+401FFC
+801000
+801000
+806000
+E1E000
+7FC000
+3E0000
+ENDCHAR
+STARTCHAR FEB2
+ENCODING 65202
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 12 1 -6
+BITMAP
+000084
+00208C
+00208C
+40318C
+403FFF
+801FFF
+801000
+801000
+806000
+E1E000
+7FC000
+3E0000
+ENDCHAR
+STARTCHAR FEB3
+ENCODING 65203
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 16 6 0 0
+BITMAP
+1021
+1023
+3023
+3063
+FFFF
+FFFE
+ENDCHAR
+STARTCHAR FEB4
+ENCODING 65204
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 18 6 0 0
+BITMAP
+102100
+102300
+302300
+306300
+FFFFC0
+FFFFC0
+ENDCHAR
+STARTCHAR FEB5
+ENCODING 65205
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 24 21 1 -6
+BITMAP
+000080
+0001C0
+0000C0
+000000
+0001B0
+0001F8
+000090
+000000
+000000
+000042
+001046
+003047
+4038C7
+401FFE
+401FFE
+801800
+801800
+803000
+E0F000
+7FC000
+3F0000
+ENDCHAR
+STARTCHAR FEB6
+ENCODING 65206
+SWIDTH 748 0
+DWIDTH 26 0
+BBX 25 21 1 -6
+BITMAP
+00008000
+0001C000
+0000C000
+00000000
+0001B000
+0001F800
+00009000
+00000000
+00000000
+00004200
+00104600
+00304600
+4038C700
+401FFF80
+401FFF80
+80080000
+80180000
+80300000
+E0F00000
+7FC00000
+3F000000
+ENDCHAR
+STARTCHAR FEB7
+ENCODING 65207
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 17 15 0 0
+BITMAP
+004000
+00E000
+006000
+000000
+00D800
+00FC00
+004800
+000000
+000000
+102180
+102180
+102180
+307380
+FFFF80
+FFFF00
+ENDCHAR
+STARTCHAR FEB8
+ENCODING 65208
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 19 15 0 0
+BITMAP
+004000
+00E000
+006000
+000000
+00D800
+00FC00
+004800
+000000
+000000
+102180
+102180
+102180
+307380
+FFFFE0
+FFFFE0
+ENDCHAR
+STARTCHAR FEB9
+ENCODING 65209
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 13 1 -6
+BITMAP
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR FEBA
+ENCODING 65210
+SWIDTH 921 0
+DWIDTH 32 0
+BBX 31 13 1 -6
+BITMAP
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFFE
+400FFFF6
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR FEBB
+ENCODING 65211
+SWIDTH 691 0
+DWIDTH 24 0
+BBX 22 7 0 0
+BITMAP
+0001C0
+1007F0
+101E78
+10381C
+30700C
+FFFFFC
+FFFFF8
+ENDCHAR
+STARTCHAR FEBC
+ENCODING 65212
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 25 7 0 0
+BITMAP
+0001C000
+1007F000
+101E7800
+10381C00
+30700C00
+FFFFFF80
+FFFFFF80
+ENDCHAR
+STARTCHAR FEBD
+ENCODING 65213
+SWIDTH 864 0
+DWIDTH 30 0
+BBX 29 19 1 -6
+BITMAP
+00000600
+00000700
+00000200
+00000000
+00000000
+00000000
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFF0
+400FFFE0
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR FEBE
+ENCODING 65214
+SWIDTH 921 0
+DWIDTH 32 0
+BBX 31 19 1 -6
+BITMAP
+00000600
+00000700
+00000200
+00000000
+00000000
+00000000
+00000780
+00000FE0
+00103DF0
+00307078
+4019C038
+401FFFFE
+400FFFF6
+80080000
+80080000
+C0100000
+E0F00000
+7FE00000
+1F000000
+ENDCHAR
+STARTCHAR FEBF
+ENCODING 65215
+SWIDTH 691 0
+DWIDTH 24 0
+BBX 22 13 0 0
+BITMAP
+000300
+000380
+000100
+000000
+000000
+000000
+0001C0
+1007F0
+101E78
+10381C
+30700C
+FFFFFC
+FFFFF8
+ENDCHAR
+STARTCHAR FEC0
+ENCODING 65216
+SWIDTH 720 0
+DWIDTH 25 0
+BBX 25 13 0 0
+BITMAP
+00030000
+00038000
+00010000
+00000000
+00000000
+00000000
+0001C000
+1007F000
+101E7800
+10381C00
+30700C00
+FFFFFF80
+FFFFFF80
+ENDCHAR
+STARTCHAR FEC1
+ENCODING 65217
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 17 1 0
+BITMAP
+0800
+0800
+0C00
+0E00
+0C00
+0C00
+0C00
+0C00
+0400
+0400
+0478
+05FE
+059E
+0707
+1E07
+FFFE
+7FFE
+ENDCHAR
+STARTCHAR FEC2
+ENCODING 65218
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 17 1 0
+BITMAP
+080000
+080000
+0C0000
+0E0000
+0C0000
+0C0000
+0C0000
+0C0000
+040000
+040000
+047800
+05FE00
+059E00
+070700
+1E0700
+FFFFC0
+7FFFC0
+ENDCHAR
+STARTCHAR FEC3
+ENCODING 65219
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 17 0 0
+BITMAP
+2000
+2000
+2000
+3800
+3000
+3000
+3000
+1000
+1000
+1000
+11E0
+13F8
+1678
+1C1C
+381C
+FFFC
+FFF8
+ENDCHAR
+STARTCHAR FEC4
+ENCODING 65220
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 17 0 0
+BITMAP
+2000
+2000
+2000
+3800
+3000
+3000
+3000
+1000
+1000
+1000
+11E0
+13F8
+1678
+1C1C
+381C
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR FEC5
+ENCODING 65221
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 17 1 0
+BITMAP
+0800
+0800
+0C00
+0E00
+0C20
+0C70
+0C30
+0C00
+0400
+0400
+0478
+05FE
+059E
+0707
+1E07
+FFFE
+7FFE
+ENDCHAR
+STARTCHAR FEC6
+ENCODING 65222
+SWIDTH 547 0
+DWIDTH 19 0
+BBX 18 17 1 0
+BITMAP
+080000
+080000
+0C0000
+0E0000
+0C2000
+0C7000
+0C3000
+0C0000
+040000
+040000
+047800
+05FE00
+059E00
+070700
+1E0700
+FFFFC0
+7FFFC0
+ENDCHAR
+STARTCHAR FEC7
+ENCODING 65223
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 17 0 0
+BITMAP
+2000
+2000
+2000
+3800
+3080
+31C0
+30C0
+1000
+1000
+1000
+11E0
+13F8
+1678
+1C1C
+381C
+FFFC
+FFF8
+ENDCHAR
+STARTCHAR FEC8
+ENCODING 65224
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 17 0 0
+BITMAP
+2000
+2000
+2000
+3800
+3080
+31C0
+30C0
+1000
+1000
+1000
+11E0
+13F8
+1678
+1C1C
+381C
+FFFF
+FFFF
+ENDCHAR
+STARTCHAR FEC9
+ENCODING 65225
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 20 1 -10
+BITMAP
+1C00
+3E00
+3100
+4000
+7180
+7F80
+3F00
+1C00
+3000
+6000
+4000
+8000
+8000
+8000
+8000
+8000
+8000
+6018
+7FE0
+1F80
+ENDCHAR
+STARTCHAR FECA
+ENCODING 65226
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 18 0 -10
+BITMAP
+0400
+1F00
+3F00
+3F00
+1E00
+1F80
+33F8
+20F8
+4000
+4000
+C000
+8000
+8000
+C000
+C000
+7000
+3FC0
+0F00
+ENDCHAR
+STARTCHAR FECB
+ENCODING 65227
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 11 9 0 0
+BITMAP
+0E00
+1F00
+3980
+7000
+7000
+7000
+3C20
+FFE0
+FFC0
+ENDCHAR
+STARTCHAR FECC
+ENCODING 65228
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 8 0 0
+BITMAP
+1E00
+3F00
+3F00
+1F00
+0F00
+3F80
+FFE0
+E1E0
+ENDCHAR
+STARTCHAR FECD
+ENCODING 65229
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 25 1 -10
+BITMAP
+1800
+1C00
+0800
+0000
+0000
+1C00
+3E00
+3100
+4000
+7180
+7F80
+3F00
+1C00
+3000
+6000
+4000
+8000
+8000
+8000
+8000
+8000
+8000
+6018
+7FE0
+1F80
+ENDCHAR
+STARTCHAR FECE
+ENCODING 65230
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 25 0 -10
+BITMAP
+1800
+1C00
+0800
+0000
+0000
+0000
+0000
+0400
+1F00
+3F00
+3F00
+1E00
+1F80
+33F8
+20F8
+4000
+4000
+C000
+8000
+8000
+C000
+C000
+7000
+3FC0
+0F00
+ENDCHAR
+STARTCHAR FECF
+ENCODING 65231
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 11 15 0 0
+BITMAP
+0C00
+0E00
+0400
+0000
+0000
+0000
+0E00
+1F00
+3980
+7000
+7000
+7000
+3C20
+FFE0
+FFC0
+ENDCHAR
+STARTCHAR FED0
+ENCODING 65232
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 15 0 0
+BITMAP
+1800
+1C00
+0800
+0000
+0000
+0000
+0000
+1E00
+3F00
+3F00
+1F00
+0F00
+3F80
+FFE0
+E1E0
+ENDCHAR
+STARTCHAR FED1
+ENCODING 65233
+SWIDTH 633 0
+DWIDTH 22 0
+BBX 20 16 1 -1
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000000
+000040
+0001E0
+0001F0
+400330
+400330
+8003F0
+8001F0
+C000F0
+7FFFF0
+3FFFE0
+07E000
+ENDCHAR
+STARTCHAR FED2
+ENCODING 65234
+SWIDTH 662 0
+DWIDTH 23 0
+BBX 22 16 1 -1
+BITMAP
+000080
+0001C0
+0000C0
+000000
+000000
+000000
+0000C0
+0001E0
+000370
+800230
+800390
+8003F0
+C001F0
+FFFFFC
+7FFFFC
+3FFFC0
+ENDCHAR
+STARTCHAR FED3
+ENCODING 65235
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 15 0 0
+BITMAP
+0400
+0E00
+0600
+0000
+0000
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+ENDCHAR
+STARTCHAR FED4
+ENCODING 65236
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 0
+BITMAP
+1000
+3800
+1800
+0000
+0000
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FED5
+ENCODING 65237
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 14 20 1 -7
+BITMAP
+0120
+03F0
+01B0
+0000
+0000
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FC
+807C
+8004
+8004
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR FED6
+ENCODING 65238
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 20 1 -7
+BITMAP
+0120
+03F0
+01B0
+0000
+0000
+0000
+0070
+0078
+00F8
+009C
+40CC
+40FF
+807F
+800C
+800C
+8018
+C078
+61F0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR FED7
+ENCODING 65239
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 9 15 0 0
+BITMAP
+1200
+3F00
+1B00
+0000
+0000
+0600
+0F00
+0B00
+1980
+1880
+1F80
+0F80
+0780
+FF80
+FF00
+ENDCHAR
+STARTCHAR FED8
+ENCODING 65240
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 0
+BITMAP
+2400
+7E00
+3600
+0000
+0000
+0C00
+1C00
+3400
+2200
+3200
+3E00
+3E00
+0F00
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FED9
+ENCODING 65241
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 17 1 0
+BITMAP
+0008
+0018
+0018
+0018
+0018
+0018
+0218
+0218
+0718
+0108
+8208
+8008
+8008
+C008
+E038
+7FF8
+7FF0
+ENDCHAR
+STARTCHAR FEDA
+ENCODING 65242
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 17 1 0
+BITMAP
+0008
+0018
+0038
+0018
+0018
+0018
+0218
+0218
+0718
+0118
+8208
+8008
+8008
+C008
+E038
+7FFE
+7FF6
+ENDCHAR
+STARTCHAR FEDB
+ENCODING 65243
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 11 17 -1 0
+BITMAP
+0020
+00E0
+07E0
+1F00
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0060
+7FE0
+7FE0
+ENDCHAR
+STARTCHAR FEDC
+ENCODING 65244
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 14 17 -1 0
+BITMAP
+0020
+00E0
+07E0
+1F80
+7C00
+7000
+E000
+F000
+7800
+3E00
+0F00
+0380
+01C0
+00E0
+0070
+7FFC
+7FFC
+ENDCHAR
+STARTCHAR FEDD
+ENCODING 65245
+SWIDTH 403 0
+DWIDTH 14 0
+BBX 12 21 1 -4
+BITMAP
+0020
+0060
+0060
+0060
+0060
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+4030
+4030
+8010
+8010
+8010
+8030
+C0E0
+7FC0
+1E00
+ENDCHAR
+STARTCHAR FEDE
+ENCODING 65246
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 15 22 1 -5
+BITMAP
+0020
+0020
+0020
+0020
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+0030
+4010
+4010
+801E
+801E
+8010
+C030
+60E0
+7FC0
+1F00
+ENDCHAR
+STARTCHAR FEDF
+ENCODING 65247
+SWIDTH 172 0
+DWIDTH 6 0
+BBX 5 17 0 0
+BITMAP
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+18
+18
+18
+F8
+F0
+ENDCHAR
+STARTCHAR FEE0
+ENCODING 65248
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 7 17 0 0
+BITMAP
+10
+10
+30
+30
+30
+30
+10
+10
+10
+10
+10
+10
+10
+18
+18
+FE
+EE
+ENDCHAR
+STARTCHAR FEE1
+ENCODING 65249
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 10 17 1 -10
+BITMAP
+0C00
+1C00
+3E00
+2700
+0380
+7FC0
+FFC0
+C000
+C000
+C000
+4000
+6000
+6000
+6000
+2000
+2000
+2000
+ENDCHAR
+STARTCHAR FEE2
+ENCODING 65250
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 11 17 1 -10
+BITMAP
+1C00
+3E00
+6E00
+4700
+0780
+7FE0
+FFE0
+8000
+8000
+8000
+8000
+4000
+4000
+4000
+4000
+4000
+4000
+ENDCHAR
+STARTCHAR FEE3
+ENCODING 65251
+SWIDTH 316 0
+DWIDTH 11 0
+BBX 10 7 0 0
+BITMAP
+0700
+0F80
+0D80
+18C0
+1CC0
+FFC0
+E780
+ENDCHAR
+STARTCHAR FEE4
+ENCODING 65252
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 12 7 0 0
+BITMAP
+0600
+0F00
+1980
+1180
+3DC0
+FFF0
+CFF0
+ENDCHAR
+STARTCHAR FEE5
+ENCODING 65253
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 13 18 1 -6
+BITMAP
+0200
+0700
+0300
+0000
+0000
+0000
+0010
+0010
+2038
+4018
+4018
+8008
+8008
+C018
+C078
+F9F0
+7FE0
+1F00
+ENDCHAR
+STARTCHAR FEE6
+ENCODING 65254
+SWIDTH 432 0
+DWIDTH 15 0
+BBX 15 18 0 -6
+BITMAP
+0200
+0700
+0300
+0000
+0000
+0000
+0000
+0018
+2018
+201C
+400E
+400E
+C00C
+C008
+E018
+F8F0
+7FE0
+1F80
+ENDCHAR
+STARTCHAR FEE7
+ENCODING 65255
+SWIDTH 230 0
+DWIDTH 8 0
+BBX 6 14 0 0
+BITMAP
+20
+70
+30
+00
+00
+00
+08
+08
+18
+0C
+0C
+04
+FC
+F8
+ENDCHAR
+STARTCHAR FEE8
+ENCODING 65256
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 14 0 0
+BITMAP
+1000
+3800
+1800
+0000
+0000
+0000
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+ENDCHAR
+STARTCHAR FEE9
+ENCODING 65257
+SWIDTH 259 0
+DWIDTH 9 0
+BBX 8 10 1 -1
+BITMAP
+20
+20
+38
+3C
+5E
+87
+83
+FE
+FE
+10
+ENDCHAR
+STARTCHAR FEEA
+ENCODING 65258
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 12 0 0
+BITMAP
+0400
+0400
+0400
+1C00
+3C00
+6400
+E400
+FC00
+7C00
+1600
+07C0
+03C0
+ENDCHAR
+STARTCHAR FEEB
+ENCODING 65259
+SWIDTH 345 0
+DWIDTH 12 0
+BBX 11 11 0 -1
+BITMAP
+0600
+0700
+0780
+0FC0
+0FC0
+12E0
+1260
+1F20
+FFE0
+FBE0
+0040
+ENDCHAR
+STARTCHAR FEEC
+ENCODING 65260
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 -6
+BITMAP
+0200
+0700
+0F00
+0B00
+1900
+1300
+3E00
+FFC0
+FFC0
+3700
+3300
+3900
+1B00
+1E00
+0600
+ENDCHAR
+STARTCHAR FEED
+ENCODING 65261
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FEEE
+ENCODING 65262
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 12 13 -2 -6
+BITMAP
+00C0
+01E0
+01E0
+0110
+0190
+01F0
+00F0
+0030
+0060
+8060
+41C0
+3F80
+1F00
+ENDCHAR
+STARTCHAR FEEF
+ENCODING 65263
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 14 1 -6
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+ENDCHAR
+STARTCHAR FEF0
+ENCODING 65264
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 17 10 1 -8
+BITMAP
+401F80
+407F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+ENDCHAR
+STARTCHAR FEF1
+ENCODING 65265
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 19 1 -11
+BITMAP
+0007
+001F
+207A
+20C0
+4080
+4180
+41F8
+81FE
+803E
+800E
+C07C
+E3F8
+7FE0
+3F00
+0000
+0000
+1200
+3F00
+1B00
+ENDCHAR
+STARTCHAR FEF2
+ENCODING 65266
+SWIDTH 489 0
+DWIDTH 17 0
+BBX 17 14 1 -12
+BITMAP
+401F80
+407F80
+406000
+80F000
+80FC00
+C07C00
+E03C00
+F1F800
+7FE000
+1F8000
+000000
+090000
+1F8000
+0D8000
+ENDCHAR
+STARTCHAR FEF3
+ENCODING 65267
+SWIDTH 201 0
+DWIDTH 7 0
+BBX 7 15 -1 -7
+BITMAP
+04
+04
+04
+06
+06
+06
+7E
+7C
+00
+00
+00
+00
+48
+FC
+6C
+ENDCHAR
+STARTCHAR FEF4
+ENCODING 65268
+SWIDTH 288 0
+DWIDTH 10 0
+BBX 10 15 0 -7
+BITMAP
+0400
+0400
+0400
+0600
+0200
+0600
+FFC0
+FFC0
+0000
+0000
+0000
+0000
+4800
+FC00
+6C00
+ENDCHAR
+STARTCHAR FEF5
+ENCODING 65269
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 19 0 0
+BITMAP
+3C00
+7800
+8010
+0030
+6030
+7038
+7830
+7C30
+3E20
+0720
+01A0
+01E0
+00C0
+00C0
+01E0
+0320
+0620
+0FE0
+0FC0
+ENDCHAR
+STARTCHAR FEF6
+ENCODING 65270
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 20 0 -1
+BITMAP
+0200
+7C00
+7810
+8010
+3010
+3810
+3C10
+3E18
+1E18
+0318
+0318
+0198
+01B8
+01B8
+00F8
+00D8
+01CC
+018F
+0787
+3E00
+ENDCHAR
+STARTCHAR FEF7
+ENCODING 65271
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 13 22 1 0
+BITMAP
+6000
+E000
+8000
+F800
+6000
+8010
+2030
+7038
+7838
+3C30
+1E30
+0730
+0330
+01A0
+00E0
+00C0
+0040
+00A0
+0120
+0720
+07E0
+07C0
+ENDCHAR
+STARTCHAR FEF8
+ENCODING 65272
+SWIDTH 518 0
+DWIDTH 18 0
+BBX 16 22 1 -1
+BITMAP
+6000
+8000
+9800
+F000
+C010
+9010
+3010
+7810
+3C10
+3E18
+1618
+0318
+0318
+0118
+01B8
+01B8
+01F8
+01D8
+01CC
+018F
+0787
+3E00
+ENDCHAR
+STARTCHAR FEF9
+ENCODING 65273
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 25 0 -8
+BITMAP
+0010
+4030
+F038
+7838
+7830
+3C30
+0620
+0320
+03A0
+01E0
+00C0
+00C0
+01E0
+0320
+0620
+0FE0
+0FC0
+0000
+0000
+1C00
+3800
+2000
+3E00
+1800
+1000
+ENDCHAR
+STARTCHAR FEFA
+ENCODING 65274
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 25 0 -8
+BITMAP
+0010
+7010
+7810
+7810
+3C10
+1E18
+0618
+0318
+0318
+0198
+01B8
+01B8
+00F8
+00D8
+01CC
+018F
+0787
+3E00
+0000
+1C00
+3800
+2000
+3E00
+1800
+1000
+ENDCHAR
+STARTCHAR FEFB
+ENCODING 65275
+SWIDTH 374 0
+DWIDTH 13 0
+BBX 13 17 0 0
+BITMAP
+0010
+4030
+F038
+7838
+7830
+3C30
+0620
+0320
+03A0
+01E0
+00C0
+00C0
+01E0
+0320
+0620
+0FE0
+0FC0
+ENDCHAR
+STARTCHAR FEFC
+ENCODING 65276
+SWIDTH 460 0
+DWIDTH 16 0
+BBX 16 18 0 -1
+BITMAP
+0010
+7010
+7810
+7810
+3C10
+1E18
+0618
+0318
+0318
+0198
+01B8
+01B8
+00F8
+00D8
+01CC
+018F
+0787
+3E00
+ENDCHAR
+ENDFONT
diff --git a/xc/extras/fonts/arabic24/uniarab.txt b/xc/extras/fonts/arabic24/uniarab.txt
new file mode 100644
index 000000000..e226ccb3b
--- /dev/null
+++ b/xc/extras/fonts/arabic24/uniarab.txt
@@ -0,0 +1,225 @@
+#
+# From: Id: uniarab.txt,v 1.1 1999/02/08 22:21:52 mleisher Exp $
+#
+# Copyright 1996, 1997, 1998, 1999 Computing Research Labs,
+# New Mexico State University
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+# OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+# THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+#
+# The current version of MUTT allocates U+E600 to U+E6FF for Arabic
+# extensions. The current characters are the contextual forms that are
+# not encoded in Unicode plus anything else Arabic related that is not
+# in Unicode.
+#
+# These entries are in the Unicode Character Database format, available
+# from ftp.unicode.org.
+#
+# Updated 19 November 1997. Improvements to the font and font name change.
+#
+# mleisher@crl.nmsu.edu (Mark Leisher)
+#
+E600;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0672;;;;N;;;;;
+E601;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE FINAL FORM;Lo;0;R;<final> 0672;;;;N;;;;;
+E602;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW ISOLATED FORM;Lo;0;R;<isolated> 0673;;;;N;;;;;
+E603;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW FINAL FORM;Lo;0;R;<final> 0673;;;;N;;;;;
+E604;ARABIC LETTER HIGH HAMZA ALEF ISOLATED FORM;Lo;0;R;<isolated> 0675;;;;N;;;;;
+E605;ARABIC LETTER HIGH HAMZA ALEF FINAL FORM;Lo;0;R;<final> 0675;;;;N;;;;;
+E606;ARABIC LETTER HIGH HAMZA WAW ISOLATED FORM;Lo;0;R;<isolated> 0676;;;;N;;;;;
+E607;ARABIC LETTER HIGH HAMZA WAW FINAL FORM;Lo;0;R;<final> 0676;;;;N;;;;;
+E608;ARABIC LETTER HIGH HAMZA YEH ISOLATED FORM;Lo;0;R;<isolated> 0678;;;;N;;;;;
+E609;ARABIC LETTER HIGH HAMZA YEH FINAL FORM;Lo;0;R;<final> 0678;;;;N;;;;;
+E60A;ARABIC LETTER HIGH HAMZA YEH INITIAL FORM;Lo;0;R;<initial> 0678;;;;N;;;;;
+E60B;ARABIC LETTER HIGH HAMZA YEH MEDIAL FORM;Lo;0;R;<medial> 0678;;;;N;;;;;
+E60C;ARABIC LETTER TEH WITH RING ISOLATED FORM;Lo;0;R;<isolated> 067C;;;;N;;;;;
+E60D;ARABIC LETTER TEH WITH RING FINAL FORM;Lo;0;R;<final> 067C;;;;N;;;;;
+E60E;ARABIC LETTER TEH WITH RING INITIAL FORM;Lo;0;R;<initial> 067C;;;;N;;;;;
+E60F;ARABIC LETTER TEH WITH RING MEDIAL FORM;Lo;0;R;<medial> 067C;;;;N;;;;;
+E610;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS ISOLATED FORM;Lo;0;R;<isolated> 067D;;;;N;;;;;
+E611;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS FINAL FORM;Lo;0;R;<final> 067D;;;;N;;;;;
+E612;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS INITIAL FORM;Lo;0;R;<initial> 067D;;;;N;;;;;
+E613;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS MEDIAL FORM;Lo;0;R;<medial> 067D;;;;N;;;;;
+E614;ARABIC LETTER HAH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0681;;;;N;;;;;
+E615;ARABIC LETTER HAH WITH HAMZA ABOVE FINAL FORM;Lo;0;R;<final> 0681;;;;N;;;;;
+E616;ARABIC LETTER HAH WITH HAMZA ABOVE INITIAL FORM;Lo;0;R;<initial> 0681;;;;N;;;;;
+E617;ARABIC LETTER HAH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;R;<medial> 0681;;;;N;;;;;
+E618;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0682;;;;N;;;;;
+E619;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE FINAL FORM;Lo;0;R;<final> 0682;;;;N;;;;;
+E61A;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE INITIAL FORM;Lo;0;R;<initial> 0682;;;;N;;;;;
+E61B;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE MEDIAL FORM;Lo;0;R;<medial> 0682;;;;N;;;;;
+E61C;ARABIC LETTER HAH WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0685;;;;N;;;;;
+E61D;ARABIC LETTER HAH WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 0685;;;;N;;;;;
+E61E;ARABIC LETTER HAH WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 0685;;;;N;;;;;
+E61F;ARABIC LETTER HAH WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 0685;;;;N;;;;;
+E620;ARABIC LETTER DAL WITH RING ISOLATED FORM;Lo;0;R;<isolated> 0689;;;;N;;;;;
+E621;ARABIC LETTER DAL WITH RING FINAL FORM;Lo;0;R;<final> 0689;;;;N;;;;;
+E622;ARABIC LETTER DAL WITH DOT BELOW ISOLATED FORM;Lo;0;R;<isolated> 068A;;;;N;;;;;
+E623;ARABIC LETTER DAL WITH DOT BELOW FINAL FORM;Lo;0;R;<final> 068A;;;;N;;;;;
+E624;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH ISOLATED FORM;Lo;0;R;<isolated> 068B;;;;N;;;;;
+E625;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH FINAL FORM;Lo;0;R;<final> 068B;;;;N;;;;;
+E626;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS ISOLATED FORM;Lo;0;R;<isolated> 068F;;;;N;;;;;
+E627;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS FINAL FORM;Lo;0;R;<final> 068F;;;;N;;;;;
+E628;ARABIC LETTER DAL WITH FOUR DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0690;;;;N;;;;;
+E629;ARABIC LETTER DAL WITH FOUR DOTS ABOVE FINAL FORM;Lo;0;R;<final> 0690;;;;N;;;;;
+E62A;ARABIC LETTER REH WITH SMALL V ISOLATED FORM;Lo;0;R;<isolated> 0692;;;;N;;;;;
+E62B;ARABIC LETTER REH WITH SMALL V FINAL FORM;Lo;0;R;<final> 0692;;;;N;;;;;
+E62C;ARABIC LETTER REH WITH RING ISOLATED FORM;Lo;0;R;<isolated> 0693;;;;N;;;;;
+E62D;ARABIC LETTER REH WITH RING FINAL FORM;Lo;0;R;<final> 0693;;;;N;;;;;
+E62E;ARABIC LETTER REH WITH DOT BELOW ISOLATED FORM;Lo;0;R;<isolated> 0694;;;;N;;;;;
+E62F;ARABIC LETTER REH WITH DOT BELOW FINAL FORM;Lo;0;R;<final> 0694;;;;N;;;;;
+E630;ARABIC LETTER REH WITH SMALL V BELOW ISOLATED FORM;Lo;0;R;<isolated> 0695;;;;N;;;;;
+E631;ARABIC LETTER REH WITH SMALL V BELOW FINAL FORM;Lo;0;R;<final> 0695;;;;N;;;;;
+E632;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0696;;;;N;;;;;
+E633;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE FINAL FORM;Lo;0;R;<final> 0696;;;;N;;;;;
+E634;ARABIC LETTER REH WITH TWO DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0697;;;;N;;;;;
+E635;ARABIC LETTER REH WITH TWO DOTS ABOVE FINAL FORM;Lo;0;R;<final> 0697;;;;N;;;;;
+E636;ARABIC LETTER REH WITH FOUR DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 0699;;;;N;;;;;
+E637;ARABIC LETTER REH WITH FOUR DOTS ABOVE FINAL FORM;Lo;0;R;<final> 0699;;;;N;;;;;
+E638;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE ISOLATED FORM;Lo;0;R;<isolated> 069A;;;;N;;;;;
+E639;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE FINAL FORM;Lo;0;R;<final> 069A;;;;N;;;;;
+E63A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE INITIAL FORM;Lo;0;R;<initial> 069A;;;;N;;;;;
+E63B;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE MEDIAL FORM;Lo;0;R;<medial> 069A;;;;N;;;;;
+E63C;ARABIC LETTER SEEN WITH THREE DOTS BELOW ISOLATED FORM;Lo;0;R;<isolated> 069B;;;;N;;;;;
+E63D;ARABIC LETTER SEEN WITH THREE DOTS BELOW FINAL FORM;Lo;0;R;<final> 069B;;;;N;;;;;
+E63E;ARABIC LETTER SEEN WITH THREE DOTS BELOW INITIAL FORM;Lo;0;R;<initial> 069B;;;;N;;;;;
+E63F;ARABIC LETTER SEEN WITH THREE DOTS BELOW MEDIAL FORM;Lo;0;R;<medial> 069B;;;;N;;;;;
+E640;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 069C;;;;N;;;;;
+E641;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 069C;;;;N;;;;;
+E642;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 069C;;;;N;;;;;
+E643;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 069C;;;;N;;;;;
+E644;ARABIC LETTER SAD WITH TWO DOTS BELOW ISOLATED FORM;Lo;0;R;<isolated> 069D;;;;N;;;;;
+E645;ARABIC LETTER SAD WITH TWO DOTS BELOW FINAL FORM;Lo;0;R;<final> 069D;;;;N;;;;;
+E646;ARABIC LETTER SAD WITH TWO DOTS BELOW INITIAL FORM;Lo;0;R;<initial> 069D;;;;N;;;;;
+E647;ARABIC LETTER SAD WITH TWO DOTS BELOW MEDIAL FORM;Lo;0;R;<medial> 069D;;;;N;;;;;
+E648;ARABIC LETTER SAD WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 069E;;;;N;;;;;
+E649;ARABIC LETTER SAD WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 069E;;;;N;;;;;
+E64A;ARABIC LETTER SAD WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 069E;;;;N;;;;;
+E64B;ARABIC LETTER SAD WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 069E;;;;N;;;;;
+E64C;ARABIC LETTER TAH WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 069F;;;;N;;;;;
+E64D;ARABIC LETTER TAH WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 069F;;;;N;;;;;
+E64E;ARABIC LETTER TAH WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 069F;;;;N;;;;;
+E64F;ARABIC LETTER TAH WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 069F;;;;N;;;;;
+E650;ARABIC LETTER AIN WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06A0;;;;N;;;;;
+E651;ARABIC LETTER AIN WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 06A0;;;;N;;;;;
+E652;ARABIC LETTER AIN WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 06A0;;;;N;;;;;
+E653;ARABIC LETTER AIN WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 06A0;;;;N;;;;;
+E654;ARABIC LETTER DOTLESS FEH ISOLATED FORM;Lo;0;R;<isolated> 06A1;;;;N;;;;;
+E655;ARABIC LETTER DOTLESS FEH FINAL FORM;Lo;0;R;<final> 06A1;;;;N;;;;;
+E656;ARABIC LETTER DOTLESS FEH INITIAL FORM;Lo;0;R;<initial> 06A1;;;;N;;;;;
+E657;ARABIC LETTER DOTLESS FEH MEDIAL FORM;Lo;0;R;<medial> 06A1;;;;N;;;;;
+E658;ARABIC LETTER FEH WITH DOT MOVED BELOW ISOLATED FORM;Lo;0;R;<isolated> 06A2;;;;N;;;;;
+E659;ARABIC LETTER FEH WITH DOT MOVED BELOW FINAL FORM;Lo;0;R;<final> 06A2;;;;N;;;;;
+E65A;ARABIC LETTER FEH WITH DOT MOVED BELOW INITIAL FORM;Lo;0;R;<initial> 06A2;;;;N;;;;;
+E65B;ARABIC LETTER FEH WITH DOT MOVED BELOW MEDIAL FORM;Lo;0;R;<medial> 06A2;;;;N;;;;;
+E65C;ARABIC LETTER FEH WITH DOT BELOW ISOLATED FORM;Lo;0;R;<isolated> 06A3;;;;N;;;;;
+E65D;ARABIC LETTER FEH WITH DOT BELOW FINAL FORM;Lo;0;R;<final> 06A3;;;;N;;;;;
+E65E;ARABIC LETTER FEH WITH DOT BELOW INITIAL FORM;Lo;0;R;<initial> 06A3;;;;N;;;;;
+E65F;ARABIC LETTER FEH WITH DOT BELOW MEDIAL FORM;Lo;0;R;<medial> 06A3;;;;N;;;;;
+E660;ARABIC LETTER FEH WITH THREE DOTS BELOW ISOLATED FORM;Lo;0;R;<isolated> 06A5;;;;N;;;;;
+E661;ARABIC LETTER FEH WITH THREE DOTS BELOW FINAL FORM;Lo;0;R;<final> 06A5;;;;N;;;;;
+E662;ARABIC LETTER FEH WITH THREE DOTS BELOW INITIAL FORM;Lo;0;R;<initial> 06A5;;;;N;;;;;
+E663;ARABIC LETTER FEH WITH THREE DOTS BELOW MEDIAL FORM;Lo;0;R;<medial> 06A5;;;;N;;;;;
+E664;ARABIC LETTER QAF WITH DOT ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06A7;;;;N;;;;;
+E665;ARABIC LETTER QAF WITH DOT ABOVE FINAL FORM;Lo;0;R;<final> 06A7;;;;N;;;;;
+E666;ARABIC LETTER QAF WITH DOT ABOVE INITIAL FORM;Lo;0;R;<initial> 06A7;;;;N;;;;;
+E667;ARABIC LETTER QAF WITH DOT ABOVE MEDIAL FORM;Lo;0;R;<medial> 06A7;;;;N;;;;;
+E668;ARABIC LETTER QAF WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06A8;;;;N;;;;;
+E669;ARABIC LETTER QAF WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 06A8;;;;N;;;;;
+E66A;ARABIC LETTER QAF WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 06A8;;;;N;;;;;
+E66B;ARABIC LETTER QAF WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 06A8;;;;N;;;;;
+E66C;ARABIC LETTER SWASH KAF ISOLATED FORM;Lo;0;R;<isolated> 06AA;;;;N;;;;;
+E66D;ARABIC LETTER SWASH KAF FINAL FORM;Lo;0;R;<final> 06AA;;;;N;;;;;
+E66E;ARABIC LETTER SWASH KAF INITIAL FORM;Lo;0;R;<initial> 06AA;;;;N;;;;;
+E66F;ARABIC LETTER SWASH KAF MEDIAL FORM;Lo;0;R;<medial> 06AA;;;;N;;;;;
+E670;ARABIC LETTER KAF WITH RING ISOLATED FORM;Lo;0;R;<isolated> 06AB;;;;N;;;;;
+E671;ARABIC LETTER KAF WITH RING FINAL FORM;Lo;0;R;<final> 06AB;;;;N;;;;;
+E672;ARABIC LETTER KAF WITH RING INITIAL FORM;Lo;0;R;<initial> 06AB;;;;N;;;;;
+E673;ARABIC LETTER KAF WITH RING MEDIAL FORM;Lo;0;R;<medial> 06AB;;;;N;;;;;
+E674;ARABIC LETTER KAF WITH DOT ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06AC;;;;N;;;;;
+E675;ARABIC LETTER KAF WITH DOT ABOVE FINAL FORM;Lo;0;R;<final> 06AC;;;;N;;;;;
+E676;ARABIC LETTER KAF WITH DOT ABOVE INITIAL FORM;Lo;0;R;<initial> 06AC;;;;N;;;;;
+E677;ARABIC LETTER KAF WITH DOT ABOVE MEDIAL FORM;Lo;0;R;<medial> 06AC;;;;N;;;;;
+E678;ARABIC LETTER KAF WITH THREE DOTS BELOW ISOLATED FORM;Lo;0;R;<isolated> 06AE;;;;N;;;;;
+E679;ARABIC LETTER KAF WITH THREE DOTS BELOW FINAL FORM;Lo;0;R;<final> 06AE;;;;N;;;;;
+E67A;ARABIC LETTER KAF WITH THREE DOTS BELOW INITIAL FORM;Lo;0;R;<initial> 06AE;;;;N;;;;;
+E67B;ARABIC LETTER KAF WITH THREE DOTS BELOW MEDIAL FORM;Lo;0;R;<medial> 06AE;;;;N;;;;;
+E67C;ARABIC LETTER GAF WITH RING ISOLATED FORM;Lo;0;R;<isolated> 06B0;;;;N;;;;;
+E67D;ARABIC LETTER GAF WITH RING FINAL FORM;Lo;0;R;<final> 06B0;;;;N;;;;;
+E67E;ARABIC LETTER GAF WITH RING INITIAL FORM;Lo;0;R;<initial> 06B0;;;;N;;;;;
+E67F;ARABIC LETTER GAF WITH RING MEDIAL FORM;Lo;0;R;<medial> 06B0;;;;N;;;;;
+E680;ARABIC LETTER GAF WITH TWO DOTS BELOW ISOLATED FORM;Lo;0;R;<isolated> 06B2;;;;N;;;;;
+E681;ARABIC LETTER GAF WITH TWO DOTS BELOW FINAL FORM;Lo;0;R;<final> 06B2;;;;N;;;;;
+E682;ARABIC LETTER GAF WITH TWO DOTS BELOW INITIAL FORM;Lo;0;R;<initial> 06B2;;;;N;;;;;
+E683;ARABIC LETTER GAF WITH TWO DOTS BELOW MEDIAL FORM;Lo;0;R;<medial> 06B2;;;;N;;;;;
+E684;ARABIC LETTER GAF WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06B4;;;;N;;;;;
+E685;ARABIC LETTER GAF WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 06B4;;;;N;;;;;
+E686;ARABIC LETTER GAF WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 06B4;;;;N;;;;;
+E687;ARABIC LETTER GAF WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 06B4;;;;N;;;;;
+E688;ARABIC LETTER LAM WITH SMALL V ISOLATED FORM;Lo;0;R;<isolated> 06B5;;;;N;;;;;
+E689;ARABIC LETTER LAM WITH SMALL V FINAL FORM;Lo;0;R;<final> 06B5;;;;N;;;;;
+E68A;ARABIC LETTER LAM WITH SMALL V INITIAL FORM;Lo;0;R;<initial> 06B5;;;;N;;;;;
+E68B;ARABIC LETTER LAM WITH SMALL V MEDIAL FORM;Lo;0;R;<medial> 06B5;;;;N;;;;;
+E68C;ARABIC LETTER LAM WITH DOT ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06B6;;;;N;;;;;
+E68D;ARABIC LETTER LAM WITH DOT ABOVE FINAL FORM;Lo;0;R;<final> 06B6;;;;N;;;;;
+E68E;ARABIC LETTER LAM WITH DOT ABOVE INITIAL FORM;Lo;0;R;<initial> 06B6;;;;N;;;;;
+E68F;ARABIC LETTER LAM WITH DOT ABOVE MEDIAL FORM;Lo;0;R;<medial> 06B6;;;;N;;;;;
+E690;ARABIC LETTER LAM WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06B7;;;;N;;;;;
+E691;ARABIC LETTER LAM WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 06B7;;;;N;;;;;
+E692;ARABIC LETTER LAM WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 06B7;;;;N;;;;;
+E693;ARABIC LETTER LAM WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 06B7;;;;N;;;;;
+E694;ARABIC LETTER NOON WITH RING ISOLATED FORM;Lo;0;R;<isolated> 06BC;;;;N;;;;;
+E695;ARABIC LETTER NOON WITH RING FINAL FORM;Lo;0;R;<final> 06BC;;;;N;;;;;
+E696;ARABIC LETTER NOON WITH RING INITIAL FORM;Lo;0;R;<initial> 06BC;;;;N;;;;;
+E697;ARABIC LETTER NOON WITH RING MEDIAL FORM;Lo;0;R;<medial> 06BC;;;;N;;;;;
+E698;ARABIC LETTER NOON WITH THREE DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06BD;;;;N;;;;;
+E699;ARABIC LETTER NOON WITH THREE DOTS ABOVE FINAL FORM;Lo;0;R;<final> 06BD;;;;N;;;;;
+E69A;ARABIC LETTER NOON WITH THREE DOTS ABOVE INITIAL FORM;Lo;0;R;<initial> 06BD;;;;N;;;;;
+E69B;ARABIC LETTER NOON WITH THREE DOTS ABOVE MEDIAL FORM;Lo;0;R;<medial> 06BD;;;;N;;;;;
+E69C;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06C0;;;;N;;;;;
+E69D;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;R;<final> 06C0;;;;N;;;;;
+E69E;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06C2;;;;N;;;;;
+E69F;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE FINAL FORM;Lo;0;R;<final> 06C2;;;;N;;;;;
+E6A0;ARABIC LETTER TEH MARBUTA GOAL ISOLATED FORM;Lo;0;R;<isolated> 06C3;;;;N;;;;;
+E6A1;ARABIC LETTER TEH MARBUTA GOAL FINAL FORM;Lo;0;R;<final> 06C3;;;;N;;;;;
+E6A2;ARABIC LETTER WAW WITH RING ISOLATED FORM;Lo;0;R;<isolated> 06C4;;;;N;;;;;
+E6A3;ARABIC LETTER WAW WITH RING FINAL FORM;Lo;0;R;<final> 06C4;;;;N;;;;;
+E6A4;ARABIC LETTER WAW WITH TWO DOTS ABOVE ISOLATED FORM;Lo;0;R;<isolated> 06CA;;;;N;;;;;
+E6A5;ARABIC LETTER WAW WITH TWO DOTS ABOVE FINAL FORM;Lo;0;R;<final> 06CA;;;;N;;;;;
+E6A6;ARABIC LETTER YEH WITH TAIL ISOLATED FORM;Lo;0;R;<isolated> 06CD;;;;N;;;;;
+E6A7;ARABIC LETTER YEH WITH TAIL FINAL FORM;Lo;0;R;<final> 06CD;;;;N;;;;;
+E6A8;ARABIC LETTER YEH WITH SMALL V ISOLATED FORM;Lo;0;R;<isolated> 06CE;;;;N;;;;;
+E6A9;ARABIC LETTER YEH WITH SMALL V FINAL FORM;Lo;0;R;<final> 06CE;;;;N;;;;;
+E6AA;ARABIC LETTER YEH WITH SMALL V INITIAL FORM;Lo;0;R;<initial> 06CE;;;;N;;;;;
+E6AB;ARABIC LETTER YEH WITH SMALL V MEDIAL FORM;Lo;0;R;<medial> 06CE;;;;N;;;;;
+E6AC;ARABIC LETTER YEH WITH THREE DOTS BELOW ISOLATED FORM;Lo;0;R;<isolated> 06D1;;;;N;;;;;
+E6AD;ARABIC LETTER YEH WITH THREE DOTS BELOW FINAL FORM;Lo;0;R;<final> 06D1;;;;N;;;;;
+E6AE;ARABIC LETTER YEH WITH THREE DOTS BELOW INITIAL FORM;Lo;0;R;<initial> 06D1;;;;N;;;;;
+E6AF;ARABIC LETTER YEH WITH THREE DOTS BELOW MEDIAL FORM;Lo;0;R;<medial> 06D1;;;;N;;;;;
+E6B0;ARABIC LETTER NOON GHUNNA INITIAL FORM;Lo,C;0;R;<initial> 06BA;;;;N;;;;;
+E6B1;ARABIC LETTER NOON GHUNNA MEDIAL FORM;Lo,C;0;R;<medial> 06BA;;;;N;;;;;
+E6B2;ARABIC LETTER U WITH HAMZA ABOVE FINAL FORM;Lo,C;0;R;<join> 0677 <no-join>;;;;N;;;;;
+E6D0;ARABIC LIGATURE LAM SMALL V WITH ALEF ISOLATED FORM;Lo,C;0;R;<no-join> 06B5 0627 <no-join>;;;;N;;;;;
+E6D1;ARABIC LIGATURE LAM SMALL V WITH ALEF ISOLATED FORM;Lo,C;0;R;<join> 06B5 0627 <no-join>;;;;N;;;;;
+E6D2;ARABIC LIGATURE LAM DOT ABOVE WITH ALEF ISOLATED FORM;Lo,C;0;R;<no-join> 06B6 0627 <no-join>;;;;N;;;;;
+E6D3;ARABIC LIGATURE LAM DOT ABOVE WITH ALEF FINAL FORM;Lo,C;0;R;<join> 06B6 0627 <no-join>;;;;N;;;;;
+E6D4;ARABIC LIGATURE LAM THREE DOTS ABOVE WITH ALEF ISOLATED FORM;Lo,C;0;R;<no-join> 06B7 0627 <no-join>;;;;N;;;;;
+E6D5;ARABIC LIGATURE LAM THREE DOTS ABOVE WITH ALEF FINAL FORM;Lo,C;0;R;<join> 06B7 0627 <no-join>;;;;N;;;;;
+E6F0;RIAL SIGN;Sc;0;ET;;;;;N;;;;;
+E6F4;EXTENDED URDU-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;;
diff --git a/xc/extras/regex/COPYRIGHT b/xc/extras/regex/COPYRIGHT
new file mode 100644
index 000000000..30c1f7a48
--- /dev/null
+++ b/xc/extras/regex/COPYRIGHT
@@ -0,0 +1,20 @@
+Copyright 1992, 1993, 1994, 1997 Henry Spencer. All rights reserved.
+This software is not subject to any license of the American Telephone
+and Telegraph Company or of the Regents of the University of California.
+
+Permission is granted to anyone to use this software for any purpose on
+any computer system, and to alter it and redistribute it, subject
+to the following restrictions:
+
+1. The author is not responsible for the consequences of use of this
+ software, no matter how awful, even if they arise from flaws in it.
+
+2. The origin of this software must not be misrepresented, either by
+ explicit claim or by omission. Since few users ever read sources,
+ credits must appear in the documentation.
+
+3. Altered versions must be plainly marked as such, and must not be
+ misrepresented as being the original software. Since few users
+ ever read sources, credits must appear in the documentation.
+
+4. This notice may not be removed or altered.
diff --git a/xc/extras/regex/Makefile b/xc/extras/regex/Makefile
new file mode 100644
index 000000000..3882b3786
--- /dev/null
+++ b/xc/extras/regex/Makefile
@@ -0,0 +1,130 @@
+# You probably want to take -DREDEBUG out of CFLAGS, and put something like
+# -O in, *after* testing (-DREDEBUG strengthens testing by enabling a lot of
+# internal assertion checking and some debugging facilities).
+# Put -Dconst= in for a pre-ANSI compiler.
+# Do not take -DPOSIX_MISTAKE out.
+# REGCFLAGS isn't important to you (it's for my use in some special contexts).
+CFLAGS=-I. -DPOSIX_MISTAKE -DREDEBUG $(REGCFLAGS)
+
+# If you have a pre-ANSI compiler, put -o into MKHFLAGS. If you want
+# the Berkeley __P macro, put -b in.
+MKHFLAGS=
+
+# Flags for linking but not compiling, if any.
+LDFLAGS=
+
+# Extra libraries for linking, if any.
+LIBS=
+
+# Internal stuff, should not need changing.
+OBJPRODN=regcomp.o regexec.o regerror.o regfree.o
+OBJS=$(OBJPRODN) split.o debug.o main.o
+H=cclass.h cname.h regex2.h utils.h
+REGSRC=regcomp.c regerror.c regexec.c regfree.c
+ALLSRC=$(REGSRC) engine.c debug.c main.c split.c
+
+# Stuff that matters only if you're trying to lint the package.
+LINTFLAGS=-I. -Dstatic= -Dconst= -DREDEBUG
+LINTC=regcomp.c regexec.c regerror.c regfree.c debug.c main.c
+JUNKLINT=possible pointer alignment|null effect
+
+# arrangements to build forward-reference header files
+.SUFFIXES: .ih .h
+.c.ih:
+ sh ./mkh $(MKHFLAGS) -p $< >$@
+
+default: r
+
+lib: purge $(OBJPRODN)
+ rm -f libregex.a
+ ar crv libregex.a $(OBJPRODN)
+
+purge:
+ rm -f *.o
+
+# stuff to build regex.h
+REGEXH=regex.h
+REGEXHSRC=regex2.h $(REGSRC)
+$(REGEXH): $(REGEXHSRC) mkh
+ sh ./mkh $(MKHFLAGS) -i _REGEX_H_ $(REGEXHSRC) >regex.tmp
+ cmp -s regex.tmp regex.h 2>/dev/null || cp regex.tmp regex.h
+ rm -f regex.tmp
+
+# dependencies
+$(OBJPRODN) debug.o: utils.h regex.h regex2.h
+regcomp.o: cclass.h cname.h regcomp.ih
+regexec.o: engine.c engine.ih
+regerror.o: regerror.ih
+debug.o: debug.ih
+main.o: main.ih
+
+# tester
+re: $(OBJS)
+ $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@
+
+# regression test
+r: re tests
+ ./re <tests
+ ./re -el <tests
+ ./re -er <tests
+
+# 57 variants, and other stuff, for development use -- not useful to you
+ra: ./re tests
+ -./re <tests
+ -./re -el <tests
+ -./re -er <tests
+
+rx: ./re tests
+ ./re -x <tests
+ ./re -x -el <tests
+ ./re -x -er <tests
+
+t: ./re tests
+ -time ./re <tests
+ -time ./re -cs <tests
+ -time ./re -el <tests
+ -time ./re -cs -el <tests
+
+l: $(LINTC)
+ lint $(LINTFLAGS) -h $(LINTC) 2>&1 | egrep -v '$(JUNKLINT)' | tee lint
+
+fullprint:
+ ti README WHATSNEW notes todo | list
+ ti *.h | list
+ list *.c
+ list regex.3 regex.7
+
+print:
+ ti README WHATSNEW notes todo | list
+ ti *.h | list
+ list reg*.c engine.c
+
+
+mf.tmp: Makefile
+ sed '/^REGEXH=/s/=.*/=regex.h/' Makefile | sed '/#DEL$$/d' >$@
+
+DTRH=cclass.h cname.h regex2.h utils.h
+PRE=COPYRIGHT README WHATSNEW
+POST=mkh regex.3 regex.7 tests $(DTRH) $(ALLSRC) fake/*.[ch]
+FILES=$(PRE) Makefile $(POST)
+DTR=$(PRE) Makefile=mf.tmp $(POST)
+dtr: $(FILES) mf.tmp
+ makedtr $(DTR) >$@
+ rm mf.tmp
+
+cio: $(FILES)
+ cio $(FILES)
+
+rdf: $(FILES)
+ rcsdiff -c $(FILES) 2>&1 | p
+
+# various forms of cleanup
+tidy:
+ rm -f junk* core core.* *.core dtr *.tmp lint
+
+clean: tidy
+ rm -f *.o *.s *.ih re libregex.a
+
+# don't do this one unless you know what you're doing
+spotless: clean
+ rm -f mkh regex.h
diff --git a/xc/extras/regex/README b/xc/extras/regex/README
new file mode 100644
index 000000000..5f5a7abc4
--- /dev/null
+++ b/xc/extras/regex/README
@@ -0,0 +1,32 @@
+alpha3.7 release.
+Fri Nov 21 13:25:21 EST 1997
+henry@zoo.toronto.edu
+
+See WHATSNEW for change listing.
+
+installation notes:
+--------
+Read the comments at the beginning of Makefile before running.
+
+Utils.h contains some things that just might have to be modified on
+some systems, as well as a nested include (ugh) of <assert.h>.
+
+The "fake" directory contains quick-and-dirty fakes for some header
+files and routines that old systems may not have. Note also that
+-DUSEBCOPY will make utils.h substitute bcopy() for memmove().
+
+After that, "make r" will build regcomp.o, regexec.o, regfree.o,
+and regerror.o (the actual routines), bundle them together into a test
+program, and run regression tests on them. No output is good output.
+
+"make lib" builds just the .o files for the actual routines (when
+you're happy with testing and have adjusted CFLAGS for production),
+and puts them together into libregex.a. You can pick up either the
+library or *.o ("make lib" makes sure there are no other .o files left
+around to confuse things).
+
+Main.c, debug.c, split.c are used for regression testing but are not part
+of the RE routines themselves.
+
+Regex.h goes in /usr/include. All other .h files are internal only.
+--------
diff --git a/xc/extras/regex/WHATSNEW b/xc/extras/regex/WHATSNEW
new file mode 100644
index 000000000..d84f9e34d
--- /dev/null
+++ b/xc/extras/regex/WHATSNEW
@@ -0,0 +1,105 @@
+New in alpha3.7: A bit of cleanup aimed at maximizing portability,
+possibly at slight cost in efficiency. "ul" suffixes and "unsigned long"
+no longer appear, in particular.
+
+New in alpha3.6: A couple more portability glitches fixed.
+
+New in alpha3.5: Active development of this code has been stopped --
+I'm working on a complete reimplementation -- but folks have found some
+minor portability glitches and the like, hence this release to fix them.
+One penalty: slightly reduced compatibility with old compilers, because
+the ANSI C `unsigned long' type and `ul' constant suffix are used in a
+few places (I could avoid this but it would be considerably more work).
+
+New in alpha3.4: The complex bug alluded to below has been fixed (in a
+slightly kludgey temporary way that may hurt efficiency a bit; this is
+another "get it out the door for 4.4" release). The tests at the end of
+the tests file have accordingly been uncommented. The primary sign of
+the bug was that something like a?b matching ab matched b rather than ab.
+(The bug was essentially specific to this exact situation, else it would
+have shown up earlier.)
+
+New in alpha3.3: The definition of word boundaries has been altered
+slightly, to more closely match the usual programming notion that "_"
+is an alphabetic. Stuff used for pre-ANSI systems is now in a subdir,
+and the makefile no longer alludes to it in mysterious ways. The
+makefile has generally been cleaned up some. Fixes have been made
+(again!) so that the regression test will run without -DREDEBUG, at
+the cost of weaker checking. A workaround for a bug in some folks'
+<assert.h> has been added. And some more things have been added to
+tests, including a couple right at the end which are commented out
+because the code currently flunks them (complex bug; fix coming).
+Plus the usual minor cleanup.
+
+New in alpha3.2: Assorted bits of cleanup and portability improvement
+(the development base is now a BSDI system using GCC instead of an ancient
+Sun system, and the newer compiler exposed some glitches). Fix for a
+serious bug that affected REs using many [] (including REG_ICASE REs
+because of the way they are implemented), *sometimes*, depending on
+memory-allocation patterns. The header-file prototypes no longer name
+the parameters, avoiding possible name conflicts. The possibility that
+some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is
+now handled gracefully. "uchar" is no longer used as an internal type
+name (too many people have the same idea). Still the same old lousy
+performance, alas.
+
+New in alpha3.1: Basically nothing, this release is just a bookkeeping
+convenience. Stay tuned.
+
+New in alpha3.0: Performance is no better, alas, but some fixes have been
+made and some functionality has been added. (This is basically the "get
+it out the door in time for 4.4" release.) One bug fix: regfree() didn't
+free the main internal structure (how embarrassing). It is now possible
+to put NULs in either the RE or the target string, using (resp.) a new
+REG_PEND flag and the old REG_STARTEND flag. The REG_NOSPEC flag to
+regcomp() makes all characters ordinary, so you can match a literal
+string easily (this will become more useful when performance improves!).
+There are now primitives to match beginnings and ends of words, although
+the syntax is disgusting and so is the implementation. The REG_ATOI
+debugging interface has changed a bit. And there has been considerable
+internal cleanup of various kinds.
+
+New in alpha2.3: Split change list out of README, and moved flags notes
+into Makefile. Macro-ized the name of regex(7) in regex(3), since it has
+to change for 4.4BSD. Cleanup work in engine.c, and some new regression
+tests to catch tricky cases thereof.
+
+New in alpha2.2: Out-of-date manpages updated. Regerror() acquires two
+small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges
+in my own test program and might be useful to others for similar purposes.
+The regression test will now compile (and run) without REDEBUG. The
+BRE \$ bug is fixed. Most uses of "uchar" are gone; it's all chars now.
+Char/uchar parameters are now written int/unsigned, to avoid possible
+portability problems with unpromoted parameters. Some unsigned casts have
+been introduced to minimize portability problems with shifting into sign
+bits.
+
+New in alpha2.1: Lots of little stuff, cleanup and fixes. The one big
+thing is that regex.h is now generated, using mkh, rather than being
+supplied in the distribution; due to circularities in dependencies,
+you have to build regex.h explicitly by "make h". The two known bugs
+have been fixed (and the regression test now checks for them), as has a
+problem with assertions not being suppressed in the absence of REDEBUG.
+No performance work yet.
+
+New in alpha2: Backslash-anything is an ordinary character, not an
+error (except, of course, for the handful of backslashed metacharacters
+in BREs), which should reduce script breakage. The regression test
+checks *where* null strings are supposed to match, and has generally
+been tightened up somewhat. Small bug fixes in parameter passing (not
+harmful, but technically errors) and some other areas. Debugging
+invoked by defining REDEBUG rather than not defining NDEBUG.
+
+New in alpha+3: full prototyping for internal routines, using a little
+helper program, mkh, which extracts prototypes given in stylized comments.
+More minor cleanup. Buglet fix: it's CHAR_BIT, not CHAR_BITS. Simple
+pre-screening of input when a literal string is known to be part of the
+RE; this does wonders for performance.
+
+New in alpha+2: minor bits of cleanup. Notably, the number "32" for the
+word width isn't hardwired into regexec.c any more, the public header
+file prototypes the functions if __STDC__ is defined, and some small typos
+in the manpages have been fixed.
+
+New in alpha+1: improvements to the manual pages, and an important
+extension, the REG_STARTEND option to regexec().
diff --git a/xc/extras/regex/cclass.h b/xc/extras/regex/cclass.h
new file mode 100644
index 000000000..0c293028e
--- /dev/null
+++ b/xc/extras/regex/cclass.h
@@ -0,0 +1,31 @@
+/* character-class table */
+static struct cclass {
+ char *name;
+ char *chars;
+ char *multis;
+} cclasses[] = {
+ "alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789", "",
+ "alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
+ "",
+ "blank", " \t", "",
+ "cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
+\25\26\27\30\31\32\33\34\35\36\37\177", "",
+ "digit", "0123456789", "",
+ "graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+ "",
+ "lower", "abcdefghijklmnopqrstuvwxyz",
+ "",
+ "print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
+0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
+ "",
+ "punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
+ "",
+ "space", "\t\n\v\f\r ", "",
+ "upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+ "",
+ "xdigit", "0123456789ABCDEFabcdef",
+ "",
+ NULL, 0, ""
+};
diff --git a/xc/extras/regex/cname.h b/xc/extras/regex/cname.h
new file mode 100644
index 000000000..02e86e912
--- /dev/null
+++ b/xc/extras/regex/cname.h
@@ -0,0 +1,102 @@
+/* character-name table */
+static struct cname {
+ char *name;
+ char code;
+} cnames[] = {
+ "NUL", '\0',
+ "SOH", '\001',
+ "STX", '\002',
+ "ETX", '\003',
+ "EOT", '\004',
+ "ENQ", '\005',
+ "ACK", '\006',
+ "BEL", '\007',
+ "alert", '\007',
+ "BS", '\010',
+ "backspace", '\b',
+ "HT", '\011',
+ "tab", '\t',
+ "LF", '\012',
+ "newline", '\n',
+ "VT", '\013',
+ "vertical-tab", '\v',
+ "FF", '\014',
+ "form-feed", '\f',
+ "CR", '\015',
+ "carriage-return", '\r',
+ "SO", '\016',
+ "SI", '\017',
+ "DLE", '\020',
+ "DC1", '\021',
+ "DC2", '\022',
+ "DC3", '\023',
+ "DC4", '\024',
+ "NAK", '\025',
+ "SYN", '\026',
+ "ETB", '\027',
+ "CAN", '\030',
+ "EM", '\031',
+ "SUB", '\032',
+ "ESC", '\033',
+ "IS4", '\034',
+ "FS", '\034',
+ "IS3", '\035',
+ "GS", '\035',
+ "IS2", '\036',
+ "RS", '\036',
+ "IS1", '\037',
+ "US", '\037',
+ "space", ' ',
+ "exclamation-mark", '!',
+ "quotation-mark", '"',
+ "number-sign", '#',
+ "dollar-sign", '$',
+ "percent-sign", '%',
+ "ampersand", '&',
+ "apostrophe", '\'',
+ "left-parenthesis", '(',
+ "right-parenthesis", ')',
+ "asterisk", '*',
+ "plus-sign", '+',
+ "comma", ',',
+ "hyphen", '-',
+ "hyphen-minus", '-',
+ "period", '.',
+ "full-stop", '.',
+ "slash", '/',
+ "solidus", '/',
+ "zero", '0',
+ "one", '1',
+ "two", '2',
+ "three", '3',
+ "four", '4',
+ "five", '5',
+ "six", '6',
+ "seven", '7',
+ "eight", '8',
+ "nine", '9',
+ "colon", ':',
+ "semicolon", ';',
+ "less-than-sign", '<',
+ "equals-sign", '=',
+ "greater-than-sign", '>',
+ "question-mark", '?',
+ "commercial-at", '@',
+ "left-square-bracket", '[',
+ "backslash", '\\',
+ "reverse-solidus", '\\',
+ "right-square-bracket", ']',
+ "circumflex", '^',
+ "circumflex-accent", '^',
+ "underscore", '_',
+ "low-line", '_',
+ "grave-accent", '`',
+ "left-brace", '{',
+ "left-curly-bracket", '{',
+ "vertical-line", '|',
+ "right-brace", '}',
+ "right-curly-bracket", '}',
+ "tilde", '~',
+ "DEL", '\177',
+ NULL, 0,
+};
diff --git a/xc/extras/regex/debug.c b/xc/extras/regex/debug.c
new file mode 100644
index 000000000..99ce7da6d
--- /dev/null
+++ b/xc/extras/regex/debug.c
@@ -0,0 +1,242 @@
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+#include "debug.ih"
+
+/*
+ - regprint - print a regexp for debugging
+ == void regprint(regex_t *r, FILE *d);
+ */
+void
+regprint(r, d)
+regex_t *r;
+FILE *d;
+{
+ register struct re_guts *g = r->re_g;
+ register int i;
+ register int c;
+ register int last;
+ int nincat[NC];
+
+ fprintf(d, "%ld states, %d categories", (long)g->nstates,
+ g->ncategories);
+ fprintf(d, ", first %ld last %ld", (long)g->firststate,
+ (long)g->laststate);
+ if (g->iflags&USEBOL)
+ fprintf(d, ", USEBOL");
+ if (g->iflags&USEEOL)
+ fprintf(d, ", USEEOL");
+ if (g->iflags&BAD)
+ fprintf(d, ", BAD");
+ if (g->nsub > 0)
+ fprintf(d, ", nsub=%ld", (long)g->nsub);
+ if (g->must != NULL)
+ fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen,
+ g->must);
+ if (g->backrefs)
+ fprintf(d, ", backrefs");
+ if (g->nplus > 0)
+ fprintf(d, ", nplus %ld", (long)g->nplus);
+ fprintf(d, "\n");
+ s_print(g, d);
+ for (i = 0; i < g->ncategories; i++) {
+ nincat[i] = 0;
+ for (c = CHAR_MIN; c <= CHAR_MAX; c++)
+ if (g->categories[c] == i)
+ nincat[i]++;
+ }
+ fprintf(d, "cc0#%d", nincat[0]);
+ for (i = 1; i < g->ncategories; i++)
+ if (nincat[i] == 1) {
+ for (c = CHAR_MIN; c <= CHAR_MAX; c++)
+ if (g->categories[c] == i)
+ break;
+ fprintf(d, ", %d=%s", i, regchar(c));
+ }
+ fprintf(d, "\n");
+ for (i = 1; i < g->ncategories; i++)
+ if (nincat[i] != 1) {
+ fprintf(d, "cc%d\t", i);
+ last = -1;
+ for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */
+ if (c <= CHAR_MAX && g->categories[c] == i) {
+ if (last < 0) {
+ fprintf(d, "%s", regchar(c));
+ last = c;
+ }
+ } else {
+ if (last >= 0) {
+ if (last != c-1)
+ fprintf(d, "-%s",
+ regchar(c-1));
+ last = -1;
+ }
+ }
+ fprintf(d, "\n");
+ }
+}
+
+/*
+ - s_print - print the strip for debugging
+ == static void s_print(register struct re_guts *g, FILE *d);
+ */
+static void
+s_print(g, d)
+register struct re_guts *g;
+FILE *d;
+{
+ register sop *s;
+ register cset *cs;
+ register int i;
+ register int done = 0;
+ register sop opnd;
+ register int col = 0;
+ register int last;
+ register sopno offset = 2;
+# define GAP() { if (offset % 5 == 0) { \
+ if (col > 40) { \
+ fprintf(d, "\n\t"); \
+ col = 0; \
+ } else { \
+ fprintf(d, " "); \
+ col++; \
+ } \
+ } else \
+ col++; \
+ offset++; \
+ }
+
+ if (OP(g->strip[0]) != OEND)
+ fprintf(d, "missing initial OEND!\n");
+ for (s = &g->strip[1]; !done; s++) {
+ opnd = OPND(*s);
+ switch (OP(*s)) {
+ case OEND:
+ fprintf(d, "\n");
+ done = 1;
+ break;
+ case OCHAR:
+ if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL)
+ fprintf(d, "\\%c", (char)opnd);
+ else
+ fprintf(d, "%s", regchar((char)opnd));
+ break;
+ case OBOL:
+ fprintf(d, "^");
+ break;
+ case OEOL:
+ fprintf(d, "$");
+ break;
+ case OBOW:
+ fprintf(d, "\\{");
+ break;
+ case OEOW:
+ fprintf(d, "\\}");
+ break;
+ case OANY:
+ fprintf(d, ".");
+ break;
+ case OANYOF:
+ fprintf(d, "[(%ld)", (long)opnd);
+ cs = &g->sets[opnd];
+ last = -1;
+ for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */
+ if (CHIN(cs, i) && i < g->csetsize) {
+ if (last < 0) {
+ fprintf(d, "%s", regchar(i));
+ last = i;
+ }
+ } else {
+ if (last >= 0) {
+ if (last != i-1)
+ fprintf(d, "-%s",
+ regchar(i-1));
+ last = -1;
+ }
+ }
+ fprintf(d, "]");
+ break;
+ case OBACK_:
+ fprintf(d, "(\\<%ld>", (long)opnd);
+ break;
+ case O_BACK:
+ fprintf(d, "<%ld>\\)", (long)opnd);
+ break;
+ case OPLUS_:
+ fprintf(d, "(+");
+ if (OP(*(s+opnd)) != O_PLUS)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case O_PLUS:
+ if (OP(*(s-opnd)) != OPLUS_)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, "+)");
+ break;
+ case OQUEST_:
+ fprintf(d, "(?");
+ if (OP(*(s+opnd)) != O_QUEST)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case O_QUEST:
+ if (OP(*(s-opnd)) != OQUEST_)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, "?)");
+ break;
+ case OLPAREN:
+ fprintf(d, "((<%ld>", (long)opnd);
+ break;
+ case ORPAREN:
+ fprintf(d, "<%ld>))", (long)opnd);
+ break;
+ case OCH_:
+ fprintf(d, "<");
+ if (OP(*(s+opnd)) != OOR2)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case OOR1:
+ if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, "|");
+ break;
+ case OOR2:
+ fprintf(d, "|");
+ if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH)
+ fprintf(d, "<%ld>", (long)opnd);
+ break;
+ case O_CH:
+ if (OP(*(s-opnd)) != OOR1)
+ fprintf(d, "<%ld>", (long)opnd);
+ fprintf(d, ">");
+ break;
+ default:
+ fprintf(d, "!%d(%d)!", OP(*s), opnd);
+ break;
+ }
+ if (!done)
+ GAP();
+ }
+}
+
+/*
+ - regchar - make a character printable
+ == static char *regchar(int ch);
+ */
+static char * /* -> representation */
+regchar(ch)
+int ch;
+{
+ static char buf[10];
+
+ if (isprint(ch) || ch == ' ')
+ sprintf(buf, "%c", ch);
+ else
+ sprintf(buf, "\\%o", ch);
+ return(buf);
+}
diff --git a/xc/extras/regex/engine.c b/xc/extras/regex/engine.c
new file mode 100644
index 000000000..919fe3f64
--- /dev/null
+++ b/xc/extras/regex/engine.c
@@ -0,0 +1,1019 @@
+/*
+ * The matching engine and friends. This file is #included by regexec.c
+ * after suitable #defines of a variety of macros used herein, so that
+ * different state representations can be used without duplicating masses
+ * of code.
+ */
+
+#ifdef SNAMES
+#define matcher smatcher
+#define fast sfast
+#define slow sslow
+#define dissect sdissect
+#define backref sbackref
+#define step sstep
+#define print sprint
+#define at sat
+#define match smat
+#endif
+#ifdef LNAMES
+#define matcher lmatcher
+#define fast lfast
+#define slow lslow
+#define dissect ldissect
+#define backref lbackref
+#define step lstep
+#define print lprint
+#define at lat
+#define match lmat
+#endif
+
+/* another structure passed up and down to avoid zillions of parameters */
+struct match {
+ struct re_guts *g;
+ int eflags;
+ regmatch_t *pmatch; /* [nsub+1] (0 element unused) */
+ char *offp; /* offsets work from here */
+ char *beginp; /* start of string -- virtual NUL precedes */
+ char *endp; /* end of string -- virtual NUL here */
+ char *coldp; /* can be no match starting before here */
+ char **lastpos; /* [nplus+1] */
+ STATEVARS;
+ states st; /* current states */
+ states fresh; /* states for a fresh start */
+ states tmp; /* temporary */
+ states empty; /* empty set of states */
+};
+
+#include "engine.ih"
+
+#ifdef REDEBUG
+#define SP(t, s, c) print(m, t, s, c, stdout)
+#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2)
+#define NOTE(str) { if (m->eflags&REG_TRACE) printf("=%s\n", (str)); }
+#else
+#define SP(t, s, c) /* nothing */
+#define AT(t, p1, p2, s1, s2) /* nothing */
+#define NOTE(s) /* nothing */
+#endif
+
+/*
+ - matcher - the actual matching engine
+ == static int matcher(register struct re_guts *g, char *string, \
+ == size_t nmatch, regmatch_t pmatch[], int eflags);
+ */
+static int /* 0 success, REG_NOMATCH failure */
+matcher(g, string, nmatch, pmatch, eflags)
+register struct re_guts *g;
+char *string;
+size_t nmatch;
+regmatch_t pmatch[];
+int eflags;
+{
+ register char *endp;
+ register int i;
+ struct match mv;
+ register struct match *m = &mv;
+ register char *dp;
+ const register sopno gf = g->firststate+1; /* +1 for OEND */
+ const register sopno gl = g->laststate;
+ char *start;
+ char *stop;
+
+ /* simplify the situation where possible */
+ if (g->cflags&REG_NOSUB)
+ nmatch = 0;
+ if (eflags&REG_STARTEND) {
+ start = string + pmatch[0].rm_so;
+ stop = string + pmatch[0].rm_eo;
+ } else {
+ start = string;
+ stop = start + strlen(start);
+ }
+ if (stop < start)
+ return(REG_INVARG);
+
+ /* prescreening; this does wonders for this rather slow code */
+ if (g->must != NULL) {
+ for (dp = start; dp < stop; dp++)
+ if (*dp == g->must[0] && stop - dp >= g->mlen &&
+ memcmp(dp, g->must, (size_t)g->mlen) == 0)
+ break;
+ if (dp == stop) /* we didn't find g->must */
+ return(REG_NOMATCH);
+ }
+
+ /* match struct setup */
+ m->g = g;
+ m->eflags = eflags;
+ m->pmatch = NULL;
+ m->lastpos = NULL;
+ m->offp = string;
+ m->beginp = start;
+ m->endp = stop;
+ STATESETUP(m, 4);
+ SETUP(m->st);
+ SETUP(m->fresh);
+ SETUP(m->tmp);
+ SETUP(m->empty);
+ CLEAR(m->empty);
+
+ /* this loop does only one repetition except for backrefs */
+ for (;;) {
+ endp = fast(m, start, stop, gf, gl);
+ if (endp == NULL) { /* a miss */
+ STATETEARDOWN(m);
+ return(REG_NOMATCH);
+ }
+ if (nmatch == 0 && !g->backrefs)
+ break; /* no further info needed */
+
+ /* where? */
+ assert(m->coldp != NULL);
+ for (;;) {
+ NOTE("finding start");
+ endp = slow(m, m->coldp, stop, gf, gl);
+ if (endp != NULL)
+ break;
+ assert(m->coldp < m->endp);
+ m->coldp++;
+ }
+ if (nmatch == 1 && !g->backrefs)
+ break; /* no further info needed */
+
+ /* oh my, he wants the subexpressions... */
+ if (m->pmatch == NULL)
+ m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) *
+ sizeof(regmatch_t));
+ if (m->pmatch == NULL) {
+ STATETEARDOWN(m);
+ return(REG_ESPACE);
+ }
+ for (i = 1; i <= m->g->nsub; i++)
+ m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1;
+ if (!g->backrefs && !(m->eflags&REG_BACKR)) {
+ NOTE("dissecting");
+ dp = dissect(m, m->coldp, endp, gf, gl);
+ } else {
+ if (g->nplus > 0 && m->lastpos == NULL)
+ m->lastpos = (char **)malloc((g->nplus+1) *
+ sizeof(char *));
+ if (g->nplus > 0 && m->lastpos == NULL) {
+ free(m->pmatch);
+ STATETEARDOWN(m);
+ return(REG_ESPACE);
+ }
+ NOTE("backref dissect");
+ dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+ }
+ if (dp != NULL)
+ break;
+
+ /* uh-oh... we couldn't find a subexpression-level match */
+ assert(g->backrefs); /* must be back references doing it */
+ assert(g->nplus == 0 || m->lastpos != NULL);
+ for (;;) {
+ if (dp != NULL || endp <= m->coldp)
+ break; /* defeat */
+ NOTE("backoff");
+ endp = slow(m, m->coldp, endp-1, gf, gl);
+ if (endp == NULL)
+ break; /* defeat */
+ /* try it on a shorter possibility */
+#ifndef NDEBUG
+ for (i = 1; i <= m->g->nsub; i++) {
+ assert(m->pmatch[i].rm_so == -1);
+ assert(m->pmatch[i].rm_eo == -1);
+ }
+#endif
+ NOTE("backoff dissect");
+ dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
+ }
+ assert(dp == NULL || dp == endp);
+ if (dp != NULL) /* found a shorter one */
+ break;
+
+ /* despite initial appearances, there is no match here */
+ NOTE("false alarm");
+ start = m->coldp + 1; /* recycle starting later */
+ assert(start <= stop);
+ }
+
+ /* fill in the details if requested */
+ if (nmatch > 0) {
+ pmatch[0].rm_so = m->coldp - m->offp;
+ pmatch[0].rm_eo = endp - m->offp;
+ }
+ if (nmatch > 1) {
+ assert(m->pmatch != NULL);
+ for (i = 1; i < nmatch; i++)
+ if (i <= m->g->nsub)
+ pmatch[i] = m->pmatch[i];
+ else {
+ pmatch[i].rm_so = -1;
+ pmatch[i].rm_eo = -1;
+ }
+ }
+
+ if (m->pmatch != NULL)
+ free((char *)m->pmatch);
+ if (m->lastpos != NULL)
+ free((char *)m->lastpos);
+ STATETEARDOWN(m);
+ return(0);
+}
+
+/*
+ - dissect - figure out what matched what, no back references
+ == static char *dissect(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst);
+ */
+static char * /* == stop (success) always */
+dissect(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ register int i;
+ register sopno ss; /* start sop of current subRE */
+ register sopno es; /* end sop of current subRE */
+ register char *sp; /* start of string matched by it */
+ register char *stp; /* string matched by it cannot pass here */
+ register char *rest; /* start of rest of string */
+ register char *tail; /* string unmatched by rest of RE */
+ register sopno ssub; /* start sop of subsubRE */
+ register sopno esub; /* end sop of subsubRE */
+ register char *ssp; /* start of string matched by subsubRE */
+ register char *sep; /* end of string matched by subsubRE */
+ register char *oldssp; /* previous ssp */
+ register char *dp;
+
+ AT("diss", start, stop, startst, stopst);
+ sp = start;
+ for (ss = startst; ss < stopst; ss = es) {
+ /* identify end of subRE */
+ es = ss;
+ switch (OP(m->g->strip[es])) {
+ case OPLUS_:
+ case OQUEST_:
+ es += OPND(m->g->strip[es]);
+ break;
+ case OCH_:
+ while (OP(m->g->strip[es]) != O_CH)
+ es += OPND(m->g->strip[es]);
+ break;
+ }
+ es++;
+
+ /* figure out what it matched */
+ switch (OP(m->g->strip[ss])) {
+ case OEND:
+ assert(nope);
+ break;
+ case OCHAR:
+ sp++;
+ break;
+ case OBOL:
+ case OEOL:
+ case OBOW:
+ case OEOW:
+ break;
+ case OANY:
+ case OANYOF:
+ sp++;
+ break;
+ case OBACK_:
+ case O_BACK:
+ assert(nope);
+ break;
+ /* cases where length of match is hard to find */
+ case OQUEST_:
+ stp = stop;
+ for (;;) {
+ /* how long could this one be? */
+ rest = slow(m, sp, stp, ss, es);
+ assert(rest != NULL); /* it did match */
+ /* could the rest match the rest? */
+ tail = slow(m, rest, stop, es, stopst);
+ if (tail == stop)
+ break; /* yes! */
+ /* no -- try a shorter match for this one */
+ stp = rest - 1;
+ assert(stp >= sp); /* it did work */
+ }
+ ssub = ss + 1;
+ esub = es - 1;
+ /* did innards match? */
+ if (slow(m, sp, rest, ssub, esub) != NULL) {
+ dp = dissect(m, sp, rest, ssub, esub);
+ assert(dp == rest);
+ } else /* no */
+ assert(sp == rest);
+ sp = rest;
+ break;
+ case OPLUS_:
+ stp = stop;
+ for (;;) {
+ /* how long could this one be? */
+ rest = slow(m, sp, stp, ss, es);
+ assert(rest != NULL); /* it did match */
+ /* could the rest match the rest? */
+ tail = slow(m, rest, stop, es, stopst);
+ if (tail == stop)
+ break; /* yes! */
+ /* no -- try a shorter match for this one */
+ stp = rest - 1;
+ assert(stp >= sp); /* it did work */
+ }
+ ssub = ss + 1;
+ esub = es - 1;
+ ssp = sp;
+ oldssp = ssp;
+ for (;;) { /* find last match of innards */
+ sep = slow(m, ssp, rest, ssub, esub);
+ if (sep == NULL || sep == ssp)
+ break; /* failed or matched null */
+ oldssp = ssp; /* on to next try */
+ ssp = sep;
+ }
+ if (sep == NULL) {
+ /* last successful match */
+ sep = ssp;
+ ssp = oldssp;
+ }
+ assert(sep == rest); /* must exhaust substring */
+ assert(slow(m, ssp, sep, ssub, esub) == rest);
+ dp = dissect(m, ssp, sep, ssub, esub);
+ assert(dp == sep);
+ sp = rest;
+ break;
+ case OCH_:
+ stp = stop;
+ for (;;) {
+ /* how long could this one be? */
+ rest = slow(m, sp, stp, ss, es);
+ assert(rest != NULL); /* it did match */
+ /* could the rest match the rest? */
+ tail = slow(m, rest, stop, es, stopst);
+ if (tail == stop)
+ break; /* yes! */
+ /* no -- try a shorter match for this one */
+ stp = rest - 1;
+ assert(stp >= sp); /* it did work */
+ }
+ ssub = ss + 1;
+ esub = ss + OPND(m->g->strip[ss]) - 1;
+ assert(OP(m->g->strip[esub]) == OOR1);
+ for (;;) { /* find first matching branch */
+ if (slow(m, sp, rest, ssub, esub) == rest)
+ break; /* it matched all of it */
+ /* that one missed, try next one */
+ assert(OP(m->g->strip[esub]) == OOR1);
+ esub++;
+ assert(OP(m->g->strip[esub]) == OOR2);
+ ssub = esub + 1;
+ esub += OPND(m->g->strip[esub]);
+ if (OP(m->g->strip[esub]) == OOR2)
+ esub--;
+ else
+ assert(OP(m->g->strip[esub]) == O_CH);
+ }
+ dp = dissect(m, sp, rest, ssub, esub);
+ assert(dp == rest);
+ sp = rest;
+ break;
+ case O_PLUS:
+ case O_QUEST:
+ case OOR1:
+ case OOR2:
+ case O_CH:
+ assert(nope);
+ break;
+ case OLPAREN:
+ i = OPND(m->g->strip[ss]);
+ assert(0 < i && i <= m->g->nsub);
+ m->pmatch[i].rm_so = sp - m->offp;
+ break;
+ case ORPAREN:
+ i = OPND(m->g->strip[ss]);
+ assert(0 < i && i <= m->g->nsub);
+ m->pmatch[i].rm_eo = sp - m->offp;
+ break;
+ default: /* uh oh */
+ assert(nope);
+ break;
+ }
+ }
+
+ assert(sp == stop);
+ return(sp);
+}
+
+/*
+ - backref - figure out what matched what, figuring in back references
+ == static char *backref(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst, sopno lev);
+ */
+static char * /* == stop (success) or NULL (failure) */
+backref(m, start, stop, startst, stopst, lev)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+sopno lev; /* PLUS nesting level */
+{
+ register int i;
+ register sopno ss; /* start sop of current subRE */
+ register char *sp; /* start of string matched by it */
+ register sopno ssub; /* start sop of subsubRE */
+ register sopno esub; /* end sop of subsubRE */
+ register char *ssp; /* start of string matched by subsubRE */
+ register char *dp;
+ register size_t len;
+ register int hard;
+ register sop s;
+ register regoff_t offsave;
+ register cset *cs;
+
+ AT("back", start, stop, startst, stopst);
+ sp = start;
+
+ /* get as far as we can with easy stuff */
+ hard = 0;
+ for (ss = startst; !hard && ss < stopst; ss++)
+ switch (OP(s = m->g->strip[ss])) {
+ case OCHAR:
+ if (sp == stop || *sp++ != (char)OPND(s))
+ return(NULL);
+ break;
+ case OANY:
+ if (sp == stop)
+ return(NULL);
+ sp++;
+ break;
+ case OANYOF:
+ cs = &m->g->sets[OPND(s)];
+ if (sp == stop || !CHIN(cs, *sp++))
+ return(NULL);
+ break;
+ case OBOL:
+ if ( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+ (sp < m->endp && *(sp-1) == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case OEOL:
+ if ( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+ (sp < m->endp && *sp == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case OBOW:
+ if (( (sp == m->beginp && !(m->eflags&REG_NOTBOL)) ||
+ (sp < m->endp && *(sp-1) == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) ||
+ (sp > m->beginp &&
+ !ISWORD(*(sp-1))) ) &&
+ (sp < m->endp && ISWORD(*sp)) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case OEOW:
+ if (( (sp == m->endp && !(m->eflags&REG_NOTEOL)) ||
+ (sp < m->endp && *sp == '\n' &&
+ (m->g->cflags&REG_NEWLINE)) ||
+ (sp < m->endp && !ISWORD(*sp)) ) &&
+ (sp > m->beginp && ISWORD(*(sp-1))) )
+ { /* yes */ }
+ else
+ return(NULL);
+ break;
+ case O_QUEST:
+ break;
+ case OOR1: /* matches null but needs to skip */
+ ss++;
+ s = m->g->strip[ss];
+ do {
+ assert(OP(s) == OOR2);
+ ss += OPND(s);
+ } while (OP(s = m->g->strip[ss]) != O_CH);
+ /* note that the ss++ gets us past the O_CH */
+ break;
+ default: /* have to make a choice */
+ hard = 1;
+ break;
+ }
+ if (!hard) { /* that was it! */
+ if (sp != stop)
+ return(NULL);
+ return(sp);
+ }
+ ss--; /* adjust for the for's final increment */
+
+ /* the hard stuff */
+ AT("hard", sp, stop, ss, stopst);
+ s = m->g->strip[ss];
+ switch (OP(s)) {
+ case OBACK_: /* the vilest depths */
+ i = OPND(s);
+ assert(0 < i && i <= m->g->nsub);
+ if (m->pmatch[i].rm_eo == -1)
+ return(NULL);
+ assert(m->pmatch[i].rm_so != -1);
+ len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so;
+ assert(stop - m->beginp >= len);
+ if (sp > stop - len)
+ return(NULL); /* not enough left to match */
+ ssp = m->offp + m->pmatch[i].rm_so;
+ if (memcmp(sp, ssp, len) != 0)
+ return(NULL);
+ while (m->g->strip[ss] != SOP(O_BACK, i))
+ ss++;
+ return(backref(m, sp+len, stop, ss+1, stopst, lev));
+ break;
+ case OQUEST_: /* to null or not */
+ dp = backref(m, sp, stop, ss+1, stopst, lev);
+ if (dp != NULL)
+ return(dp); /* not */
+ return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev));
+ break;
+ case OPLUS_:
+ assert(m->lastpos != NULL);
+ assert(lev+1 <= m->g->nplus);
+ m->lastpos[lev+1] = sp;
+ return(backref(m, sp, stop, ss+1, stopst, lev+1));
+ break;
+ case O_PLUS:
+ if (sp == m->lastpos[lev]) /* last pass matched null */
+ return(backref(m, sp, stop, ss+1, stopst, lev-1));
+ /* try another pass */
+ m->lastpos[lev] = sp;
+ dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev);
+ if (dp == NULL)
+ return(backref(m, sp, stop, ss+1, stopst, lev-1));
+ else
+ return(dp);
+ break;
+ case OCH_: /* find the right one, if any */
+ ssub = ss + 1;
+ esub = ss + OPND(s) - 1;
+ assert(OP(m->g->strip[esub]) == OOR1);
+ for (;;) { /* find first matching branch */
+ dp = backref(m, sp, stop, ssub, esub, lev);
+ if (dp != NULL)
+ return(dp);
+ /* that one missed, try next one */
+ if (OP(m->g->strip[esub]) == O_CH)
+ return(NULL); /* there is none */
+ esub++;
+ assert(OP(m->g->strip[esub]) == OOR2);
+ ssub = esub + 1;
+ esub += OPND(m->g->strip[esub]);
+ if (OP(m->g->strip[esub]) == OOR2)
+ esub--;
+ else
+ assert(OP(m->g->strip[esub]) == O_CH);
+ }
+ break;
+ case OLPAREN: /* must undo assignment if rest fails */
+ i = OPND(s);
+ assert(0 < i && i <= m->g->nsub);
+ offsave = m->pmatch[i].rm_so;
+ m->pmatch[i].rm_so = sp - m->offp;
+ dp = backref(m, sp, stop, ss+1, stopst, lev);
+ if (dp != NULL)
+ return(dp);
+ m->pmatch[i].rm_so = offsave;
+ return(NULL);
+ break;
+ case ORPAREN: /* must undo assignment if rest fails */
+ i = OPND(s);
+ assert(0 < i && i <= m->g->nsub);
+ offsave = m->pmatch[i].rm_eo;
+ m->pmatch[i].rm_eo = sp - m->offp;
+ dp = backref(m, sp, stop, ss+1, stopst, lev);
+ if (dp != NULL)
+ return(dp);
+ m->pmatch[i].rm_eo = offsave;
+ return(NULL);
+ break;
+ default: /* uh oh */
+ assert(nope);
+ break;
+ }
+
+ /* "can't happen" */
+ assert(nope);
+ /* NOTREACHED */
+ return((char *)NULL); /* dummy */
+}
+
+/*
+ - fast - step through the string at top speed
+ == static char *fast(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst);
+ */
+static char * /* where tentative match ended, or NULL */
+fast(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ register states st = m->st;
+ register states fresh = m->fresh;
+ register states tmp = m->tmp;
+ register char *p = start;
+ register int c = (start == m->beginp) ? OUT : *(start-1);
+ register int lastc; /* previous c */
+ register int flagch;
+ register int i;
+ register char *coldp; /* last p after which no match was underway */
+
+ CLEAR(st);
+ SET1(st, startst);
+ st = step(m->g, startst, stopst, st, NOTHING, st);
+ ASSIGN(fresh, st);
+ SP("start", st, *p);
+ coldp = NULL;
+ for (;;) {
+ /* next character */
+ lastc = c;
+ c = (p == m->endp) ? OUT : *p;
+ if (EQ(st, fresh))
+ coldp = p;
+
+ /* is there an EOL and/or BOL between lastc and c? */
+ flagch = '\0';
+ i = 0;
+ if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+ flagch = BOL;
+ i = m->g->nbol;
+ }
+ if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+ flagch = (flagch == BOL) ? BOLEOL : EOL;
+ i += m->g->neol;
+ }
+ if (i != 0) {
+ for (; i > 0; i--)
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("boleol", st, c);
+ }
+
+ /* how about a word boundary? */
+ if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+ (c != OUT && ISWORD(c)) ) {
+ flagch = BOW;
+ }
+ if ( (lastc != OUT && ISWORD(lastc)) &&
+ (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+ flagch = EOW;
+ }
+ if (flagch == BOW || flagch == EOW) {
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("boweow", st, c);
+ }
+
+ /* are we done? */
+ if (ISSET(st, stopst) || p == stop)
+ break; /* NOTE BREAK OUT */
+
+ /* no, we must deal with this character */
+ ASSIGN(tmp, st);
+ ASSIGN(st, fresh);
+ assert(c != OUT);
+ st = step(m->g, startst, stopst, tmp, c, st);
+ SP("aft", st, c);
+ assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+ p++;
+ }
+
+ assert(coldp != NULL);
+ m->coldp = coldp;
+ if (ISSET(st, stopst))
+ return(p+1);
+ else
+ return(NULL);
+}
+
+/*
+ - slow - step through the string more deliberately
+ == static char *slow(register struct match *m, char *start, \
+ == char *stop, sopno startst, sopno stopst);
+ */
+static char * /* where it ended */
+slow(m, start, stop, startst, stopst)
+register struct match *m;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ register states st = m->st;
+ register states empty = m->empty;
+ register states tmp = m->tmp;
+ register char *p = start;
+ register int c = (start == m->beginp) ? OUT : *(start-1);
+ register int lastc; /* previous c */
+ register int flagch;
+ register int i;
+ register char *matchp; /* last p at which a match ended */
+
+ AT("slow", start, stop, startst, stopst);
+ CLEAR(st);
+ SET1(st, startst);
+ SP("sstart", st, *p);
+ st = step(m->g, startst, stopst, st, NOTHING, st);
+ matchp = NULL;
+ for (;;) {
+ /* next character */
+ lastc = c;
+ c = (p == m->endp) ? OUT : *p;
+
+ /* is there an EOL and/or BOL between lastc and c? */
+ flagch = '\0';
+ i = 0;
+ if ( (lastc == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (lastc == OUT && !(m->eflags&REG_NOTBOL)) ) {
+ flagch = BOL;
+ i = m->g->nbol;
+ }
+ if ( (c == '\n' && m->g->cflags&REG_NEWLINE) ||
+ (c == OUT && !(m->eflags&REG_NOTEOL)) ) {
+ flagch = (flagch == BOL) ? BOLEOL : EOL;
+ i += m->g->neol;
+ }
+ if (i != 0) {
+ for (; i > 0; i--)
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("sboleol", st, c);
+ }
+
+ /* how about a word boundary? */
+ if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
+ (c != OUT && ISWORD(c)) ) {
+ flagch = BOW;
+ }
+ if ( (lastc != OUT && ISWORD(lastc)) &&
+ (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
+ flagch = EOW;
+ }
+ if (flagch == BOW || flagch == EOW) {
+ st = step(m->g, startst, stopst, st, flagch, st);
+ SP("sboweow", st, c);
+ }
+
+ /* are we done? */
+ if (ISSET(st, stopst))
+ matchp = p;
+ if (EQ(st, empty) || p == stop)
+ break; /* NOTE BREAK OUT */
+
+ /* no, we must deal with this character */
+ ASSIGN(tmp, st);
+ ASSIGN(st, empty);
+ assert(c != OUT);
+ st = step(m->g, startst, stopst, tmp, c, st);
+ SP("saft", st, c);
+ assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
+ p++;
+ }
+
+ return(matchp);
+}
+
+
+/*
+ - step - map set of states reachable before char to set reachable after
+ == static states step(register struct re_guts *g, sopno start, sopno stop, \
+ == register states bef, int ch, register states aft);
+ == #define BOL (OUT+1)
+ == #define EOL (BOL+1)
+ == #define BOLEOL (BOL+2)
+ == #define NOTHING (BOL+3)
+ == #define BOW (BOL+4)
+ == #define EOW (BOL+5)
+ == #define CODEMAX (BOL+5) // highest code used
+ == #define NONCHAR(c) ((c) > CHAR_MAX)
+ == #define NNONCHAR (CODEMAX-CHAR_MAX)
+ */
+static states
+step(g, start, stop, bef, ch, aft)
+register struct re_guts *g;
+sopno start; /* start state within strip */
+sopno stop; /* state after stop state within strip */
+register states bef; /* states reachable before */
+int ch; /* character or NONCHAR code */
+register states aft; /* states already known reachable after */
+{
+ register cset *cs;
+ register sop s;
+ register sopno pc;
+ register onestate here; /* note, macros know this name */
+ register sopno look;
+ register long i;
+
+ for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) {
+ s = g->strip[pc];
+ switch (OP(s)) {
+ case OEND:
+ assert(pc == stop-1);
+ break;
+ case OCHAR:
+ /* only characters can match */
+ assert(!NONCHAR(ch) || ch != (char)OPND(s));
+ if (ch == (char)OPND(s))
+ FWD(aft, bef, 1);
+ break;
+ case OBOL:
+ if (ch == BOL || ch == BOLEOL)
+ FWD(aft, bef, 1);
+ break;
+ case OEOL:
+ if (ch == EOL || ch == BOLEOL)
+ FWD(aft, bef, 1);
+ break;
+ case OBOW:
+ if (ch == BOW)
+ FWD(aft, bef, 1);
+ break;
+ case OEOW:
+ if (ch == EOW)
+ FWD(aft, bef, 1);
+ break;
+ case OANY:
+ if (!NONCHAR(ch))
+ FWD(aft, bef, 1);
+ break;
+ case OANYOF:
+ cs = &g->sets[OPND(s)];
+ if (!NONCHAR(ch) && CHIN(cs, ch))
+ FWD(aft, bef, 1);
+ break;
+ case OBACK_: /* ignored here */
+ case O_BACK:
+ FWD(aft, aft, 1);
+ break;
+ case OPLUS_: /* forward, this is just an empty */
+ FWD(aft, aft, 1);
+ break;
+ case O_PLUS: /* both forward and back */
+ FWD(aft, aft, 1);
+ i = ISSETBACK(aft, OPND(s));
+ BACK(aft, aft, OPND(s));
+ if (!i && ISSETBACK(aft, OPND(s))) {
+ /* oho, must reconsider loop body */
+ pc -= OPND(s) + 1;
+ INIT(here, pc);
+ }
+ break;
+ case OQUEST_: /* two branches, both forward */
+ FWD(aft, aft, 1);
+ FWD(aft, aft, OPND(s));
+ break;
+ case O_QUEST: /* just an empty */
+ FWD(aft, aft, 1);
+ break;
+ case OLPAREN: /* not significant here */
+ case ORPAREN:
+ FWD(aft, aft, 1);
+ break;
+ case OCH_: /* mark the first two branches */
+ FWD(aft, aft, 1);
+ assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+ FWD(aft, aft, OPND(s));
+ break;
+ case OOR1: /* done a branch, find the O_CH */
+ if (ISSTATEIN(aft, here)) {
+ for (look = 1;
+ OP(s = g->strip[pc+look]) != O_CH;
+ look += OPND(s))
+ assert(OP(s) == OOR2);
+ FWD(aft, aft, look);
+ }
+ break;
+ case OOR2: /* propagate OCH_'s marking */
+ FWD(aft, aft, 1);
+ if (OP(g->strip[pc+OPND(s)]) != O_CH) {
+ assert(OP(g->strip[pc+OPND(s)]) == OOR2);
+ FWD(aft, aft, OPND(s));
+ }
+ break;
+ case O_CH: /* just empty */
+ FWD(aft, aft, 1);
+ break;
+ default: /* ooooops... */
+ assert(nope);
+ break;
+ }
+ }
+
+ return(aft);
+}
+
+#ifdef REDEBUG
+/*
+ - print - print a set of states
+ == #ifdef REDEBUG
+ == static void print(struct match *m, char *caption, states st, \
+ == int ch, FILE *d);
+ == #endif
+ */
+static void
+print(m, caption, st, ch, d)
+struct match *m;
+char *caption;
+states st;
+int ch;
+FILE *d;
+{
+ register struct re_guts *g = m->g;
+ register int i;
+ register int first = 1;
+
+ if (!(m->eflags&REG_TRACE))
+ return;
+
+ fprintf(d, "%s", caption);
+ if (ch != '\0')
+ fprintf(d, " %s", pchar(ch));
+ for (i = 0; i < g->nstates; i++)
+ if (ISSET(st, i)) {
+ fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
+ first = 0;
+ }
+ fprintf(d, "\n");
+}
+
+/*
+ - at - print current situation
+ == #ifdef REDEBUG
+ == static void at(struct match *m, char *title, char *start, char *stop, \
+ == sopno startst, sopno stopst);
+ == #endif
+ */
+static void
+at(m, title, start, stop, startst, stopst)
+struct match *m;
+char *title;
+char *start;
+char *stop;
+sopno startst;
+sopno stopst;
+{
+ if (!(m->eflags&REG_TRACE))
+ return;
+
+ printf("%s %s-", title, pchar(*start));
+ printf("%s ", pchar(*stop));
+ printf("%ld-%ld\n", (long)startst, (long)stopst);
+}
+
+#ifndef PCHARDONE
+#define PCHARDONE /* never again */
+/*
+ - pchar - make a character printable
+ == #ifdef REDEBUG
+ == static char *pchar(int ch);
+ == #endif
+ *
+ * Is this identical to regchar() over in debug.c? Well, yes. But a
+ * duplicate here avoids having a debugging-capable regexec.o tied to
+ * a matching debug.o, and this is convenient. It all disappears in
+ * the non-debug compilation anyway, so it doesn't matter much.
+ */
+static char * /* -> representation */
+pchar(ch)
+int ch;
+{
+ static char pbuf[10];
+
+ if (isprint(ch) || ch == ' ')
+ sprintf(pbuf, "%c", ch);
+ else
+ sprintf(pbuf, "\\%o", ch);
+ return(pbuf);
+}
+#endif
+#endif
+
+#undef matcher
+#undef fast
+#undef slow
+#undef dissect
+#undef backref
+#undef step
+#undef print
+#undef at
+#undef match
diff --git a/xc/extras/regex/main.c b/xc/extras/regex/main.c
new file mode 100644
index 000000000..0221e7713
--- /dev/null
+++ b/xc/extras/regex/main.c
@@ -0,0 +1,510 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <regex.h>
+#include <assert.h>
+
+#include "main.ih"
+
+char *progname;
+int debug = 0;
+int line = 0;
+int status = 0;
+
+int copts = REG_EXTENDED;
+int eopts = 0;
+regoff_t startoff = 0;
+regoff_t endoff = 0;
+
+
+extern int split();
+extern void regprint();
+
+/*
+ - main - do the simple case, hand off to regress() for regression
+ */
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ regex_t re;
+# define NS 10
+ regmatch_t subs[NS];
+ char erbuf[100];
+ int err;
+ size_t len;
+ int c;
+ int errflg = 0;
+ register int i;
+ extern int optind;
+ extern char *optarg;
+
+ progname = argv[0];
+
+ while ((c = getopt(argc, argv, "c:e:S:E:x")) != EOF)
+ switch (c) {
+ case 'c': /* compile options */
+ copts = options('c', optarg);
+ break;
+ case 'e': /* execute options */
+ eopts = options('e', optarg);
+ break;
+ case 'S': /* start offset */
+ startoff = (regoff_t)atoi(optarg);
+ break;
+ case 'E': /* end offset */
+ endoff = (regoff_t)atoi(optarg);
+ break;
+ case 'x': /* Debugging. */
+ debug++;
+ break;
+ case '?':
+ default:
+ errflg++;
+ break;
+ }
+ if (errflg) {
+ fprintf(stderr, "usage: %s ", progname);
+ fprintf(stderr, "[-c copt][-C][-d] [re]\n");
+ exit(2);
+ }
+
+ if (optind >= argc) {
+ regress(stdin);
+ exit(status);
+ }
+
+ err = regcomp(&re, argv[optind++], copts);
+ if (err) {
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "error %s, %d/%d `%s'\n",
+ eprint(err), len, sizeof(erbuf), erbuf);
+ exit(status);
+ }
+ regprint(&re, stdout);
+
+ if (optind >= argc) {
+ regfree(&re);
+ exit(status);
+ }
+
+ if (eopts&REG_STARTEND) {
+ subs[0].rm_so = startoff;
+ subs[0].rm_eo = strlen(argv[optind]) - endoff;
+ }
+ err = regexec(&re, argv[optind], (size_t)NS, subs, eopts);
+ if (err) {
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "error %s, %d/%d `%s'\n",
+ eprint(err), len, sizeof(erbuf), erbuf);
+ exit(status);
+ }
+ if (!(copts&REG_NOSUB)) {
+ len = (int)(subs[0].rm_eo - subs[0].rm_so);
+ if (subs[0].rm_so != -1) {
+ if (len != 0)
+ printf("match `%.*s'\n", len,
+ argv[optind] + subs[0].rm_so);
+ else
+ printf("match `'@%.1s\n",
+ argv[optind] + subs[0].rm_so);
+ }
+ for (i = 1; i < NS; i++)
+ if (subs[i].rm_so != -1)
+ printf("(%d) `%.*s'\n", i,
+ (int)(subs[i].rm_eo - subs[i].rm_so),
+ argv[optind] + subs[i].rm_so);
+ }
+ exit(status);
+}
+
+/*
+ - regress - main loop of regression test
+ == void regress(FILE *in);
+ */
+void
+regress(in)
+FILE *in;
+{
+ char inbuf[1000];
+# define MAXF 10
+ char *f[MAXF];
+ int nf;
+ int i;
+ char erbuf[100];
+ size_t ne;
+ char *badpat = "invalid regular expression";
+# define SHORT 10
+ char *bpname = "REG_BADPAT";
+ regex_t re;
+
+ while (fgets(inbuf, sizeof(inbuf), in) != NULL) {
+ line++;
+ if (inbuf[0] == '#' || inbuf[0] == '\n')
+ continue; /* NOTE CONTINUE */
+ inbuf[strlen(inbuf)-1] = '\0'; /* get rid of stupid \n */
+ if (debug)
+ fprintf(stdout, "%d:\n", line);
+ nf = split(inbuf, f, MAXF, "\t\t");
+ if (nf < 3) {
+ fprintf(stderr, "bad input, line %d\n", line);
+ exit(1);
+ }
+ for (i = 0; i < nf; i++)
+ if (strcmp(f[i], "\"\"") == 0)
+ f[i] = "";
+ if (nf <= 3)
+ f[3] = NULL;
+ if (nf <= 4)
+ f[4] = NULL;
+ try(f[0], f[1], f[2], f[3], f[4], options('c', f[1]));
+ if (opt('&', f[1])) /* try with either type of RE */
+ try(f[0], f[1], f[2], f[3], f[4],
+ options('c', f[1]) &~ REG_EXTENDED);
+ }
+
+ ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
+ if (strcmp(erbuf, badpat) != 0 || ne != strlen(badpat)+1) {
+ fprintf(stderr, "end: regerror() test gave `%s' not `%s'\n",
+ erbuf, badpat);
+ status = 1;
+ }
+ ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, (size_t)SHORT);
+ if (strncmp(erbuf, badpat, SHORT-1) != 0 || erbuf[SHORT-1] != '\0' ||
+ ne != strlen(badpat)+1) {
+ fprintf(stderr, "end: regerror() short test gave `%s' not `%.*s'\n",
+ erbuf, SHORT-1, badpat);
+ status = 1;
+ }
+ ne = regerror(REG_ITOA|REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf));
+ if (strcmp(erbuf, bpname) != 0 || ne != strlen(bpname)+1) {
+ fprintf(stderr, "end: regerror() ITOA test gave `%s' not `%s'\n",
+ erbuf, bpname);
+ status = 1;
+ }
+ re.re_endp = bpname;
+ ne = regerror(REG_ATOI, &re, erbuf, sizeof(erbuf));
+ if (atoi(erbuf) != (int)REG_BADPAT) {
+ fprintf(stderr, "end: regerror() ATOI test gave `%s' not `%ld'\n",
+ erbuf, (long)REG_BADPAT);
+ status = 1;
+ } else if (ne != strlen(erbuf)+1) {
+ fprintf(stderr, "end: regerror() ATOI test len(`%s') = %ld\n",
+ erbuf, (long)REG_BADPAT);
+ status = 1;
+ }
+}
+
+/*
+ - try - try it, and report on problems
+ == void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts);
+ */
+void
+try(f0, f1, f2, f3, f4, opts)
+char *f0;
+char *f1;
+char *f2;
+char *f3;
+char *f4;
+int opts; /* may not match f1 */
+{
+ regex_t re;
+# define NSUBS 10
+ regmatch_t subs[NSUBS];
+# define NSHOULD 15
+ char *should[NSHOULD];
+ int nshould;
+ char erbuf[100];
+ int err;
+ int len;
+ char *type = (opts & REG_EXTENDED) ? "ERE" : "BRE";
+ register int i;
+ char *grump;
+ char f0copy[1000];
+ char f2copy[1000];
+
+ strcpy(f0copy, f0);
+ re.re_endp = (opts&REG_PEND) ? f0copy + strlen(f0copy) : NULL;
+ fixstr(f0copy);
+ err = regcomp(&re, f0copy, opts);
+ if (err != 0 && (!opt('C', f1) || err != efind(f2))) {
+ /* unexpected error or wrong error */
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "%d: %s error %s, %d/%d `%s'\n",
+ line, type, eprint(err), len,
+ sizeof(erbuf), erbuf);
+ status = 1;
+ } else if (err == 0 && opt('C', f1)) {
+ /* unexpected success */
+ fprintf(stderr, "%d: %s should have given REG_%s\n",
+ line, type, f2);
+ status = 1;
+ err = 1; /* so we won't try regexec */
+ }
+
+ if (err != 0) {
+ regfree(&re);
+ return;
+ }
+
+ strcpy(f2copy, f2);
+ fixstr(f2copy);
+
+ if (options('e', f1)&REG_STARTEND) {
+ if (strchr(f2, '(') == NULL || strchr(f2, ')') == NULL)
+ fprintf(stderr, "%d: bad STARTEND syntax\n", line);
+ subs[0].rm_so = strchr(f2, '(') - f2 + 1;
+ subs[0].rm_eo = strchr(f2, ')') - f2;
+ }
+ err = regexec(&re, f2copy, NSUBS, subs, options('e', f1));
+
+ if (err != 0 && (f3 != NULL || err != REG_NOMATCH)) {
+ /* unexpected error or wrong error */
+ len = regerror(err, &re, erbuf, sizeof(erbuf));
+ fprintf(stderr, "%d: %s exec error %s, %d/%d `%s'\n",
+ line, type, eprint(err), len,
+ sizeof(erbuf), erbuf);
+ status = 1;
+ } else if (err != 0) {
+ /* nothing more to check */
+ } else if (f3 == NULL) {
+ /* unexpected success */
+ fprintf(stderr, "%d: %s exec should have failed\n",
+ line, type);
+ status = 1;
+ err = 1; /* just on principle */
+ } else if (opts&REG_NOSUB) {
+ /* nothing more to check */
+ } else if ((grump = check(f2, subs[0], f3)) != NULL) {
+ fprintf(stderr, "%d: %s %s\n", line, type, grump);
+ status = 1;
+ err = 1;
+ }
+
+ if (err != 0 || f4 == NULL) {
+ regfree(&re);
+ return;
+ }
+
+ for (i = 1; i < NSHOULD; i++)
+ should[i] = NULL;
+ nshould = split(f4, should+1, NSHOULD-1, ",");
+ if (nshould == 0) {
+ nshould = 1;
+ should[1] = "";
+ }
+ for (i = 1; i < NSUBS; i++) {
+ grump = check(f2, subs[i], should[i]);
+ if (grump != NULL) {
+ fprintf(stderr, "%d: %s $%d %s\n", line,
+ type, i, grump);
+ status = 1;
+ err = 1;
+ }
+ }
+
+ regfree(&re);
+}
+
+/*
+ - options - pick options out of a regression-test string
+ == int options(int type, char *s);
+ */
+int
+options(type, s)
+int type; /* 'c' compile, 'e' exec */
+char *s;
+{
+ register char *p;
+ register int o = (type == 'c') ? copts : eopts;
+ register char *legal = (type == 'c') ? "bisnmp" : "^$#tl";
+
+ for (p = s; *p != '\0'; p++)
+ if (strchr(legal, *p) != NULL)
+ switch (*p) {
+ case 'b':
+ o &= ~REG_EXTENDED;
+ break;
+ case 'i':
+ o |= REG_ICASE;
+ break;
+ case 's':
+ o |= REG_NOSUB;
+ break;
+ case 'n':
+ o |= REG_NEWLINE;
+ break;
+ case 'm':
+ o &= ~REG_EXTENDED;
+ o |= REG_NOSPEC;
+ break;
+ case 'p':
+ o |= REG_PEND;
+ break;
+ case '^':
+ o |= REG_NOTBOL;
+ break;
+ case '$':
+ o |= REG_NOTEOL;
+ break;
+ case '#':
+ o |= REG_STARTEND;
+ break;
+ case 't': /* trace */
+ o |= REG_TRACE;
+ break;
+ case 'l': /* force long representation */
+ o |= REG_LARGE;
+ break;
+ case 'r': /* force backref use */
+ o |= REG_BACKR;
+ break;
+ }
+ return(o);
+}
+
+/*
+ - opt - is a particular option in a regression string?
+ == int opt(int c, char *s);
+ */
+int /* predicate */
+opt(c, s)
+int c;
+char *s;
+{
+ return(strchr(s, c) != NULL);
+}
+
+/*
+ - fixstr - transform magic characters in strings
+ == void fixstr(register char *p);
+ */
+void
+fixstr(p)
+register char *p;
+{
+ if (p == NULL)
+ return;
+
+ for (; *p != '\0'; p++)
+ if (*p == 'N')
+ *p = '\n';
+ else if (*p == 'T')
+ *p = '\t';
+ else if (*p == 'S')
+ *p = ' ';
+ else if (*p == 'Z')
+ *p = '\0';
+}
+
+/*
+ - check - check a substring match
+ == char *check(char *str, regmatch_t sub, char *should);
+ */
+char * /* NULL or complaint */
+check(str, sub, should)
+char *str;
+regmatch_t sub;
+char *should;
+{
+ register int len;
+ register int shlen;
+ register char *p;
+ static char grump[500];
+ register char *at = NULL;
+
+ if (should != NULL && strcmp(should, "-") == 0)
+ should = NULL;
+ if (should != NULL && should[0] == '@') {
+ at = should + 1;
+ should = "";
+ }
+
+ /* check rm_so and rm_eo for consistency */
+ if (sub.rm_so > sub.rm_eo || (sub.rm_so == -1 && sub.rm_eo != -1) ||
+ (sub.rm_so != -1 && sub.rm_eo == -1) ||
+ (sub.rm_so != -1 && sub.rm_so < 0) ||
+ (sub.rm_eo != -1 && sub.rm_eo < 0) ) {
+ sprintf(grump, "start %ld end %ld", (long)sub.rm_so,
+ (long)sub.rm_eo);
+ return(grump);
+ }
+
+ /* check for no match */
+ if (sub.rm_so == -1 && should == NULL)
+ return(NULL);
+ if (sub.rm_so == -1)
+ return("did not match");
+
+ /* check for in range */
+ if (sub.rm_eo > strlen(str)) {
+ sprintf(grump, "start %ld end %ld, past end of string",
+ (long)sub.rm_so, (long)sub.rm_eo);
+ return(grump);
+ }
+
+ len = (int)(sub.rm_eo - sub.rm_so);
+ shlen = (int)strlen(should);
+ p = str + sub.rm_so;
+
+ /* check for not supposed to match */
+ if (should == NULL) {
+ sprintf(grump, "matched `%.*s'", len, p);
+ return(grump);
+ }
+
+ /* check for wrong match */
+ if (len != shlen || strncmp(p, should, (size_t)shlen) != 0) {
+ sprintf(grump, "matched `%.*s' instead", len, p);
+ return(grump);
+ }
+ if (shlen > 0)
+ return(NULL);
+
+ /* check null match in right place */
+ if (at == NULL)
+ return(NULL);
+ shlen = strlen(at);
+ if (shlen == 0)
+ shlen = 1; /* force check for end-of-string */
+ if (strncmp(p, at, shlen) != 0) {
+ sprintf(grump, "matched null at `%.20s'", p);
+ return(grump);
+ }
+ return(NULL);
+}
+
+/*
+ - eprint - convert error number to name
+ == static char *eprint(int err);
+ */
+static char *
+eprint(err)
+int err;
+{
+ static char epbuf[100];
+ size_t len;
+
+ len = regerror(REG_ITOA|err, (regex_t *)NULL, epbuf, sizeof(epbuf));
+ assert(len <= sizeof(epbuf));
+ return(epbuf);
+}
+
+/*
+ - efind - convert error name to number
+ == static int efind(char *name);
+ */
+static int
+efind(name)
+char *name;
+{
+ static char efbuf[100];
+ size_t n;
+ regex_t re;
+
+ sprintf(efbuf, "REG_%s", name);
+ assert(strlen(efbuf) < sizeof(efbuf));
+ re.re_endp = efbuf;
+ (void) regerror(REG_ATOI, &re, efbuf, sizeof(efbuf));
+ return(atoi(efbuf));
+}
diff --git a/xc/extras/regex/mkh b/xc/extras/regex/mkh
new file mode 100644
index 000000000..252b246c7
--- /dev/null
+++ b/xc/extras/regex/mkh
@@ -0,0 +1,76 @@
+#! /bin/sh
+# mkh - pull headers out of C source
+PATH=/bin:/usr/bin ; export PATH
+
+# egrep pattern to pick out marked lines
+egrep='^ =([ ]|$)'
+
+# Sed program to process marked lines into lines for the header file.
+# The markers have already been removed. Two things are done here: removal
+# of backslashed newlines, and some fudging of comments. The first is done
+# because -o needs to have prototypes on one line to strip them down.
+# Getting comments into the output is tricky; we turn C++-style // comments
+# into /* */ comments, after altering any existing */'s to avoid trouble.
+peel=' /\\$/N
+ /\\\n[ ]*/s///g
+ /\/\//s;\*/;* /;g
+ /\/\//s;//\(.*\);/*\1 */;'
+
+for a
+do
+ case "$a" in
+ -o) # old (pre-function-prototype) compiler
+ # add code to comment out argument lists
+ peel="$peel
+ "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1(/*\2*/);'
+ shift
+ ;;
+ -b) # funny Berkeley __P macro
+ peel="$peel
+ "'/^\([^#\/][^\/]*[a-zA-Z0-9_)]\)(\(.*\))/s;;\1 __P((\2));'
+ shift
+ ;;
+ -s) # compiler doesn't like `static foo();'
+ # add code to get rid of the `static'
+ peel="$peel
+ "'/^static[ ][^\/]*[a-zA-Z0-9_)](.*)/s;static.;;'
+ shift
+ ;;
+ -p) # private declarations
+ egrep='^ ==([ ]|$)'
+ shift
+ ;;
+ -i) # wrap in #ifndef, argument is name
+ ifndef="$2"
+ shift ; shift
+ ;;
+ *) break
+ ;;
+ esac
+done
+
+if test " $ifndef" != " "
+then
+ echo "#ifndef $ifndef"
+ echo "#define $ifndef /* never again */"
+fi
+echo "/* ========= begin header generated by $0 ========= */"
+echo '#ifdef __cplusplus'
+echo 'extern "C" {'
+echo '#endif'
+for f
+do
+ echo
+ echo "/* === $f === */"
+ egrep "$egrep" $f | sed 's/^ ==*[ ]//;s/^ ==*$//' | sed "$peel"
+ echo
+done
+echo '#ifdef __cplusplus'
+echo '}'
+echo '#endif'
+echo "/* ========= end header generated by $0 ========= */"
+if test " $ifndef" != " "
+then
+ echo "#endif"
+fi
+exit 0
diff --git a/xc/extras/regex/regcomp.c b/xc/extras/regex/regcomp.c
new file mode 100644
index 000000000..42c3b8654
--- /dev/null
+++ b/xc/extras/regex/regcomp.c
@@ -0,0 +1,1603 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+#include "cclass.h"
+#include "cname.h"
+
+/*
+ * parse structure, passed up and down to avoid global variables and
+ * other clumsinesses
+ */
+struct parse {
+ char *next; /* next character in RE */
+ char *end; /* end of string (-> NUL normally) */
+ int error; /* has an error been seen? */
+ sop *strip; /* malloced strip */
+ sopno ssize; /* malloced strip size (allocated) */
+ sopno slen; /* malloced strip length (used) */
+ int ncsalloc; /* number of csets allocated */
+ struct re_guts *g;
+# define NPAREN 10 /* we need to remember () 1-9 for back refs */
+ sopno pbegin[NPAREN]; /* -> ( ([0] unused) */
+ sopno pend[NPAREN]; /* -> ) ([0] unused) */
+};
+
+#include "regcomp.ih"
+
+static char nuls[10]; /* place to point scanner in event of error */
+
+/*
+ * macros for use with parse structure
+ * BEWARE: these know that the parse structure is named `p' !!!
+ */
+#define PEEK() (*p->next)
+#define PEEK2() (*(p->next+1))
+#define MORE() (p->next < p->end)
+#define MORE2() (p->next+1 < p->end)
+#define SEE(c) (MORE() && PEEK() == (c))
+#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
+#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0)
+#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
+#define NEXT() (p->next++)
+#define NEXT2() (p->next += 2)
+#define NEXTn(n) (p->next += (n))
+#define GETNEXT() (*p->next++)
+#define SETERROR(e) seterr(p, (e))
+#define REQUIRE(co, e) ((co) || SETERROR(e))
+#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e))
+#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e))
+#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e))
+#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
+#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos)
+#define AHEAD(pos) dofwd(p, pos, HERE()-(pos))
+#define ASTERN(sop, pos) EMIT(sop, HERE()-pos)
+#define HERE() (p->slen)
+#define THERE() (p->slen - 1)
+#define THERETHERE() (p->slen - 2)
+#define DROP(n) (p->slen -= (n))
+
+#ifndef NDEBUG
+static int never = 0; /* for use in asserts; shuts lint up */
+#else
+#define never 0 /* some <assert.h>s have bugs too */
+#endif
+
+/*
+ - regcomp - interface for parser and compilation
+ = extern int regcomp(regex_t *, const char *, int);
+ = #define REG_BASIC 0000
+ = #define REG_EXTENDED 0001
+ = #define REG_ICASE 0002
+ = #define REG_NOSUB 0004
+ = #define REG_NEWLINE 0010
+ = #define REG_NOSPEC 0020
+ = #define REG_PEND 0040
+ = #define REG_DUMP 0200
+ */
+int /* 0 success, otherwise REG_something */
+regcomp(preg, pattern, cflags)
+regex_t *preg;
+const char *pattern;
+int cflags;
+{
+ struct parse pa;
+ register struct re_guts *g;
+ register struct parse *p = &pa;
+ register int i;
+ register size_t len;
+#ifdef REDEBUG
+# define GOODFLAGS(f) (f)
+#else
+# define GOODFLAGS(f) ((f)&~REG_DUMP)
+#endif
+
+ cflags = GOODFLAGS(cflags);
+ if ((cflags&REG_EXTENDED) && (cflags&REG_NOSPEC))
+ return(REG_INVARG);
+
+ if (cflags&REG_PEND) {
+ if (preg->re_endp < pattern)
+ return(REG_INVARG);
+ len = preg->re_endp - pattern;
+ } else
+ len = strlen((char *)pattern);
+
+ /* do the mallocs early so failure handling is easy */
+ g = (struct re_guts *)malloc(sizeof(struct re_guts) +
+ (NC-1)*sizeof(cat_t));
+ if (g == NULL)
+ return(REG_ESPACE);
+ p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */
+ p->strip = (sop *)malloc(p->ssize * sizeof(sop));
+ p->slen = 0;
+ if (p->strip == NULL) {
+ free((char *)g);
+ return(REG_ESPACE);
+ }
+
+ /* set things up */
+ p->g = g;
+ p->next = (char *)pattern; /* convenience; we do not modify it */
+ p->end = p->next + len;
+ p->error = 0;
+ p->ncsalloc = 0;
+ for (i = 0; i < NPAREN; i++) {
+ p->pbegin[i] = 0;
+ p->pend[i] = 0;
+ }
+ g->csetsize = NC;
+ g->sets = NULL;
+ g->setbits = NULL;
+ g->ncsets = 0;
+ g->cflags = cflags;
+ g->iflags = 0;
+ g->nbol = 0;
+ g->neol = 0;
+ g->must = NULL;
+ g->mlen = 0;
+ g->nsub = 0;
+ g->ncategories = 1; /* category 0 is "everything else" */
+ g->categories = &g->catspace[-(CHAR_MIN)];
+ (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
+ g->backrefs = 0;
+
+ /* do it */
+ EMIT(OEND, 0);
+ g->firststate = THERE();
+ if (cflags&REG_EXTENDED)
+ p_ere(p, OUT);
+ else if (cflags&REG_NOSPEC)
+ p_str(p);
+ else
+ p_bre(p, OUT, OUT);
+ EMIT(OEND, 0);
+ g->laststate = THERE();
+
+ /* tidy up loose ends and fill things in */
+ categorize(p, g);
+ stripsnug(p, g);
+ findmust(p, g);
+ g->nplus = pluscount(p, g);
+ g->magic = MAGIC2;
+ preg->re_nsub = g->nsub;
+ preg->re_g = g;
+ preg->re_magic = MAGIC1;
+#ifndef REDEBUG
+ /* not debugging, so can't rely on the assert() in regexec() */
+ if (g->iflags&BAD)
+ SETERROR(REG_ASSERT);
+#endif
+
+ /* win or lose, we're done */
+ if (p->error != 0) /* lose */
+ regfree(preg);
+ return(p->error);
+}
+
+/*
+ - p_ere - ERE parser top level, concatenation and alternation
+ == static void p_ere(register struct parse *p, int stop);
+ */
+static void
+p_ere(p, stop)
+register struct parse *p;
+int stop; /* character this ERE should end at */
+{
+ register char c;
+ register sopno prevback;
+ register sopno prevfwd;
+ register sopno conc;
+ register int first = 1; /* is this the first alternative? */
+
+ for (;;) {
+ /* do a bunch of concatenated expressions */
+ conc = HERE();
+ while (MORE() && (c = PEEK()) != '|' && c != stop)
+ p_ere_exp(p);
+ REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */
+
+ if (!EAT('|'))
+ break; /* NOTE BREAK OUT */
+
+ if (first) {
+ INSERT(OCH_, conc); /* offset is wrong */
+ prevfwd = conc;
+ prevback = conc;
+ first = 0;
+ }
+ ASTERN(OOR1, prevback);
+ prevback = THERE();
+ AHEAD(prevfwd); /* fix previous offset */
+ prevfwd = HERE();
+ EMIT(OOR2, 0); /* offset is very wrong */
+ }
+
+ if (!first) { /* tail-end fixups */
+ AHEAD(prevfwd);
+ ASTERN(O_CH, prevback);
+ }
+
+ assert(!MORE() || SEE(stop));
+}
+
+/*
+ - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op
+ == static void p_ere_exp(register struct parse *p);
+ */
+static void
+p_ere_exp(p)
+register struct parse *p;
+{
+ register char c;
+ register sopno pos;
+ register int count;
+ register int count2;
+ register sopno subno;
+ int wascaret = 0;
+
+ assert(MORE()); /* caller should have ensured this */
+ c = GETNEXT();
+
+ pos = HERE();
+ switch (c) {
+ case '(':
+ REQUIRE(MORE(), REG_EPAREN);
+ p->g->nsub++;
+ subno = p->g->nsub;
+ if (subno < NPAREN)
+ p->pbegin[subno] = HERE();
+ EMIT(OLPAREN, subno);
+ if (!SEE(')'))
+ p_ere(p, ')');
+ if (subno < NPAREN) {
+ p->pend[subno] = HERE();
+ assert(p->pend[subno] != 0);
+ }
+ EMIT(ORPAREN, subno);
+ MUSTEAT(')', REG_EPAREN);
+ break;
+#ifndef POSIX_MISTAKE
+ case ')': /* happens only if no current unmatched ( */
+ /*
+ * You may ask, why the ifndef? Because I didn't notice
+ * this until slightly too late for 1003.2, and none of the
+ * other 1003.2 regular-expression reviewers noticed it at
+ * all. So an unmatched ) is legal POSIX, at least until
+ * we can get it fixed.
+ */
+ SETERROR(REG_EPAREN);
+ break;
+#endif
+ case '^':
+ EMIT(OBOL, 0);
+ p->g->iflags |= USEBOL;
+ p->g->nbol++;
+ wascaret = 1;
+ break;
+ case '$':
+ EMIT(OEOL, 0);
+ p->g->iflags |= USEEOL;
+ p->g->neol++;
+ break;
+ case '|':
+ SETERROR(REG_EMPTY);
+ break;
+ case '*':
+ case '+':
+ case '?':
+ SETERROR(REG_BADRPT);
+ break;
+ case '.':
+ if (p->g->cflags&REG_NEWLINE)
+ nonnewline(p);
+ else
+ EMIT(OANY, 0);
+ break;
+ case '[':
+ p_bracket(p);
+ break;
+ case '\\':
+ REQUIRE(MORE(), REG_EESCAPE);
+ c = GETNEXT();
+ ordinary(p, c);
+ break;
+ case '{': /* okay as ordinary except if digit follows */
+ REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT);
+ /* FALLTHROUGH */
+ default:
+ ordinary(p, c);
+ break;
+ }
+
+ if (!MORE())
+ return;
+ c = PEEK();
+ /* we call { a repetition if followed by a digit */
+ if (!( c == '*' || c == '+' || c == '?' ||
+ (c == '{' && MORE2() && isdigit(PEEK2())) ))
+ return; /* no repetition, we're done */
+ NEXT();
+
+ REQUIRE(!wascaret, REG_BADRPT);
+ switch (c) {
+ case '*': /* implemented as +? */
+ /* this case does not require the (y|) trick, noKLUDGE */
+ INSERT(OPLUS_, pos);
+ ASTERN(O_PLUS, pos);
+ INSERT(OQUEST_, pos);
+ ASTERN(O_QUEST, pos);
+ break;
+ case '+':
+ INSERT(OPLUS_, pos);
+ ASTERN(O_PLUS, pos);
+ break;
+ case '?':
+ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+ INSERT(OCH_, pos); /* offset slightly wrong */
+ ASTERN(OOR1, pos); /* this one's right */
+ AHEAD(pos); /* fix the OCH_ */
+ EMIT(OOR2, 0); /* offset very wrong... */
+ AHEAD(THERE()); /* ...so fix it */
+ ASTERN(O_CH, THERETHERE());
+ break;
+ case '{':
+ count = p_count(p);
+ if (EAT(',')) {
+ if (isdigit(PEEK())) {
+ count2 = p_count(p);
+ REQUIRE(count <= count2, REG_BADBR);
+ } else /* single number with comma */
+ count2 = INFINITY;
+ } else /* just a single number */
+ count2 = count;
+ repeat(p, pos, count, count2);
+ if (!EAT('}')) { /* error heuristics */
+ while (MORE() && PEEK() != '}')
+ NEXT();
+ REQUIRE(MORE(), REG_EBRACE);
+ SETERROR(REG_BADBR);
+ }
+ break;
+ }
+
+ if (!MORE())
+ return;
+ c = PEEK();
+ if (!( c == '*' || c == '+' || c == '?' ||
+ (c == '{' && MORE2() && isdigit(PEEK2())) ) )
+ return;
+ SETERROR(REG_BADRPT);
+}
+
+/*
+ - p_str - string (no metacharacters) "parser"
+ == static void p_str(register struct parse *p);
+ */
+static void
+p_str(p)
+register struct parse *p;
+{
+ REQUIRE(MORE(), REG_EMPTY);
+ while (MORE())
+ ordinary(p, GETNEXT());
+}
+
+/*
+ - p_bre - BRE parser top level, anchoring and concatenation
+ == static void p_bre(register struct parse *p, register int end1, \
+ == register int end2);
+ * Giving end1 as OUT essentially eliminates the end1/end2 check.
+ *
+ * This implementation is a bit of a kludge, in that a trailing $ is first
+ * taken as an ordinary character and then revised to be an anchor. The
+ * only undesirable side effect is that '$' gets included as a character
+ * category in such cases. This is fairly harmless; not worth fixing.
+ * The amount of lookahead needed to avoid this kludge is excessive.
+ */
+static void
+p_bre(p, end1, end2)
+register struct parse *p;
+register int end1; /* first terminating character */
+register int end2; /* second terminating character */
+{
+ register sopno start = HERE();
+ register int first = 1; /* first subexpression? */
+ register int wasdollar = 0;
+
+ if (EAT('^')) {
+ EMIT(OBOL, 0);
+ p->g->iflags |= USEBOL;
+ p->g->nbol++;
+ }
+ while (MORE() && !SEETWO(end1, end2)) {
+ wasdollar = p_simp_re(p, first);
+ first = 0;
+ }
+ if (wasdollar) { /* oops, that was a trailing anchor */
+ DROP(1);
+ EMIT(OEOL, 0);
+ p->g->iflags |= USEEOL;
+ p->g->neol++;
+ }
+
+ REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */
+}
+
+/*
+ - p_simp_re - parse a simple RE, an atom possibly followed by a repetition
+ == static int p_simp_re(register struct parse *p, int starordinary);
+ */
+static int /* was the simple RE an unbackslashed $? */
+p_simp_re(p, starordinary)
+register struct parse *p;
+int starordinary; /* is a leading * an ordinary character? */
+{
+ register int c;
+ register int count;
+ register int count2;
+ register sopno pos;
+ register int i;
+ register sopno subno;
+# define BACKSL (1<<CHAR_BIT)
+
+ pos = HERE(); /* repetion op, if any, covers from here */
+
+ assert(MORE()); /* caller should have ensured this */
+ c = GETNEXT();
+ if (c == '\\') {
+ REQUIRE(MORE(), REG_EESCAPE);
+ c = BACKSL | (unsigned char)GETNEXT();
+ }
+ switch (c) {
+ case '.':
+ if (p->g->cflags&REG_NEWLINE)
+ nonnewline(p);
+ else
+ EMIT(OANY, 0);
+ break;
+ case '[':
+ p_bracket(p);
+ break;
+ case BACKSL|'{':
+ SETERROR(REG_BADRPT);
+ break;
+ case BACKSL|'(':
+ p->g->nsub++;
+ subno = p->g->nsub;
+ if (subno < NPAREN)
+ p->pbegin[subno] = HERE();
+ EMIT(OLPAREN, subno);
+ /* the MORE here is an error heuristic */
+ if (MORE() && !SEETWO('\\', ')'))
+ p_bre(p, '\\', ')');
+ if (subno < NPAREN) {
+ p->pend[subno] = HERE();
+ assert(p->pend[subno] != 0);
+ }
+ EMIT(ORPAREN, subno);
+ REQUIRE(EATTWO('\\', ')'), REG_EPAREN);
+ break;
+ case BACKSL|')': /* should not get here -- must be user */
+ case BACKSL|'}':
+ SETERROR(REG_EPAREN);
+ break;
+ case BACKSL|'1':
+ case BACKSL|'2':
+ case BACKSL|'3':
+ case BACKSL|'4':
+ case BACKSL|'5':
+ case BACKSL|'6':
+ case BACKSL|'7':
+ case BACKSL|'8':
+ case BACKSL|'9':
+ i = (c&~BACKSL) - '0';
+ assert(i < NPAREN);
+ if (p->pend[i] != 0) {
+ assert(i <= p->g->nsub);
+ EMIT(OBACK_, i);
+ assert(p->pbegin[i] != 0);
+ assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
+ assert(OP(p->strip[p->pend[i]]) == ORPAREN);
+ (void) dupl(p, p->pbegin[i]+1, p->pend[i]);
+ EMIT(O_BACK, i);
+ } else
+ SETERROR(REG_ESUBREG);
+ p->g->backrefs = 1;
+ break;
+ case '*':
+ REQUIRE(starordinary, REG_BADRPT);
+ /* FALLTHROUGH */
+ default:
+ ordinary(p, c &~ BACKSL);
+ break;
+ }
+
+ if (EAT('*')) { /* implemented as +? */
+ /* this case does not require the (y|) trick, noKLUDGE */
+ INSERT(OPLUS_, pos);
+ ASTERN(O_PLUS, pos);
+ INSERT(OQUEST_, pos);
+ ASTERN(O_QUEST, pos);
+ } else if (EATTWO('\\', '{')) {
+ count = p_count(p);
+ if (EAT(',')) {
+ if (MORE() && isdigit(PEEK())) {
+ count2 = p_count(p);
+ REQUIRE(count <= count2, REG_BADBR);
+ } else /* single number with comma */
+ count2 = INFINITY;
+ } else /* just a single number */
+ count2 = count;
+ repeat(p, pos, count, count2);
+ if (!EATTWO('\\', '}')) { /* error heuristics */
+ while (MORE() && !SEETWO('\\', '}'))
+ NEXT();
+ REQUIRE(MORE(), REG_EBRACE);
+ SETERROR(REG_BADBR);
+ }
+ } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */
+ return(1);
+
+ return(0);
+}
+
+/*
+ - p_count - parse a repetition count
+ == static int p_count(register struct parse *p);
+ */
+static int /* the value */
+p_count(p)
+register struct parse *p;
+{
+ register int count = 0;
+ register int ndigits = 0;
+
+ while (MORE() && isdigit(PEEK()) && count <= DUPMAX) {
+ count = count*10 + (GETNEXT() - '0');
+ ndigits++;
+ }
+
+ REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
+ return(count);
+}
+
+/*
+ - p_bracket - parse a bracketed character list
+ == static void p_bracket(register struct parse *p);
+ *
+ * Note a significant property of this code: if the allocset() did SETERROR,
+ * no set operations are done.
+ */
+static void
+p_bracket(p)
+register struct parse *p;
+{
+ register cset *cs = allocset(p);
+ register int invert = 0;
+
+ /* Dept of Truly Sickening Special-Case Kludges */
+ if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) {
+ EMIT(OBOW, 0);
+ NEXTn(6);
+ return;
+ }
+ if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) {
+ EMIT(OEOW, 0);
+ NEXTn(6);
+ return;
+ }
+
+ if (EAT('^'))
+ invert++; /* make note to invert set at end */
+ if (EAT(']'))
+ CHadd(cs, ']');
+ else if (EAT('-'))
+ CHadd(cs, '-');
+ while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
+ p_b_term(p, cs);
+ if (EAT('-'))
+ CHadd(cs, '-');
+ MUSTEAT(']', REG_EBRACK);
+
+ if (p->error != 0) /* don't mess things up further */
+ return;
+
+ if (p->g->cflags&REG_ICASE) {
+ register int i;
+ register int ci;
+
+ for (i = p->g->csetsize - 1; i >= 0; i--)
+ if (CHIN(cs, i) && isalpha(i)) {
+ ci = othercase(i);
+ if (ci != i)
+ CHadd(cs, ci);
+ }
+ if (cs->multis != NULL)
+ mccase(p, cs);
+ }
+ if (invert) {
+ register int i;
+
+ for (i = p->g->csetsize - 1; i >= 0; i--)
+ if (CHIN(cs, i))
+ CHsub(cs, i);
+ else
+ CHadd(cs, i);
+ if (p->g->cflags&REG_NEWLINE)
+ CHsub(cs, '\n');
+ if (cs->multis != NULL)
+ mcinvert(p, cs);
+ }
+
+ assert(cs->multis == NULL); /* xxx */
+
+ if (nch(p, cs) == 1) { /* optimize singleton sets */
+ ordinary(p, firstch(p, cs));
+ freeset(p, cs);
+ } else
+ EMIT(OANYOF, freezeset(p, cs));
+}
+
+/*
+ - p_b_term - parse one term of a bracketed character list
+ == static void p_b_term(register struct parse *p, register cset *cs);
+ */
+static void
+p_b_term(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register char c;
+ register char start, finish;
+ register int i;
+
+ /* classify what we've got */
+ switch ((MORE()) ? PEEK() : '\0') {
+ case '[':
+ c = (MORE2()) ? PEEK2() : '\0';
+ break;
+ case '-':
+ SETERROR(REG_ERANGE);
+ return; /* NOTE RETURN */
+ break;
+ default:
+ c = '\0';
+ break;
+ }
+
+ switch (c) {
+ case ':': /* character class */
+ NEXT2();
+ REQUIRE(MORE(), REG_EBRACK);
+ c = PEEK();
+ REQUIRE(c != '-' && c != ']', REG_ECTYPE);
+ p_b_cclass(p, cs);
+ REQUIRE(MORE(), REG_EBRACK);
+ REQUIRE(EATTWO(':', ']'), REG_ECTYPE);
+ break;
+ case '=': /* equivalence class */
+ NEXT2();
+ REQUIRE(MORE(), REG_EBRACK);
+ c = PEEK();
+ REQUIRE(c != '-' && c != ']', REG_ECOLLATE);
+ p_b_eclass(p, cs);
+ REQUIRE(MORE(), REG_EBRACK);
+ REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
+ break;
+ default: /* symbol, ordinary character, or range */
+/* xxx revision needed for multichar stuff */
+ start = p_b_symbol(p);
+ if (SEE('-') && MORE2() && PEEK2() != ']') {
+ /* range */
+ NEXT();
+ if (EAT('-'))
+ finish = '-';
+ else
+ finish = p_b_symbol(p);
+ } else
+ finish = start;
+/* xxx what about signed chars here... */
+ REQUIRE(start <= finish, REG_ERANGE);
+ for (i = start; i <= finish; i++)
+ CHadd(cs, i);
+ break;
+ }
+}
+
+/*
+ - p_b_cclass - parse a character-class name and deal with it
+ == static void p_b_cclass(register struct parse *p, register cset *cs);
+ */
+static void
+p_b_cclass(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register char *sp = p->next;
+ register struct cclass *cp;
+ register size_t len;
+ register char *u;
+ register char c;
+
+ while (MORE() && isalpha(PEEK()))
+ NEXT();
+ len = p->next - sp;
+ for (cp = cclasses; cp->name != NULL; cp++)
+ if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
+ break;
+ if (cp->name == NULL) {
+ /* oops, didn't find it */
+ SETERROR(REG_ECTYPE);
+ return;
+ }
+
+ u = cp->chars;
+ while ((c = *u++) != '\0')
+ CHadd(cs, c);
+ for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
+ MCadd(p, cs, u);
+}
+
+/*
+ - p_b_eclass - parse an equivalence-class name and deal with it
+ == static void p_b_eclass(register struct parse *p, register cset *cs);
+ *
+ * This implementation is incomplete. xxx
+ */
+static void
+p_b_eclass(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register char c;
+
+ c = p_b_coll_elem(p, '=');
+ CHadd(cs, c);
+}
+
+/*
+ - p_b_symbol - parse a character or [..]ed multicharacter collating symbol
+ == static char p_b_symbol(register struct parse *p);
+ */
+static char /* value of symbol */
+p_b_symbol(p)
+register struct parse *p;
+{
+ register char value;
+
+ REQUIRE(MORE(), REG_EBRACK);
+ if (!EATTWO('[', '.'))
+ return(GETNEXT());
+
+ /* collating symbol */
+ value = p_b_coll_elem(p, '.');
+ REQUIRE(EATTWO('.', ']'), REG_ECOLLATE);
+ return(value);
+}
+
+/*
+ - p_b_coll_elem - parse a collating-element name and look it up
+ == static char p_b_coll_elem(register struct parse *p, int endc);
+ */
+static char /* value of collating element */
+p_b_coll_elem(p, endc)
+register struct parse *p;
+int endc; /* name ended by endc,']' */
+{
+ register char *sp = p->next;
+ register struct cname *cp;
+ register int len;
+
+ while (MORE() && !SEETWO(endc, ']'))
+ NEXT();
+ if (!MORE()) {
+ SETERROR(REG_EBRACK);
+ return(0);
+ }
+ len = p->next - sp;
+ for (cp = cnames; cp->name != NULL; cp++)
+ if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
+ return(cp->code); /* known name */
+ if (len == 1)
+ return(*sp); /* single character */
+ SETERROR(REG_ECOLLATE); /* neither */
+ return(0);
+}
+
+/*
+ - othercase - return the case counterpart of an alphabetic
+ == static char othercase(int ch);
+ */
+static char /* if no counterpart, return ch */
+othercase(ch)
+int ch;
+{
+ assert(isalpha(ch));
+ if (isupper(ch))
+ return(tolower(ch));
+ else if (islower(ch))
+ return(toupper(ch));
+ else /* peculiar, but could happen */
+ return(ch);
+}
+
+/*
+ - bothcases - emit a dualcase version of a two-case character
+ == static void bothcases(register struct parse *p, int ch);
+ *
+ * Boy, is this implementation ever a kludge...
+ */
+static void
+bothcases(p, ch)
+register struct parse *p;
+int ch;
+{
+ register char *oldnext = p->next;
+ register char *oldend = p->end;
+ char bracket[3];
+
+ assert(othercase(ch) != ch); /* p_bracket() would recurse */
+ p->next = bracket;
+ p->end = bracket+2;
+ bracket[0] = ch;
+ bracket[1] = ']';
+ bracket[2] = '\0';
+ p_bracket(p);
+ assert(p->next == bracket+2);
+ p->next = oldnext;
+ p->end = oldend;
+}
+
+/*
+ - ordinary - emit an ordinary character
+ == static void ordinary(register struct parse *p, register int ch);
+ */
+static void
+ordinary(p, ch)
+register struct parse *p;
+register int ch;
+{
+ register cat_t *cap = p->g->categories;
+
+ if ((p->g->cflags&REG_ICASE) && isalpha(ch) && othercase(ch) != ch)
+ bothcases(p, ch);
+ else {
+ EMIT(OCHAR, (unsigned char)ch);
+ if (cap[ch] == 0)
+ cap[ch] = p->g->ncategories++;
+ }
+}
+
+/*
+ - nonnewline - emit REG_NEWLINE version of OANY
+ == static void nonnewline(register struct parse *p);
+ *
+ * Boy, is this implementation ever a kludge...
+ */
+static void
+nonnewline(p)
+register struct parse *p;
+{
+ register char *oldnext = p->next;
+ register char *oldend = p->end;
+ char bracket[4];
+
+ p->next = bracket;
+ p->end = bracket+3;
+ bracket[0] = '^';
+ bracket[1] = '\n';
+ bracket[2] = ']';
+ bracket[3] = '\0';
+ p_bracket(p);
+ assert(p->next == bracket+3);
+ p->next = oldnext;
+ p->end = oldend;
+}
+
+/*
+ - repeat - generate code for a bounded repetition, recursively if needed
+ == static void repeat(register struct parse *p, sopno start, int from, int to);
+ */
+static void
+repeat(p, start, from, to)
+register struct parse *p;
+sopno start; /* operand from here to end of strip */
+int from; /* repeated from this number */
+int to; /* to this number of times (maybe INFINITY) */
+{
+ register sopno finish = HERE();
+# define N 2
+# define INF 3
+# define REP(f, t) ((f)*8 + (t))
+# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)
+ register sopno copy;
+
+ if (p->error != 0) /* head off possible runaway recursion */
+ return;
+
+ assert(from <= to);
+
+ switch (REP(MAP(from), MAP(to))) {
+ case REP(0, 0): /* must be user doing this */
+ DROP(finish-start); /* drop the operand */
+ break;
+ case REP(0, 1): /* as x{1,1}? */
+ case REP(0, N): /* as x{1,n}? */
+ case REP(0, INF): /* as x{1,}? */
+ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+ INSERT(OCH_, start); /* offset is wrong... */
+ repeat(p, start+1, 1, to);
+ ASTERN(OOR1, start);
+ AHEAD(start); /* ... fix it */
+ EMIT(OOR2, 0);
+ AHEAD(THERE());
+ ASTERN(O_CH, THERETHERE());
+ break;
+ case REP(1, 1): /* trivial case */
+ /* done */
+ break;
+ case REP(1, N): /* as x?x{1,n-1} */
+ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+ INSERT(OCH_, start);
+ ASTERN(OOR1, start);
+ AHEAD(start);
+ EMIT(OOR2, 0); /* offset very wrong... */
+ AHEAD(THERE()); /* ...so fix it */
+ ASTERN(O_CH, THERETHERE());
+ copy = dupl(p, start+1, finish+1);
+ assert(copy == finish+4);
+ repeat(p, copy, 1, to-1);
+ break;
+ case REP(1, INF): /* as x+ */
+ INSERT(OPLUS_, start);
+ ASTERN(O_PLUS, start);
+ break;
+ case REP(N, N): /* as xx{m-1,n-1} */
+ copy = dupl(p, start, finish);
+ repeat(p, copy, from-1, to-1);
+ break;
+ case REP(N, INF): /* as xx{n-1,INF} */
+ copy = dupl(p, start, finish);
+ repeat(p, copy, from-1, to);
+ break;
+ default: /* "can't happen" */
+ SETERROR(REG_ASSERT); /* just in case */
+ break;
+ }
+}
+
+/*
+ - seterr - set an error condition
+ == static int seterr(register struct parse *p, int e);
+ */
+static int /* useless but makes type checking happy */
+seterr(p, e)
+register struct parse *p;
+int e;
+{
+ if (p->error == 0) /* keep earliest error condition */
+ p->error = e;
+ p->next = nuls; /* try to bring things to a halt */
+ p->end = nuls;
+ return(0); /* make the return value well-defined */
+}
+
+/*
+ - allocset - allocate a set of characters for []
+ == static cset *allocset(register struct parse *p);
+ */
+static cset *
+allocset(p)
+register struct parse *p;
+{
+ register int no = p->g->ncsets++;
+ register size_t nc;
+ register size_t nbytes;
+ register cset *cs;
+ register size_t css = (size_t)p->g->csetsize;
+ register int i;
+
+ if (no >= p->ncsalloc) { /* need another column of space */
+ p->ncsalloc += CHAR_BIT;
+ nc = p->ncsalloc;
+ assert(nc % CHAR_BIT == 0);
+ nbytes = nc / CHAR_BIT * css;
+ if (p->g->sets == NULL)
+ p->g->sets = (cset *)malloc(nc * sizeof(cset));
+ else
+ p->g->sets = (cset *)realloc((char *)p->g->sets,
+ nc * sizeof(cset));
+ if (p->g->setbits == NULL)
+ p->g->setbits = (uch *)malloc(nbytes);
+ else {
+ p->g->setbits = (uch *)realloc((char *)p->g->setbits,
+ nbytes);
+ /* xxx this isn't right if setbits is now NULL */
+ for (i = 0; i < no; i++)
+ p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT);
+ }
+ if (p->g->sets != NULL && p->g->setbits != NULL)
+ (void) memset((char *)p->g->setbits + (nbytes - css),
+ 0, css);
+ else {
+ no = 0;
+ SETERROR(REG_ESPACE);
+ /* caller's responsibility not to do set ops */
+ }
+ }
+
+ assert(p->g->sets != NULL); /* xxx */
+ cs = &p->g->sets[no];
+ cs->ptr = p->g->setbits + css*((no)/CHAR_BIT);
+ cs->mask = 1 << ((no) % CHAR_BIT);
+ cs->hash = 0;
+ cs->smultis = 0;
+ cs->multis = NULL;
+
+ return(cs);
+}
+
+/*
+ - freeset - free a now-unused set
+ == static void freeset(register struct parse *p, register cset *cs);
+ */
+static void
+freeset(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register int i;
+ register cset *top = &p->g->sets[p->g->ncsets];
+ register size_t css = (size_t)p->g->csetsize;
+
+ for (i = 0; i < css; i++)
+ CHsub(cs, i);
+ if (cs == top-1) /* recover only the easy case */
+ p->g->ncsets--;
+}
+
+/*
+ - freezeset - final processing on a set of characters
+ == static int freezeset(register struct parse *p, register cset *cs);
+ *
+ * The main task here is merging identical sets. This is usually a waste
+ * of time (although the hash code minimizes the overhead), but can win
+ * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash
+ * is done using addition rather than xor -- all ASCII [aA] sets xor to
+ * the same value!
+ */
+static int /* set number */
+freezeset(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register uch h = cs->hash;
+ register int i;
+ register cset *top = &p->g->sets[p->g->ncsets];
+ register cset *cs2;
+ register size_t css = (size_t)p->g->csetsize;
+
+ /* look for an earlier one which is the same */
+ for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
+ if (cs2->hash == h && cs2 != cs) {
+ /* maybe */
+ for (i = 0; i < css; i++)
+ if (!!CHIN(cs2, i) != !!CHIN(cs, i))
+ break; /* no */
+ if (i == css)
+ break; /* yes */
+ }
+
+ if (cs2 < top) { /* found one */
+ freeset(p, cs);
+ cs = cs2;
+ }
+
+ return((int)(cs - p->g->sets));
+}
+
+/*
+ - firstch - return first character in a set (which must have at least one)
+ == static int firstch(register struct parse *p, register cset *cs);
+ */
+static int /* character; there is no "none" value */
+firstch(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register int i;
+ register size_t css = (size_t)p->g->csetsize;
+
+ for (i = 0; i < css; i++)
+ if (CHIN(cs, i))
+ return((char)i);
+ assert(never);
+ return(0); /* arbitrary */
+}
+
+/*
+ - nch - number of characters in a set
+ == static int nch(register struct parse *p, register cset *cs);
+ */
+static int
+nch(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ register int i;
+ register size_t css = (size_t)p->g->csetsize;
+ register int n = 0;
+
+ for (i = 0; i < css; i++)
+ if (CHIN(cs, i))
+ n++;
+ return(n);
+}
+
+/*
+ - mcadd - add a collating element to a cset
+ == static void mcadd(register struct parse *p, register cset *cs, \
+ == register char *cp);
+ */
+static void
+mcadd(p, cs, cp)
+register struct parse *p;
+register cset *cs;
+register char *cp;
+{
+ register size_t oldend = cs->smultis;
+
+ cs->smultis += strlen(cp) + 1;
+ if (cs->multis == NULL)
+ cs->multis = malloc(cs->smultis);
+ else
+ cs->multis = realloc(cs->multis, cs->smultis);
+ if (cs->multis == NULL) {
+ SETERROR(REG_ESPACE);
+ return;
+ }
+
+ (void) strcpy(cs->multis + oldend - 1, cp);
+ cs->multis[cs->smultis - 1] = '\0';
+}
+
+/*
+ - mcsub - subtract a collating element from a cset
+ == static void mcsub(register cset *cs, register char *cp);
+ */
+static void
+mcsub(cs, cp)
+register cset *cs;
+register char *cp;
+{
+ register char *fp = mcfind(cs, cp);
+ register size_t len = strlen(fp);
+
+ assert(fp != NULL);
+ (void) memmove(fp, fp + len + 1,
+ cs->smultis - (fp + len + 1 - cs->multis));
+ cs->smultis -= len;
+
+ if (cs->smultis == 0) {
+ free(cs->multis);
+ cs->multis = NULL;
+ return;
+ }
+
+ cs->multis = realloc(cs->multis, cs->smultis);
+ assert(cs->multis != NULL);
+}
+
+/*
+ - mcin - is a collating element in a cset?
+ == static int mcin(register cset *cs, register char *cp);
+ */
+static int
+mcin(cs, cp)
+register cset *cs;
+register char *cp;
+{
+ return(mcfind(cs, cp) != NULL);
+}
+
+/*
+ - mcfind - find a collating element in a cset
+ == static char *mcfind(register cset *cs, register char *cp);
+ */
+static char *
+mcfind(cs, cp)
+register cset *cs;
+register char *cp;
+{
+ register char *p;
+
+ if (cs->multis == NULL)
+ return(NULL);
+ for (p = cs->multis; *p != '\0'; p += strlen(p) + 1)
+ if (strcmp(cp, p) == 0)
+ return(p);
+ return(NULL);
+}
+
+/*
+ - mcinvert - invert the list of collating elements in a cset
+ == static void mcinvert(register struct parse *p, register cset *cs);
+ *
+ * This would have to know the set of possibilities. Implementation
+ * is deferred.
+ */
+static void
+mcinvert(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ assert(cs->multis == NULL); /* xxx */
+}
+
+/*
+ - mccase - add case counterparts of the list of collating elements in a cset
+ == static void mccase(register struct parse *p, register cset *cs);
+ *
+ * This would have to know the set of possibilities. Implementation
+ * is deferred.
+ */
+static void
+mccase(p, cs)
+register struct parse *p;
+register cset *cs;
+{
+ assert(cs->multis == NULL); /* xxx */
+}
+
+/*
+ - isinsets - is this character in any sets?
+ == static int isinsets(register struct re_guts *g, int c);
+ */
+static int /* predicate */
+isinsets(g, c)
+register struct re_guts *g;
+int c;
+{
+ register uch *col;
+ register int i;
+ register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
+ register unsigned uc = (unsigned char)c;
+
+ for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
+ if (col[uc] != 0)
+ return(1);
+ return(0);
+}
+
+/*
+ - samesets - are these two characters in exactly the same sets?
+ == static int samesets(register struct re_guts *g, int c1, int c2);
+ */
+static int /* predicate */
+samesets(g, c1, c2)
+register struct re_guts *g;
+int c1;
+int c2;
+{
+ register uch *col;
+ register int i;
+ register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
+ register unsigned uc1 = (unsigned char)c1;
+ register unsigned uc2 = (unsigned char)c2;
+
+ for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
+ if (col[uc1] != col[uc2])
+ return(0);
+ return(1);
+}
+
+/*
+ - categorize - sort out character categories
+ == static void categorize(struct parse *p, register struct re_guts *g);
+ */
+static void
+categorize(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+ register cat_t *cats = g->categories;
+ register int c;
+ register int c2;
+ register cat_t cat;
+
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ for (c = CHAR_MIN; c <= CHAR_MAX; c++)
+ if (cats[c] == 0 && isinsets(g, c)) {
+ cat = g->ncategories++;
+ cats[c] = cat;
+ for (c2 = c+1; c2 <= CHAR_MAX; c2++)
+ if (cats[c2] == 0 && samesets(g, c, c2))
+ cats[c2] = cat;
+ }
+}
+
+/*
+ - dupl - emit a duplicate of a bunch of sops
+ == static sopno dupl(register struct parse *p, sopno start, sopno finish);
+ */
+static sopno /* start of duplicate */
+dupl(p, start, finish)
+register struct parse *p;
+sopno start; /* from here */
+sopno finish; /* to this less one */
+{
+ register sopno ret = HERE();
+ register sopno len = finish - start;
+
+ assert(finish >= start);
+ if (len == 0)
+ return(ret);
+ enlarge(p, p->ssize + len); /* this many unexpected additions */
+ assert(p->ssize >= p->slen + len);
+ (void) memcpy((char *)(p->strip + p->slen),
+ (char *)(p->strip + start), (size_t)len*sizeof(sop));
+ p->slen += len;
+ return(ret);
+}
+
+/*
+ - doemit - emit a strip operator
+ == static void doemit(register struct parse *p, sop op, size_t opnd);
+ *
+ * It might seem better to implement this as a macro with a function as
+ * hard-case backup, but it's just too big and messy unless there are
+ * some changes to the data structures. Maybe later.
+ */
+static void
+doemit(p, op, opnd)
+register struct parse *p;
+sop op;
+size_t opnd;
+{
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ /* deal with oversize operands ("can't happen", more or less) */
+ assert(opnd < 1<<OPSHIFT);
+
+ /* deal with undersized strip */
+ if (p->slen >= p->ssize)
+ enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */
+ assert(p->slen < p->ssize);
+
+ /* finally, it's all reduced to the easy case */
+ p->strip[p->slen++] = SOP(op, opnd);
+}
+
+/*
+ - doinsert - insert a sop into the strip
+ == static void doinsert(register struct parse *p, sop op, size_t opnd, sopno pos);
+ */
+static void
+doinsert(p, op, opnd, pos)
+register struct parse *p;
+sop op;
+size_t opnd;
+sopno pos;
+{
+ register sopno sn;
+ register sop s;
+ register int i;
+
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ sn = HERE();
+ EMIT(op, opnd); /* do checks, ensure space */
+ assert(HERE() == sn+1);
+ s = p->strip[sn];
+
+ /* adjust paren pointers */
+ assert(pos > 0);
+ for (i = 1; i < NPAREN; i++) {
+ if (p->pbegin[i] >= pos) {
+ p->pbegin[i]++;
+ }
+ if (p->pend[i] >= pos) {
+ p->pend[i]++;
+ }
+ }
+
+ memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos],
+ (HERE()-pos-1)*sizeof(sop));
+ p->strip[pos] = s;
+}
+
+/*
+ - dofwd - complete a forward reference
+ == static void dofwd(register struct parse *p, sopno pos, sop value);
+ */
+static void
+dofwd(p, pos, value)
+register struct parse *p;
+register sopno pos;
+sop value;
+{
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ assert(value < 1<<OPSHIFT);
+ p->strip[pos] = OP(p->strip[pos]) | value;
+}
+
+/*
+ - enlarge - enlarge the strip
+ == static void enlarge(register struct parse *p, sopno size);
+ */
+static void
+enlarge(p, size)
+register struct parse *p;
+register sopno size;
+{
+ register sop *sp;
+
+ if (p->ssize >= size)
+ return;
+
+ sp = (sop *)realloc(p->strip, size*sizeof(sop));
+ if (sp == NULL) {
+ SETERROR(REG_ESPACE);
+ return;
+ }
+ p->strip = sp;
+ p->ssize = size;
+}
+
+/*
+ - stripsnug - compact the strip
+ == static void stripsnug(register struct parse *p, register struct re_guts *g);
+ */
+static void
+stripsnug(p, g)
+register struct parse *p;
+register struct re_guts *g;
+{
+ g->nstates = p->slen;
+ g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop));
+ if (g->strip == NULL) {
+ SETERROR(REG_ESPACE);
+ g->strip = p->strip;
+ }
+}
+
+/*
+ - findmust - fill in must and mlen with longest mandatory literal string
+ == static void findmust(register struct parse *p, register struct re_guts *g);
+ *
+ * This algorithm could do fancy things like analyzing the operands of |
+ * for common subsequences. Someday. This code is simple and finds most
+ * of the interesting cases.
+ *
+ * Note that must and mlen got initialized during setup.
+ */
+static void
+findmust(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+ register sop *scan;
+ sop *start;
+ register sop *newstart;
+ register sopno newlen;
+ register sop s;
+ register char *cp;
+ register sopno i;
+
+ /* avoid making error situations worse */
+ if (p->error != 0)
+ return;
+
+ /* find the longest OCHAR sequence in strip */
+ newlen = 0;
+ scan = g->strip + 1;
+ do {
+ s = *scan++;
+ switch (OP(s)) {
+ case OCHAR: /* sequence member */
+ if (newlen == 0) /* new sequence */
+ newstart = scan - 1;
+ newlen++;
+ break;
+ case OPLUS_: /* things that don't break one */
+ case OLPAREN:
+ case ORPAREN:
+ break;
+ case OQUEST_: /* things that must be skipped */
+ case OCH_:
+ scan--;
+ do {
+ scan += OPND(s);
+ s = *scan;
+ /* assert() interferes w debug printouts */
+ if (OP(s) != O_QUEST && OP(s) != O_CH &&
+ OP(s) != OOR2) {
+ g->iflags |= BAD;
+ return;
+ }
+ } while (OP(s) != O_QUEST && OP(s) != O_CH);
+ /* fallthrough */
+ default: /* things that break a sequence */
+ if (newlen > g->mlen) { /* ends one */
+ start = newstart;
+ g->mlen = newlen;
+ }
+ newlen = 0;
+ break;
+ }
+ } while (OP(s) != OEND);
+
+ if (g->mlen == 0) /* there isn't one */
+ return;
+
+ /* turn it into a character string */
+ g->must = malloc((size_t)g->mlen + 1);
+ if (g->must == NULL) { /* argh; just forget it */
+ g->mlen = 0;
+ return;
+ }
+ cp = g->must;
+ scan = start;
+ for (i = g->mlen; i > 0; i--) {
+ while (OP(s = *scan++) != OCHAR)
+ continue;
+ assert(cp < g->must + g->mlen);
+ *cp++ = (char)OPND(s);
+ }
+ assert(cp == g->must + g->mlen);
+ *cp++ = '\0'; /* just on general principles */
+}
+
+/*
+ - pluscount - count + nesting
+ == static sopno pluscount(register struct parse *p, register struct re_guts *g);
+ */
+static sopno /* nesting depth */
+pluscount(p, g)
+struct parse *p;
+register struct re_guts *g;
+{
+ register sop *scan;
+ register sop s;
+ register sopno plusnest = 0;
+ register sopno maxnest = 0;
+
+ if (p->error != 0)
+ return(0); /* there may not be an OEND */
+
+ scan = g->strip + 1;
+ do {
+ s = *scan++;
+ switch (OP(s)) {
+ case OPLUS_:
+ plusnest++;
+ break;
+ case O_PLUS:
+ if (plusnest > maxnest)
+ maxnest = plusnest;
+ plusnest--;
+ break;
+ }
+ } while (OP(s) != OEND);
+ if (plusnest != 0)
+ g->iflags |= BAD;
+ return(maxnest);
+}
diff --git a/xc/extras/regex/regerror.c b/xc/extras/regex/regerror.c
new file mode 100644
index 000000000..e53dafcfb
--- /dev/null
+++ b/xc/extras/regex/regerror.c
@@ -0,0 +1,126 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <limits.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regerror.ih"
+
+/*
+ = #define REG_OKAY 0
+ = #define REG_NOMATCH 1
+ = #define REG_BADPAT 2
+ = #define REG_ECOLLATE 3
+ = #define REG_ECTYPE 4
+ = #define REG_EESCAPE 5
+ = #define REG_ESUBREG 6
+ = #define REG_EBRACK 7
+ = #define REG_EPAREN 8
+ = #define REG_EBRACE 9
+ = #define REG_BADBR 10
+ = #define REG_ERANGE 11
+ = #define REG_ESPACE 12
+ = #define REG_BADRPT 13
+ = #define REG_EMPTY 14
+ = #define REG_ASSERT 15
+ = #define REG_INVARG 16
+ = #define REG_ATOI 255 // convert name to number (!)
+ = #define REG_ITOA 0400 // convert number to name (!)
+ */
+static struct rerr {
+ int code;
+ char *name;
+ char *explain;
+} rerrs[] = {
+ REG_OKAY, "REG_OKAY", "no errors detected",
+ REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match",
+ REG_BADPAT, "REG_BADPAT", "invalid regular expression",
+ REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element",
+ REG_ECTYPE, "REG_ECTYPE", "invalid character class",
+ REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)",
+ REG_ESUBREG, "REG_ESUBREG", "invalid backreference number",
+ REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced",
+ REG_EPAREN, "REG_EPAREN", "parentheses not balanced",
+ REG_EBRACE, "REG_EBRACE", "braces not balanced",
+ REG_BADBR, "REG_BADBR", "invalid repetition count(s)",
+ REG_ERANGE, "REG_ERANGE", "invalid character range",
+ REG_ESPACE, "REG_ESPACE", "out of memory",
+ REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid",
+ REG_EMPTY, "REG_EMPTY", "empty (sub)expression",
+ REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug",
+ REG_INVARG, "REG_INVARG", "invalid argument to regex routine",
+ -1, "", "*** unknown regexp error code ***",
+};
+
+/*
+ - regerror - the interface to error numbers
+ = extern size_t regerror(int, const regex_t *, char *, size_t);
+ */
+/* ARGSUSED */
+size_t
+regerror(errcode, preg, errbuf, errbuf_size)
+int errcode;
+const regex_t *preg;
+char *errbuf;
+size_t errbuf_size;
+{
+ register struct rerr *r;
+ register size_t len;
+ register int target = errcode &~ REG_ITOA;
+ register char *s;
+ char convbuf[50];
+
+ if (errcode == REG_ATOI)
+ s = regatoi(preg, convbuf);
+ else {
+ for (r = rerrs; r->code >= 0; r++)
+ if (r->code == target)
+ break;
+
+ if (errcode&REG_ITOA) {
+ if (r->code >= 0)
+ (void) strcpy(convbuf, r->name);
+ else
+ sprintf(convbuf, "REG_0x%x", target);
+ assert(strlen(convbuf) < sizeof(convbuf));
+ s = convbuf;
+ } else
+ s = r->explain;
+ }
+
+ len = strlen(s) + 1;
+ if (errbuf_size > 0) {
+ if (errbuf_size > len)
+ (void) strcpy(errbuf, s);
+ else {
+ (void) strncpy(errbuf, s, errbuf_size-1);
+ errbuf[errbuf_size-1] = '\0';
+ }
+ }
+
+ return(len);
+}
+
+/*
+ - regatoi - internal routine to implement REG_ATOI
+ == static char *regatoi(const regex_t *preg, char *localbuf);
+ */
+static char *
+regatoi(preg, localbuf)
+const regex_t *preg;
+char *localbuf;
+{
+ register struct rerr *r;
+
+ for (r = rerrs; r->code >= 0; r++)
+ if (strcmp(r->name, preg->re_endp) == 0)
+ break;
+ if (r->code < 0)
+ return("0");
+
+ sprintf(localbuf, "%d", r->code);
+ return(localbuf);
+}
diff --git a/xc/extras/regex/regex.3 b/xc/extras/regex/regex.3
new file mode 100644
index 000000000..bc747096d
--- /dev/null
+++ b/xc/extras/regex/regex.3
@@ -0,0 +1,509 @@
+.TH REGEX 3 "25 Sept 1997"
+.BY "Henry Spencer"
+.de ZR
+.\" one other place knows this name: the SEE ALSO section
+.IR regex (7) \\$1
+..
+.SH NAME
+regcomp, regexec, regerror, regfree \- regular-expression library
+.SH SYNOPSIS
+.ft B
+.\".na
+#include <sys/types.h>
+.br
+#include <regex.h>
+.HP 10
+int regcomp(regex_t\ *preg, const\ char\ *pattern, int\ cflags);
+.HP
+int\ regexec(const\ regex_t\ *preg, const\ char\ *string,
+size_t\ nmatch, regmatch_t\ pmatch[], int\ eflags);
+.HP
+size_t\ regerror(int\ errcode, const\ regex_t\ *preg,
+char\ *errbuf, size_t\ errbuf_size);
+.HP
+void\ regfree(regex_t\ *preg);
+.\".ad
+.ft
+.SH DESCRIPTION
+These routines implement POSIX 1003.2 regular expressions (``RE''s);
+see
+.ZR .
+.I Regcomp
+compiles an RE written as a string into an internal form,
+.I regexec
+matches that internal form against a string and reports results,
+.I regerror
+transforms error codes from either into human-readable messages,
+and
+.I regfree
+frees any dynamically-allocated storage used by the internal form
+of an RE.
+.PP
+The header
+.I <regex.h>
+declares two structure types,
+.I regex_t
+and
+.IR regmatch_t ,
+the former for compiled internal forms and the latter for match reporting.
+It also declares the four functions,
+a type
+.IR regoff_t ,
+and a number of constants with names starting with ``REG_''.
+.PP
+.I Regcomp
+compiles the regular expression contained in the
+.I pattern
+string,
+subject to the flags in
+.IR cflags ,
+and places the results in the
+.I regex_t
+structure pointed to by
+.IR preg .
+.I Cflags
+is the bitwise OR of zero or more of the following flags:
+.IP REG_EXTENDED \w'REG_EXTENDED'u+2n
+Compile modern (``extended'') REs,
+rather than the obsolete (``basic'') REs that
+are the default.
+.IP REG_BASIC
+This is a synonym for 0,
+provided as a counterpart to REG_EXTENDED to improve readability.
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+.IP REG_NOSPEC
+Compile with recognition of all special characters turned off.
+All characters are thus considered ordinary,
+so the ``RE'' is a literal string.
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+REG_EXTENDED and REG_NOSPEC may not be used
+in the same call to
+.IR regcomp .
+.IP REG_ICASE
+Compile for matching that ignores upper/lower case distinctions.
+See
+.ZR .
+.IP REG_NOSUB
+Compile for matching that need only report success or failure,
+not what was matched.
+.IP REG_NEWLINE
+Compile for newline-sensitive matching.
+By default, newline is a completely ordinary character with no special
+meaning in either REs or strings.
+With this flag,
+`[^' bracket expressions and `.' never match newline,
+a `^' anchor matches the null string after any newline in the string
+in addition to its normal function,
+and the `$' anchor matches the null string before any newline in the
+string in addition to its normal function.
+.IP REG_PEND
+The regular expression ends,
+not at the first NUL,
+but just before the character pointed to by the
+.I re_endp
+member of the structure pointed to by
+.IR preg .
+The
+.I re_endp
+member is of type
+.IR const\ char\ * .
+This flag permits inclusion of NULs in the RE;
+they are considered ordinary characters.
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+.PP
+When successful,
+.I regcomp
+returns 0 and fills in the structure pointed to by
+.IR preg .
+One member of that structure
+(other than
+.IR re_endp )
+is publicized:
+.IR re_nsub ,
+of type
+.IR size_t ,
+contains the number of parenthesized subexpressions within the RE
+(except that the value of this member is undefined if the
+REG_NOSUB flag was used).
+If
+.I regcomp
+fails, it returns a non-zero error code;
+see DIAGNOSTICS.
+.PP
+.I Regexec
+matches the compiled RE pointed to by
+.I preg
+against the
+.IR string ,
+subject to the flags in
+.IR eflags ,
+and reports results using
+.IR nmatch ,
+.IR pmatch ,
+and the returned value.
+The RE must have been compiled by a previous invocation of
+.IR regcomp .
+The compiled form is not altered during execution of
+.IR regexec ,
+so a single compiled RE can be used simultaneously by multiple threads.
+.PP
+By default,
+the NUL-terminated string pointed to by
+.I string
+is considered to be the text of an entire line,
+with the NUL indicating the end of the line.
+(That is,
+any other end-of-line marker is considered to have been removed
+and replaced by the NUL.)
+The
+.I eflags
+argument is the bitwise OR of zero or more of the following flags:
+.IP REG_NOTBOL \w'REG_STARTEND'u+2n
+The first character of
+the string
+is not the beginning of a line, so the `^' anchor should not match before it.
+This does not affect the behavior of newlines under REG_NEWLINE.
+.IP REG_NOTEOL
+The NUL terminating
+the string
+does not end a line, so the `$' anchor should not match before it.
+This does not affect the behavior of newlines under REG_NEWLINE.
+.IP REG_STARTEND
+The string is considered to start at
+\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_so\fR
+and to have a terminating NUL located at
+\fIstring\fR\ + \fIpmatch\fR[0].\fIrm_eo\fR
+(there need not actually be a NUL at that location),
+regardless of the value of
+.IR nmatch .
+See below for the definition of
+.IR pmatch
+and
+.IR nmatch .
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+Note that a non-zero \fIrm_so\fR does not imply REG_NOTBOL;
+REG_STARTEND affects only the location of the string,
+not how it is matched.
+.PP
+See
+.ZR
+for a discussion of what is matched in situations where an RE or a
+portion thereof could match any of several substrings of
+.IR string .
+.PP
+Normally,
+.I regexec
+returns 0 for success and the non-zero code REG_NOMATCH for failure.
+Other non-zero error codes may be returned in exceptional situations;
+see DIAGNOSTICS.
+.PP
+If REG_NOSUB was specified in the compilation of the RE,
+or if
+.I nmatch
+is 0,
+.I regexec
+ignores the
+.I pmatch
+argument (but see below for the case where REG_STARTEND is specified).
+Otherwise,
+.I pmatch
+points to an array of
+.I nmatch
+structures of type
+.IR regmatch_t .
+Such a structure has at least the members
+.I rm_so
+and
+.IR rm_eo ,
+both of type
+.I regoff_t
+(a signed arithmetic type at least as large as an
+.I off_t
+and a
+.IR ssize_t ),
+containing respectively the offset of the first character of a substring
+and the offset of the first character after the end of the substring.
+Offsets are measured from the beginning of the
+.I string
+argument given to
+.IR regexec .
+An empty substring is denoted by equal offsets,
+both indicating the character following the empty substring.
+.PP
+The 0th member of the
+.I pmatch
+array is filled in to indicate what substring of
+.I string
+was matched by the entire RE.
+Remaining members report what substring was matched by parenthesized
+subexpressions within the RE;
+member
+.I i
+reports subexpression
+.IR i ,
+with subexpressions counted (starting at 1) by the order of their opening
+parentheses in the RE, left to right.
+Unused entries in the array\(emcorresponding either to subexpressions that
+did not participate in the match at all, or to subexpressions that do not
+exist in the RE (that is, \fIi\fR\ > \fIpreg\fR\->\fIre_nsub\fR)\(emhave both
+.I rm_so
+and
+.I rm_eo
+set to \-1.
+If a subexpression participated in the match several times,
+the reported substring is the last one it matched.
+(Note, as an example in particular, that when the RE `(b*)+' matches `bbb',
+the parenthesized subexpression matches the three `b's and then
+an infinite number of empty strings following the last `b',
+so the reported substring is one of the empties.)
+.PP
+If REG_STARTEND is specified,
+.I pmatch
+must point to at least one
+.I regmatch_t
+(even if
+.I nmatch
+is 0 or REG_NOSUB was specified),
+to hold the input offsets for REG_STARTEND.
+Use for output is still entirely controlled by
+.IR nmatch ;
+if
+.I nmatch
+is 0 or REG_NOSUB was specified,
+the value of
+.IR pmatch [0]
+will not be changed by a successful
+.IR regexec .
+.PP
+.I Regerror
+maps a non-zero
+.I errcode
+from either
+.I regcomp
+or
+.I regexec
+to a human-readable, printable message.
+If
+.I preg
+is non-NULL,
+the error code should have arisen from use of
+the
+.I regex_t
+pointed to by
+.IR preg ,
+and if the error code came from
+.IR regcomp ,
+it should have been the result from the most recent
+.I regcomp
+using that
+.IR regex_t .
+.RI ( Regerror
+may be able to supply a more detailed message using information
+from the
+.IR regex_t .)
+.I Regerror
+places the NUL-terminated message into the buffer pointed to by
+.IR errbuf ,
+limiting the length (including the NUL) to at most
+.I errbuf_size
+bytes.
+If the whole message won't fit,
+as much of it as will fit before the terminating NUL is supplied.
+In any case,
+the returned value is the size of buffer needed to hold the whole
+message (including terminating NUL).
+If
+.I errbuf_size
+is 0,
+.I errbuf
+is ignored but the return value is still correct.
+.PP
+If the
+.I errcode
+given to
+.I regerror
+is first ORed with REG_ITOA,
+the ``message'' that results is the printable name of the error code,
+e.g. ``REG_NOMATCH'',
+rather than an explanation thereof.
+If
+.I errcode
+is REG_ATOI,
+then
+.I preg
+shall be non-NULL and the
+.I re_endp
+member of the structure it points to
+must point to the printable name of an error code;
+in this case, the result in
+.I errbuf
+is the decimal digits of
+the numeric value of the error code
+(0 if the name is not recognized).
+REG_ITOA and REG_ATOI are intended primarily as debugging facilities;
+they are extensions,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+Be warned also that they are considered experimental and changes are possible.
+.PP
+.I Regfree
+frees any dynamically-allocated storage associated with the compiled RE
+pointed to by
+.IR preg .
+The remaining
+.I regex_t
+is no longer a valid compiled RE
+and the effect of supplying it to
+.I regexec
+or
+.I regerror
+is undefined.
+.PP
+None of these functions references global variables except for tables
+of constants;
+all are safe for use from multiple threads if the arguments are safe.
+.SH IMPLEMENTATION CHOICES
+There are a number of decisions that 1003.2 leaves up to the implementor,
+either by explicitly saying ``undefined'' or by virtue of them being
+forbidden by the RE grammar.
+This implementation treats them as follows.
+.PP
+See
+.ZR
+for a discussion of the definition of case-independent matching.
+.PP
+There is no particular limit on the length of REs,
+except insofar as memory is limited.
+Memory usage is approximately linear in RE size, and largely insensitive
+to RE complexity, except for bounded repetitions.
+See BUGS for one short RE using them
+that will run almost any system out of memory.
+.PP
+A backslashed character other than one specifically given a magic meaning
+by 1003.2 (such magic meanings occur only in obsolete [``basic''] REs)
+is taken as an ordinary character.
+.PP
+Any unmatched [ is a REG_EBRACK error.
+.PP
+Equivalence classes cannot begin or end bracket-expression ranges.
+The endpoint of one range cannot begin another.
+.PP
+RE_DUP_MAX, the limit on repetition counts in bounded repetitions, is 255.
+.PP
+A repetition operator (?, *, +, or bounds) cannot follow another
+repetition operator.
+A repetition operator cannot begin an expression or subexpression
+or follow `^' or `|'.
+.PP
+`|' cannot appear first or last in a (sub)expression or after another `|',
+i.e. an operand of `|' cannot be an empty subexpression.
+An empty parenthesized subexpression, `()', is legal and matches an
+empty (sub)string.
+An empty string is not a legal RE.
+.PP
+A `{' followed by a digit is considered the beginning of bounds for a
+bounded repetition, which must then follow the syntax for bounds.
+A `{' \fInot\fR followed by a digit is considered an ordinary character.
+.PP
+`^' and `$' beginning and ending subexpressions in obsolete (``basic'')
+REs are anchors, not ordinary characters.
+.SH SEE ALSO
+grep(1), regex(7)
+.PP
+POSIX 1003.2, sections 2.8 (Regular Expression Notation)
+and
+B.5 (C Binding for Regular Expression Matching).
+.SH DIAGNOSTICS
+Non-zero error codes from
+.I regcomp
+and
+.I regexec
+include the following:
+.PP
+.nf
+.ta \w'REG_ECOLLATE'u+3n
+REG_NOMATCH regexec() failed to match
+REG_BADPAT invalid regular expression
+REG_ECOLLATE invalid collating element
+REG_ECTYPE invalid character class
+REG_EESCAPE \e applied to unescapable character
+REG_ESUBREG invalid backreference number
+REG_EBRACK brackets [ ] not balanced
+REG_EPAREN parentheses ( ) not balanced
+REG_EBRACE braces { } not balanced
+REG_BADBR invalid repetition count(s) in { }
+REG_ERANGE invalid character range in [ ]
+REG_ESPACE ran out of memory
+REG_BADRPT ?, *, or + operand invalid
+REG_EMPTY empty (sub)expression
+REG_ASSERT ``can't happen''\(emyou found a bug
+REG_INVARG invalid argument, e.g. negative-length string
+.fi
+.SH HISTORY
+Written by Henry Spencer,
+henry@zoo.toronto.edu.
+.SH BUGS
+This is an alpha release with known defects.
+Please report problems.
+.PP
+There is one known functionality bug.
+The implementation of internationalization is incomplete:
+the locale is always assumed to be the default one of 1003.2,
+and only the collating elements etc. of that locale are available.
+.PP
+The back-reference code is subtle and doubts linger about its correctness
+in complex cases.
+.PP
+.I Regexec
+performance is poor.
+This will improve with later releases.
+.I Nmatch
+exceeding 0 is expensive;
+.I nmatch
+exceeding 1 is worse.
+.I Regexec
+is largely insensitive to RE complexity \fIexcept\fR that back
+references are massively expensive.
+RE length does matter; in particular, there is a strong speed bonus
+for keeping RE length under about 30 characters,
+with most special characters counting roughly double.
+.PP
+.I Regcomp
+implements bounded repetitions by macro expansion,
+which is costly in time and space if counts are large
+or bounded repetitions are nested.
+An RE like, say,
+`((((a{1,100}){1,100}){1,100}){1,100}){1,100}'
+will (eventually) run almost any existing machine out of swap space.
+.PP
+There are suspected problems with response to obscure error conditions.
+Notably,
+certain kinds of internal overflow,
+produced only by truly enormous REs or by multiply nested bounded repetitions,
+are probably not handled well.
+.PP
+Due to a mistake in 1003.2, things like `a)b' are legal REs because `)' is
+a special character only in the presence of a previous unmatched `('.
+This can't be fixed until the spec is fixed.
+.PP
+The standard's definition of back references is vague.
+For example, does
+`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?
+Until the standard is clarified,
+behavior in such cases should not be relied on.
+.PP
+The implementation of word-boundary matching is a bit of a kludge,
+and bugs may lurk in combinations of word-boundary matching and anchoring.
diff --git a/xc/extras/regex/regex.7 b/xc/extras/regex/regex.7
new file mode 100644
index 000000000..0fa180269
--- /dev/null
+++ b/xc/extras/regex/regex.7
@@ -0,0 +1,235 @@
+.TH REGEX 7 "25 Oct 1995"
+.BY "Henry Spencer"
+.SH NAME
+regex \- POSIX 1003.2 regular expressions
+.SH DESCRIPTION
+Regular expressions (``RE''s),
+as defined in POSIX 1003.2, come in two forms:
+modern REs (roughly those of
+.IR egrep ;
+1003.2 calls these ``extended'' REs)
+and obsolete REs (roughly those of
+.IR ed ;
+1003.2 ``basic'' REs).
+Obsolete REs mostly exist for backward compatibility in some old programs;
+they will be discussed at the end.
+1003.2 leaves some aspects of RE syntax and semantics open;
+`\(dg' marks decisions on these aspects that
+may not be fully portable to other 1003.2 implementations.
+.PP
+A (modern) RE is one\(dg or more non-empty\(dg \fIbranches\fR,
+separated by `|'.
+It matches anything that matches one of the branches.
+.PP
+A branch is one\(dg or more \fIpieces\fR, concatenated.
+It matches a match for the first, followed by a match for the second, etc.
+.PP
+A piece is an \fIatom\fR possibly followed
+by a single\(dg `*', `+', `?', or \fIbound\fR.
+An atom followed by `*' matches a sequence of 0 or more matches of the atom.
+An atom followed by `+' matches a sequence of 1 or more matches of the atom.
+An atom followed by `?' matches a sequence of 0 or 1 matches of the atom.
+.PP
+A \fIbound\fR is `{' followed by an unsigned decimal integer,
+possibly followed by `,'
+possibly followed by another unsigned decimal integer,
+always followed by `}'.
+The integers must lie between 0 and RE_DUP_MAX (255\(dg) inclusive,
+and if there are two of them, the first may not exceed the second.
+An atom followed by a bound containing one integer \fIi\fR
+and no comma matches
+a sequence of exactly \fIi\fR matches of the atom.
+An atom followed by a bound
+containing one integer \fIi\fR and a comma matches
+a sequence of \fIi\fR or more matches of the atom.
+An atom followed by a bound
+containing two integers \fIi\fR and \fIj\fR matches
+a sequence of \fIi\fR through \fIj\fR (inclusive) matches of the atom.
+.PP
+An atom is a regular expression enclosed in `()' (matching a match for the
+regular expression),
+an empty set of `()' (matching the null string)\(dg,
+a \fIbracket expression\fR (see below), `.'
+(matching any single character), `^' (matching the null string at the
+beginning of a line), `$' (matching the null string at the
+end of a line), a `\e' followed by one of the characters
+`^.[$()|*+?{\e'
+(matching that character taken as an ordinary character),
+a `\e' followed by any other character\(dg
+(matching that character taken as an ordinary character,
+as if the `\e' had not been present\(dg),
+or a single character with no other significance (matching that character).
+A `{' followed by a character other than a digit is an ordinary
+character, not the beginning of a bound\(dg.
+It is illegal to end an RE with `\e'.
+.PP
+A \fIbracket expression\fR is a list of characters enclosed in `[]'.
+It normally matches any single character from the list (but see below).
+If the list begins with `^',
+it matches any single character
+(but see below) \fInot\fR from the rest of the list.
+If two characters in the list are separated by `\-', this is shorthand
+for the full \fIrange\fR of characters between those two (inclusive) in the
+collating sequence,
+e.g. `[0\-9]' in ASCII matches any decimal digit.
+It is illegal\(dg for two ranges to share an
+endpoint, e.g. `a\-c\-e'.
+Ranges are very collating-sequence-dependent,
+and portable programs should avoid relying on them.
+.PP
+To include a literal `]' in the list, make it the first character
+(following a possible `^').
+To include a literal `\-', make it the first or last character,
+or the second endpoint of a range.
+To use a literal `\-' as the first endpoint of a range,
+enclose it in `[.' and `.]' to make it a collating element (see below).
+With the exception of these and some combinations using `[' (see next
+paragraphs), all other special characters, including `\e', lose their
+special significance within a bracket expression.
+.PP
+Within a bracket expression, a collating element (a character,
+a multi-character sequence that collates as if it were a single character,
+or a collating-sequence name for either)
+enclosed in `[.' and `.]' stands for the
+sequence of characters of that collating element.
+The sequence is a single element of the bracket expression's list.
+A bracket expression containing a multi-character collating element
+can thus match more than one character,
+e.g. if the collating sequence includes a `ch' collating element,
+then the RE `[[.ch.]]*c' matches the first five characters
+of `chchcc'.
+.PP
+Within a bracket expression, a collating element enclosed in `[=' and
+`=]' is an equivalence class, standing for the sequences of characters
+of all collating elements equivalent to that one, including itself.
+(If there are no other equivalent collating elements,
+the treatment is as if the enclosing delimiters were `[.' and `.]'.)
+For example, if o and \o'o^' are the members of an equivalence class,
+then `[[=o=]]', `[[=\o'o^'=]]', and `[o\o'o^']' are all synonymous.
+An equivalence class may not\(dg be an endpoint
+of a range.
+.PP
+Within a bracket expression, the name of a \fIcharacter class\fR enclosed
+in `[:' and `:]' stands for the list of all characters belonging to that
+class.
+Standard character class names are:
+.PP
+.RS
+.nf
+.ta 3c 6c 9c
+alnum digit punct
+alpha graph space
+blank lower upper
+cntrl print xdigit
+.fi
+.RE
+.PP
+These stand for the character classes defined in
+.IR ctype (3).
+A locale may provide others.
+A character class may not be used as an endpoint of a range.
+.PP
+There are two special cases\(dg of bracket expressions:
+the bracket expressions `[[:<:]]' and `[[:>:]]' match the null string at
+the beginning and end of a word respectively.
+A word is defined as a sequence of
+word characters
+which is neither preceded nor followed by
+word characters.
+A word character is an
+.I alnum
+character (as defined by
+.IR ctype (3))
+or an underscore.
+This is an extension,
+compatible with but not specified by POSIX 1003.2,
+and should be used with
+caution in software intended to be portable to other systems.
+.PP
+In the event that an RE could match more than one substring of a given
+string,
+the RE matches the one starting earliest in the string.
+If the RE could match more than one substring starting at that point,
+it matches the longest.
+Subexpressions also match the longest possible substrings, subject to
+the constraint that the whole match be as long as possible,
+with subexpressions starting earlier in the RE taking priority over
+ones starting later.
+Note that higher-level subexpressions thus take priority over
+their lower-level component subexpressions.
+.PP
+Match lengths are measured in characters, not collating elements.
+A null string is considered longer than no match at all.
+For example,
+`bb*' matches the three middle characters of `abbbc',
+`(wee|week)(knights|nights)' matches all ten characters of `weeknights',
+when `(.*).*' is matched against `abc' the parenthesized subexpression
+matches all three characters, and
+when `(a*)*' is matched against `bc' both the whole RE and the parenthesized
+subexpression match the null string.
+.PP
+If case-independent matching is specified,
+the effect is much as if all case distinctions had vanished from the
+alphabet.
+When an alphabetic that exists in multiple cases appears as an
+ordinary character outside a bracket expression, it is effectively
+transformed into a bracket expression containing both cases,
+e.g. `x' becomes `[xX]'.
+When it appears inside a bracket expression, all case counterparts
+of it are added to the bracket expression, so that (e.g.) `[x]'
+becomes `[xX]' and `[^x]' becomes `[^xX]'.
+.PP
+No particular limit is imposed on the length of REs\(dg.
+Programs intended to be portable should not employ REs longer
+than 256 bytes,
+as an implementation can refuse to accept such REs and remain
+POSIX-compliant.
+.PP
+Obsolete (``basic'') regular expressions differ in several respects.
+`|', `+', and `?' are ordinary characters and there is no equivalent
+for their functionality.
+The delimiters for bounds are `\e{' and `\e}',
+with `{' and `}' by themselves ordinary characters.
+The parentheses for nested subexpressions are `\e(' and `\e)',
+with `(' and `)' by themselves ordinary characters.
+`^' is an ordinary character except at the beginning of the
+RE or\(dg the beginning of a parenthesized subexpression,
+`$' is an ordinary character except at the end of the
+RE or\(dg the end of a parenthesized subexpression,
+and `*' is an ordinary character if it appears at the beginning of the
+RE or the beginning of a parenthesized subexpression
+(after a possible leading `^').
+Finally, there is one new type of atom, a \fIback reference\fR:
+`\e' followed by a non-zero decimal digit \fId\fR
+matches the same sequence of characters
+matched by the \fId\fRth parenthesized subexpression
+(numbering subexpressions by the positions of their opening parentheses,
+left to right),
+so that (e.g.) `\e([bc]\e)\e1' matches `bb' or `cc' but not `bc'.
+.SH SEE ALSO
+regex(3)
+.PP
+POSIX 1003.2, section 2.8 (Regular Expression Notation).
+.SH HISTORY
+Written by Henry Spencer, based on the 1003.2 spec.
+.SH BUGS
+Having two kinds of REs is a botch.
+.PP
+The current 1003.2 spec says that `)' is an ordinary character in
+the absence of an unmatched `(';
+this was an unintentional result of a wording error,
+and change is likely.
+Avoid relying on it.
+.PP
+Back references are a dreadful botch,
+posing major problems for efficient implementations.
+They are also somewhat vaguely defined
+(does
+`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?).
+Avoid using them.
+.PP
+1003.2's specification of case-independent matching is vague.
+The ``one case implies all cases'' definition given above
+is current consensus among implementors as to the right interpretation.
+.PP
+The syntax for word boundaries is incredibly ugly.
diff --git a/xc/extras/regex/regex2.h b/xc/extras/regex/regex2.h
new file mode 100644
index 000000000..58fd8d8a4
--- /dev/null
+++ b/xc/extras/regex/regex2.h
@@ -0,0 +1,134 @@
+/*
+ * First, the stuff that ends up in the outside-world include file
+ = typedef off_t regoff_t;
+ = typedef struct {
+ = int re_magic;
+ = size_t re_nsub; // number of parenthesized subexpressions
+ = const char *re_endp; // end pointer for REG_PEND
+ = struct re_guts *re_g; // none of your business :-)
+ = } regex_t;
+ = typedef struct {
+ = regoff_t rm_so; // start of match
+ = regoff_t rm_eo; // end of match
+ = } regmatch_t;
+ */
+/*
+ * internals of regex_t
+ */
+#define MAGIC1 ((('r'^0200)<<8) | 'e')
+
+/*
+ * The internal representation is a *strip*, a sequence of
+ * operators ending with an endmarker. (Some terminology etc. is a
+ * historical relic of earlier versions which used multiple strips.)
+ * Certain oddities in the representation are there to permit running
+ * the machinery backwards; in particular, any deviation from sequential
+ * flow must be marked at both its source and its destination. Some
+ * fine points:
+ *
+ * - OPLUS_ and O_PLUS are *inside* the loop they create.
+ * - OQUEST_ and O_QUEST are *outside* the bypass they create.
+ * - OCH_ and O_CH are *outside* the multi-way branch they create, while
+ * OOR1 and OOR2 are respectively the end and the beginning of one of
+ * the branches. Note that there is an implicit OOR2 following OCH_
+ * and an implicit OOR1 preceding O_CH.
+ *
+ * In state representations, an operator's bit is on to signify a state
+ * immediately *preceding* "execution" of that operator.
+ */
+typedef long sop; /* strip operator */
+typedef long sopno;
+#define OPRMASK 0x7c000000
+#define OPDMASK 0x03ffffff
+#define OPSHIFT (26)
+#define OP(n) ((n)&OPRMASK)
+#define OPND(n) ((n)&OPDMASK)
+#define SOP(op, opnd) ((op)|(opnd))
+/* operators meaning operand */
+/* (back, fwd are offsets) */
+#define OEND (1<<OPSHIFT) /* endmarker - */
+#define OCHAR (2<<OPSHIFT) /* character unsigned char */
+#define OBOL (3<<OPSHIFT) /* left anchor - */
+#define OEOL (4<<OPSHIFT) /* right anchor - */
+#define OANY (5<<OPSHIFT) /* . - */
+#define OANYOF (6<<OPSHIFT) /* [...] set number */
+#define OBACK_ (7<<OPSHIFT) /* begin \d paren number */
+#define O_BACK (8<<OPSHIFT) /* end \d paren number */
+#define OPLUS_ (9<<OPSHIFT) /* + prefix fwd to suffix */
+#define O_PLUS (10<<OPSHIFT) /* + suffix back to prefix */
+#define OQUEST_ (11<<OPSHIFT) /* ? prefix fwd to suffix */
+#define O_QUEST (12<<OPSHIFT) /* ? suffix back to prefix */
+#define OLPAREN (13<<OPSHIFT) /* ( fwd to ) */
+#define ORPAREN (14<<OPSHIFT) /* ) back to ( */
+#define OCH_ (15<<OPSHIFT) /* begin choice fwd to OOR2 */
+#define OOR1 (16<<OPSHIFT) /* | pt. 1 back to OOR1 or OCH_ */
+#define OOR2 (17<<OPSHIFT) /* | pt. 2 fwd to OOR2 or O_CH */
+#define O_CH (18<<OPSHIFT) /* end choice back to OOR1 */
+#define OBOW (19<<OPSHIFT) /* begin word - */
+#define OEOW (20<<OPSHIFT) /* end word - */
+
+/*
+ * Structure for [] character-set representation. Character sets are
+ * done as bit vectors, grouped 8 to a byte vector for compactness.
+ * The individual set therefore has both a pointer to the byte vector
+ * and a mask to pick out the relevant bit of each byte. A hash code
+ * simplifies testing whether two sets could be identical.
+ *
+ * This will get trickier for multicharacter collating elements. As
+ * preliminary hooks for dealing with such things, we also carry along
+ * a string of multi-character elements, and decide the size of the
+ * vectors at run time.
+ */
+typedef struct {
+ uch *ptr; /* -> uch [csetsize] */
+ uch mask; /* bit within array */
+ uch hash; /* hash code */
+ size_t smultis;
+ char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */
+} cset;
+/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
+#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c))
+#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c))
+#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask)
+#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */
+#define MCsub(p, cs, cp) mcsub(p, cs, cp)
+#define MCin(p, cs, cp) mcin(p, cs, cp)
+
+/* stuff for character categories */
+typedef unsigned char cat_t;
+
+/*
+ * main compiled-expression structure
+ */
+struct re_guts {
+ int magic;
+# define MAGIC2 ((('R'^0200)<<8)|'E')
+ sop *strip; /* malloced area for strip */
+ int csetsize; /* number of bits in a cset vector */
+ int ncsets; /* number of csets in use */
+ cset *sets; /* -> cset [ncsets] */
+ uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */
+ int cflags; /* copy of regcomp() cflags argument */
+ sopno nstates; /* = number of sops */
+ sopno firststate; /* the initial OEND (normally 0) */
+ sopno laststate; /* the final OEND */
+ int iflags; /* internal flags */
+# define USEBOL 01 /* used ^ */
+# define USEEOL 02 /* used $ */
+# define BAD 04 /* something wrong */
+ int nbol; /* number of ^ used */
+ int neol; /* number of $ used */
+ int ncategories; /* how many character categories */
+ cat_t *categories; /* ->catspace[-CHAR_MIN] */
+ char *must; /* match must contain this string */
+ int mlen; /* length of must */
+ size_t nsub; /* copy of re_nsub */
+ int backrefs; /* does it use back references? */
+ sopno nplus; /* how deep does it nest +s? */
+ /* catspace must be last */
+ cat_t catspace[1]; /* actually [NC] */
+};
+
+/* misc utilities */
+#define OUT (CHAR_MAX+1) /* a non-character value */
+#define ISWORD(c) (isalnum(c) || (c) == '_')
diff --git a/xc/extras/regex/regexec.c b/xc/extras/regex/regexec.c
new file mode 100644
index 000000000..dcb11b285
--- /dev/null
+++ b/xc/extras/regex/regexec.c
@@ -0,0 +1,138 @@
+/*
+ * the outer shell of regexec()
+ *
+ * This file includes engine.c *twice*, after muchos fiddling with the
+ * macros that code uses. This lets the same code operate on two different
+ * representations for state sets.
+ */
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <ctype.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+static int nope = 0; /* for use in asserts; shuts lint up */
+
+/* macros for manipulating states, small version */
+#define states unsigned
+#define states1 unsigned /* for later use in regexec() decision */
+#define CLEAR(v) ((v) = 0)
+#define SET0(v, n) ((v) &= ~((unsigned)1 << (n)))
+#define SET1(v, n) ((v) |= (unsigned)1 << (n))
+#define ISSET(v, n) ((v) & ((unsigned)1 << (n)))
+#define ASSIGN(d, s) ((d) = (s))
+#define EQ(a, b) ((a) == (b))
+#define STATEVARS int dummy /* dummy version */
+#define STATESETUP(m, n) /* nothing */
+#define STATETEARDOWN(m) /* nothing */
+#define SETUP(v) ((v) = 0)
+#define onestate unsigned
+#define INIT(o, n) ((o) = (unsigned)1 << (n))
+#define INC(o) ((o) <<= 1)
+#define ISSTATEIN(v, o) ((v) & (o))
+/* some abbreviations; note that some of these know variable names! */
+/* do "if I'm here, I can also be there" etc without branches */
+#define FWD(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) << (n))
+#define BACK(dst, src, n) ((dst) |= ((unsigned)(src)&(here)) >> (n))
+#define ISSETBACK(v, n) ((v) & ((unsigned)here >> (n)))
+/* function names */
+#define SNAMES /* engine.c looks after details */
+
+#include "engine.c"
+
+/* now undo things */
+#undef states
+#undef CLEAR
+#undef SET0
+#undef SET1
+#undef ISSET
+#undef ASSIGN
+#undef EQ
+#undef STATEVARS
+#undef STATESETUP
+#undef STATETEARDOWN
+#undef SETUP
+#undef onestate
+#undef INIT
+#undef INC
+#undef ISSTATEIN
+#undef FWD
+#undef BACK
+#undef ISSETBACK
+#undef SNAMES
+
+/* macros for manipulating states, large version */
+#define states char *
+#define CLEAR(v) memset(v, 0, m->g->nstates)
+#define SET0(v, n) ((v)[n] = 0)
+#define SET1(v, n) ((v)[n] = 1)
+#define ISSET(v, n) ((v)[n])
+#define ASSIGN(d, s) memcpy(d, s, m->g->nstates)
+#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0)
+#define STATEVARS int vn; char *space
+#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \
+ if ((m)->space == NULL) return(REG_ESPACE); \
+ (m)->vn = 0; }
+#define STATETEARDOWN(m) { free((m)->space); }
+#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates])
+#define onestate int
+#define INIT(o, n) ((o) = (n))
+#define INC(o) ((o)++)
+#define ISSTATEIN(v, o) ((v)[o])
+/* some abbreviations; note that some of these know variable names! */
+/* do "if I'm here, I can also be there" etc without branches */
+#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here])
+#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here])
+#define ISSETBACK(v, n) ((v)[here - (n)])
+/* function names */
+#define LNAMES /* flag */
+
+#include "engine.c"
+
+/*
+ - regexec - interface for matching
+ = extern int regexec(const regex_t *, const char *, size_t, \
+ = regmatch_t [], int);
+ = #define REG_NOTBOL 00001
+ = #define REG_NOTEOL 00002
+ = #define REG_STARTEND 00004
+ = #define REG_TRACE 00400 // tracing of execution
+ = #define REG_LARGE 01000 // force large representation
+ = #define REG_BACKR 02000 // force use of backref code
+ *
+ * We put this here so we can exploit knowledge of the state representation
+ * when choosing which matcher to call. Also, by this point the matchers
+ * have been prototyped.
+ */
+int /* 0 success, REG_NOMATCH failure */
+regexec(preg, string, nmatch, pmatch, eflags)
+const regex_t *preg;
+const char *string;
+size_t nmatch;
+regmatch_t pmatch[];
+int eflags;
+{
+ register struct re_guts *g = preg->re_g;
+#ifdef REDEBUG
+# define GOODFLAGS(f) (f)
+#else
+# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
+#endif
+
+ if (preg->re_magic != MAGIC1 || g->magic != MAGIC2)
+ return(REG_BADPAT);
+ assert(!(g->iflags&BAD));
+ if (g->iflags&BAD) /* backstop for no-debug case */
+ return(REG_BADPAT);
+ eflags = GOODFLAGS(eflags);
+
+ if (g->nstates <= CHAR_BIT*sizeof(states1) && !(eflags&REG_LARGE))
+ return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
+ else
+ return(lmatcher(g, (char *)string, nmatch, pmatch, eflags));
+}
diff --git a/xc/extras/regex/regfree.c b/xc/extras/regex/regfree.c
new file mode 100644
index 000000000..9a6acf173
--- /dev/null
+++ b/xc/extras/regex/regfree.c
@@ -0,0 +1,37 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <regex.h>
+
+#include "utils.h"
+#include "regex2.h"
+
+/*
+ - regfree - free everything
+ = extern void regfree(regex_t *);
+ */
+void
+regfree(preg)
+regex_t *preg;
+{
+ register struct re_guts *g;
+
+ if (preg->re_magic != MAGIC1) /* oops */
+ return; /* nice to complain, but hard */
+
+ g = preg->re_g;
+ if (g == NULL || g->magic != MAGIC2) /* oops again */
+ return;
+ preg->re_magic = 0; /* mark it invalid */
+ g->magic = 0; /* mark it invalid */
+
+ if (g->strip != NULL)
+ free((char *)g->strip);
+ if (g->sets != NULL)
+ free((char *)g->sets);
+ if (g->setbits != NULL)
+ free((char *)g->setbits);
+ if (g->must != NULL)
+ free(g->must);
+ free((char *)g);
+}
diff --git a/xc/extras/regex/split.c b/xc/extras/regex/split.c
new file mode 100644
index 000000000..188bdb775
--- /dev/null
+++ b/xc/extras/regex/split.c
@@ -0,0 +1,316 @@
+#include <stdio.h>
+#include <string.h>
+
+/*
+ - split - divide a string into fields, like awk split()
+ = int split(char *string, char *fields[], int nfields, char *sep);
+ */
+int /* number of fields, including overflow */
+split(string, fields, nfields, sep)
+char *string;
+char *fields[]; /* list is not NULL-terminated */
+int nfields; /* number of entries available in fields[] */
+char *sep; /* "" white, "c" single char, "ab" [ab]+ */
+{
+ register char *p = string;
+ register char c; /* latest character */
+ register char sepc = sep[0];
+ register char sepc2;
+ register int fn;
+ register char **fp = fields;
+ register char *sepp;
+ register int trimtrail;
+
+ /* white space */
+ if (sepc == '\0') {
+ while ((c = *p++) == ' ' || c == '\t')
+ continue;
+ p--;
+ trimtrail = 1;
+ sep = " \t"; /* note, code below knows this is 2 long */
+ sepc = ' ';
+ } else
+ trimtrail = 0;
+ sepc2 = sep[1]; /* now we can safely pick this up */
+
+ /* catch empties */
+ if (*p == '\0')
+ return(0);
+
+ /* single separator */
+ if (sepc2 == '\0') {
+ fn = nfields;
+ for (;;) {
+ *fp++ = p;
+ fn--;
+ if (fn == 0)
+ break;
+ while ((c = *p++) != sepc)
+ if (c == '\0')
+ return(nfields - fn);
+ *(p-1) = '\0';
+ }
+ /* we have overflowed the fields vector -- just count them */
+ fn = nfields;
+ for (;;) {
+ while ((c = *p++) != sepc)
+ if (c == '\0')
+ return(fn);
+ fn++;
+ }
+ /* not reached */
+ }
+
+ /* two separators */
+ if (sep[2] == '\0') {
+ fn = nfields;
+ for (;;) {
+ *fp++ = p;
+ fn--;
+ while ((c = *p++) != sepc && c != sepc2)
+ if (c == '\0') {
+ if (trimtrail && **(fp-1) == '\0')
+ fn++;
+ return(nfields - fn);
+ }
+ if (fn == 0)
+ break;
+ *(p-1) = '\0';
+ while ((c = *p++) == sepc || c == sepc2)
+ continue;
+ p--;
+ }
+ /* we have overflowed the fields vector -- just count them */
+ fn = nfields;
+ while (c != '\0') {
+ while ((c = *p++) == sepc || c == sepc2)
+ continue;
+ p--;
+ fn++;
+ while ((c = *p++) != '\0' && c != sepc && c != sepc2)
+ continue;
+ }
+ /* might have to trim trailing white space */
+ if (trimtrail) {
+ p--;
+ while ((c = *--p) == sepc || c == sepc2)
+ continue;
+ p++;
+ if (*p != '\0') {
+ if (fn == nfields+1)
+ *p = '\0';
+ fn--;
+ }
+ }
+ return(fn);
+ }
+
+ /* n separators */
+ fn = 0;
+ for (;;) {
+ if (fn < nfields)
+ *fp++ = p;
+ fn++;
+ for (;;) {
+ c = *p++;
+ if (c == '\0')
+ return(fn);
+ sepp = sep;
+ while ((sepc = *sepp++) != '\0' && sepc != c)
+ continue;
+ if (sepc != '\0') /* it was a separator */
+ break;
+ }
+ if (fn < nfields)
+ *(p-1) = '\0';
+ for (;;) {
+ c = *p++;
+ sepp = sep;
+ while ((sepc = *sepp++) != '\0' && sepc != c)
+ continue;
+ if (sepc == '\0') /* it wasn't a separator */
+ break;
+ }
+ p--;
+ }
+
+ /* not reached */
+}
+
+#ifdef TEST_SPLIT
+
+
+/*
+ * test program
+ * pgm runs regression
+ * pgm sep splits stdin lines by sep
+ * pgm str sep splits str by sep
+ * pgm str sep n splits str by sep n times
+ */
+int
+main(argc, argv)
+int argc;
+char *argv[];
+{
+ char buf[512];
+ register int n;
+# define MNF 10
+ char *fields[MNF];
+
+ if (argc > 4)
+ for (n = atoi(argv[3]); n > 0; n--) {
+ (void) strcpy(buf, argv[1]);
+ }
+ else if (argc > 3)
+ for (n = atoi(argv[3]); n > 0; n--) {
+ (void) strcpy(buf, argv[1]);
+ (void) split(buf, fields, MNF, argv[2]);
+ }
+ else if (argc > 2)
+ dosplit(argv[1], argv[2]);
+ else if (argc > 1)
+ while (fgets(buf, sizeof(buf), stdin) != NULL) {
+ buf[strlen(buf)-1] = '\0'; /* stomp newline */
+ dosplit(buf, argv[1]);
+ }
+ else
+ regress();
+
+ exit(0);
+}
+
+dosplit(string, seps)
+char *string;
+char *seps;
+{
+# define NF 5
+ char *fields[NF];
+ register int nf;
+
+ nf = split(string, fields, NF, seps);
+ print(nf, NF, fields);
+}
+
+print(nf, nfp, fields)
+int nf;
+int nfp;
+char *fields[];
+{
+ register int fn;
+ register int bound;
+
+ bound = (nf > nfp) ? nfp : nf;
+ printf("%d:\t", nf);
+ for (fn = 0; fn < bound; fn++)
+ printf("\"%s\"%s", fields[fn], (fn+1 < nf) ? ", " : "\n");
+}
+
+#define RNF 5 /* some table entries know this */
+struct {
+ char *str;
+ char *seps;
+ int nf;
+ char *fi[RNF];
+} tests[] = {
+ "", " ", 0, { "" },
+ " ", " ", 2, { "", "" },
+ "x", " ", 1, { "x" },
+ "xy", " ", 1, { "xy" },
+ "x y", " ", 2, { "x", "y" },
+ "abc def g ", " ", 5, { "abc", "def", "", "g", "" },
+ " a bcd", " ", 4, { "", "", "a", "bcd" },
+ "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
+
+ "", " _", 0, { "" },
+ " ", " _", 2, { "", "" },
+ "x", " _", 1, { "x" },
+ "x y", " _", 2, { "x", "y" },
+ "ab _ cd", " _", 2, { "ab", "cd" },
+ " a_b c ", " _", 5, { "", "a", "b", "c", "" },
+ "a b c_d e f", " _", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d ", " _", 6, { "", "a", "b", "c", "d " },
+
+ "", " _~", 0, { "" },
+ " ", " _~", 2, { "", "" },
+ "x", " _~", 1, { "x" },
+ "x y", " _~", 2, { "x", "y" },
+ "ab _~ cd", " _~", 2, { "ab", "cd" },
+ " a_b c~", " _~", 5, { "", "a", "b", "c", "" },
+ "a b_c d~e f", " _~", 6, { "a", "b", "c", "d", "e f" },
+ "~a b c d ", " _~", 6, { "", "a", "b", "c", "d " },
+
+ "", " _~-", 0, { "" },
+ " ", " _~-", 2, { "", "" },
+ "x", " _~-", 1, { "x" },
+ "x y", " _~-", 2, { "x", "y" },
+ "ab _~- cd", " _~-", 2, { "ab", "cd" },
+ " a_b c~", " _~-", 5, { "", "a", "b", "c", "" },
+ "a b_c-d~e f", " _~-", 6, { "a", "b", "c", "d", "e f" },
+ "~a-b c d ", " _~-", 6, { "", "a", "b", "c", "d " },
+
+ "", " ", 0, { "" },
+ " ", " ", 2, { "", "" },
+ "x", " ", 1, { "x" },
+ "xy", " ", 1, { "xy" },
+ "x y", " ", 2, { "x", "y" },
+ "abc def g ", " ", 4, { "abc", "def", "g", "" },
+ " a bcd", " ", 3, { "", "a", "bcd" },
+ "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d ", " ", 6, { "", "a", "b", "c", "d " },
+
+ "", "", 0, { "" },
+ " ", "", 0, { "" },
+ "x", "", 1, { "x" },
+ "xy", "", 1, { "xy" },
+ "x y", "", 2, { "x", "y" },
+ "abc def g ", "", 3, { "abc", "def", "g" },
+ "\t a bcd", "", 2, { "a", "bcd" },
+ " a \tb\t c ", "", 3, { "a", "b", "c" },
+ "a b c d e ", "", 5, { "a", "b", "c", "d", "e" },
+ "a b\tc d e f", "", 6, { "a", "b", "c", "d", "e f" },
+ " a b c d e f ", "", 6, { "a", "b", "c", "d", "e f " },
+
+ NULL, NULL, 0, { NULL },
+};
+
+regress()
+{
+ char buf[512];
+ register int n;
+ char *fields[RNF+1];
+ register int nf;
+ register int i;
+ register int printit;
+ register char *f;
+
+ for (n = 0; tests[n].str != NULL; n++) {
+ (void) strcpy(buf, tests[n].str);
+ fields[RNF] = NULL;
+ nf = split(buf, fields, RNF, tests[n].seps);
+ printit = 0;
+ if (nf != tests[n].nf) {
+ printf("split `%s' by `%s' gave %d fields, not %d\n",
+ tests[n].str, tests[n].seps, nf, tests[n].nf);
+ printit = 1;
+ } else if (fields[RNF] != NULL) {
+ printf("split() went beyond array end\n");
+ printit = 1;
+ } else {
+ for (i = 0; i < nf && i < RNF; i++) {
+ f = fields[i];
+ if (f == NULL)
+ f = "(NULL)";
+ if (strcmp(f, tests[n].fi[i]) != 0) {
+ printf("split `%s' by `%s', field %d is `%s', not `%s'\n",
+ tests[n].str, tests[n].seps,
+ i, fields[i], tests[n].fi[i]);
+ printit = 1;
+ }
+ }
+ }
+ if (printit)
+ print(nf, RNF, fields);
+ }
+}
+#endif
diff --git a/xc/extras/regex/tests b/xc/extras/regex/tests
new file mode 100644
index 000000000..e4d928dad
--- /dev/null
+++ b/xc/extras/regex/tests
@@ -0,0 +1,477 @@
+# regular expression test set
+# Lines are at least three fields, separated by one or more tabs. "" stands
+# for an empty field. First field is an RE. Second field is flags. If
+# C flag given, regcomp() is expected to fail, and the third field is the
+# error name (minus the leading REG_).
+#
+# Otherwise it is expected to succeed, and the third field is the string to
+# try matching it against. If there is no fourth field, the match is
+# expected to fail. If there is a fourth field, it is the substring that
+# the RE is expected to match. If there is a fifth field, it is a comma-
+# separated list of what the subexpressions should match, with - indicating
+# no match for that one. In both the fourth and fifth fields, a (sub)field
+# starting with @ indicates that the (sub)expression is expected to match
+# a null string followed by the stuff after the @; this provides a way to
+# test where null strings match. The character `N' in REs and strings
+# is newline, `S' is space, `T' is tab, `Z' is NUL.
+#
+# The full list of flags:
+# - placeholder, does nothing
+# b RE is a BRE, not an ERE
+# & try it as both an ERE and a BRE
+# C regcomp() error expected, third field is error name
+# i REG_ICASE
+# m ("mundane") REG_NOSPEC
+# s REG_NOSUB (not really testable)
+# n REG_NEWLINE
+# ^ REG_NOTBOL
+# $ REG_NOTEOL
+# # REG_STARTEND (see below)
+# p REG_PEND
+#
+# For REG_STARTEND, the start/end offsets are those of the substring
+# enclosed in ().
+
+# basics
+a & a a
+abc & abc abc
+abc|de - abc abc
+a|b|c - abc a
+
+# parentheses and perversions thereof
+a(b)c - abc abc
+a\(b\)c b abc abc
+a( C EPAREN
+a( b a( a(
+a\( - a( a(
+a\( bC EPAREN
+a\(b bC EPAREN
+a(b C EPAREN
+a(b b a(b a(b
+# gag me with a right parenthesis -- 1003.2 goofed here (my fault, partly)
+a) - a) a)
+) - ) )
+# end gagging (in a just world, those *should* give EPAREN)
+a) b a) a)
+a\) bC EPAREN
+\) bC EPAREN
+a()b - ab ab
+a\(\)b b ab ab
+
+# anchoring and REG_NEWLINE
+^abc$ & abc abc
+a^b - a^b
+a^b b a^b a^b
+a$b - a$b
+a$b b a$b a$b
+^ & abc @abc
+$ & abc @
+^$ & "" @
+$^ - "" @
+\($\)\(^\) b "" @
+# stop retching, those are legitimate (although disgusting)
+^^ - "" @
+$$ - "" @
+b$ & abNc
+b$ &n abNc b
+^b$ & aNbNc
+^b$ &n aNbNc b
+^$ &n aNNb @Nb
+^$ n abc
+^$ n abcN @
+$^ n aNNb @Nb
+\($\)\(^\) bn aNNb @Nb
+^^ n^ aNNb @Nb
+$$ n aNNb @NN
+^a ^ a
+a$ $ a
+^a ^n aNb
+^b ^n aNb b
+a$ $n bNa
+b$ $n bNa b
+a*(^b$)c* - b b
+a*\(^b$\)c* b b b
+
+# certain syntax errors and non-errors
+| C EMPTY
+| b | |
+* C BADRPT
+* b * *
++ C BADRPT
+? C BADRPT
+"" &C EMPTY
+() - abc @abc
+\(\) b abc @abc
+a||b C EMPTY
+|ab C EMPTY
+ab| C EMPTY
+(|a)b C EMPTY
+(a|)b C EMPTY
+(*a) C BADRPT
+(+a) C BADRPT
+(?a) C BADRPT
+({1}a) C BADRPT
+\(\{1\}a\) bC BADRPT
+(a|*b) C BADRPT
+(a|+b) C BADRPT
+(a|?b) C BADRPT
+(a|{1}b) C BADRPT
+^* C BADRPT
+^* b * *
+^+ C BADRPT
+^? C BADRPT
+^{1} C BADRPT
+^\{1\} bC BADRPT
+
+# metacharacters, backslashes
+a.c & abc abc
+a[bc]d & abd abd
+a\*c & a*c a*c
+a\\b & a\b a\b
+a\\\*b & a\*b a\*b
+a\bc & abc abc
+a\ &C EESCAPE
+a\\bc & a\bc a\bc
+\{ bC BADRPT
+a\[b & a[b a[b
+a[b &C EBRACK
+# trailing $ is a peculiar special case for the BRE code
+a$ & a a
+a$ & a$
+a\$ & a
+a\$ & a$ a$
+a\\$ & a
+a\\$ & a$
+a\\$ & a\$
+a\\$ & a\ a\
+
+# back references, ugh
+a\(b\)\2c bC ESUBREG
+a\(b\1\)c bC ESUBREG
+a\(b*\)c\1d b abbcbbd abbcbbd bb
+a\(b*\)c\1d b abbcbd
+a\(b*\)c\1d b abbcbbbd
+^\(.\)\1 b abc
+a\([bc]\)\1d b abcdabbd abbd b
+a\(\([bc]\)\2\)*d b abbccd abbccd
+a\(\([bc]\)\2\)*d b abbcbd
+# actually, this next one probably ought to fail, but the spec is unclear
+a\(\(b\)*\2\)*d b abbbd abbbd
+# here is a case that no NFA implementation does right
+\(ab*\)[ab]*\1 b ababaaa ababaaa a
+# check out normal matching in the presence of back refs
+\(a\)\1bcd b aabcd aabcd
+\(a\)\1bc*d b aabcd aabcd
+\(a\)\1bc*d b aabd aabd
+\(a\)\1bc*d b aabcccd aabcccd
+\(a\)\1bc*[ce]d b aabcccd aabcccd
+^\(a\)\1b\(c\)*cd$ b aabcccd aabcccd
+
+# ordinary repetitions
+ab*c & abc abc
+ab+c - abc abc
+ab?c - abc abc
+a\(*\)b b a*b a*b
+a\(**\)b b ab ab
+a\(***\)b bC BADRPT
+*a b *a *a
+**a b a a
+***a bC BADRPT
+
+# the dreaded bounded repetitions
+{ & { {
+{abc & {abc {abc
+{1 C BADRPT
+{1} C BADRPT
+a{b & a{b a{b
+a{1}b - ab ab
+a\{1\}b b ab ab
+a{1,}b - ab ab
+a\{1,\}b b ab ab
+a{1,2}b - aab aab
+a\{1,2\}b b aab aab
+a{1 C EBRACE
+a\{1 bC EBRACE
+a{1a C EBRACE
+a\{1a bC EBRACE
+a{1a} C BADBR
+a\{1a\} bC BADBR
+a{,2} - a{,2} a{,2}
+a\{,2\} bC BADBR
+a{,} - a{,} a{,}
+a\{,\} bC BADBR
+a{1,x} C BADBR
+a\{1,x\} bC BADBR
+a{1,x C EBRACE
+a\{1,x bC EBRACE
+a{300} C BADBR
+a\{300\} bC BADBR
+a{1,0} C BADBR
+a\{1,0\} bC BADBR
+ab{0,0}c - abcac ac
+ab\{0,0\}c b abcac ac
+ab{0,1}c - abcac abc
+ab\{0,1\}c b abcac abc
+ab{0,3}c - abbcac abbc
+ab\{0,3\}c b abbcac abbc
+ab{1,1}c - acabc abc
+ab\{1,1\}c b acabc abc
+ab{1,3}c - acabc abc
+ab\{1,3\}c b acabc abc
+ab{2,2}c - abcabbc abbc
+ab\{2,2\}c b abcabbc abbc
+ab{2,4}c - abcabbc abbc
+ab\{2,4\}c b abcabbc abbc
+((a{1,10}){1,10}){1,10} - a a a,a
+
+# multiple repetitions
+a** &C BADRPT
+a++ C BADRPT
+a?? C BADRPT
+a*+ C BADRPT
+a*? C BADRPT
+a+* C BADRPT
+a+? C BADRPT
+a?* C BADRPT
+a?+ C BADRPT
+a{1}{1} C BADRPT
+a*{1} C BADRPT
+a+{1} C BADRPT
+a?{1} C BADRPT
+a{1}* C BADRPT
+a{1}+ C BADRPT
+a{1}? C BADRPT
+a*{b} - a{b} a{b}
+a\{1\}\{1\} bC BADRPT
+a*\{1\} bC BADRPT
+a\{1\}* bC BADRPT
+
+# brackets, and numerous perversions thereof
+a[b]c & abc abc
+a[ab]c & abc abc
+a[^ab]c & adc adc
+a[]b]c & a]c a]c
+a[[b]c & a[c a[c
+a[-b]c & a-c a-c
+a[^]b]c & adc adc
+a[^-b]c & adc adc
+a[b-]c & a-c a-c
+a[b &C EBRACK
+a[] &C EBRACK
+a[1-3]c & a2c a2c
+a[3-1]c &C ERANGE
+a[1-3-5]c &C ERANGE
+a[[.-.]--]c & a-c a-c
+a[1- &C ERANGE
+a[[. &C EBRACK
+a[[.x &C EBRACK
+a[[.x. &C EBRACK
+a[[.x.] &C EBRACK
+a[[.x.]] & ax ax
+a[[.x,.]] &C ECOLLATE
+a[[.one.]]b & a1b a1b
+a[[.notdef.]]b &C ECOLLATE
+a[[.].]]b & a]b a]b
+a[[:alpha:]]c & abc abc
+a[[:notdef:]]c &C ECTYPE
+a[[: &C EBRACK
+a[[:alpha &C EBRACK
+a[[:alpha:] &C EBRACK
+a[[:alpha,:] &C ECTYPE
+a[[:]:]]b &C ECTYPE
+a[[:-:]]b &C ECTYPE
+a[[:alph:]] &C ECTYPE
+a[[:alphabet:]] &C ECTYPE
+[[:alnum:]]+ - -%@a0X- a0X
+[[:alpha:]]+ - -%@aX0- aX
+[[:blank:]]+ - aSSTb SST
+[[:cntrl:]]+ - aNTb NT
+[[:digit:]]+ - a019b 019
+[[:graph:]]+ - Sa%bS a%b
+[[:lower:]]+ - AabC ab
+[[:print:]]+ - NaSbN aSb
+[[:punct:]]+ - S%-&T %-&
+[[:space:]]+ - aSNTb SNT
+[[:upper:]]+ - aBCd BC
+[[:xdigit:]]+ - p0f3Cq 0f3C
+a[[=b=]]c & abc abc
+a[[= &C EBRACK
+a[[=b &C EBRACK
+a[[=b= &C EBRACK
+a[[=b=] &C EBRACK
+a[[=b,=]] &C ECOLLATE
+a[[=one=]]b & a1b a1b
+
+# complexities
+a(((b)))c - abc abc
+a(b|(c))d - abd abd
+a(b*|c)d - abbd abbd
+# just gotta have one DFA-buster, of course
+a[ab]{20} - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
+# and an inline expansion in case somebody gets tricky
+a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab] - aaaaabaaaabaaaabaaaab aaaaabaaaabaaaabaaaab
+# and in case somebody just slips in an NFA...
+a[ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab][ab](wee|week)(knights|night) - aaaaabaaaabaaaabaaaabweeknights aaaaabaaaabaaaabaaaabweeknights
+# fish for anomalies as the number of states passes 32
+12345678901234567890123456789 - a12345678901234567890123456789b 12345678901234567890123456789
+123456789012345678901234567890 - a123456789012345678901234567890b 123456789012345678901234567890
+1234567890123456789012345678901 - a1234567890123456789012345678901b 1234567890123456789012345678901
+12345678901234567890123456789012 - a12345678901234567890123456789012b 12345678901234567890123456789012
+123456789012345678901234567890123 - a123456789012345678901234567890123b 123456789012345678901234567890123
+# and one really big one, beyond any plausible word width
+1234567890123456789012345678901234567890123456789012345678901234567890 - a1234567890123456789012345678901234567890123456789012345678901234567890b 1234567890123456789012345678901234567890123456789012345678901234567890
+# fish for problems as brackets go past 8
+[ab][cd][ef][gh][ij][kl][mn] - xacegikmoq acegikm
+[ab][cd][ef][gh][ij][kl][mn][op] - xacegikmoq acegikmo
+[ab][cd][ef][gh][ij][kl][mn][op][qr] - xacegikmoqy acegikmoq
+[ab][cd][ef][gh][ij][kl][mn][op][q] - xacegikmoqy acegikmoq
+
+# subtleties of matching
+abc & xabcy abc
+a\(b\)?c\1d b acd
+aBc i Abc Abc
+a[Bc]*d i abBCcd abBCcd
+0[[:upper:]]1 &i 0a1 0a1
+0[[:lower:]]1 &i 0A1 0A1
+a[^b]c &i abc
+a[^b]c &i aBc
+a[^b]c &i adc adc
+[a]b[c] - abc abc
+[a]b[a] - aba aba
+[abc]b[abc] - abc abc
+[abc]b[abd] - abd abd
+a(b?c)+d - accd accd
+(wee|week)(knights|night) - weeknights weeknights
+(we|wee|week|frob)(knights|night|day) - weeknights weeknights
+a[bc]d - xyzaaabcaababdacd abd
+a[ab]c - aaabc abc
+abc s abc abc
+a* & b @b
+
+# Let's have some fun -- try to match a C comment.
+# first the obvious, which looks okay at first glance...
+/\*.*\*/ - /*x*/ /*x*/
+# but...
+/\*.*\*/ - /*x*/y/*z*/ /*x*/y/*z*/
+# okay, we must not match */ inside; try to do that...
+/\*([^*]|\*[^/])*\*/ - /*x*/ /*x*/
+/\*([^*]|\*[^/])*\*/ - /*x*/y/*z*/ /*x*/
+# but...
+/\*([^*]|\*[^/])*\*/ - /*x**/y/*z*/ /*x**/y/*z*/
+# and a still fancier version, which does it right (I think)...
+/\*([^*]|\*+[^*/])*\*+/ - /*x*/ /*x*/
+/\*([^*]|\*+[^*/])*\*+/ - /*x*/y/*z*/ /*x*/
+/\*([^*]|\*+[^*/])*\*+/ - /*x**/y/*z*/ /*x**/
+/\*([^*]|\*+[^*/])*\*+/ - /*x****/y/*z*/ /*x****/
+/\*([^*]|\*+[^*/])*\*+/ - /*x**x*/y/*z*/ /*x**x*/
+/\*([^*]|\*+[^*/])*\*+/ - /*x***x/y/*z*/ /*x***x/y/*z*/
+
+# subexpressions
+.* - abc abc -
+a(b)(c)d - abcd abcd b,c
+a(((b)))c - abc abc b,b,b
+a(b|(c))d - abd abd b,-
+a(b*|c|e)d - abbd abbd bb
+a(b*|c|e)d - acd acd c
+a(b*|c|e)d - ad ad @d
+a(b?)c - abc abc b
+a(b?)c - ac ac @c
+a(b+)c - abc abc b
+a(b+)c - abbbc abbbc bbb
+a(b*)c - ac ac @c
+(a|ab)(bc([de]+)f|cde) - abcdef abcdef a,bcdef,de
+# the regression tester only asks for 9 subexpressions
+a(b)(c)(d)(e)(f)(g)(h)(i)(j)k - abcdefghijk abcdefghijk b,c,d,e,f,g,h,i,j
+a(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)l - abcdefghijkl abcdefghijkl b,c,d,e,f,g,h,i,j,k
+a([bc]?)c - abc abc b
+a([bc]?)c - ac ac @c
+a([bc]+)c - abc abc b
+a([bc]+)c - abcc abcc bc
+a([bc]+)bc - abcbc abcbc bc
+a(bb+|b)b - abb abb b
+a(bbb+|bb+|b)b - abb abb b
+a(bbb+|bb+|b)b - abbb abbb bb
+a(bbb+|bb+|b)bb - abbb abbb b
+(.*).* - abcdef abcdef abcdef
+(a*)* - bc @b @b
+
+# do we get the right subexpression when it is used more than once?
+a(b|c)*d - ad ad -
+a(b|c)*d - abcd abcd c
+a(b|c)+d - abd abd b
+a(b|c)+d - abcd abcd c
+a(b|c?)+d - ad ad @d
+a(b|c?)+d - abcd abcd @d
+a(b|c){0,0}d - ad ad -
+a(b|c){0,1}d - ad ad -
+a(b|c){0,1}d - abd abd b
+a(b|c){0,2}d - ad ad -
+a(b|c){0,2}d - abcd abcd c
+a(b|c){0,}d - ad ad -
+a(b|c){0,}d - abcd abcd c
+a(b|c){1,1}d - abd abd b
+a(b|c){1,1}d - acd acd c
+a(b|c){1,2}d - abd abd b
+a(b|c){1,2}d - abcd abcd c
+a(b|c){1,}d - abd abd b
+a(b|c){1,}d - abcd abcd c
+a(b|c){2,2}d - acbd acbd b
+a(b|c){2,2}d - abcd abcd c
+a(b|c){2,4}d - abcd abcd c
+a(b|c){2,4}d - abcbd abcbd b
+a(b|c){2,4}d - abcbcd abcbcd c
+a(b|c){2,}d - abcd abcd c
+a(b|c){2,}d - abcbd abcbd b
+a(b+|((c)*))+d - abd abd @d,@d,-
+a(b+|((c)*))+d - abcd abcd @d,@d,-
+
+# check out the STARTEND option
+[abc] &# a(b)c b
+[abc] &# a(d)c
+[abc] &# a(bc)d b
+[abc] &# a(dc)d c
+. &# a()c
+b.*c &# b(bc)c bc
+b.* &# b(bc)c bc
+.*c &# b(bc)c bc
+
+# plain strings, with the NOSPEC flag
+abc m abc abc
+abc m xabcy abc
+abc m xyz
+a*b m aba*b a*b
+a*b m ab
+"" mC EMPTY
+
+# cases involving NULs
+aZb & a a
+aZb &p a
+aZb &p# (aZb) aZb
+aZ*b &p# (ab) ab
+a.b &# (aZb) aZb
+a.* &# (aZb)c aZb
+
+# word boundaries (ick)
+[[:<:]]a & a a
+[[:<:]]a & ba
+[[:<:]]a & -a a
+a[[:>:]] & a a
+a[[:>:]] & ab
+a[[:>:]] & a- a
+[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc abc
+[[:<:]]a.c[[:>:]] & axcd-dayc-dazce-abc-q abc
+[[:<:]]a.c[[:>:]] & axc-dayc-dazce-abc axc
+[[:<:]]b.c[[:>:]] & a_bxc-byc_d-bzc-q bzc
+[[:<:]].x..[[:>:]] & y_xa_-_xb_y-_xc_-axdc _xc_
+[[:<:]]a_b[[:>:]] & x_a_b
+
+# past problems, and suspected problems
+(A[1])|(A[2])|(A[3])|(A[4])|(A[5])|(A[6])|(A[7])|(A[8])|(A[9])|(A[A]) - A1 A1
+abcdefghijklmnop i abcdefghijklmnop abcdefghijklmnop
+abcdefghijklmnopqrstuv i abcdefghijklmnopqrstuv abcdefghijklmnopqrstuv
+(ALAK)|(ALT[AB])|(CC[123]1)|(CM[123]1)|(GAMC)|(LC[23][EO ])|(SEM[1234])|(SL[ES][12])|(SLWW)|(SLF )|(SLDT)|(VWH[12])|(WH[34][EW])|(WP1[ESN]) - CC11 CC11
+CC[13]1|a{21}[23][EO][123][Es][12]a{15}aa[34][EW]aaaaaaa[X]a - CC11 CC11
+Char \([a-z0-9_]*\)\[.* b Char xyz[k Char xyz[k xyz
+a?b - ab ab
+-\{0,1\}[0-9]*$ b -5 -5
+a*a*a*a*a*a*a* & aaaaaa aaaaaa
diff --git a/xc/extras/regex/utils.h b/xc/extras/regex/utils.h
new file mode 100644
index 000000000..1a997ac8f
--- /dev/null
+++ b/xc/extras/regex/utils.h
@@ -0,0 +1,22 @@
+/* utility definitions */
+#ifdef _POSIX2_RE_DUP_MAX
+#define DUPMAX _POSIX2_RE_DUP_MAX
+#else
+#define DUPMAX 255
+#endif
+#define INFINITY (DUPMAX + 1)
+#define NC (CHAR_MAX - CHAR_MIN + 1)
+typedef unsigned char uch;
+
+/* switch off assertions (if not already off) if no REDEBUG */
+#ifndef REDEBUG
+#ifndef NDEBUG
+#define NDEBUG /* no assertions please */
+#endif
+#endif
+#include <assert.h>
+
+/* for old systems with bcopy() but no memmove() */
+#ifdef USEBCOPY
+#define memmove(d, s, c) bcopy(s, d, c)
+#endif